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 eb6981df4..ccc55393e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -3039,7 +3039,7 @@ public class ConversationActivity extends PassphraseRequiredActivity messageRequestBottomView.setBlockOnClickListener(v -> onMessageRequestBlockClicked(viewModel)); messageRequestBottomView.setUnblockOnClickListener(v -> onMessageRequestUnblockClicked(viewModel)); - viewModel.getRecipient().observe(this, this::presentMessageRequestBottomViewTo); + viewModel.getMessageData().observe(this, this::presentMessageRequestBottomViewTo); viewModel.getMessageRequestDisplayState().observe(this, this::presentMessageRequestDisplayState); viewModel.getFailures().observe(this, this::showGroupChangeErrorToast); viewModel.getMessageRequestStatus().observe(this, status -> { @@ -3452,10 +3452,10 @@ public class ConversationActivity extends PassphraseRequiredActivity } } - private void presentMessageRequestBottomViewTo(@Nullable Recipient recipient) { - if (recipient == null) return; + private void presentMessageRequestBottomViewTo(@Nullable MessageRequestViewModel.MessageData messageData) { + if (messageData == null) return; - messageRequestBottomView.setRecipient(recipient); + messageRequestBottomView.setMessageData(messageData); } private static class KeyboardImageDetails { diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java index 9ee8995bb..522baa6ed 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java @@ -14,6 +14,7 @@ import org.thoughtcrime.securesms.database.RecipientDatabase; import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.groups.GroupChangeException; +import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.groups.GroupManager; import org.thoughtcrime.securesms.groups.ui.GroupChangeErrorCallback; import org.thoughtcrime.securesms.groups.ui.GroupChangeFailureReason; @@ -229,6 +230,10 @@ final class MessageRequestRepository { }); } + boolean isPendingMember(@NonNull GroupId.V2 groupId) { + return DatabaseFactory.getGroupDatabase(context).isPendingMember(groupId, Recipient.self()); + } + enum MessageRequestState { /** * Message request permission does not need to be gained at this time. diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestViewModel.java index 749f1bef9..3538894ac 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestViewModel.java @@ -5,6 +5,7 @@ import android.content.Context; import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.Transformations; @@ -19,6 +20,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.SingleLiveEvent; import org.thoughtcrime.securesms.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.util.livedata.LiveDataTriple; +import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; import java.util.Collections; import java.util.List; @@ -28,6 +30,7 @@ public class MessageRequestViewModel extends ViewModel { private final SingleLiveEvent status = new SingleLiveEvent<>(); private final SingleLiveEvent failures = new SingleLiveEvent<>(); private final MutableLiveData recipient = new MutableLiveData<>(); + private final LiveData messageData; private final MutableLiveData> groups = new MutableLiveData<>(Collections.emptyList()); private final MutableLiveData memberCount = new MutableLiveData<>(GroupMemberCount.ZERO); private final MutableLiveData displayState = new MutableLiveData<>(); @@ -46,7 +49,8 @@ public class MessageRequestViewModel extends ViewModel { }; private MessageRequestViewModel(MessageRequestRepository repository) { - this.repository = repository; + this.repository = repository; + this.messageData = LiveDataUtil.mapAsync(recipient, this::createMessageDataForRecipient); } public void setConversationInfo(@NonNull RecipientId recipientId, long threadId) { @@ -77,6 +81,10 @@ public class MessageRequestViewModel extends ViewModel { return recipient; } + public LiveData getMessageData() { + return messageData; + } + public LiveData getRecipientInfo() { return recipientInfo; } @@ -152,6 +160,29 @@ public class MessageRequestViewModel extends ViewModel { repository.getMemberCount(liveRecipient.getId(), memberCount::postValue); } + @WorkerThread + private @NonNull MessageData createMessageDataForRecipient(@NonNull Recipient recipient) { + if (recipient.isBlocked()) { + if (recipient.isGroup()) { + return new MessageData(recipient, MessageClass.BLOCKED_GROUP); + } else { + return new MessageData(recipient, MessageClass.BLOCKED_INDIVIDUAL); + } + } else if (recipient.isGroup()) { + if (recipient.isPushV2Group()) { + if (repository.isPendingMember(recipient.requireGroupId().requireV2())) { + return new MessageData(recipient, MessageClass.GROUP_V2_INVITE); + } else { + return new MessageData(recipient, MessageClass.GROUP_V2_ADD); + } + } else { + return new MessageData(recipient, MessageClass.GROUP_V1); + } + } else { + return new MessageData(recipient, MessageClass.INDIVIDUAL); + } + } + @SuppressWarnings("ConstantConditions") private void loadMessageRequestAccepted(@NonNull Recipient recipient) { if (recipient.isBlocked()) { @@ -218,6 +249,33 @@ public class MessageRequestViewModel extends ViewModel { DISPLAY_MESSAGE_REQUEST, DISPLAY_LEGACY, DISPLAY_NONE } + public enum MessageClass { + BLOCKED_INDIVIDUAL, + BLOCKED_GROUP, + GROUP_V1, + GROUP_V2_INVITE, + GROUP_V2_ADD, + INDIVIDUAL + } + + public static final class MessageData { + private final Recipient recipient; + private final MessageClass messageClass; + + public MessageData(@NonNull Recipient recipient, @NonNull MessageClass messageClass) { + this.recipient = recipient; + this.messageClass = messageClass; + } + + public @NonNull Recipient getRecipient() { + return recipient; + } + + public @NonNull MessageClass getMessageClass() { + return messageClass; + } + } + public static class Factory implements ViewModelProvider.Factory { private final Context context; diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java index cf18d3946..e7e4a7c8b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java @@ -60,23 +60,33 @@ public class MessageRequestsBottomView extends ConstraintLayout { busyIndicator = findViewById(R.id.message_request_busy_indicator); } - public void setRecipient(@NonNull Recipient recipient) { - if (recipient.isBlocked()) { - if (recipient.isGroup()) { + public void setMessageData(@NonNull MessageRequestViewModel.MessageData messageData) { + Recipient recipient = messageData.getRecipient(); + + switch (messageData.getMessageClass()) { + case BLOCKED_INDIVIDUAL: + question.setText(HtmlCompat.fromHtml(getContext().getString(R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_wont_receive_any_messages_until_you_unblock_them, + HtmlUtil.bold(recipient.getShortDisplayName(getContext()))), 0)); + setActiveInactiveGroups(blockedButtons, normalButtons); + break; + case BLOCKED_GROUP: question.setText(R.string.MessageRequestBottomView_unblock_this_group_and_share_your_name_and_photo_with_its_members); - } else { - String name = recipient.getShortDisplayName(getContext()); - question.setText(HtmlCompat.fromHtml(getContext().getString(R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_wont_receive_any_messages_until_you_unblock_them, HtmlUtil.bold(name)), 0)); - } - setActiveInactiveGroups(blockedButtons, normalButtons); - } else { - if (recipient.isGroup()) { + setActiveInactiveGroups(blockedButtons, normalButtons); + break; + case GROUP_V1: + case GROUP_V2_INVITE: question.setText(R.string.MessageRequestBottomView_do_you_want_to_join_this_group_they_wont_know_youve_seen_their_messages_until_you_accept); - } else { - String name = recipient.getShortDisplayName(getContext()); - question.setText(HtmlCompat.fromHtml(getContext().getString(R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_they_wont_know_youve_seen_their_messages_until_you_accept, HtmlUtil.bold(name)), 0)); - } - setActiveInactiveGroups(normalButtons, blockedButtons); + setActiveInactiveGroups(normalButtons, blockedButtons); + break; + case GROUP_V2_ADD: + question.setText(R.string.MessageRequestBottomView_join_this_group_they_wont_know_youve_seen_their_messages_until_you_accept); + setActiveInactiveGroups(normalButtons, blockedButtons); + break; + case INDIVIDUAL: + question.setText(HtmlCompat.fromHtml(getContext().getString(R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_they_wont_know_youve_seen_their_messages_until_you_accept, + HtmlUtil.bold(recipient.getShortDisplayName(getContext()))), 0)); + setActiveInactiveGroups(normalButtons, blockedButtons); + break; } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9097d39ec..04c27b6a3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1057,6 +1057,7 @@ Let %1$s message you and share your name and photo with them? They won\'t know you\'ve seen their message until you accept. Let %1$s message you and share your name and photo with them? You won\'t receive any messages until you unblock them. Join this group and share your name and photo with its members? They won\'t know you\'ve seen their messages until you accept. + Join this group? They won’t know you’ve seen their messages until you accept. Unblock this group and share your name and photo with its members? You won\'t receive any messages until you unblock them. Member of %1$s Member of %1$s and %2$s