Search in sources :

Example 11 with SlideDeck

use of org.thoughtcrime.securesms.mms.SlideDeck in project Signal-Android by signalapp.

the class ConversationParentFragment method handleReplyMessage.

@Override
public void handleReplyMessage(ConversationMessage conversationMessage) {
    MessageRecord messageRecord = conversationMessage.getMessageRecord();
    Recipient author;
    if (messageRecord.isOutgoing()) {
        author = Recipient.self();
    } else {
        author = messageRecord.getIndividualRecipient();
    }
    if (messageRecord.isMms() && !((MmsMessageRecord) messageRecord).getSharedContacts().isEmpty()) {
        Contact contact = ((MmsMessageRecord) messageRecord).getSharedContacts().get(0);
        String displayName = ContactUtil.getDisplayName(contact);
        String body = getString(R.string.ConversationActivity_quoted_contact_message, EmojiStrings.BUST_IN_SILHOUETTE, displayName);
        SlideDeck slideDeck = new SlideDeck();
        if (contact.getAvatarAttachment() != null) {
            slideDeck.addSlide(MediaUtil.getSlideForAttachment(requireContext(), contact.getAvatarAttachment()));
        }
        inputPanel.setQuote(GlideApp.with(this), messageRecord.getDateSent(), author, body, slideDeck);
    } else if (messageRecord.isMms() && !((MmsMessageRecord) messageRecord).getLinkPreviews().isEmpty()) {
        LinkPreview linkPreview = ((MmsMessageRecord) messageRecord).getLinkPreviews().get(0);
        SlideDeck slideDeck = new SlideDeck();
        if (linkPreview.getThumbnail().isPresent()) {
            slideDeck.addSlide(MediaUtil.getSlideForAttachment(requireContext(), linkPreview.getThumbnail().get()));
        }
        inputPanel.setQuote(GlideApp.with(this), messageRecord.getDateSent(), author, conversationMessage.getDisplayBody(requireContext()), slideDeck);
    } else {
        SlideDeck slideDeck = messageRecord.isMms() ? ((MmsMessageRecord) messageRecord).getSlideDeck() : new SlideDeck();
        if (messageRecord.isMms() && ((MmsMessageRecord) messageRecord).isViewOnce()) {
            Attachment attachment = new TombstoneAttachment(MediaUtil.VIEW_ONCE, true);
            slideDeck = new SlideDeck();
            slideDeck.addSlide(MediaUtil.getSlideForAttachment(requireContext(), attachment));
        }
        inputPanel.setQuote(GlideApp.with(this), messageRecord.getDateSent(), author, conversationMessage.getDisplayBody(requireContext()), slideDeck);
    }
    inputPanel.clickOnComposeInput();
}
Also used : TombstoneAttachment(org.thoughtcrime.securesms.attachments.TombstoneAttachment) LinkPreview(org.thoughtcrime.securesms.linkpreview.LinkPreview) MmsMessageRecord(org.thoughtcrime.securesms.database.model.MmsMessageRecord) MessageRecord(org.thoughtcrime.securesms.database.model.MessageRecord) LiveRecipient(org.thoughtcrime.securesms.recipients.LiveRecipient) Recipient(org.thoughtcrime.securesms.recipients.Recipient) Attachment(org.thoughtcrime.securesms.attachments.Attachment) TombstoneAttachment(org.thoughtcrime.securesms.attachments.TombstoneAttachment) SpannableString(android.text.SpannableString) SlideDeck(org.thoughtcrime.securesms.mms.SlideDeck) MmsMessageRecord(org.thoughtcrime.securesms.database.model.MmsMessageRecord) Contact(org.thoughtcrime.securesms.contactshare.Contact)

Example 12 with SlideDeck

use of org.thoughtcrime.securesms.mms.SlideDeck in project Signal-Android by signalapp.

the class ConversationParentFragment method sendKeyboardImage.

private void sendKeyboardImage(@NonNull Uri uri, @NonNull String contentType, @Nullable KeyboardImageDetails details) {
    if (details == null || !details.hasTransparency) {
        setMedia(uri, Objects.requireNonNull(MediaType.from(contentType)));
        return;
    }
    long expiresIn = TimeUnit.SECONDS.toMillis(recipient.get().getExpiresInSeconds());
    int subscriptionId = sendButton.getSelectedTransport().getSimSubscriptionId().or(-1);
    boolean initiating = threadId == -1;
    SlideDeck slideDeck = new SlideDeck();
    if (MediaUtil.isGif(contentType)) {
        slideDeck.addSlide(new GifSlide(requireContext(), uri, 0, details.width, details.height, details.hasTransparency, null));
    } else if (MediaUtil.isImageType(contentType)) {
        slideDeck.addSlide(new ImageSlide(requireContext(), uri, contentType, 0, details.width, details.height, details.hasTransparency, null, null));
    } else {
        throw new AssertionError("Only images are supported!");
    }
    sendMediaMessage(recipient.getId(), isSmsForced(), "", slideDeck, null, Collections.emptyList(), Collections.emptyList(), composeText.getMentions(), expiresIn, false, subscriptionId, initiating, false, null);
}
Also used : ImageSlide(org.thoughtcrime.securesms.mms.ImageSlide) GifSlide(org.thoughtcrime.securesms.mms.GifSlide) SlideDeck(org.thoughtcrime.securesms.mms.SlideDeck) SuppressLint(android.annotation.SuppressLint)

Example 13 with SlideDeck

use of org.thoughtcrime.securesms.mms.SlideDeck in project Signal-Android by signalapp.

the class ConversationParentFragment method sendMediaMessage.

private void sendMediaMessage(@NonNull MediaSendActivityResult result) {
    long thread = this.threadId;
    long expiresIn = TimeUnit.SECONDS.toMillis(recipient.get().getExpiresInSeconds());
    QuoteModel quote = result.isViewOnce() ? null : inputPanel.getQuote().orNull();
    List<Mention> mentions = new ArrayList<>(result.getMentions());
    OutgoingMediaMessage message = new OutgoingMediaMessage(recipient.get(), new SlideDeck(), result.getBody(), System.currentTimeMillis(), -1, expiresIn, result.isViewOnce(), distributionType, quote, Collections.emptyList(), Collections.emptyList(), mentions);
    OutgoingMediaMessage secureMessage = new OutgoingSecureMediaMessage(message);
    final Context context = requireContext().getApplicationContext();
    ApplicationDependencies.getTypingStatusSender().onTypingStopped(thread);
    inputPanel.clearQuote();
    attachmentManager.clear(glideRequests, false);
    silentlySetComposeText("");
    long id = fragment.stageOutgoingMessage(secureMessage);
    SimpleTask.run(() -> {
        long resultId = MessageSender.sendPushWithPreUploadedMedia(context, secureMessage, result.getPreUploadResults(), thread, null);
        int deleted = SignalDatabase.attachments().deleteAbandonedPreuploadedAttachments();
        Log.i(TAG, "Deleted " + deleted + " abandoned attachments.");
        return resultId;
    }, this::sendComplete);
}
Also used : Context(android.content.Context) OutgoingSecureMediaMessage(org.thoughtcrime.securesms.mms.OutgoingSecureMediaMessage) Mention(org.thoughtcrime.securesms.database.model.Mention) ArrayList(java.util.ArrayList) OutgoingMediaMessage(org.thoughtcrime.securesms.mms.OutgoingMediaMessage) SlideDeck(org.thoughtcrime.securesms.mms.SlideDeck) QuoteModel(org.thoughtcrime.securesms.mms.QuoteModel) SuppressLint(android.annotation.SuppressLint)

Example 14 with SlideDeck

use of org.thoughtcrime.securesms.mms.SlideDeck in project Signal-Android by signalapp.

the class MediaMmsMessageRecord method withAttachments.

@NonNull
public MediaMmsMessageRecord withAttachments(@NonNull Context context, @NonNull List<DatabaseAttachment> attachments) {
    Map<AttachmentId, DatabaseAttachment> attachmentIdMap = new HashMap<>();
    for (DatabaseAttachment attachment : attachments) {
        attachmentIdMap.put(attachment.getAttachmentId(), attachment);
    }
    List<Contact> contacts = updateContacts(getSharedContacts(), attachmentIdMap);
    Set<Attachment> contactAttachments = contacts.stream().map(Contact::getAvatarAttachment).filter(Objects::nonNull).collect(Collectors.toSet());
    List<LinkPreview> linkPreviews = updateLinkPreviews(getLinkPreviews(), attachmentIdMap);
    Set<Attachment> linkPreviewAttachments = linkPreviews.stream().map(LinkPreview::getThumbnail).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toSet());
    Quote quote = updateQuote(context, getQuote(), attachments);
    List<DatabaseAttachment> slideAttachments = attachments.stream().filter(a -> !contactAttachments.contains(a)).filter(a -> !linkPreviewAttachments.contains(a)).collect(Collectors.toList());
    SlideDeck slideDeck = MmsDatabase.Reader.buildSlideDeck(context, slideAttachments);
    return new MediaMmsMessageRecord(getId(), getRecipient(), getIndividualRecipient(), getRecipientDeviceId(), getDateSent(), getDateReceived(), getServerTimestamp(), getDeliveryReceiptCount(), getThreadId(), getBody(), slideDeck, getPartCount(), getType(), getIdentityKeyMismatches(), getNetworkFailures(), getSubscriptionId(), getExpiresIn(), getExpireStarted(), isViewOnce(), getReadReceiptCount(), quote, contacts, linkPreviews, isUnidentified(), getReactions(), isRemoteDelete(), mentionsSelf, getNotifiedTimestamp(), getViewedReceiptCount(), getReceiptTimestamp(), getMessageRanges());
}
Also used : Context(android.content.Context) SlideDeck(org.thoughtcrime.securesms.mms.SlideDeck) LinkPreview(org.thoughtcrime.securesms.linkpreview.LinkPreview) NonNull(androidx.annotation.NonNull) WorkerThread(androidx.annotation.WorkerThread) HashMap(java.util.HashMap) R(org.thoughtcrime.securesms.R) DatabaseAttachment(org.thoughtcrime.securesms.attachments.DatabaseAttachment) BodyRangeList(org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList) Map(java.util.Map) Recipient(org.thoughtcrime.securesms.recipients.Recipient) Contact(org.thoughtcrime.securesms.contactshare.Contact) Status(org.thoughtcrime.securesms.database.SmsDatabase.Status) IdentityKeyMismatch(org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch) SpannableString(android.text.SpannableString) Set(java.util.Set) Collectors(java.util.stream.Collectors) Optional(org.whispersystems.libsignal.util.guava.Optional) Objects(java.util.Objects) Log(org.signal.core.util.logging.Log) List(java.util.List) Nullable(androidx.annotation.Nullable) AttachmentId(org.thoughtcrime.securesms.attachments.AttachmentId) NetworkFailure(org.thoughtcrime.securesms.database.documents.NetworkFailure) MmsDatabase(org.thoughtcrime.securesms.database.MmsDatabase) Attachment(org.thoughtcrime.securesms.attachments.Attachment) Optional(org.whispersystems.libsignal.util.guava.Optional) HashMap(java.util.HashMap) LinkPreview(org.thoughtcrime.securesms.linkpreview.LinkPreview) DatabaseAttachment(org.thoughtcrime.securesms.attachments.DatabaseAttachment) DatabaseAttachment(org.thoughtcrime.securesms.attachments.DatabaseAttachment) Attachment(org.thoughtcrime.securesms.attachments.Attachment) SlideDeck(org.thoughtcrime.securesms.mms.SlideDeck) AttachmentId(org.thoughtcrime.securesms.attachments.AttachmentId) Contact(org.thoughtcrime.securesms.contactshare.Contact) NonNull(androidx.annotation.NonNull)

Example 15 with SlideDeck

use of org.thoughtcrime.securesms.mms.SlideDeck in project Signal-Android by signalapp.

the class MessageContentProcessor method handleSynchronizeSentTextMessage.

private long handleSynchronizeSentTextMessage(@NonNull SentTranscriptMessage message, long envelopeTimestamp) throws MmsException, BadGroupIdException {
    log(envelopeTimestamp, "Synchronize sent text message for " + message.getTimestamp());
    Recipient recipient = getSyncMessageDestination(message);
    String body = message.getMessage().getBody().or("");
    long expiresInMillis = TimeUnit.SECONDS.toMillis(message.getMessage().getExpiresInSeconds());
    if (recipient.getExpiresInSeconds() != message.getMessage().getExpiresInSeconds()) {
        handleSynchronizeSentExpirationUpdate(message);
    }
    long threadId = SignalDatabase.threads().getOrCreateThreadIdFor(recipient);
    boolean isGroup = recipient.isGroup();
    MessageDatabase database;
    long messageId;
    if (isGroup) {
        OutgoingMediaMessage outgoingMediaMessage = new OutgoingMediaMessage(recipient, new SlideDeck(), body, message.getTimestamp(), -1, expiresInMillis, false, ThreadDatabase.DistributionTypes.DEFAULT, null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
        outgoingMediaMessage = new OutgoingSecureMediaMessage(outgoingMediaMessage);
        messageId = SignalDatabase.mms().insertMessageOutbox(outgoingMediaMessage, threadId, false, GroupReceiptDatabase.STATUS_UNKNOWN, null);
        database = SignalDatabase.mms();
        updateGroupReceiptStatus(message, messageId, recipient.requireGroupId());
    } else {
        OutgoingTextMessage outgoingTextMessage = new OutgoingEncryptedMessage(recipient, body, expiresInMillis);
        messageId = SignalDatabase.sms().insertMessageOutbox(threadId, outgoingTextMessage, false, message.getTimestamp(), null);
        database = SignalDatabase.sms();
        database.markUnidentified(messageId, isUnidentified(message, recipient));
        SignalDatabase.threads().update(threadId, true);
    }
    database.markAsSent(messageId, true);
    if (expiresInMillis > 0) {
        database.markExpireStarted(messageId, message.getExpirationStartTimestamp());
        ApplicationDependencies.getExpiringMessageManager().scheduleDeletion(messageId, isGroup, message.getExpirationStartTimestamp(), expiresInMillis);
    }
    if (recipient.isSelf()) {
        SyncMessageId id = new SyncMessageId(recipient.getId(), message.getTimestamp());
        SignalDatabase.mmsSms().incrementDeliveryReceiptCount(id, System.currentTimeMillis());
        SignalDatabase.mmsSms().incrementReadReceiptCount(id, System.currentTimeMillis());
    }
    return threadId;
}
Also used : OutgoingTextMessage(org.thoughtcrime.securesms.sms.OutgoingTextMessage) MessageDatabase(org.thoughtcrime.securesms.database.MessageDatabase) OutgoingSecureMediaMessage(org.thoughtcrime.securesms.mms.OutgoingSecureMediaMessage) OutgoingEncryptedMessage(org.thoughtcrime.securesms.sms.OutgoingEncryptedMessage) Recipient(org.thoughtcrime.securesms.recipients.Recipient) OutgoingMediaMessage(org.thoughtcrime.securesms.mms.OutgoingMediaMessage) SlideDeck(org.thoughtcrime.securesms.mms.SlideDeck) SyncMessageId(org.thoughtcrime.securesms.database.MessageDatabase.SyncMessageId)

Aggregations

SlideDeck (org.thoughtcrime.securesms.mms.SlideDeck)26 Recipient (org.thoughtcrime.securesms.recipients.Recipient)13 SuppressLint (android.annotation.SuppressLint)11 Context (android.content.Context)8 AudioSlide (org.thoughtcrime.securesms.mms.AudioSlide)8 OutgoingMediaMessage (org.thoughtcrime.securesms.mms.OutgoingMediaMessage)8 OutgoingSecureMediaMessage (org.thoughtcrime.securesms.mms.OutgoingSecureMediaMessage)7 Nullable (androidx.annotation.Nullable)6 WorkerThread (androidx.annotation.WorkerThread)6 ArrayList (java.util.ArrayList)6 Mention (org.thoughtcrime.securesms.database.model.Mention)6 MmsMessageRecord (org.thoughtcrime.securesms.database.model.MmsMessageRecord)6 GifSlide (org.thoughtcrime.securesms.mms.GifSlide)6 ImageSlide (org.thoughtcrime.securesms.mms.ImageSlide)6 Slide (org.thoughtcrime.securesms.mms.Slide)6 StickerSlide (org.thoughtcrime.securesms.mms.StickerSlide)6 OutgoingTextMessage (org.thoughtcrime.securesms.sms.OutgoingTextMessage)6 SpannableString (android.text.SpannableString)5 Attachment (org.thoughtcrime.securesms.attachments.Attachment)5 Contact (org.thoughtcrime.securesms.contactshare.Contact)5