171 lines
5.1 KiB
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);
|
|
}
|
|
}
|
|
}
|