From 77ef877c5982931a63cb5bbbe32a3409fc28e5ef Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Fri, 18 Mar 2022 15:26:38 -0400 Subject: [PATCH] Show block request if request follows a collapsed event. --- .../conversation/ConversationUpdateItem.java | 21 ++++++++++++++----- .../database/model/MessageRecord.java | 18 ++++++++++++++-- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java index a06314ccb2..f4e5fb475c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java @@ -77,6 +77,7 @@ public final class ConversationUpdateItem extends FrameLayout private View background; private ConversationMessage conversationMessage; private Recipient conversationRecipient; + private Optional previousMessageRecord; private Optional nextMessageRecord; private MessageRecord messageRecord; private boolean isMessageRequestAccepted; @@ -150,13 +151,15 @@ public final class ConversationUpdateItem extends FrameLayout { this.conversationMessage = conversationMessage; this.messageRecord = conversationMessage.getMessageRecord(); + this.previousMessageRecord = previousMessageRecord; this.nextMessageRecord = nextMessageRecord; this.conversationRecipient = conversationRecipient; this.isMessageRequestAccepted = isMessageRequestAccepted; senderObserver.observe(lifecycleOwner, messageRecord.getIndividualRecipient()); - if (conversationRecipient.isActiveGroup() && (conversationMessage.getMessageRecord().isGroupCall() || conversationMessage.getMessageRecord().isCollapsedGroupV2JoinUpdate())) { + if (conversationRecipient.isActiveGroup() && + (messageRecord.isGroupCall() || messageRecord.isCollapsedGroupV2JoinUpdate() || messageRecord.isGroupV2JoinRequest(messageRecord.getIndividualRecipient().getServiceId().orElse(null)))) { groupObserver.observe(lifecycleOwner, conversationRecipient); groupData.observe(lifecycleOwner, conversationRecipient); } else { @@ -509,10 +512,7 @@ public final class ConversationUpdateItem extends FrameLayout eventListener.onChangeNumberUpdateContact(conversationMessage.getMessageRecord().getIndividualRecipient()); } }); - } else if (conversationMessage.getMessageRecord().isCollapsedGroupV2JoinUpdate() && - groupData.isSelfAdmin() && - !groupData.isBanned(conversationMessage.getMessageRecord().getIndividualRecipient()) && - !groupData.isFullMember(conversationMessage.getMessageRecord().getIndividualRecipient())) { + } else if (shouldShowBlockRequestAction(conversationMessage.getMessageRecord())) { actionButton.setText(R.string.ConversationUpdateItem_block_request); actionButton.setVisibility(VISIBLE); actionButton.setOnClickListener(v -> { @@ -554,6 +554,17 @@ public final class ConversationUpdateItem extends FrameLayout } } + private boolean shouldShowBlockRequestAction(MessageRecord messageRecord) { + Recipient toBlock = messageRecord.getIndividualRecipient(); + + if (!toBlock.hasServiceId() || !groupData.isSelfAdmin() || groupData.isBanned(toBlock) || groupData.isFullMember(toBlock)) { + return false; + } + + return (messageRecord.isCollapsedGroupV2JoinUpdate() && !nextMessageRecord.map(m -> m.isGroupV2JoinRequest(toBlock.requireServiceId())).orElse(false)) || + (messageRecord.isGroupV2JoinRequest(toBlock.requireServiceId()) && previousMessageRecord.map(m -> m.isCollapsedGroupV2JoinUpdate(toBlock.requireServiceId())).orElse(false)); + } + private void presentBackground(boolean collapseAbove, boolean collapseBelow, boolean hasWallpaper) { int marginDefault = getContext().getResources().getDimensionPixelOffset(R.dimen.conversation_update_vertical_margin); int marginCollapsed = 0; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java index 07e1958da2..c0dd37d0a1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java @@ -412,7 +412,15 @@ public abstract class MessageRecord extends DisplayRecord { return ""; } - public boolean isGroupV2JoinRequest(ByteString uuid) { + public boolean isGroupV2JoinRequest(@Nullable ServiceId serviceId) { + if (serviceId == null) { + return false; + } + + return isGroupV2JoinRequest(UuidUtil.toByteString(serviceId.uuid())); + } + + public boolean isGroupV2JoinRequest(@NonNull ByteString uuid) { DecryptedGroupV2Context decryptedGroupV2Context = getDecryptedGroupV2Context(); if (decryptedGroupV2Context != null && decryptedGroupV2Context.hasChange()) { DecryptedGroupChange change = decryptedGroupV2Context.getChange(); @@ -422,10 +430,16 @@ public abstract class MessageRecord extends DisplayRecord { } public boolean isCollapsedGroupV2JoinUpdate() { + return isCollapsedGroupV2JoinUpdate(null); + } + + public boolean isCollapsedGroupV2JoinUpdate(@Nullable ServiceId serviceId) { DecryptedGroupV2Context decryptedGroupV2Context = getDecryptedGroupV2Context(); if (decryptedGroupV2Context != null && decryptedGroupV2Context.hasChange()) { DecryptedGroupChange change = decryptedGroupV2Context.getChange(); - return change.getNewRequestingMembersCount() > 0 && change.getDeleteRequestingMembersCount() > 0; + return change.getNewRequestingMembersCount() > 0 && + change.getDeleteRequestingMembersCount() > 0 && + (serviceId == null || change.getEditor().equals(UuidUtil.toByteString(serviceId.uuid()))); } return false; }