mirror of
https://github.com/oxen-io/session-android.git
synced 2025-12-16 22:22:22 +00:00
New copy for GV2 direct add message request.
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 won’t know you’ve 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>
|
||||||
|
|||||||
Reference in New Issue
Block a user