New copy for GV2 direct add message request.

This commit is contained in:
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.setBlockOnClickListener(v -> onMessageRequestBlockClicked(viewModel));
messageRequestBottomView.setUnblockOnClickListener(v -> onMessageRequestUnblockClicked(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.getMessageRequestDisplayState().observe(this, this::presentMessageRequestDisplayState);
viewModel.getFailures().observe(this, this::showGroupChangeErrorToast); viewModel.getFailures().observe(this, this::showGroupChangeErrorToast);
viewModel.getMessageRequestStatus().observe(this, status -> { viewModel.getMessageRequestStatus().observe(this, status -> {
@@ -3452,10 +3452,10 @@ public class ConversationActivity extends PassphraseRequiredActivity
} }
} }
private void presentMessageRequestBottomViewTo(@Nullable Recipient recipient) { private void presentMessageRequestBottomViewTo(@Nullable MessageRequestViewModel.MessageData messageData) {
if (recipient == null) return; if (messageData == null) return;
messageRequestBottomView.setRecipient(recipient); messageRequestBottomView.setMessageData(messageData);
} }
private static class KeyboardImageDetails { 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.database.ThreadDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupChangeException; import org.thoughtcrime.securesms.groups.GroupChangeException;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.groups.GroupManager; import org.thoughtcrime.securesms.groups.GroupManager;
import org.thoughtcrime.securesms.groups.ui.GroupChangeErrorCallback; import org.thoughtcrime.securesms.groups.ui.GroupChangeErrorCallback;
import org.thoughtcrime.securesms.groups.ui.GroupChangeFailureReason; 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 { enum MessageRequestState {
/** /**
* Message request permission does not need to be gained at this time. * 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.MainThread;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Transformations; 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.SingleLiveEvent;
import org.thoughtcrime.securesms.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.util.concurrent.SignalExecutors;
import org.thoughtcrime.securesms.util.livedata.LiveDataTriple; import org.thoughtcrime.securesms.util.livedata.LiveDataTriple;
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -28,6 +30,7 @@ public class MessageRequestViewModel extends ViewModel {
private final SingleLiveEvent<Status> status = new SingleLiveEvent<>(); private final SingleLiveEvent<Status> status = new SingleLiveEvent<>();
private final SingleLiveEvent<GroupChangeFailureReason> failures = new SingleLiveEvent<>(); private final SingleLiveEvent<GroupChangeFailureReason> failures = new SingleLiveEvent<>();
private final MutableLiveData<Recipient> recipient = new MutableLiveData<>(); 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<List<String>> groups = new MutableLiveData<>(Collections.emptyList());
private final MutableLiveData<GroupMemberCount> memberCount = new MutableLiveData<>(GroupMemberCount.ZERO); private final MutableLiveData<GroupMemberCount> memberCount = new MutableLiveData<>(GroupMemberCount.ZERO);
private final MutableLiveData<DisplayState> displayState = new MutableLiveData<>(); private final MutableLiveData<DisplayState> displayState = new MutableLiveData<>();
@@ -47,6 +50,7 @@ public class MessageRequestViewModel extends ViewModel {
private MessageRequestViewModel(MessageRequestRepository repository) { 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) { public void setConversationInfo(@NonNull RecipientId recipientId, long threadId) {
@@ -77,6 +81,10 @@ public class MessageRequestViewModel extends ViewModel {
return recipient; return recipient;
} }
public LiveData<MessageData> getMessageData() {
return messageData;
}
public LiveData<RecipientInfo> getRecipientInfo() { public LiveData<RecipientInfo> getRecipientInfo() {
return recipientInfo; return recipientInfo;
} }
@@ -152,6 +160,29 @@ public class MessageRequestViewModel extends ViewModel {
repository.getMemberCount(liveRecipient.getId(), memberCount::postValue); 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") @SuppressWarnings("ConstantConditions")
private void loadMessageRequestAccepted(@NonNull Recipient recipient) { private void loadMessageRequestAccepted(@NonNull Recipient recipient) {
if (recipient.isBlocked()) { if (recipient.isBlocked()) {
@@ -218,6 +249,33 @@ public class MessageRequestViewModel extends ViewModel {
DISPLAY_MESSAGE_REQUEST, DISPLAY_LEGACY, DISPLAY_NONE 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 { public static class Factory implements ViewModelProvider.Factory {
private final Context context; private final Context context;

View File

@@ -60,23 +60,33 @@ public class MessageRequestsBottomView extends ConstraintLayout {
busyIndicator = findViewById(R.id.message_request_busy_indicator); busyIndicator = findViewById(R.id.message_request_busy_indicator);
} }
public void setRecipient(@NonNull Recipient recipient) { public void setMessageData(@NonNull MessageRequestViewModel.MessageData messageData) {
if (recipient.isBlocked()) { Recipient recipient = messageData.getRecipient();
if (recipient.isGroup()) {
question.setText(R.string.MessageRequestBottomView_unblock_this_group_and_share_your_name_and_photo_with_its_members); switch (messageData.getMessageClass()) {
} else { case BLOCKED_INDIVIDUAL:
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,
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)); HtmlUtil.bold(recipient.getShortDisplayName(getContext()))), 0));
}
setActiveInactiveGroups(blockedButtons, normalButtons); setActiveInactiveGroups(blockedButtons, normalButtons);
} else { break;
if (recipient.isGroup()) { case BLOCKED_GROUP:
question.setText(R.string.MessageRequestBottomView_unblock_this_group_and_share_your_name_and_photo_with_its_members);
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); 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_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_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_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="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_one_group">Member of %1$s</string>
<string name="MessageRequestProfileView_member_of_two_groups">Member of %1$s and %2$s</string> <string name="MessageRequestProfileView_member_of_two_groups">Member of %1$s and %2$s</string>