diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java index f774d4f072..7862f2a705 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -3677,7 +3677,7 @@ public class ConversationActivity extends PassphraseRequiredActivity { reactionDelegate.setOnToolbarItemClickedListener(toolbarListener); reactionDelegate.setOnHideListener(onHideListener); - reactionDelegate.show(this, maskTarget, recipient.get(), conversationMessage, inputAreaHeight()); + reactionDelegate.show(this, maskTarget, recipient.get(), conversationMessage, inputAreaHeight(), groupViewModel.isNonAdminInAnnouncementGroup()); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java index 7c8ce6e498..2f9492f76c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -208,6 +208,7 @@ public class ConversationFragment extends LoggingFragment implements Multiselect private MessageRequestViewModel messageRequestViewModel; private MessageCountsViewModel messageCountsViewModel; private ConversationViewModel conversationViewModel; + private ConversationGroupViewModel groupViewModel; private SnapToTopDataObserver snapToTopDataObserver; private MarkReadHelper markReadHelper; private Animation scrollButtonInAnimation; @@ -309,13 +310,15 @@ public class ConversationFragment extends LoggingFragment implements Multiselect MenuState.canReplyToMessage(recipient.get(), MenuState.isActionMessage(conversationMessage.getMessageRecord()), conversationMessage.getMessageRecord(), - messageRequestViewModel.shouldShowMessageRequest()), + messageRequestViewModel.shouldShowMessageRequest(), + groupViewModel.isNonAdminInAnnouncementGroup()), this::handleReplyMessage, this::onViewHolderPositionTranslated ).attachToRecyclerView(list); setupListLayoutListeners(); + this.groupViewModel = ViewModelProviders.of(requireActivity(), new ConversationGroupViewModel.Factory()).get(ConversationGroupViewModel.class); this.messageCountsViewModel = ViewModelProviders.of(requireActivity()).get(MessageCountsViewModel.class); this.conversationViewModel = ViewModelProviders.of(requireActivity(), new ConversationViewModel.Factory()).get(ConversationViewModel.class); @@ -801,7 +804,7 @@ public class ConversationFragment extends LoggingFragment implements Multiselect return; } - MenuState menuState = MenuState.getMenuState(recipient.get(), selectedParts, messageRequestViewModel.shouldShowMessageRequest()); + MenuState menuState = MenuState.getMenuState(recipient.get(), selectedParts, messageRequestViewModel.shouldShowMessageRequest(), groupViewModel.isNonAdminInAnnouncementGroup()); menu.findItem(R.id.menu_context_forward).setVisible(menuState.shouldShowForwardAction()); menu.findItem(R.id.menu_context_reply).setVisible(menuState.shouldShowReplyAction()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionDelegate.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionDelegate.java index b0262db289..d931c01c47 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionDelegate.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionDelegate.java @@ -41,9 +41,10 @@ final class ConversationReactionDelegate { @NonNull MaskView.MaskTarget maskTarget, @NonNull Recipient conversationRecipient, @NonNull ConversationMessage conversationMessage, - int maskPaddingBottom) + int maskPaddingBottom, + boolean isNonAdminInAnnouncementGroup) { - resolveOverlay().show(activity, maskTarget, conversationRecipient, conversationMessage, maskPaddingBottom, lastSeenDownPoint); + resolveOverlay().show(activity, maskTarget, conversationRecipient, conversationMessage, maskPaddingBottom, lastSeenDownPoint, isNonAdminInAnnouncementGroup); } void showMask(@NonNull MaskView.MaskTarget maskTarget, int maskPaddingTop, int maskPaddingBottom) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java index 1b4f1f1a82..67e5087070 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java @@ -60,6 +60,7 @@ public final class ConversationReactionOverlay extends RelativeLayout { private Recipient conversationRecipient; private MessageRecord messageRecord; private OverlayState overlayState = OverlayState.HIDDEN; + private boolean isNonAdminInAnnouncementGroup; private boolean downIsOurs; private boolean isToolbarTouch; @@ -152,17 +153,18 @@ public final class ConversationReactionOverlay extends RelativeLayout { @NonNull Recipient conversationRecipient, @NonNull ConversationMessage conversationMessage, int maskPaddingBottom, - @NonNull PointF lastSeenDownPoint) + @NonNull PointF lastSeenDownPoint, + boolean isNonAdminInAnnouncementGroup) { - if (overlayState != OverlayState.HIDDEN) { return; } - this.messageRecord = conversationMessage.getMessageRecord(); - this.conversationRecipient = conversationRecipient; - overlayState = OverlayState.UNINITAILIZED; - selected = -1; + this.messageRecord = conversationMessage.getMessageRecord(); + this.conversationRecipient = conversationRecipient; + this.isNonAdminInAnnouncementGroup = isNonAdminInAnnouncementGroup; + overlayState = OverlayState.UNINITAILIZED; + selected = -1; setupToolbarMenuItems(conversationMessage); setupSelectedEmoji(); @@ -505,7 +507,7 @@ public final class ConversationReactionOverlay extends RelativeLayout { } private void setupToolbarMenuItems(@NonNull ConversationMessage conversationMessage) { - MenuState menuState = MenuState.getMenuState(conversationRecipient, conversationMessage.getMultiselectCollection().toSet(), false); + MenuState menuState = MenuState.getMenuState(conversationRecipient, conversationMessage.getMultiselectCollection().toSet(), false, isNonAdminInAnnouncementGroup); toolbar.getMenu().findItem(R.id.action_copy).setVisible(menuState.shouldShowCopyAction()); toolbar.getMenu().findItem(R.id.action_download).setVisible(menuState.shouldShowSaveAttachmentAction()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/MenuState.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/MenuState.java index df76656c9d..49fbb2f119 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/MenuState.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/MenuState.java @@ -64,7 +64,8 @@ final class MenuState { static MenuState getMenuState(@NonNull Recipient conversationRecipient, @NonNull Set selectedParts, - boolean shouldShowMessageRequest) + boolean shouldShowMessageRequest, + boolean isNonAdminInAnnouncementGroup) { Builder builder = new Builder(); @@ -143,7 +144,7 @@ final class MenuState { ((MediaMmsMessageRecord)messageRecord).getSlideDeck().getStickerSlide() == null) .shouldShowForwardAction(shouldShowForwardAction) .shouldShowDetailsAction(!actionMessage) - .shouldShowReplyAction(canReplyToMessage(conversationRecipient, actionMessage, messageRecord, shouldShowMessageRequest)); + .shouldShowReplyAction(canReplyToMessage(conversationRecipient, actionMessage, messageRecord, shouldShowMessageRequest, isNonAdminInAnnouncementGroup)); } return builder.shouldShowCopyAction(!actionMessage && !remoteDelete && hasText) @@ -158,8 +159,14 @@ final class MenuState { .allMatch(collection -> multiselectParts.containsAll(collection.toSet())); } - static boolean canReplyToMessage(@NonNull Recipient conversationRecipient, boolean actionMessage, @NonNull MessageRecord messageRecord, boolean isDisplayingMessageRequest) { + static boolean canReplyToMessage(@NonNull Recipient conversationRecipient, + boolean actionMessage, + @NonNull MessageRecord messageRecord, + boolean isDisplayingMessageRequest, + boolean isNonAdminInAnnouncementGroup) + { return !actionMessage && + !isNonAdminInAnnouncementGroup && !messageRecord.isRemoteDelete() && !messageRecord.isPending() && !messageRecord.isFailed() &&