Skip to content

Commit e98bb43

Browse files
authored
Fixes: Manage members and admins (#1811)
* Fixed empty invite contacts flag * Fixed wrong string when inviting via Account ID * Fix Cancel button not dismissing invite contact modal * Share history UI flag * Fix control message for shared history * Updated promote member to use supervisorScope and avoid supressed exception * Update Remove member/members string * Fix promote member failure message, fix sending/resending promotion strings
1 parent c39242d commit e98bb43

File tree

7 files changed

+56
-38
lines changed

7 files changed

+56
-38
lines changed

app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/MessageFormatter.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -398,15 +398,15 @@ class MessageFormatter @Inject constructor(
398398
if (historyShared) R.string.groupInviteYouHistory else R.string.groupInviteYou)
399399
.format()
400400
number == 1 -> Phrase.from(context,
401-
if (historyShared) R.string.groupMemberNewHistory else R.string.groupMemberNew)
401+
if (historyShared) R.string.groupMemberInvitedHistory else R.string.groupMemberNew)
402402
.put(NAME_KEY, getGroupMemberName(updateData.sessionIds.first()))
403403
.format()
404404
number == 2 && containsUser -> Phrase.from(context,
405405
if (historyShared) R.string.groupMemberNewYouHistoryTwo else R.string.groupInviteYouAndOtherNew)
406406
.put(OTHER_NAME_KEY, getGroupMemberName(updateData.sessionIds.first { it != userPublicKey }))
407407
.format()
408408
number == 2 -> Phrase.from(context,
409-
if (historyShared) R.string.groupMemberNewHistoryTwo else R.string.groupMemberNewTwo)
409+
if (historyShared) R.string.groupMemberInvitedHistoryTwo else R.string.groupMemberNewTwo)
410410
.put(NAME_KEY, getGroupMemberName(updateData.sessionIds.first()))
411411
.put(OTHER_NAME_KEY, getGroupMemberName(updateData.sessionIds.last()))
412412
.format()
@@ -415,7 +415,7 @@ class MessageFormatter @Inject constructor(
415415
.put(COUNT_KEY, updateData.sessionIds.size - 1)
416416
.format()
417417
number > 0 -> Phrase.from(context,
418-
if (historyShared) R.string.groupMemberNewHistoryMultiple else R.string.groupMemberNewMultiple)
418+
if (historyShared) R.string.groupMemberInvitedHistoryMultiple else R.string.groupMemberNewMultiple)
419419
.put(NAME_KEY, getGroupMemberName(updateData.sessionIds.first()))
420420
.put(COUNT_KEY, updateData.sessionIds.size - 1)
421421
.format()

app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import com.google.protobuf.ByteString
55
import com.squareup.phrase.Phrase
66
import dagger.hilt.android.qualifiers.ApplicationContext
77
import kotlinx.coroutines.Dispatchers
8-
import kotlinx.coroutines.SupervisorJob
98
import kotlinx.coroutines.async
109
import kotlinx.coroutines.flow.filter
1110
import kotlinx.coroutines.flow.first
11+
import kotlinx.coroutines.supervisorScope
1212
import kotlinx.coroutines.withContext
1313
import kotlinx.coroutines.withTimeout
1414
import network.loki.messenger.R
@@ -348,7 +348,11 @@ class GroupManagerV2Impl @Inject constructor(
348348
} finally {
349349
// Send a group update message to the group telling members someone has been invited
350350
if (!isReinvite) {
351-
sendGroupUpdateForAddingMembers(group, adminKey, memberInvites.map { it.id })
351+
sendGroupUpdateForAddingMembers(
352+
group,
353+
adminKey,
354+
memberInvites.map { it.id },
355+
shareHistory = memberInvites.any { it.shareHistory }) // This is the same for all members/contact invited
352356
}
353357
}
354358

@@ -369,6 +373,7 @@ class GroupManagerV2Impl @Inject constructor(
369373
group: AccountId,
370374
adminKey: ByteArray,
371375
newMembers: Collection<AccountId>,
376+
shareHistory : Boolean = false
372377
) {
373378
val timestamp = clock.currentTimeMills()
374379
val signature = ED25519.sign(
@@ -383,6 +388,7 @@ class GroupManagerV2Impl @Inject constructor(
383388
.addAllMemberSessionIds(newMembers.sortedWith(groupMemberComparator).map { it.hexString })
384389
.setType(GroupUpdateMemberChangeMessage.Type.ADDED)
385390
.setAdminSignature(ByteString.copyFrom(signature))
391+
.setHistoryShared(shareHistory)
386392
)
387393
.build()
388394
).apply { this.sentTimestamp = timestamp }
@@ -506,7 +512,7 @@ class GroupManagerV2Impl @Inject constructor(
506512
members: List<AccountId>,
507513
isRepromote: Boolean
508514
): Unit = scope.launchAndWait(group, "Promote member") {
509-
withContext(SupervisorJob()) {
515+
supervisorScope {
510516
val adminKey = requireAdminAccess(group)
511517
val groupName = configFactory.withMutableGroupConfigs(group) { configs ->
512518
// Update the group member's promotion status
@@ -521,15 +527,19 @@ class GroupManagerV2Impl @Inject constructor(
521527
// Build a group update message to the group telling members someone has been promoted
522528
val timestamp = clock.currentTimeMills()
523529
val signature = ED25519.sign(
524-
message = buildMemberChangeSignature(GroupUpdateMemberChangeMessage.Type.PROMOTED, timestamp),
530+
message = buildMemberChangeSignature(
531+
GroupUpdateMemberChangeMessage.Type.PROMOTED,
532+
timestamp
533+
),
525534
ed25519PrivateKey = adminKey
526535
)
527536

528537
val message = GroupUpdated(
529538
GroupUpdateMessage.newBuilder()
530539
.setMemberChangeMessage(
531540
GroupUpdateMemberChangeMessage.newBuilder()
532-
.addAllMemberSessionIds(members.sortedWith(groupMemberComparator).map { it.hexString })
541+
.addAllMemberSessionIds(
542+
members.sortedWith(groupMemberComparator).map { it.hexString })
533543
.setType(GroupUpdateMemberChangeMessage.Type.PROMOTED)
534544
.setAdminSignature(ByteString.copyFrom(signature))
535545
)
@@ -612,6 +622,7 @@ class GroupManagerV2Impl @Inject constructor(
612622
}
613623
}
614624
}
625+
615626
/**
616627
* Mark this member as "removed" in the group config.
617628
*

app/src/main/java/org/thoughtcrime/securesms/groups/InviteMembersViewModel.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,7 @@ class InviteMembersViewModel @AssistedInject constructor(
9999
.put(NAME_KEY, firstMember?.name)
100100
.format()
101101
} else {
102-
// TODO: Need to add String in Crowdin
103-
context.getString(R.string.membersInviteShareDescription)
102+
context.getString(R.string.shareGroupMessageHistory)
104103
}
105104
}
106105
2 -> {

app/src/main/java/org/thoughtcrime/securesms/groups/ManageGroupAdminsViewModel.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,13 +147,13 @@ class ManageGroupAdminsViewModel @AssistedInject constructor(
147147

148148
val accountIds = members.map { it.accountId }
149149

150-
val resendingText = context.resources.getQuantityString(
151-
R.plurals.resendingPromotion,
150+
val sendingPromotionText = context.resources.getQuantityString(
151+
if (isRepromote) R.plurals.resendingPromotion else R.plurals.sendingPromotion,
152152
accountIds.size,
153153
accountIds.size
154154
)
155155

156-
showToast(resendingText)
156+
showToast(sendingPromotionText)
157157

158158
performGroupOperationCore(
159159
showLoading = false,

app/src/main/java/org/thoughtcrime/securesms/groups/ManageGroupMembersViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ class ManageGroupMembersViewModel @AssistedInject constructor(
329329
}
330330

331331
val removeMemberOnly =
332-
context.resources.getQuantityString(R.plurals.removeMember, count, count)
332+
context.resources.getQuantityString(R.plurals.removeMemberLowercase, count, count)
333333
val removeMessages =
334334
context.resources.getQuantityString(R.plurals.removeMemberMessages, count, count)
335335

app/src/main/java/org/thoughtcrime/securesms/groups/compose/Components.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ fun InviteMembersDialog(
190190
onInviteClicked: (Boolean) -> Unit,
191191
onDismiss: () -> Unit,
192192
) {
193-
var shareHistory by remember { mutableStateOf(false) }
193+
var shareHistory by remember { mutableStateOf(true) }
194194

195195
AlertDialog(
196196
modifier = modifier,
@@ -205,20 +205,20 @@ fun InviteMembersDialog(
205205
option = RadioOption(
206206
value = Unit,
207207
title = GetString(LocalResources.current.getString(R.string.membersInviteShareMessageHistoryDays)),
208-
selected = !shareHistory
208+
selected = shareHistory
209209
)
210210
) {
211-
shareHistory = false
211+
shareHistory = true
212212
}
213213

214214
DialogTitledRadioButton(
215215
option = RadioOption(
216216
value = Unit,
217217
title = GetString(LocalResources.current.getString(R.string.membersInviteShareNewMessagesOnly)),
218-
selected = shareHistory,
218+
selected = !shareHistory,
219219
)
220220
) {
221-
shareHistory = true
221+
shareHistory = false
222222
}
223223
},
224224
buttons = listOf(

app/src/main/java/org/thoughtcrime/securesms/groups/compose/InviteContactsScreen.kt

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import org.thoughtcrime.securesms.groups.InviteMembersViewModel.Commands.SearchF
3939
import org.thoughtcrime.securesms.groups.InviteMembersViewModel.Commands.SearchQueryChange
4040
import org.thoughtcrime.securesms.groups.InviteMembersViewModel.Commands.ShowSendInviteDialog
4141
import org.thoughtcrime.securesms.groups.InviteMembersViewModel.Commands.ToggleFooter
42+
import org.thoughtcrime.securesms.groups.InviteMembersViewModel.Commands.DismissSendInviteDialog
4243
import org.thoughtcrime.securesms.ui.CollapsibleFooterAction
4344
import org.thoughtcrime.securesms.ui.CollapsibleFooterActionData
4445
import org.thoughtcrime.securesms.ui.CollapsibleFooterItemData
@@ -66,6 +67,7 @@ fun InviteContactsScreen(
6667
contacts = viewModel.contacts.collectAsState().value,
6768
uiState = viewModel.uiState.collectAsState().value,
6869
searchQuery = viewModel.searchQuery.collectAsState().value,
70+
hasContacts = viewModel.hasContacts.collectAsState().value,
6971
onDoneClicked = onDoneClicked,
7072
onBack = onBack,
7173
banner = banner,
@@ -80,6 +82,7 @@ fun InviteContacts(
8082
contacts: List<ContactItem>,
8183
uiState: InviteMembersViewModel.UiState,
8284
searchQuery: String,
85+
hasContacts: Boolean,
8386
onDoneClicked: (shareHistory: Boolean) -> Unit,
8487
onBack: () -> Unit,
8588
banner: @Composable () -> Unit = {},
@@ -144,30 +147,32 @@ fun InviteContacts(
144147
) {
145148
Spacer(modifier = Modifier.height(LocalDimensions.current.smallSpacing))
146149

147-
SearchBarWithClose(
148-
query = searchQuery,
149-
onValueChanged = { query -> sendCommand(SearchQueryChange(query)) },
150-
onClear = { sendCommand(SearchQueryChange("")) },
151-
placeholder = stringResource(R.string.searchContacts),
152-
modifier = Modifier
153-
.padding(horizontal = LocalDimensions.current.smallSpacing)
154-
.qaTag(R.string.AccessibilityId_groupNameSearch),
155-
backgroundColor = LocalColors.current.backgroundSecondary,
156-
isFocused = uiState.isSearchFocused,
157-
onFocusChanged = { isFocused -> sendCommand(SearchFocusChange(isFocused)) },
158-
enabled = true,
159-
)
150+
if (hasContacts) {
151+
SearchBarWithClose(
152+
query = searchQuery,
153+
onValueChanged = { query -> sendCommand(SearchQueryChange(query)) },
154+
onClear = { sendCommand(SearchQueryChange("")) },
155+
placeholder = stringResource(R.string.searchContacts),
156+
modifier = Modifier
157+
.padding(horizontal = LocalDimensions.current.smallSpacing)
158+
.qaTag(R.string.AccessibilityId_groupNameSearch),
159+
backgroundColor = LocalColors.current.backgroundSecondary,
160+
isFocused = uiState.isSearchFocused,
161+
onFocusChanged = { isFocused -> sendCommand(SearchFocusChange(isFocused)) },
162+
enabled = true,
163+
)
160164

161-
val scrollState = rememberLazyListState()
165+
Spacer(modifier = Modifier.height(LocalDimensions.current.smallSpacing))
166+
}
162167

163-
Spacer(modifier = Modifier.height(LocalDimensions.current.smallSpacing))
168+
val scrollState = rememberLazyListState()
164169

165170
Box(
166171
modifier = Modifier
167172
.weight(1f)
168173
.fillMaxWidth()
169174
) {
170-
if (contacts.isEmpty() && searchQuery.isEmpty()) {
175+
if (!hasContacts && searchQuery.isEmpty()) {
171176
Text(
172177
text = stringResource(id = R.string.membersInviteNoContacts),
173178
modifier = Modifier
@@ -194,7 +199,7 @@ fun InviteContacts(
194199
InviteMembersDialog(
195200
state = uiState.inviteContactsDialog,
196201
onInviteClicked = onDoneClicked,
197-
onDismiss = { }
202+
onDismiss = {sendCommand(DismissSendInviteDialog) }
198203
)
199204
}
200205
}
@@ -235,6 +240,7 @@ private fun PreviewSelectContacts() {
235240
)
236241
),
237242
searchQuery = "",
243+
hasContacts = true
238244
)
239245
}
240246
}
@@ -258,7 +264,8 @@ private fun PreviewSelectEmptyContacts() {
258264
footerActionTitle = GetString("")
259265
)
260266
),
261-
searchQuery = "Test"
267+
searchQuery = "Test",
268+
hasContacts = false
262269
)
263270
}
264271
}
@@ -282,7 +289,8 @@ private fun PreviewSelectEmptyContactsWithSearch() {
282289
footerActionTitle = GetString("")
283290
)
284291
),
285-
searchQuery = ""
292+
searchQuery = "",
293+
hasContacts = false
286294
)
287295
}
288296
}

0 commit comments

Comments
 (0)