QA fixes for Groups V2 (#946)

* SES-3303 - proper URL for groups banner

* SES-3301 - fixing display of legacy group control mesasges

* SES-3304 - No admin state dialogs while DEPRECATED

Updated debug menu with confirm dialog when changing deprecation state

* SES-3307 fixing legacy user view

* SES-3308 - not overwritting the last character in group banners
pull/1709/head
ThomasSession 2 months ago committed by GitHub
parent 42a536fef7
commit 1cb39c9b5f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -855,6 +855,9 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
binding.outdatedGroupBanner.isVisible = true
binding.outdatedGroupBanner.text = SpannableStringBuilder(banner)
.apply {
// Append a space as a placeholder
append(" ")
// we need to add the inline icon
val drawable = ContextCompat.getDrawable(this@ConversationActivityV2, R.drawable.ic_external)!!
val imageSize = toPx(10, resources)
@ -874,7 +877,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
}
binding.outdatedGroupBanner.setOnClickListener {
showOpenUrlDialog("https://getsession.org/blog/session-groups-v2")
showOpenUrlDialog("https://getsession.org/groups")
}
}
}

@ -1049,6 +1049,7 @@ class ConversationViewModel(
factory = configFactory,
storage = storage,
groupManager = groupManagerV2,
deprecationManager = legacyGroupDeprecationManager,
)
if (inProgress != null) {

@ -192,6 +192,7 @@ object ConversationMenuHelper {
factory: ConfigFactory,
storage: StorageProtocol,
groupManager: GroupManagerV2,
deprecationManager: LegacyGroupDeprecationManager,
): ReceiveChannel<GroupLeavingStatus>? {
when (item.itemId) {
R.id.menu_view_all_media -> { showAllMedia(context, thread) }
@ -205,7 +206,9 @@ object ConversationMenuHelper {
R.id.menu_copy_open_group_url -> { copyOpenGroupUrl(context, thread) }
R.id.menu_edit_group -> { editGroup(context, thread) }
R.id.menu_group_members -> { showGroupMembers(context, thread) }
R.id.menu_leave_group -> { return leaveGroup(context, thread, threadID, factory, storage, groupManager) }
R.id.menu_leave_group -> { return leaveGroup(
context, thread, threadID, factory, storage, groupManager, deprecationManager
) }
R.id.menu_invite_to_open_group -> { inviteContacts(context, thread) }
R.id.menu_unmute_notifications -> { unmute(context, thread) }
R.id.menu_mute_notifications -> { mute(context, thread) }
@ -374,20 +377,27 @@ object ConversationMenuHelper {
configFactory: ConfigFactory,
storage: StorageProtocol,
groupManager: GroupManagerV2,
deprecationManager: LegacyGroupDeprecationManager,
): ReceiveChannel<GroupLeavingStatus>? {
val channel = Channel<GroupLeavingStatus>()
when {
thread.isLegacyGroupRecipient -> {
val group = DatabaseComponent.get(context).groupDatabase().getGroup(thread.address.toGroupString()).orNull()
val admins = group.admins
val accountID = TextSecurePreferences.getLocalNumber(context)
val isCurrentUserAdmin = admins.any { it.toString() == accountID }
// we do not want admin related messaging once legacy groups are deprecated
val isGroupAdmin = if(deprecationManager.isDeprecated){
false
} else { // prior to the deprecated state, calculate admin rights properly
val admins = group.admins
val accountID = TextSecurePreferences.getLocalNumber(context)
admins.any { it.toString() == accountID }
}
confirmAndLeaveGroup(
context = context,
groupName = group.title,
isAdmin = isCurrentUserAdmin,
isAdmin = isGroupAdmin,
isKicked = configFactory.wasKickedFromGroupV2(thread),
threadID = threadID,
storage = storage,

@ -140,13 +140,13 @@ public abstract class MessageRecord extends DisplayRecord {
UpdateMessageData updateMessageData = getGroupUpdateMessage();
Recipient groupRecipient = DatabaseComponent.get(context).threadDatabase().getRecipientForThreadId(getThreadId());
if (updateMessageData == null || groupRecipient == null || !groupRecipient.isGroupV2Recipient()) {
if (updateMessageData == null || groupRecipient == null) {
return "";
}
SpannableString text = new SpannableString(UpdateMessageBuilder.buildGroupUpdateMessage(
context,
new AccountId(groupRecipient.getAddress().serialize()),
groupRecipient.isGroupV2Recipient() ? new AccountId(groupRecipient.getAddress().serialize()) : null, // accountId is only used for GroupsV2
updateMessageData,
MessagingModuleConfiguration.getShared().getConfigFactory(),
isOutgoing(),

@ -1,6 +1,5 @@
package org.thoughtcrime.securesms.debugmenu
import android.widget.TimePicker
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
@ -44,9 +43,7 @@ import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.tooling.preview.Preview
import network.loki.messenger.BuildConfig
import network.loki.messenger.R
import org.thoughtcrime.securesms.debugmenu.DebugMenuViewModel.Commands.ChangeEnvironment
import org.thoughtcrime.securesms.debugmenu.DebugMenuViewModel.Commands.HideEnvironmentWarningDialog
import org.thoughtcrime.securesms.debugmenu.DebugMenuViewModel.Commands.ShowEnvironmentWarningDialog
import org.thoughtcrime.securesms.debugmenu.DebugMenuViewModel.Commands.*
import org.session.libsession.messaging.groups.LegacyGroupDeprecationManager
import org.thoughtcrime.securesms.ui.AlertDialog
import org.thoughtcrime.securesms.ui.Cell
@ -106,6 +103,25 @@ fun DebugMenu(
}
// Alert dialogs
if (uiState.showDeprecatedStateWarningDialog) {
AlertDialog(
onDismissRequest = { sendCommand(HideEnvironmentWarningDialog) },
title = "Are you sure you want to change the deprecation state?",
text = "This will restart the app...",
showCloseButton = false, // don't display the 'x' button
buttons = listOf(
DialogButtonModel(
text = GetString(R.string.cancel),
onClick = { sendCommand(HideDeprecationChangeDialog) }
),
DialogButtonModel(
text = GetString(R.string.ok),
onClick = { sendCommand(OverrideDeprecationState) }
)
)
)
}
if (uiState.showEnvironmentWarningDialog) {
AlertDialog(
onDismissRequest = { sendCommand(HideEnvironmentWarningDialog) },
@ -125,8 +141,8 @@ fun DebugMenu(
)
}
if (uiState.showEnvironmentLoadingDialog) {
LoadingDialog(title = "Changing Environment...")
if (uiState.showLoadingDialog) {
LoadingDialog(title = "Applying changes...")
}
Column(
@ -204,7 +220,7 @@ fun DebugMenu(
val override = LegacyGroupDeprecationManager.DeprecationState.entries
.firstOrNull { it.displayName == selected }
sendCommand(DebugMenuViewModel.Commands.OverrideDeprecationState(override))
sendCommand(ShowDeprecationChangeDialog(override))
}
DebugRow(title = "Deprecating start date", modifier = Modifier.clickable {
@ -414,7 +430,8 @@ fun PreviewDebugMenu() {
environments = listOf("Development", "Production"),
snackMessage = null,
showEnvironmentWarningDialog = false,
showEnvironmentLoadingDialog = false,
showLoadingDialog = false,
showDeprecatedStateWarningDialog = false,
hideMessageRequests = true,
hideNoteToSelf = false,
forceDeprecationState = null,

@ -34,7 +34,8 @@ class DebugMenuViewModel @Inject constructor(
environments = Environment.entries.map { it.label },
snackMessage = null,
showEnvironmentWarningDialog = false,
showEnvironmentLoadingDialog = false,
showLoadingDialog = false,
showDeprecatedStateWarningDialog = false,
hideMessageRequests = textSecurePreferences.hasHiddenMessageRequests(),
hideNoteToSelf = textSecurePreferences.hasHiddenNoteToSelf(),
forceDeprecationState = deprecationManager.deprecationStateOverride.value,
@ -48,6 +49,8 @@ class DebugMenuViewModel @Inject constructor(
private var temporaryEnv: Environment? = null
private var temporaryDeprecatedState: LegacyGroupDeprecationManager.DeprecationState? = null
fun onCommand(command: Commands) {
when (command) {
is Commands.ChangeEnvironment -> changeEnvironment()
@ -72,8 +75,19 @@ class DebugMenuViewModel @Inject constructor(
}
is Commands.OverrideDeprecationState -> {
deprecationManager.overrideDeprecationState(command.state)
_uiState.value = _uiState.value.copy(forceDeprecationState = command.state)
if(temporaryDeprecatedState == null) return
_uiState.value = _uiState.value.copy(forceDeprecationState = temporaryDeprecatedState,
showLoadingDialog = true)
deprecationManager.overrideDeprecationState(temporaryDeprecatedState)
// restart app
viewModelScope.launch {
delay(500) // giving time to save data
ApplicationContext.getInstance(application).restartApplication()
}
}
is Commands.OverrideDeprecatedTime -> {
@ -85,6 +99,12 @@ class DebugMenuViewModel @Inject constructor(
deprecationManager.overrideDeprecatingStartTime(command.time)
_uiState.value = _uiState.value.copy(deprecatingStartTime = command.time)
}
is Commands.HideDeprecationChangeDialog ->
_uiState.value = _uiState.value.copy(showDeprecatedStateWarningDialog = false)
is Commands.ShowDeprecationChangeDialog ->
showDeprecatedStateWarningDialog(command.state)
}
}
@ -103,7 +123,7 @@ class DebugMenuViewModel @Inject constructor(
// show a loading state
_uiState.value = _uiState.value.copy(
showEnvironmentWarningDialog = false,
showEnvironmentLoadingDialog = true
showLoadingDialog = true
)
// clear remote and local data, then restart the app
@ -117,7 +137,7 @@ class DebugMenuViewModel @Inject constructor(
} else {
_uiState.value = _uiState.value.copy(
showEnvironmentWarningDialog = false,
showEnvironmentLoadingDialog = false
showLoadingDialog = false
)
Log.e(TAG, "Failed to force sync when deleting data")
_uiState.value = _uiState.value.copy(snackMessage = "Sorry, something went wrong...")
@ -127,12 +147,21 @@ class DebugMenuViewModel @Inject constructor(
}
}
private fun showDeprecatedStateWarningDialog(state: LegacyGroupDeprecationManager.DeprecationState?) {
if(state == _uiState.value.forceDeprecationState) return
temporaryDeprecatedState = state
_uiState.value = _uiState.value.copy(showDeprecatedStateWarningDialog = true)
}
data class UIState(
val currentEnvironment: String,
val environments: List<String>,
val snackMessage: String?,
val showEnvironmentWarningDialog: Boolean,
val showEnvironmentLoadingDialog: Boolean,
val showLoadingDialog: Boolean,
val showDeprecatedStateWarningDialog: Boolean,
val hideMessageRequests: Boolean,
val hideNoteToSelf: Boolean,
val forceDeprecationState: LegacyGroupDeprecationManager.DeprecationState?,
@ -147,7 +176,9 @@ class DebugMenuViewModel @Inject constructor(
object HideEnvironmentWarningDialog : Commands()
data class HideMessageRequest(val hide: Boolean) : Commands()
data class HideNoteToSelf(val hide: Boolean) : Commands()
data class OverrideDeprecationState(val state: LegacyGroupDeprecationManager.DeprecationState?) : Commands()
data class ShowDeprecationChangeDialog(val state: LegacyGroupDeprecationManager.DeprecationState?) : Commands()
object HideDeprecationChangeDialog : Commands()
object OverrideDeprecationState : Commands()
data class OverrideDeprecatedTime(val time: ZonedDateTime) : Commands()
data class OverrideDeprecatingStartTime(val time: ZonedDateTime) : Commands()
}

@ -35,6 +35,7 @@ import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import org.session.libsession.messaging.groups.GroupManagerV2
import org.session.libsession.messaging.groups.LegacyGroupDeprecationManager
import org.session.libsession.messaging.jobs.JobQueue
import org.session.libsession.messaging.sending_receiving.notifications.MessageNotifier
import org.session.libsession.snode.SnodeClock
@ -101,6 +102,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
@Inject lateinit var textSecurePreferences: TextSecurePreferences
@Inject lateinit var configFactory: ConfigFactory
@Inject lateinit var groupManagerV2: GroupManagerV2
@Inject lateinit var deprecationManager: LegacyGroupDeprecationManager
@Inject lateinit var lokiThreadDatabase: LokiThreadDatabase
@Inject lateinit var sessionJobDatabase: SessionJobDatabase
@Inject lateinit var clock: SnodeClock
@ -589,6 +591,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
configFactory = configFactory,
storage = storage,
groupManager = groupManagerV2,
deprecationManager = deprecationManager
)
return
@ -636,7 +639,14 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
positiveButtonId = R.string.leave
// If you are an admin of this group you can delete it
if (group != null && group.admins.map { it.toString() }.contains(textSecurePreferences.getLocalNumber())) {
// we do not want admin related messaging once legacy groups are deprecated
val isGroupAdmin = if(deprecationManager.isDeprecated){
false
} else { // prior to the deprecated state, calculate admin rights properly
group.admins.map { it.toString() }.contains(textSecurePreferences.getLocalNumber())
}
if (group != null && isGroupAdmin) {
title = getString(R.string.groupLeave)
message = Phrase.from(this, R.string.groupLeaveDescriptionAdmin)
.put(GROUP_NAME_KEY, group.title)

@ -18,22 +18,29 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:paddingVertical="@dimen/medium_spacing"
android:clipToPadding="false"
android:clipChildren="false">
<org.thoughtcrime.securesms.components.ProfilePictureView
android:id="@+id/profilePictureView"
android:layout_width="@dimen/small_profile_picture_size"
android:layout_height="@dimen/small_profile_picture_size"
android:layout_marginTop="3dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:clipToPadding="false"
android:clipChildren="false"/>
<ImageView
android:id="@+id/adminIcon"
android:layout_width="16dp"
android:layout_height="16dp"
android:src="@drawable/ic_crown_custom"
android:layout_marginEnd="-1dp"
android:clipToPadding="false"
android:clipChildren="false"
android:layout_marginBottom="-1dp"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"

@ -38,15 +38,15 @@ object UpdateMessageBuilder {
?.displayName(Contact.ContactContext.REGULAR)
?: truncateIdForDisplay(senderId)
private fun getGroupMemberName(groupId: AccountId, memberId: String) =
private fun getGroupMemberName(groupId: AccountId?, memberId: String) =
storage.getContactWithAccountID(memberId)?.displayName(Contact.ContactContext.REGULAR)
?: MessagingModuleConfiguration.shared.configFactory.withGroupConfigs(groupId) { it.groupMembers.getOrNull(memberId)?.name }
?: groupId?.let{ MessagingModuleConfiguration.shared.configFactory.withGroupConfigs(it) { it.groupMembers.getOrNull(memberId)?.name } }
?: truncateIdForDisplay(memberId)
@JvmStatic
fun buildGroupUpdateMessage(
context: Context,
groupId: AccountId,
groupV2Id: AccountId?, // null for legacy groups
updateMessageData: UpdateMessageData,
configFactory: ConfigFactoryProtocol,
isOutgoing: Boolean,
@ -86,19 +86,19 @@ object UpdateMessageBuilder {
}
1 -> {
Phrase.from(context, R.string.legacyGroupMemberNew)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0)))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0)))
.format()
}
2 -> {
Phrase.from(context, R.string.legacyGroupMemberTwoNew)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0)))
.put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(1)))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0)))
.put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(1)))
.format()
}
else -> {
val newMemberCountMinusOne = newMemberCount - 1
Phrase.from(context, R.string.legacyGroupMemberNewMultiple)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0)))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0)))
.put(COUNT_KEY, newMemberCountMinusOne)
.format()
}
@ -126,14 +126,14 @@ object UpdateMessageBuilder {
"" // Return an empty string - we don't want to show the error in the conversation
}
1 -> Phrase.from(context, R.string.groupRemoved)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0)))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0)))
.format()
2 -> Phrase.from(context, R.string.groupRemovedTwo)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0)))
.put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(1)))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0)))
.put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(1)))
.format()
else -> Phrase.from(context, R.string.groupRemovedMultiple)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0)))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0)))
.put(COUNT_KEY, updateData.updatedMembers.size - 1)
.format()
}
@ -150,14 +150,14 @@ object UpdateMessageBuilder {
"" // Return an empty string - we don't want to show the error in the conversation
}
1 -> Phrase.from(context, R.string.groupRemoved)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0)))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0)))
.format()
2 -> Phrase.from(context, R.string.groupRemovedTwo)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0)))
.put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(1)))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0)))
.put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(1)))
.format()
else -> Phrase.from(context, R.string.groupRemovedMultiple)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0)))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0)))
.put(COUNT_KEY, updateData.updatedMembers.size - 1)
.format()
}
@ -173,14 +173,14 @@ object UpdateMessageBuilder {
"" // Return an empty string - we don't want to show the error in the conversation
}
1 -> Phrase.from(context, R.string.groupMemberLeft)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0)))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0)))
.format()
2 -> Phrase.from(context, R.string.groupMemberLeftTwo)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0)))
.put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(1)))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0)))
.put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(1)))
.format()
else -> Phrase.from(context, R.string.groupMemberLeftMultiple)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0)))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0)))
.put(COUNT_KEY, updateData.updatedMembers.size - 1)
.format()
}
@ -208,16 +208,16 @@ object UpdateMessageBuilder {
.format()
number == 1 -> Phrase.from(context,
if (historyShared) R.string.groupMemberNewHistory else R.string.groupMemberNew)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first()))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first()))
.format()
number == 2 && containsUser -> Phrase.from(context,
if (historyShared) R.string.groupMemberNewYouHistoryTwo else R.string.groupInviteYouAndOtherNew)
.put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first { it != userPublicKey }))
.put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first { it != userPublicKey }))
.format()
number == 2 -> Phrase.from(context,
if (historyShared) R.string.groupMemberNewHistoryTwo else R.string.groupMemberNewTwo)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first()))
.put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.last()))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first()))
.put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.last()))
.format()
containsUser -> Phrase.from(context,
if (historyShared) R.string.groupMemberNewYouHistoryMultiple else R.string.groupInviteYouAndMoreNew)
@ -225,7 +225,7 @@ object UpdateMessageBuilder {
.format()
number > 0 -> Phrase.from(context,
if (historyShared) R.string.groupMemberNewHistoryMultiple else R.string.groupMemberNewMultiple)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first()))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first()))
.put(COUNT_KEY, updateData.sessionIds.size - 1)
.format()
else -> ""
@ -239,16 +239,16 @@ object UpdateMessageBuilder {
)
number == 1 -> Phrase.from(context,
R.string.adminPromotedToAdmin)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first()))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first()))
.format()
number == 2 && containsUser -> Phrase.from(context,
R.string.groupPromotedYouTwo)
.put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first{ it != userPublicKey }))
.put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first{ it != userPublicKey }))
.format()
number == 2 -> Phrase.from(context,
R.string.adminTwoPromotedToAdmin)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first()))
.put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.last()))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first()))
.put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.last()))
.format()
containsUser -> Phrase.from(context,
R.string.groupPromotedYouMultiple)
@ -256,7 +256,7 @@ object UpdateMessageBuilder {
.format()
else -> Phrase.from(context,
R.string.adminMorePromotedToAdmin)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first()))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first()))
.put(COUNT_KEY, updateData.sessionIds.size - 1)
.format()
}
@ -268,16 +268,16 @@ object UpdateMessageBuilder {
R.string.groupRemovedYouGeneral).format()
number == 1 -> Phrase.from(context,
R.string.groupRemoved)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first()))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first()))
.format()
number == 2 && containsUser -> Phrase.from(context,
R.string.groupRemovedYouTwo)
.put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first { it != userPublicKey }))
.put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first { it != userPublicKey }))
.format()
number == 2 -> Phrase.from(context,
R.string.groupRemovedTwo)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first()))
.put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.last()))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first()))
.put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.last()))
.format()
containsUser -> Phrase.from(context,
R.string.groupRemovedYouMultiple)
@ -285,7 +285,7 @@ object UpdateMessageBuilder {
.format()
else -> Phrase.from(context,
R.string.groupRemovedMultiple)
.put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first()))
.put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first()))
.put(COUNT_KEY, updateData.sessionIds.size - 1)
.format()
}
@ -295,7 +295,7 @@ object UpdateMessageBuilder {
}
is UpdateMessageData.Kind.GroupInvitation -> {
val approved = configFactory.getGroup(AccountId(updateData.groupAccountId))?.invited == false
val inviterName = updateData.invitingAdminName?.takeIf { it.isNotEmpty() } ?: getGroupMemberName(groupId, updateData.invitingAdminId)
val inviterName = updateData.invitingAdminName?.takeIf { it.isNotEmpty() } ?: getGroupMemberName(groupV2Id, updateData.invitingAdminId)
return if (!approved) {
Phrase.from(context, R.string.messageRequestGroupInvite)
.put(NAME_KEY, inviterName)
@ -321,7 +321,6 @@ object UpdateMessageBuilder {
}
}
private fun Context.youOrSender(sessionId: String) = if (storage.getUserPublicKey() == sessionId) getString(R.string.you) else getSenderName(sessionId)
fun buildExpirationTimerMessage(
context: Context,

Loading…
Cancel
Save