Fix crash after inviting group members.

This commit is contained in:
jeffrey-signal
2026-02-27 22:29:06 -05:00
committed by GitHub
parent 2c1226dc02
commit 38a234ae66
5 changed files with 66 additions and 32 deletions

View File

@@ -1044,7 +1044,9 @@ class ConversationSettingsFragment :
}
private fun showGroupInvitesSentDialog(showGroupInvitesSentDialog: ConversationSettingsEvent.ShowGroupInvitesSentDialog) {
GroupInviteSentDialog.showInvitesSent(requireContext(), viewLifecycleOwner, showGroupInvitesSentDialog.invitesSentTo)
if (showGroupInvitesSentDialog.invitesSentTo.isNotEmpty()) {
GroupInviteSentDialog.show(childFragmentManager, showGroupInvitesSentDialog.invitesSentTo)
}
}
private fun showMembersAdded(showMembersAdded: ConversationSettingsEvent.ShowMembersAdded) {

View File

@@ -1,6 +1,5 @@
package org.thoughtcrime.securesms.groups.ui.creategroup.details;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
@@ -64,11 +63,15 @@ public class AddGroupDetailsActivity extends PassphraseRequiredActivity implemen
long threadId,
@NonNull List<Recipient> invitedMembers)
{
Dialog dialog = GroupInviteSentDialog.showInvitesSent(this, this, invitedMembers);
if (dialog != null) {
dialog.setOnDismissListener((d) -> goToConversation(recipientId, threadId));
} else {
if (invitedMembers.isEmpty()) {
goToConversation(recipientId, threadId);
} else {
getSupportFragmentManager().setFragmentResultListener(
GroupInviteSentDialog.RESULT_DISMISSED,
this,
(requestKey, result) -> goToConversation(recipientId, threadId)
);
GroupInviteSentDialog.show(getSupportFragmentManager(), invitedMembers);
}
}

View File

@@ -1,12 +1,13 @@
package org.thoughtcrime.securesms.groups.ui.managegroup.dialogs;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.lifecycle.LifecycleOwner;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
@@ -14,46 +15,74 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.groups.ui.GroupMemberEntry;
import org.thoughtcrime.securesms.groups.ui.GroupMemberListView;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public final class GroupInviteSentDialog {
public final class GroupInviteSentDialog extends DialogFragment {
private static final String FRAGMENT_TAG = "GroupInviteSentDialog";
public static final String RESULT_DISMISSED = "GroupInviteSentDialog.result_dismissed";
private GroupInviteSentDialog() {
}
private static final String ARG_RECIPIENT_IDS = "recipient_ids";
public static @Nullable Dialog showInvitesSent(@NonNull Context context, @NonNull LifecycleOwner lifecycleOwner, @NonNull List<Recipient> recipients) {
int size = recipients.size();
if (size == 0) {
return null;
public static void show(@NonNull FragmentManager fragmentManager, @NonNull List<Recipient> recipients) {
ArrayList<RecipientId> recipientIds = new ArrayList<>(recipients.size());
for (Recipient recipient : recipients) {
recipientIds.add(recipient.getId());
}
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(context)
.setTitle(context.getResources().getQuantityString(R.plurals.GroupManagement_invitation_sent, size, size))
.setPositiveButton(android.R.string.ok, null);
if (size == 1) {
builder.setMessage(context.getString(R.string.GroupManagement_invite_single_user, recipients.get(0).getDisplayName(context)));
Bundle args = new Bundle();
args.putParcelableArrayList(ARG_RECIPIENT_IDS, recipientIds);
GroupInviteSentDialog fragment = new GroupInviteSentDialog();
fragment.setArguments(args);
fragment.show(fragmentManager, FRAGMENT_TAG);
}
@Override
public @NonNull Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
List<RecipientId> recipientIds = Objects.requireNonNull(requireArguments().getParcelableArrayList(ARG_RECIPIENT_IDS));
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireContext())
.setTitle(getResources().getQuantityString(R.plurals.GroupManagement_invitation_sent, recipientIds.size(), recipientIds.size()))
.setPositiveButton(android.R.string.ok, null);
if (recipientIds.size() == 1) {
Recipient recipient = Recipient.live(recipientIds.get(0)).get();
builder.setMessage(getString(R.string.GroupManagement_invite_single_user, recipient.getDisplayName(requireContext())));
} else {
builder.setMessage(R.string.GroupManagement_invite_multiple_users)
.setView(R.layout.dialog_multiple_group_invites_sent);
}
Dialog dialog = builder.show();
if (size > 1) {
GroupMemberListView invitees = dialog.findViewById(R.id.list_invitees);
return builder.create();
}
invitees.initializeAdapter(lifecycleOwner);
@Override
public void onStart() {
super.onStart();
List<GroupMemberEntry.PendingMember> pendingMembers = new ArrayList<>(recipients.size());
for (Recipient r : recipients) {
pendingMembers.add(new GroupMemberEntry.PendingMember(r));
List<RecipientId> recipientIds = Objects.requireNonNull(requireArguments().getParcelableArrayList(ARG_RECIPIENT_IDS));
if (recipientIds.size() > 1) {
GroupMemberListView invitees = requireDialog().findViewById(R.id.list_invitees);
invitees.initializeAdapter(this);
List<GroupMemberEntry.PendingMember> pendingMembers = new ArrayList<>(recipientIds.size());
for (RecipientId id : recipientIds) {
pendingMembers.add(new GroupMemberEntry.PendingMember(Recipient.live(id).get()));
}
//noinspection ConstantConditions
invitees.setMembers(pendingMembers);
}
}
return dialog;
@Override
public void onDismiss(@NonNull DialogInterface dialog) {
super.onDismiss(dialog);
getParentFragmentManager().setFragmentResult(RESULT_DISMISSED, new Bundle());
}
}

View File

@@ -16,6 +16,6 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:maxHeight="100dp" />
tools:listitem="@layout/group_recipient_list_item" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackground"
android:foreground="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:minHeight="64dp"