Signal-Android/app/src/main/java/org/thoughtcrime/securesms/conversation/MenuState.java

171 lines
5.1 KiB
Java

package org.thoughtcrime.securesms.conversation;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
import java.util.Set;
final class MenuState {
private final boolean forward;
private final boolean reply;
private final boolean details;
private final boolean saveAttachment;
private final boolean resend;
private final boolean copy;
private MenuState(@NonNull Builder builder) {
forward = builder.forward;
reply = builder.reply;
details = builder.details;
saveAttachment = builder.saveAttachment;
resend = builder.resend;
copy = builder.copy;
}
boolean shouldShowForwardAction() {
return forward;
}
boolean shouldShowReplyAction() {
return reply;
}
boolean shouldShowDetailsAction() {
return details;
}
boolean shouldShowSaveAttachmentAction() {
return saveAttachment;
}
boolean shouldShowResendAction() {
return resend;
}
boolean shouldShowCopyAction() {
return copy;
}
static MenuState getMenuState(@NonNull Set<MessageRecord> messageRecords,
boolean shouldShowMessageRequest)
{
Builder builder = new Builder();
boolean actionMessage = false;
boolean hasText = false;
boolean sharedContact = false;
boolean viewOnce = false;
for (MessageRecord messageRecord : messageRecords) {
if (isActionMessage(messageRecord))
{
actionMessage = true;
}
if (messageRecord.getBody().length() > 0) {
hasText = true;
}
if (messageRecord.isMms() && !((MmsMessageRecord) messageRecord).getSharedContacts().isEmpty()) {
sharedContact = true;
}
if (messageRecord.isViewOnce()) {
viewOnce = true;
}
}
if (messageRecords.size() > 1) {
builder.shouldShowForwardAction(false)
.shouldShowReplyAction(false)
.shouldShowDetailsAction(false)
.shouldShowSaveAttachmentAction(false)
.shouldShowResendAction(false);
} else {
MessageRecord messageRecord = messageRecords.iterator().next();
builder.shouldShowResendAction(messageRecord.isFailed())
.shouldShowSaveAttachmentAction(!actionMessage &&
!viewOnce &&
messageRecord.isMms() &&
!messageRecord.isMmsNotification() &&
((MediaMmsMessageRecord)messageRecord).containsMediaSlide() &&
((MediaMmsMessageRecord)messageRecord).getSlideDeck().getStickerSlide() == null)
.shouldShowForwardAction(!actionMessage && !sharedContact && !viewOnce)
.shouldShowDetailsAction(!actionMessage)
.shouldShowReplyAction(canReplyToMessage(actionMessage, messageRecord, shouldShowMessageRequest));
}
return builder.shouldShowCopyAction(!actionMessage && hasText)
.build();
}
static boolean canReplyToMessage(boolean actionMessage, @NonNull MessageRecord messageRecord, boolean isDisplayingMessageRequest) {
return !actionMessage &&
!messageRecord.isPending() &&
!messageRecord.isFailed() &&
!isDisplayingMessageRequest &&
messageRecord.isSecure();
}
static boolean isActionMessage(@NonNull MessageRecord messageRecord) {
return messageRecord.isGroupAction() ||
messageRecord.isCallLog() ||
messageRecord.isJoined() ||
messageRecord.isExpirationTimerUpdate() ||
messageRecord.isEndSession() ||
messageRecord.isIdentityUpdate() ||
messageRecord.isIdentityVerified() ||
messageRecord.isIdentityDefault();
}
private final static class Builder {
private boolean forward;
private boolean reply;
private boolean details;
private boolean saveAttachment;
private boolean resend;
private boolean copy;
@NonNull Builder shouldShowForwardAction(boolean forward) {
this.forward = forward;
return this;
}
@NonNull Builder shouldShowReplyAction(boolean reply) {
this.reply = reply;
return this;
}
@NonNull Builder shouldShowDetailsAction(boolean details) {
this.details = details;
return this;
}
@NonNull Builder shouldShowSaveAttachmentAction(boolean saveAttachment) {
this.saveAttachment = saveAttachment;
return this;
}
@NonNull Builder shouldShowResendAction(boolean resend) {
this.resend = resend;
return this;
}
@NonNull Builder shouldShowCopyAction(boolean copy) {
this.copy = copy;
return this;
}
@NonNull
MenuState build() {
return new MenuState(this);
}
}
}