New copy for GV2 direct add message request.

master
Alan Evans 2020-10-05 14:50:35 -03:00
parent fb00652396
commit e22384b6b4
5 changed files with 94 additions and 20 deletions

View File

@ -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 {

View File

@ -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.

View File

@ -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> status = new SingleLiveEvent<>();
private final SingleLiveEvent<GroupChangeFailureReason> failures = new SingleLiveEvent<>();
private final MutableLiveData<Recipient> recipient = new MutableLiveData<>();
private final LiveData<MessageData> messageData;
private final MutableLiveData<List<String>> groups = new MutableLiveData<>(Collections.emptyList());
private final MutableLiveData<GroupMemberCount> memberCount = new MutableLiveData<>(GroupMemberCount.ZERO);
private final MutableLiveData<DisplayState> 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<MessageData> getMessageData() {
return messageData;
}
public LiveData<RecipientInfo> 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;

View File

@ -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;
}
}

View File

@ -1057,6 +1057,7 @@
<string name="MessageRequestBottomView_do_you_want_to_let_s_message_you_they_wont_know_youve_seen_their_messages_until_you_accept">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.</string>
<string name="MessageRequestBottomView_do_you_want_to_let_s_message_you_wont_receive_any_messages_until_you_unblock_them">Let %1$s message you and share your name and photo with them? You won\'t receive any messages until you unblock them.</string>
<string name="MessageRequestBottomView_do_you_want_to_join_this_group_they_wont_know_youve_seen_their_messages_until_you_accept">Join this group and share your name and photo with its members? They won\'t know you\'ve seen their messages until you accept.</string>
<string name="MessageRequestBottomView_join_this_group_they_wont_know_youve_seen_their_messages_until_you_accept">Join this group? They wont know youve seen their messages until you accept.</string>
<string name="MessageRequestBottomView_unblock_this_group_and_share_your_name_and_photo_with_its_members">Unblock this group and share your name and photo with its members? You won\'t receive any messages until you unblock them.</string>
<string name="MessageRequestProfileView_member_of_one_group">Member of %1$s</string>
<string name="MessageRequestProfileView_member_of_two_groups">Member of %1$s and %2$s</string>