From 38a234ae660dfe44ece35ec777e5e6d4141eb281 Mon Sep 17 00:00:00 2001 From: jeffrey-signal Date: Fri, 27 Feb 2026 22:29:06 -0500 Subject: [PATCH] Fix crash after inviting group members. --- .../ConversationSettingsFragment.kt | 4 +- .../details/AddGroupDetailsActivity.java | 13 ++-- .../dialogs/GroupInviteSentDialog.java | 77 +++++++++++++------ .../dialog_multiple_group_invites_sent.xml | 2 +- .../res/layout/group_recipient_list_item.xml | 2 +- 5 files changed, 66 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt index c273cb3f24..2ae401e618 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt @@ -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) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsActivity.java index ac78d491de..2297ed78c4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsActivity.java @@ -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 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); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/dialogs/GroupInviteSentDialog.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/dialogs/GroupInviteSentDialog.java index 61eaf68388..51cdef101f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/dialogs/GroupInviteSentDialog.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/dialogs/GroupInviteSentDialog.java @@ -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 recipients) { - int size = recipients.size(); - if (size == 0) { - return null; + + public static void show(@NonNull FragmentManager fragmentManager, @NonNull List recipients) { + ArrayList 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 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 pendingMembers = new ArrayList<>(recipients.size()); - for (Recipient r : recipients) { - pendingMembers.add(new GroupMemberEntry.PendingMember(r)); + List recipientIds = Objects.requireNonNull(requireArguments().getParcelableArrayList(ARG_RECIPIENT_IDS)); + + if (recipientIds.size() > 1) { + GroupMemberListView invitees = requireDialog().findViewById(R.id.list_invitees); + invitees.initializeAdapter(this); + + List 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()); } } diff --git a/app/src/main/res/layout/dialog_multiple_group_invites_sent.xml b/app/src/main/res/layout/dialog_multiple_group_invites_sent.xml index 3b72828894..dc016054ac 100644 --- a/app/src/main/res/layout/dialog_multiple_group_invites_sent.xml +++ b/app/src/main/res/layout/dialog_multiple_group_invites_sent.xml @@ -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" /> \ No newline at end of file diff --git a/app/src/main/res/layout/group_recipient_list_item.xml b/app/src/main/res/layout/group_recipient_list_item.xml index a76e097772..ab8a274383 100644 --- a/app/src/main/res/layout/group_recipient_list_item.xml +++ b/app/src/main/res/layout/group_recipient_list_item.xml @@ -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"