Skip to content

Commit aaa2d87

Browse files
authored
feat: support new reason value on conversation leave event (#2536)
1 parent bf53877 commit aaa2d87

File tree

47 files changed

+349
-74
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+349
-74
lines changed

app/src/main/kotlin/com/wire/android/mapper/MessagePreviewContentMapper.kt

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -204,10 +204,10 @@ fun MessagePreview.uiLastMessageContent(): UILastMessageContent {
204204
UILastMessageContent.TextMessage(MessageBody(previewMessageContent))
205205
}
206206

207-
is WithUser.MembersRemoved -> {
208-
val membersRemovedContent = (content as WithUser.MembersRemoved)
209-
val isSelfRemoved = membersRemovedContent.isSelfUserRemoved
210-
val otherUsersSize = membersRemovedContent.otherUserIdList.size
207+
is WithUser.ConversationMembersRemoved -> {
208+
val conversationMembersRemovedContent = (content as WithUser.ConversationMembersRemoved)
209+
val isSelfRemoved = conversationMembersRemovedContent.isSelfUserRemoved
210+
val otherUsersSize = conversationMembersRemovedContent.otherUserIdList.size
211211

212212
val previewMessageContent = when {
213213
isSelfMessage && otherUsersSize > 0 -> {
@@ -234,6 +234,14 @@ fun MessagePreview.uiLastMessageContent(): UILastMessageContent {
234234
UILastMessageContent.TextMessage(MessageBody(previewMessageContent))
235235
}
236236

237+
is WithUser.TeamMembersRemoved -> {
238+
val teamMembersRemovedContent = (content as WithUser.TeamMembersRemoved)
239+
val previewMessageContent =
240+
UIText.PluralResource(R.plurals.last_message_team_member_removed, teamMembersRemovedContent.otherUserIdList.size)
241+
242+
UILastMessageContent.TextMessage(MessageBody(previewMessageContent))
243+
}
244+
237245
is WithUser.MentionedSelf -> UILastMessageContent.SenderWithMessage(
238246
userUIText,
239247
UIText.StringResource(R.string.last_message_mentioned)
@@ -244,7 +252,7 @@ fun MessagePreview.uiLastMessageContent(): UILastMessageContent {
244252
UIText.StringResource(R.string.last_message_replied)
245253
)
246254

247-
is WithUser.TeamMemberRemoved -> UILastMessageContent.None // TODO
255+
is WithUser.TeamMemberRemoved -> UILastMessageContent.None
248256
is WithUser.Text -> UILastMessageContent.SenderWithMessage(
249257
sender = userUIText,
250258
message = (content as WithUser.Text).messageBody.let { UIText.DynamicString(it) },
@@ -319,12 +327,16 @@ fun MessagePreview.uiLastMessageContent(): UILastMessageContent {
319327
MessagePreviewContent.CryptoSessionReset -> UILastMessageContent.None
320328
MessagePreviewContent.VerificationChanged.VerifiedMls ->
321329
UILastMessageContent.VerificationChanged(R.string.last_message_verified_conversation_mls)
330+
322331
MessagePreviewContent.VerificationChanged.VerifiedProteus ->
323332
UILastMessageContent.VerificationChanged(R.string.last_message_verified_conversation_proteus)
333+
324334
MessagePreviewContent.VerificationChanged.DegradedMls ->
325335
UILastMessageContent.VerificationChanged(R.string.last_message_conversations_verification_degraded_mls)
336+
326337
MessagePreviewContent.VerificationChanged.DegradedProteus ->
327338
UILastMessageContent.VerificationChanged(R.string.last_message_conversations_verification_degraded_proteus)
339+
328340
Unknown -> UILastMessageContent.None
329341
}
330342
}

app/src/main/kotlin/com/wire/android/mapper/SystemMessageContentMapper.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ class SystemMessageContentMapper @Inject constructor(
180180

181181
private fun mapTeamMemberRemovedMessage(
182182
content: MessageContent.TeamMemberRemoved
183-
): UIMessageContent.SystemMessage = UIMessageContent.SystemMessage.TeamMemberRemoved(content)
183+
): UIMessageContent.SystemMessage = UIMessageContent.SystemMessage.TeamMemberRemoved_Legacy(content)
184184

185185
private fun mapConversationRenamedMessage(
186186
senderUserId: UserId,
@@ -242,6 +242,11 @@ class SystemMessageContentMapper @Inject constructor(
242242
is MemberChange.FederationRemoved -> UIMessageContent.SystemMessage.FederationMemberRemoved(
243243
memberNames = memberNameList
244244
)
245+
246+
is MemberChange.RemovedFromTeam -> UIMessageContent.SystemMessage.TeamMemberRemoved(
247+
author = authorName,
248+
memberNames = memberNameList
249+
)
245250
}
246251
}
247252

app/src/main/kotlin/com/wire/android/ui/home/conversations/SystemMessageItem.kt

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ import com.wire.android.ui.theme.WireTheme
7575
import com.wire.android.ui.theme.wireColorScheme
7676
import com.wire.android.ui.theme.wireTypography
7777
import com.wire.android.util.CustomTabsHelper
78+
import com.wire.android.util.ui.LocalizedStringResource
7879
import com.wire.android.util.ui.PreviewMultipleThemes
7980
import com.wire.android.util.ui.UIText
8081
import com.wire.android.util.ui.markdownBold
@@ -126,16 +127,16 @@ fun SystemMessageItem(
126127
contentAlignment = Alignment.TopEnd
127128
) {
128129
if (message.messageContent.iconResId != null) {
129-
Image(
130-
painter = painterResource(id = message.messageContent.iconResId),
131-
contentDescription = null,
132-
colorFilter = getColorFilter(message.messageContent),
133-
modifier = Modifier.size(
134-
if (message.messageContent.isSmallIcon) dimensions().systemMessageIconSize
135-
else dimensions().systemMessageIconLargeSize
136-
),
137-
contentScale = ContentScale.Crop
138-
)
130+
Image(
131+
painter = painterResource(id = message.messageContent.iconResId),
132+
contentDescription = null,
133+
colorFilter = getColorFilter(message.messageContent),
134+
modifier = Modifier.size(
135+
if (message.messageContent.isSmallIcon) dimensions().systemMessageIconSize
136+
else dimensions().systemMessageIconLargeSize
137+
),
138+
contentScale = ContentScale.Crop
139+
)
139140
}
140141
}
141142
Spacer(Modifier.width(dimensions().messageItemHorizontalPadding - fullAvatarOuterPadding))
@@ -187,7 +188,7 @@ fun SystemMessageItem(
187188
modifier = Modifier.defaultMinSize(minHeight = dimensions().spacing20x),
188189
text = fullAnnotatedString,
189190
onClick = { offset ->
190-
fullAnnotatedString.getStringAnnotations(TAG_LEARN_MORE, offset, offset,)
191+
fullAnnotatedString.getStringAnnotations(TAG_LEARN_MORE, offset, offset)
191192
.firstOrNull()?.let { result -> CustomTabsHelper.launchUrl(context, result.item) }
192193
},
193194
style = MaterialTheme.wireTypography.body02,
@@ -256,7 +257,7 @@ private fun getColorFilter(message: SystemMessage): ColorFilter? {
256257
is SystemMessage.MemberRemoved,
257258
is SystemMessage.CryptoSessionReset,
258259
is SystemMessage.RenamedConversation,
259-
is SystemMessage.TeamMemberRemoved,
260+
is SystemMessage.TeamMemberRemoved_Legacy,
260261
is SystemMessage.ConversationReceiptModeChanged,
261262
is SystemMessage.HistoryLost,
262263
is SystemMessage.HistoryLostProtocolChanged,
@@ -269,6 +270,7 @@ private fun getColorFilter(message: SystemMessage): ColorFilter? {
269270
is SystemMessage.FederationMemberRemoved,
270271
is SystemMessage.FederationStopped,
271272
is SystemMessage.ConversationMessageCreatedUnverifiedWarning,
273+
is SystemMessage.TeamMemberRemoved,
272274
is SystemMessage.MLSWrongEpochWarning -> ColorFilter.tint(colorsScheme().onBackground)
273275
}
274276
}
@@ -548,7 +550,7 @@ private val SystemMessage.expandable
548550
is SystemMessage.MemberLeft -> false
549551
is SystemMessage.MissedCall -> false
550552
is SystemMessage.RenamedConversation -> false
551-
is SystemMessage.TeamMemberRemoved -> false
553+
is SystemMessage.TeamMemberRemoved_Legacy -> false
552554
is SystemMessage.CryptoSessionReset -> false
553555
is SystemMessage.NewConversationReceiptMode -> false
554556
is SystemMessage.ConversationReceiptModeChanged -> false
@@ -567,6 +569,7 @@ private val SystemMessage.expandable
567569
is SystemMessage.FederationStopped -> false
568570
is SystemMessage.ConversationMessageCreatedUnverifiedWarning -> false
569571
is SystemMessage.LegalHold -> false
572+
is SystemMessage.TeamMemberRemoved -> this.memberNames.size > EXPANDABLE_THRESHOLD
570573
}
571574

572575
private fun List<String>.toUserNamesListMarkdownString(res: Resources): String = when {
@@ -594,7 +597,7 @@ private fun List<UIText>.limitUserNamesList(
594597
.plus(res.getQuantityString(quantityString, moreCount, moreCount))
595598
}
596599

597-
@Suppress("LongParameterList", "SpreadOperator", "ComplexMethod")
600+
@Suppress("LongParameterList", "SpreadOperator", "ComplexMethod", "LongMethod")
598601
fun SystemMessage.annotatedString(
599602
res: Resources,
600603
expanded: Boolean,
@@ -618,6 +621,11 @@ fun SystemMessage.annotatedString(
618621
memberNames.limitUserNamesList(res, expanded).toUserNamesListMarkdownString(res)
619622
)
620623

624+
is SystemMessage.TeamMemberRemoved -> arrayOf(
625+
author.asString(res).markdownBold(),
626+
memberNames.limitUserNamesList(res, expanded).toUserNamesListMarkdownString(res)
627+
)
628+
621629
is SystemMessage.FederationMemberRemoved ->
622630
arrayOf(
623631
memberNames.limitUserNamesList(res, expanded).toUserNamesListMarkdownString(res)
@@ -627,14 +635,14 @@ fun SystemMessage.annotatedString(
627635
is SystemMessage.MemberLeft -> arrayOf(author.asString(res).markdownBold())
628636
is SystemMessage.MissedCall -> arrayOf(author.asString(res).markdownBold())
629637
is SystemMessage.RenamedConversation -> arrayOf(author.asString(res).markdownBold(), content.conversationName.markdownBold())
630-
is SystemMessage.TeamMemberRemoved -> arrayOf(content.userName.markdownBold())
631638
is SystemMessage.CryptoSessionReset -> arrayOf(author.asString(res).markdownBold())
632639
is SystemMessage.NewConversationReceiptMode -> arrayOf(receiptMode.asString(res).markdownBold())
633640
is SystemMessage.ConversationReceiptModeChanged -> arrayOf(
634641
author.asString(res).markdownBold(),
635642
receiptMode.asString(res).markdownBold()
636643
)
637644

645+
is SystemMessage.TeamMemberRemoved_Legacy -> arrayOf(content.userName)
638646
is SystemMessage.Knock -> arrayOf(author.asString(res).markdownBold())
639647
is SystemMessage.HistoryLost -> arrayOf()
640648
is SystemMessage.MLSWrongEpochWarning -> arrayOf()
@@ -664,7 +672,19 @@ fun SystemMessage.annotatedString(
664672
arrayOf(memberNames.limitUserNamesList(res, true).toUserNamesListMarkdownString(res))
665673
} ?: arrayOf()
666674
}
667-
val markdownString = res.getString(stringResId, *markdownArgs)
675+
val markdownString = when (stringResId) {
676+
is LocalizedStringResource.PluralResource -> res.getQuantityString(
677+
(stringResId as LocalizedStringResource.PluralResource).id,
678+
(stringResId as LocalizedStringResource.PluralResource).quantity,
679+
*markdownArgs
680+
)
681+
682+
is LocalizedStringResource.StringResource -> res.getString(
683+
(stringResId as LocalizedStringResource.StringResource).id,
684+
*markdownArgs
685+
)
686+
}
687+
668688
return markdownText(markdownString, normalStyle, boldStyle, normalColor, boldColor, errorColor, isErrorString)
669689
}
670690

@@ -699,7 +719,18 @@ private fun SystemMessage.MemberFailedToAdd.toFailedToAddMarkdownText(
699719
if (isMultipleUsersFailure) failedToAddAnnotatedText.append("\n\n")
700720
failedToAddAnnotatedText.append(
701721
markdownText(
702-
res.getString(stringResId, memberNames.limitUserNamesList(res, true).toUserNamesListMarkdownString(res)),
722+
when (stringResId) {
723+
is LocalizedStringResource.PluralResource -> res.getQuantityString(
724+
stringResId.id,
725+
stringResId.quantity,
726+
stringResId.formatArgs
727+
)
728+
729+
is LocalizedStringResource.StringResource -> res.getString(
730+
stringResId.id,
731+
memberNames.limitUserNamesList(res, true).toUserNamesListMarkdownString(res)
732+
)
733+
},
703734
normalStyle,
704735
boldStyle,
705736
normalColor,

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

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ package com.wire.android.ui.home.conversations.model
2222

2323
import android.content.res.Resources
2424
import androidx.annotation.DrawableRes
25+
import androidx.annotation.PluralsRes
2526
import androidx.annotation.StringRes
2627
import androidx.compose.runtime.Stable
2728
import com.wire.android.R
@@ -30,6 +31,7 @@ import com.wire.android.model.UserAvatarData
3031
import com.wire.android.ui.home.conversationslist.model.Membership
3132
import com.wire.android.ui.home.messagecomposer.SelfDeletionDuration
3233
import com.wire.android.util.Copyable
34+
import com.wire.android.util.ui.LocalizedStringResource
3335
import com.wire.android.util.ui.UIText
3436
import com.wire.android.util.uiMessageDateTime
3537
import com.wire.kalium.logic.data.conversation.ClientId
@@ -279,11 +281,32 @@ sealed class UIMessageContent {
279281

280282
sealed class SystemMessage(
281283
@DrawableRes val iconResId: Int?,
282-
@StringRes open val stringResId: Int,
284+
open val stringResId: LocalizedStringResource,
283285
@StringRes val learnMoreResId: Int? = null,
284286
val isSmallIcon: Boolean = true,
285287
) : UIMessageContent() {
286288

289+
constructor(
290+
@DrawableRes iconResId: Int?,
291+
@StringRes stringResId: Int,
292+
isSmallIcon: Boolean = true,
293+
@StringRes learnMoreResId: Int? = null
294+
) : this(iconResId, LocalizedStringResource.StringResource(stringResId), learnMoreResId, isSmallIcon)
295+
296+
constructor(
297+
@DrawableRes iconResId: Int?,
298+
@PluralsRes stringResId: Int,
299+
quantity: Int,
300+
formatArgs: List<UIText>,
301+
isSmallIcon: Boolean = true,
302+
@StringRes learnMoreResId: Int? = null
303+
) : this(
304+
iconResId,
305+
LocalizedStringResource.PluralResource(stringResId, quantity, formatArgs.toTypedArray()),
306+
learnMoreResId,
307+
isSmallIcon
308+
)
309+
287310
data class Knock(val author: UIText, val isSelfTriggered: Boolean) : SystemMessage(
288311
R.drawable.ic_ping,
289312
if (isSelfTriggered) R.string.label_system_message_self_user_knock else R.string.label_system_message_other_user_knock
@@ -319,6 +342,16 @@ sealed class UIMessageContent {
319342
if (isSelfTriggered) R.string.label_system_message_removed_by_self else R.string.label_system_message_removed_by_other
320343
)
321344

345+
data class TeamMemberRemoved(
346+
val author: UIText,
347+
val memberNames: List<UIText>,
348+
) : SystemMessage(
349+
R.drawable.ic_minus,
350+
R.plurals.label_system_message_team_member_left,
351+
quantity = memberNames.size,
352+
formatArgs = memberNames
353+
)
354+
322355
data class MemberLeft(
323356
val author: UIText,
324357
val isSelfTriggered: Boolean = false
@@ -356,7 +389,7 @@ sealed class UIMessageContent {
356389

357390
sealed class MissedCall(
358391
open val author: UIText,
359-
@StringRes override val stringResId: Int
392+
@StringRes stringResId: Int
360393
) : SystemMessage(R.drawable.ic_call_end, stringResId) {
361394

362395
data class YouCalled(override val author: UIText) : MissedCall(author, R.string.label_system_message_you_called)
@@ -366,8 +399,16 @@ sealed class UIMessageContent {
366399
data class RenamedConversation(val author: UIText, val content: MessageContent.ConversationRenamed) :
367400
SystemMessage(R.drawable.ic_edit, R.string.label_system_message_renamed_the_conversation)
368401

369-
data class TeamMemberRemoved(val content: MessageContent.TeamMemberRemoved) :
370-
SystemMessage(R.drawable.ic_minus, R.string.label_system_message_team_member_left)
402+
@Deprecated("Use TeamMemberRemoved")
403+
@Suppress("ClassNaming")
404+
data class TeamMemberRemoved_Legacy(val content: MessageContent.TeamMemberRemoved) :
405+
SystemMessage(
406+
R.drawable.ic_minus,
407+
R.plurals.label_system_message_team_member_left,
408+
quantity = 0,
409+
formatArgs = emptyList(),
410+
true
411+
)
371412

372413
data class CryptoSessionReset(val author: UIText) :
373414
SystemMessage(R.drawable.ic_info, R.string.label_system_message_session_reset)
@@ -493,18 +534,25 @@ sealed class UIMessageContent {
493534
)
494535

495536
sealed class LegalHold(
496-
@StringRes stringResId: Int,
537+
stringResId: LocalizedStringResource.StringResource,
497538
@StringRes learnMoreResId: Int? = null,
498539
open val memberNames: List<UIText>? = null,
499540
) : SystemMessage(R.drawable.ic_legal_hold, stringResId, learnMoreResId) {
500541

501-
sealed class Enabled(@StringRes override val stringResId: Int) : LegalHold(stringResId, R.string.url_legal_hold_learn_more) {
542+
sealed class Enabled(override val stringResId: LocalizedStringResource.StringResource) :
543+
LegalHold(stringResId, R.string.url_legal_hold_learn_more) {
544+
545+
constructor(@StringRes stringResId: Int) : this(LocalizedStringResource.StringResource(stringResId))
546+
502547
data object Self : Enabled(R.string.legal_hold_system_message_enabled_self)
503548
data class Others(override val memberNames: List<UIText>) : Enabled(R.string.legal_hold_system_message_enabled_others)
504549
data object Conversation : Enabled(R.string.legal_hold_system_message_enabled_conversation)
505550
}
506551

507-
sealed class Disabled(@StringRes override val stringResId: Int) : LegalHold(stringResId, null) {
552+
sealed class Disabled(override val stringResId: LocalizedStringResource.StringResource) : LegalHold(stringResId, null) {
553+
554+
constructor(@StringRes stringResId: Int) : this(LocalizedStringResource.StringResource(stringResId))
555+
508556
data object Self : Disabled(R.string.legal_hold_system_message_disabled_self)
509557
data class Others(override val memberNames: List<UIText>) : Disabled(R.string.legal_hold_system_message_disabled_others)
510558
data object Conversation : Disabled(R.string.legal_hold_system_message_disabled_conversation)

0 commit comments

Comments
 (0)