diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ScheduledMessagesBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ScheduledMessagesBottomSheet.kt index 358553abe4..0b3ce8d95a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ScheduledMessagesBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ScheduledMessagesBottomSheet.kt @@ -47,7 +47,7 @@ import org.thoughtcrime.securesms.mms.TextSlide import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.util.StickyHeaderDecoration -import org.thoughtcrime.securesms.util.fragments.requireListener +import org.thoughtcrime.securesms.util.fragments.findListener import org.thoughtcrime.securesms.util.hasTextSlide import org.thoughtcrime.securesms.util.requireTextSlide import java.io.IOException @@ -88,7 +88,10 @@ class ScheduledMessagesBottomSheet : FixedRoundedCornerBottomSheetDialogFragment val conversationRecipientId = RecipientId.from(arguments?.getString(KEY_CONVERSATION_RECIPIENT_ID, null) ?: throw IllegalArgumentException()) val conversationRecipient = Recipient.resolved(conversationRecipientId) - callback = requireListener() + callback = findListener() ?: run { + dismissAllowingStateLoss() + return + } val colorizer = Colorizer() diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt index ee72755207..65a1845705 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt @@ -42,7 +42,7 @@ import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.util.StickyHeaderDecoration import org.thoughtcrime.securesms.util.ViewModelFactory -import org.thoughtcrime.securesms.util.fragments.requireListener +import org.thoughtcrime.securesms.util.fragments.findListener import java.util.Locale /** @@ -78,6 +78,9 @@ class EditMessageHistoryDialog : FixedRoundedCornerBottomSheetDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + + val callback = findListener() ?: EmptyConversationBottomSheetCallback + disposables.bindTo(viewLifecycleOwner) val colorizer = Colorizer() @@ -87,7 +90,7 @@ class EditMessageHistoryDialog : FixedRoundedCornerBottomSheetDialogFragment() { viewLifecycleOwner, Glide.with(this), Locale.getDefault(), - ConversationAdapterListener(), + ConversationAdapterListener(callback), conversationRecipient.hasWallpaper, colorizer ).apply { @@ -142,7 +145,7 @@ class EditMessageHistoryDialog : FixedRoundedCornerBottomSheetDialogFragment() { return callback } - private inner class ConversationAdapterListener : ConversationAdapter.ItemClickListener by requireListener().getConversationAdapterListener() { + private class ConversationAdapterListener(callback: ConversationBottomSheetCallback) : ConversationAdapter.ItemClickListener by callback.getConversationAdapterListener() { override fun onQuoteClicked(messageRecord: MmsMessageRecord) = Unit override fun onScheduledIndicatorClicked(view: View, conversationMessage: ConversationMessage) = Unit override fun onGroupMemberClicked(recipientId: RecipientId, groupId: GroupId) = Unit diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EmptyConversationAdapterListener.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EmptyConversationAdapterListener.kt new file mode 100644 index 0000000000..f0222bbb14 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EmptyConversationAdapterListener.kt @@ -0,0 +1,97 @@ +/* + * Copyright 2026 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.conversation.ui.edit + +import android.net.Uri +import android.view.View +import androidx.lifecycle.Observer +import org.signal.ringrtc.CallLinkRootKey +import org.thoughtcrime.securesms.components.voice.VoiceNotePlaybackState +import org.thoughtcrime.securesms.contactshare.Contact +import org.thoughtcrime.securesms.conversation.ConversationAdapter +import org.thoughtcrime.securesms.conversation.ConversationItem +import org.thoughtcrime.securesms.conversation.ConversationMessage +import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectPart +import org.thoughtcrime.securesms.database.model.InMemoryMessageRecord +import org.thoughtcrime.securesms.database.model.MessageRecord +import org.thoughtcrime.securesms.database.model.MmsMessageRecord +import org.thoughtcrime.securesms.groups.GroupId +import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange +import org.thoughtcrime.securesms.linkpreview.LinkPreview +import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory +import org.thoughtcrime.securesms.polls.PollOption +import org.thoughtcrime.securesms.polls.PollRecord +import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.recipients.RecipientId +import org.thoughtcrime.securesms.stickers.StickerLocator + +/** + * Empty object for when a callback can't be found. + */ +object EmptyConversationAdapterListener : ConversationAdapter.ItemClickListener { + override fun onItemClick(item: MultiselectPart?) = Unit + override fun onItemLongClick(itemView: View?, item: MultiselectPart?) = Unit + override fun onQuoteClicked(messageRecord: MmsMessageRecord?) = Unit + override fun onLinkPreviewClicked(linkPreview: LinkPreview) = Unit + override fun onQuotedIndicatorClicked(messageRecord: MessageRecord) = Unit + override fun onMoreTextClicked(conversationRecipientId: RecipientId, messageId: Long, isMms: Boolean) = Unit + override fun onStickerClicked(stickerLocator: StickerLocator) = Unit + override fun onViewOnceMessageClicked(messageRecord: MmsMessageRecord) = Unit + override fun onSharedContactDetailsClicked(contact: Contact, avatarTransitionView: View) = Unit + override fun onAddToContactsClicked(contact: Contact) = Unit + override fun onMessageSharedContactClicked(choices: List) = Unit + override fun onInviteSharedContactClicked(choices: List) = Unit + override fun onReactionClicked(multiselectPart: MultiselectPart, messageId: Long, isMms: Boolean) = Unit + override fun onGroupMemberClicked(recipientId: RecipientId, groupId: GroupId) = Unit + override fun onMessageWithErrorClicked(messageRecord: MessageRecord) = Unit + override fun onMessageWithRecaptchaNeededClicked(messageRecord: MessageRecord) = Unit + override fun onIncomingIdentityMismatchClicked(recipientId: RecipientId) = Unit + override fun onRegisterVoiceNoteCallbacks(onPlaybackStartObserver: Observer) = Unit + override fun onUnregisterVoiceNoteCallbacks(onPlaybackStartObserver: Observer) = Unit + override fun onVoiceNotePause(uri: Uri) = Unit + override fun onVoiceNotePlay(uri: Uri, messageId: Long, position: Double) = Unit + override fun onVoiceNoteSeekTo(uri: Uri, position: Double) = Unit + override fun onVoiceNotePlaybackSpeedChanged(uri: Uri, speed: Float) = Unit + override fun onGroupMigrationLearnMoreClicked(membershipChange: GroupMigrationMembershipChange) = Unit + override fun onChatSessionRefreshLearnMoreClicked() = Unit + override fun onBadDecryptLearnMoreClicked(author: RecipientId) = Unit + override fun onSafetyNumberLearnMoreClicked(recipient: Recipient) = Unit + override fun onJoinGroupCallClicked() = Unit + override fun onInviteFriendsToGroupClicked(groupId: GroupId.V2) = Unit + override fun onEnableCallNotificationsClicked() = Unit + override fun onPlayInlineContent(conversationMessage: ConversationMessage?) = Unit + override fun onInMemoryMessageClicked(messageRecord: InMemoryMessageRecord) = Unit + override fun onViewGroupDescriptionChange(groupId: GroupId?, description: String, isMessageRequestAccepted: Boolean) = Unit + override fun onChangeNumberUpdateContact(recipient: Recipient) = Unit + override fun onChangeProfileNameUpdateContact(recipient: Recipient) = Unit + override fun onCallToAction(action: String) = Unit + override fun onDonateClicked() = Unit + override fun onBlockJoinRequest(recipient: Recipient) = Unit + override fun onRecipientNameClicked(target: RecipientId) = Unit + override fun onInviteToSignalClicked() = Unit + override fun onActivatePaymentsClicked() = Unit + override fun onSendPaymentClicked(recipientId: RecipientId) = Unit + override fun onScheduledIndicatorClicked(view: View, conversationMessage: ConversationMessage) = Unit + override fun onUrlClicked(url: String): Boolean = false + override fun onViewGiftBadgeClicked(messageRecord: MessageRecord) = Unit + override fun onGiftBadgeRevealed(messageRecord: MessageRecord) = Unit + override fun goToMediaPreview(parent: ConversationItem?, sharedElement: View?, args: MediaIntentFactory.MediaPreviewArgs?) = Unit + override fun onEditedIndicatorClicked(conversationMessage: ConversationMessage) = Unit + override fun onShowGroupDescriptionClicked(groupName: String, description: String, shouldLinkifyWebLinks: Boolean) = Unit + override fun onJoinCallLink(callLinkRootKey: CallLinkRootKey) = Unit + override fun onShowSafetyTips(forGroup: Boolean) = Unit + override fun onReportSpamLearnMoreClicked() = Unit + override fun onMessageRequestAcceptOptionsClicked() = Unit + override fun onItemDoubleClick(multiselectPart: MultiselectPart?) = Unit + override fun onPaymentTombstoneClicked() = Unit + override fun onDisplayMediaNoLongerAvailableSheet() = Unit + override fun onShowUnverifiedProfileSheet(forGroup: Boolean) = Unit + override fun onUpdateSignalClicked() = Unit + override fun onViewResultsClicked(pollId: Long) = Unit + override fun onViewPollClicked(messageId: Long) = Unit + override fun onToggleVote(poll: PollRecord, pollOption: PollOption, isChecked: Boolean?) = Unit + override fun onViewPinnedMessage(messageId: Long) = Unit +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EmptyConversationBottomSheetCallback.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EmptyConversationBottomSheetCallback.kt new file mode 100644 index 0000000000..2747850cfe --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EmptyConversationBottomSheetCallback.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2026 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.conversation.ui.edit + +import org.thoughtcrime.securesms.conversation.ConversationAdapter +import org.thoughtcrime.securesms.conversation.ConversationBottomSheetCallback +import org.thoughtcrime.securesms.conversation.ConversationMessage +import org.thoughtcrime.securesms.database.model.MessageRecord + +object EmptyConversationBottomSheetCallback : ConversationBottomSheetCallback { + override fun getConversationAdapterListener(): ConversationAdapter.ItemClickListener = EmptyConversationAdapterListener + override fun jumpToMessage(messageRecord: MessageRecord) = Unit + override fun unpin(conversationMessage: ConversationMessage) = Unit + override fun copy(conversationMessage: ConversationMessage) = Unit + override fun delete(conversationMessage: ConversationMessage) = Unit + override fun save(conversationMessage: ConversationMessage) = Unit +}