Search in sources :

Example 31 with Optional

use of org.whispersystems.libsignal.util.guava.Optional in project Signal-Android by WhisperSystems.

the class ConversationListFragment method updateReminders.

private void updateReminders() {
    reminderView.hide();
    new AsyncTask<Context, Void, Optional<? extends Reminder>>() {

        @Override
        protected Optional<? extends Reminder> doInBackground(Context... params) {
            final Context context = params[0];
            if (ExpiredBuildReminder.isEligible()) {
                return Optional.of(new ExpiredBuildReminder(context));
            } else if (OutdatedBuildReminder.isEligible()) {
                return Optional.of(new OutdatedBuildReminder(context));
            } else if (DefaultSmsReminder.isEligible(context)) {
                return Optional.of(new DefaultSmsReminder(context));
            } else if (Util.isDefaultSmsProvider(context) && SystemSmsImportReminder.isEligible(context)) {
                return Optional.of((new SystemSmsImportReminder(context, masterSecret)));
            } else if (PushRegistrationReminder.isEligible(context)) {
                return Optional.of((new PushRegistrationReminder(context, masterSecret)));
            } else if (ShareReminder.isEligible(context)) {
                return Optional.of(new ShareReminder(context));
            } else if (DozeReminder.isEligible(context)) {
                return Optional.of(new DozeReminder(context));
            } else {
                return Optional.absent();
            }
        }

        @Override
        protected void onPostExecute(Optional<? extends Reminder> reminder) {
            if (reminder.isPresent() && getActivity() != null && !isRemoving()) {
                reminderView.showReminder(reminder.get());
            }
        }
    }.execute(getActivity());
}
Also used : Context(android.content.Context) PushRegistrationReminder(org.thoughtcrime.securesms.components.reminder.PushRegistrationReminder) ShareReminder(org.thoughtcrime.securesms.components.reminder.ShareReminder) DozeReminder(org.thoughtcrime.securesms.components.reminder.DozeReminder) ShareReminder(org.thoughtcrime.securesms.components.reminder.ShareReminder) DefaultSmsReminder(org.thoughtcrime.securesms.components.reminder.DefaultSmsReminder) ExpiredBuildReminder(org.thoughtcrime.securesms.components.reminder.ExpiredBuildReminder) DozeReminder(org.thoughtcrime.securesms.components.reminder.DozeReminder) SystemSmsImportReminder(org.thoughtcrime.securesms.components.reminder.SystemSmsImportReminder) OutdatedBuildReminder(org.thoughtcrime.securesms.components.reminder.OutdatedBuildReminder) PushRegistrationReminder(org.thoughtcrime.securesms.components.reminder.PushRegistrationReminder) Reminder(org.thoughtcrime.securesms.components.reminder.Reminder) Optional(org.whispersystems.libsignal.util.guava.Optional) DefaultSmsReminder(org.thoughtcrime.securesms.components.reminder.DefaultSmsReminder) ExpiredBuildReminder(org.thoughtcrime.securesms.components.reminder.ExpiredBuildReminder) OutdatedBuildReminder(org.thoughtcrime.securesms.components.reminder.OutdatedBuildReminder) SystemSmsImportReminder(org.thoughtcrime.securesms.components.reminder.SystemSmsImportReminder)

Example 32 with Optional

use of org.whispersystems.libsignal.util.guava.Optional in project Signal-Android by WhisperSystems.

the class IdentityUtil method getRemoteIdentityKey.

@UiThread
public static ListenableFuture<Optional<IdentityKey>> getRemoteIdentityKey(final Context context, final MasterSecret masterSecret, final Recipient recipient) {
    final SettableFuture<Optional<IdentityKey>> future = new SettableFuture<>();
    new AsyncTask<Recipient, Void, Optional<IdentityKey>>() {

        @Override
        protected Optional<IdentityKey> doInBackground(Recipient... recipient) {
            SessionStore sessionStore = new TextSecureSessionStore(context, masterSecret);
            SignalProtocolAddress axolotlAddress = new SignalProtocolAddress(recipient[0].getNumber(), SignalServiceAddress.DEFAULT_DEVICE_ID);
            SessionRecord record = sessionStore.loadSession(axolotlAddress);
            if (record == null) {
                return Optional.absent();
            }
            return Optional.fromNullable(record.getSessionState().getRemoteIdentityKey());
        }

        @Override
        protected void onPostExecute(Optional<IdentityKey> result) {
            future.set(result);
        }
    }.execute(recipient);
    return future;
}
Also used : SettableFuture(org.thoughtcrime.securesms.util.concurrent.SettableFuture) IdentityKey(org.whispersystems.libsignal.IdentityKey) Optional(org.whispersystems.libsignal.util.guava.Optional) Recipient(org.thoughtcrime.securesms.recipients.Recipient) TextSecureSessionStore(org.thoughtcrime.securesms.crypto.storage.TextSecureSessionStore) SessionStore(org.whispersystems.libsignal.state.SessionStore) TextSecureSessionStore(org.thoughtcrime.securesms.crypto.storage.TextSecureSessionStore) SignalProtocolAddress(org.whispersystems.libsignal.SignalProtocolAddress) SessionRecord(org.whispersystems.libsignal.state.SessionRecord) UiThread(android.support.annotation.UiThread)

Example 33 with Optional

use of org.whispersystems.libsignal.util.guava.Optional in project Signal-Android by WhisperSystems.

the class ConversationItem method setMediaAttributes.

private void setMediaAttributes(@NonNull MessageRecord messageRecord, @NonNull Optional<MessageRecord> previousRecord, @NonNull Optional<MessageRecord> nextRecord, boolean isGroupThread, boolean hasWallpaper, boolean messageRequestAccepted, boolean allowedToPlayInline) {
    boolean showControls = !messageRecord.isFailed();
    ViewUtil.setTopMargin(bodyText, readDimen(R.dimen.message_bubble_top_padding));
    bodyBubble.setQuoteViewProjection(null);
    bodyBubble.setVideoPlayerProjection(null);
    if (eventListener != null && audioViewStub.resolved()) {
        Log.d(TAG, "setMediaAttributes: unregistering voice note callbacks for audio slide " + audioViewStub.get().getAudioSlideUri());
        eventListener.onUnregisterVoiceNoteCallbacks(audioViewStub.get().getPlaybackStateObserver());
    }
    footer.setPlaybackSpeedListener(null);
    if (isViewOnceMessage(messageRecord) && !messageRecord.isRemoteDelete()) {
        revealableStub.get().setVisibility(VISIBLE);
        if (mediaThumbnailStub.resolved())
            mediaThumbnailStub.require().setVisibility(View.GONE);
        if (audioViewStub.resolved())
            audioViewStub.get().setVisibility(View.GONE);
        if (documentViewStub.resolved())
            documentViewStub.get().setVisibility(View.GONE);
        if (sharedContactStub.resolved())
            sharedContactStub.get().setVisibility(GONE);
        if (linkPreviewStub.resolved())
            linkPreviewStub.get().setVisibility(GONE);
        if (stickerStub.resolved())
            stickerStub.get().setVisibility(View.GONE);
        revealableStub.get().setMessage((MmsMessageRecord) messageRecord, hasWallpaper);
        revealableStub.get().setOnClickListener(revealableClickListener);
        revealableStub.get().setOnLongClickListener(passthroughClickListener);
        updateRevealableMargins(messageRecord, previousRecord, nextRecord, isGroupThread);
        footer.setVisibility(VISIBLE);
    } else if (hasSharedContact(messageRecord)) {
        sharedContactStub.get().setVisibility(VISIBLE);
        if (audioViewStub.resolved())
            audioViewStub.get().setVisibility(View.GONE);
        if (mediaThumbnailStub.resolved())
            mediaThumbnailStub.require().setVisibility(View.GONE);
        if (documentViewStub.resolved())
            documentViewStub.get().setVisibility(View.GONE);
        if (linkPreviewStub.resolved())
            linkPreviewStub.get().setVisibility(GONE);
        if (stickerStub.resolved())
            stickerStub.get().setVisibility(View.GONE);
        if (revealableStub.resolved())
            revealableStub.get().setVisibility(View.GONE);
        sharedContactStub.get().setContact(((MediaMmsMessageRecord) messageRecord).getSharedContacts().get(0), glideRequests, locale);
        sharedContactStub.get().setEventListener(sharedContactEventListener);
        sharedContactStub.get().setOnClickListener(sharedContactClickListener);
        sharedContactStub.get().setOnLongClickListener(passthroughClickListener);
        setSharedContactCorners(messageRecord, previousRecord, nextRecord, isGroupThread);
        ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        ViewUtil.updateLayoutParamsIfNonNull(groupSenderHolder, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        footer.setVisibility(GONE);
    } else if (hasLinkPreview(messageRecord) && messageRequestAccepted) {
        linkPreviewStub.get().setVisibility(View.VISIBLE);
        if (audioViewStub.resolved())
            audioViewStub.get().setVisibility(View.GONE);
        if (mediaThumbnailStub.resolved())
            mediaThumbnailStub.require().setVisibility(View.GONE);
        if (documentViewStub.resolved())
            documentViewStub.get().setVisibility(View.GONE);
        if (sharedContactStub.resolved())
            sharedContactStub.get().setVisibility(GONE);
        if (stickerStub.resolved())
            stickerStub.get().setVisibility(View.GONE);
        if (revealableStub.resolved())
            revealableStub.get().setVisibility(View.GONE);
        // noinspection ConstantConditions
        LinkPreview linkPreview = ((MmsMessageRecord) messageRecord).getLinkPreviews().get(0);
        if (hasBigImageLinkPreview(messageRecord)) {
            mediaThumbnailStub.require().setVisibility(VISIBLE);
            mediaThumbnailStub.require().setMinimumThumbnailWidth(readDimen(R.dimen.media_bubble_min_width_with_content));
            mediaThumbnailStub.require().setImageResource(glideRequests, Collections.singletonList(new ImageSlide(context, linkPreview.getThumbnail().get())), showControls, false);
            mediaThumbnailStub.require().setThumbnailClickListener(new LinkPreviewThumbnailClickListener());
            mediaThumbnailStub.require().setDownloadClickListener(downloadClickListener);
            mediaThumbnailStub.require().setOnLongClickListener(passthroughClickListener);
            linkPreviewStub.get().setLinkPreview(glideRequests, linkPreview, false);
            setThumbnailCorners(messageRecord, previousRecord, nextRecord, isGroupThread);
            setLinkPreviewCorners(messageRecord, previousRecord, nextRecord, isGroupThread, true);
            ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            ViewUtil.updateLayoutParamsIfNonNull(groupSenderHolder, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            ViewUtil.setTopMargin(linkPreviewStub.get(), 0);
        } else {
            linkPreviewStub.get().setLinkPreview(glideRequests, linkPreview, true);
            linkPreviewStub.get().setDownloadClickedListener(downloadClickListener);
            setLinkPreviewCorners(messageRecord, previousRecord, nextRecord, isGroupThread, false);
            ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            ViewUtil.updateLayoutParamsIfNonNull(groupSenderHolder, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            // noinspection ConstantConditions
            int topMargin = isGroupThread && isStartOfMessageCluster(messageRecord, previousRecord, isGroupThread) && !messageRecord.isOutgoing() ? readDimen(R.dimen.message_bubble_top_padding) : 0;
            ViewUtil.setTopMargin(linkPreviewStub.get(), topMargin);
        }
        linkPreviewStub.get().setOnClickListener(linkPreviewClickListener);
        linkPreviewStub.get().setOnLongClickListener(passthroughClickListener);
        footer.setVisibility(VISIBLE);
    } else if (hasAudio(messageRecord)) {
        audioViewStub.get().setVisibility(View.VISIBLE);
        if (mediaThumbnailStub.resolved())
            mediaThumbnailStub.require().setVisibility(View.GONE);
        if (documentViewStub.resolved())
            documentViewStub.get().setVisibility(View.GONE);
        if (sharedContactStub.resolved())
            sharedContactStub.get().setVisibility(GONE);
        if (linkPreviewStub.resolved())
            linkPreviewStub.get().setVisibility(GONE);
        if (stickerStub.resolved())
            stickerStub.get().setVisibility(View.GONE);
        if (revealableStub.resolved())
            revealableStub.get().setVisibility(View.GONE);
        audioViewStub.get().setAudio(Objects.requireNonNull(((MediaMmsMessageRecord) messageRecord).getSlideDeck().getAudioSlide()), new AudioViewCallbacks(), showControls, true);
        audioViewStub.get().setDownloadClickListener(singleDownloadClickListener);
        audioViewStub.get().setOnLongClickListener(passthroughClickListener);
        if (eventListener != null) {
            Log.d(TAG, "setMediaAttributes: registered listener for audio slide " + audioViewStub.get().getAudioSlideUri());
            eventListener.onRegisterVoiceNoteCallbacks(audioViewStub.get().getPlaybackStateObserver());
        } else {
            Log.w(TAG, "setMediaAttributes: could not register listener for audio slide " + audioViewStub.get().getAudioSlideUri());
        }
        ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        ViewUtil.updateLayoutParamsIfNonNull(groupSenderHolder, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        footer.setPlaybackSpeedListener(new AudioPlaybackSpeedToggleListener());
        footer.setVisibility(VISIBLE);
    } else if (hasDocument(messageRecord)) {
        documentViewStub.get().setVisibility(View.VISIBLE);
        if (mediaThumbnailStub.resolved())
            mediaThumbnailStub.require().setVisibility(View.GONE);
        if (audioViewStub.resolved())
            audioViewStub.get().setVisibility(View.GONE);
        if (sharedContactStub.resolved())
            sharedContactStub.get().setVisibility(GONE);
        if (linkPreviewStub.resolved())
            linkPreviewStub.get().setVisibility(GONE);
        if (stickerStub.resolved())
            stickerStub.get().setVisibility(View.GONE);
        if (revealableStub.resolved())
            revealableStub.get().setVisibility(View.GONE);
        // noinspection ConstantConditions
        documentViewStub.get().setDocument(((MediaMmsMessageRecord) messageRecord).getSlideDeck().getDocumentSlide(), showControls);
        documentViewStub.get().setDocumentClickListener(new ThumbnailClickListener());
        documentViewStub.get().setDownloadClickListener(singleDownloadClickListener);
        documentViewStub.get().setOnLongClickListener(passthroughClickListener);
        ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        ViewUtil.updateLayoutParamsIfNonNull(groupSenderHolder, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        ViewUtil.setTopMargin(bodyText, 0);
        footer.setVisibility(VISIBLE);
    } else if ((hasSticker(messageRecord) && isCaptionlessMms(messageRecord)) || isBorderless(messageRecord)) {
        bodyBubble.setBackgroundColor(Color.TRANSPARENT);
        stickerStub.get().setVisibility(View.VISIBLE);
        if (mediaThumbnailStub.resolved())
            mediaThumbnailStub.require().setVisibility(View.GONE);
        if (audioViewStub.resolved())
            audioViewStub.get().setVisibility(View.GONE);
        if (documentViewStub.resolved())
            documentViewStub.get().setVisibility(View.GONE);
        if (sharedContactStub.resolved())
            sharedContactStub.get().setVisibility(GONE);
        if (linkPreviewStub.resolved())
            linkPreviewStub.get().setVisibility(GONE);
        if (revealableStub.resolved())
            revealableStub.get().setVisibility(View.GONE);
        if (hasSticker(messageRecord)) {
            // noinspection ConstantConditions
            stickerStub.get().setSlide(glideRequests, ((MmsMessageRecord) messageRecord).getSlideDeck().getStickerSlide());
            stickerStub.get().setThumbnailClickListener(new StickerClickListener());
        } else {
            // noinspection ConstantConditions
            stickerStub.get().setSlide(glideRequests, ((MmsMessageRecord) messageRecord).getSlideDeck().getThumbnailSlide());
            stickerStub.get().setThumbnailClickListener((v, slide) -> performClick());
        }
        stickerStub.get().setDownloadClickListener(downloadClickListener);
        stickerStub.get().setOnLongClickListener(passthroughClickListener);
        stickerStub.get().setOnClickListener(passthroughClickListener);
        ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        ViewUtil.updateLayoutParamsIfNonNull(groupSenderHolder, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        footer.setVisibility(VISIBLE);
    } else if (hasNoBubble(messageRecord)) {
        bodyBubble.setBackgroundColor(Color.TRANSPARENT);
    } else if (hasThumbnail(messageRecord)) {
        mediaThumbnailStub.require().setVisibility(View.VISIBLE);
        if (audioViewStub.resolved())
            audioViewStub.get().setVisibility(View.GONE);
        if (documentViewStub.resolved())
            documentViewStub.get().setVisibility(View.GONE);
        if (sharedContactStub.resolved())
            sharedContactStub.get().setVisibility(GONE);
        if (linkPreviewStub.resolved())
            linkPreviewStub.get().setVisibility(GONE);
        if (stickerStub.resolved())
            stickerStub.get().setVisibility(View.GONE);
        if (revealableStub.resolved())
            revealableStub.get().setVisibility(View.GONE);
        List<Slide> thumbnailSlides = ((MmsMessageRecord) messageRecord).getSlideDeck().getThumbnailSlides();
        mediaThumbnailStub.require().setMinimumThumbnailWidth(readDimen(isCaptionlessMms(messageRecord) ? R.dimen.media_bubble_min_width_solo : R.dimen.media_bubble_min_width_with_content));
        mediaThumbnailStub.require().setImageResource(glideRequests, thumbnailSlides, showControls, false);
        mediaThumbnailStub.require().setThumbnailClickListener(new ThumbnailClickListener());
        mediaThumbnailStub.require().setDownloadClickListener(downloadClickListener);
        mediaThumbnailStub.require().setOnLongClickListener(passthroughClickListener);
        mediaThumbnailStub.require().setOnClickListener(passthroughClickListener);
        mediaThumbnailStub.require().showShade(messageRecord.isDisplayBodyEmpty(getContext()) && !hasExtraText(messageRecord));
        if (!messageRecord.isOutgoing()) {
            mediaThumbnailStub.require().setConversationColor(getDefaultBubbleColor(hasWallpaper));
        } else {
            mediaThumbnailStub.require().setConversationColor(Color.TRANSPARENT);
        }
        mediaThumbnailStub.require().setBorderless(false);
        setThumbnailCorners(messageRecord, previousRecord, nextRecord, isGroupThread);
        ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        ViewUtil.updateLayoutParamsIfNonNull(groupSenderHolder, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        footer.setVisibility(VISIBLE);
        if (thumbnailSlides.size() == 1 && thumbnailSlides.get(0).isVideoGif() && thumbnailSlides.get(0) instanceof VideoSlide) {
            Uri uri = thumbnailSlides.get(0).getUri();
            if (uri != null) {
                mediaItem = MediaItem.fromUri(uri);
            } else {
                mediaItem = null;
            }
            canPlayContent = (GiphyMp4PlaybackPolicy.autoplay() || allowedToPlayInline) && mediaItem != null;
        }
    } else {
        if (mediaThumbnailStub.resolved())
            mediaThumbnailStub.require().setVisibility(View.GONE);
        if (audioViewStub.resolved())
            audioViewStub.get().setVisibility(View.GONE);
        if (documentViewStub.resolved())
            documentViewStub.get().setVisibility(View.GONE);
        if (sharedContactStub.resolved())
            sharedContactStub.get().setVisibility(GONE);
        if (linkPreviewStub.resolved())
            linkPreviewStub.get().setVisibility(GONE);
        if (stickerStub.resolved())
            stickerStub.get().setVisibility(View.GONE);
        if (revealableStub.resolved())
            revealableStub.get().setVisibility(View.GONE);
        ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        ViewUtil.updateLayoutParamsIfNonNull(groupSenderHolder, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        footer.setVisibility(VISIBLE);
        // noinspection ConstantConditions
        int topMargin = !messageRecord.isOutgoing() && isGroupThread && isStartOfMessageCluster(messageRecord, previousRecord, isGroupThread) ? readDimen(R.dimen.message_bubble_text_only_top_margin) : readDimen(R.dimen.message_bubble_top_padding);
        ViewUtil.setTopMargin(bodyText, topMargin);
    }
}
Also used : LinkPreview(org.thoughtcrime.securesms.linkpreview.LinkPreview) SlideClickListener(org.thoughtcrime.securesms.mms.SlideClickListener) NonNull(androidx.annotation.NonNull) LongClickMovementMethod(org.thoughtcrime.securesms.util.LongClickMovementMethod) Uri(android.net.Uri) StringUtil(org.thoughtcrime.securesms.util.StringUtil) TouchDelegate(android.view.TouchDelegate) ColorInt(androidx.annotation.ColorInt) LinkPreviewUtil(org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil) ImageSlide(org.thoughtcrime.securesms.mms.ImageSlide) RecipientId(org.thoughtcrime.securesms.recipients.RecipientId) TextSlide(org.thoughtcrime.securesms.mms.TextSlide) MmsMessageRecord(org.thoughtcrime.securesms.database.model.MmsMessageRecord) BindableConversationItem(org.thoughtcrime.securesms.BindableConversationItem) PartAuthority(org.thoughtcrime.securesms.mms.PartAuthority) LinkPreviewView(org.thoughtcrime.securesms.components.LinkPreviewView) ForegroundColorSpan(android.text.style.ForegroundColorSpan) ContextCompat(androidx.core.content.ContextCompat) PlaceholderURLSpan(org.thoughtcrime.securesms.util.PlaceholderURLSpan) ApplicationDependencies(org.thoughtcrime.securesms.dependencies.ApplicationDependencies) Set(java.util.Set) MediaPreviewActivity(org.thoughtcrime.securesms.MediaPreviewActivity) MmsDownloadJob(org.thoughtcrime.securesms.jobs.MmsDownloadJob) MessageRecordUtil(org.thoughtcrime.securesms.util.MessageRecordUtil) Nullable(androidx.annotation.Nullable) TextPaint(android.text.TextPaint) AlertView(org.thoughtcrime.securesms.components.AlertView) LinkifyCompat(androidx.core.text.util.LinkifyCompat) ViewOnceMessageView(org.thoughtcrime.securesms.revealable.ViewOnceMessageView) SignalDatabase(org.thoughtcrime.securesms.database.SignalDatabase) Stream(com.annimon.stream.Stream) Util(org.thoughtcrime.securesms.util.Util) PlaybackSpeedToggleTextView(org.thoughtcrime.securesms.components.PlaybackSpeedToggleTextView) AttachmentDatabase(org.thoughtcrime.securesms.database.AttachmentDatabase) ArrayList(java.util.ArrayList) SpannableStringBuilder(android.text.SpannableStringBuilder) Toast(android.widget.Toast) Annotation(android.text.Annotation) AvatarImageView(org.thoughtcrime.securesms.components.AvatarImageView) MultiselectCollection(org.thoughtcrime.securesms.conversation.mutiselect.MultiselectCollection) MediaMmsMessageRecord(org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord) LiveRecipient(org.thoughtcrime.securesms.recipients.LiveRecipient) URLSpan(android.text.style.URLSpan) Contact(org.thoughtcrime.securesms.contactshare.Contact) SpannableString(android.text.SpannableString) StyleSpan(android.text.style.StyleSpan) NullableStub(org.thoughtcrime.securesms.util.views.NullableStub) Optional(org.whispersystems.libsignal.util.guava.Optional) ThemeUtil(org.thoughtcrime.securesms.util.ThemeUtil) TypedValue(android.util.TypedValue) SmsSendJob(org.thoughtcrime.securesms.jobs.SmsSendJob) DocumentView(org.thoughtcrime.securesms.components.DocumentView) ProjectionList(org.thoughtcrime.securesms.util.ProjectionList) ValueAnimator(android.animation.ValueAnimator) SignalStore(org.thoughtcrime.securesms.keyvalue.SignalStore) Rect(android.graphics.Rect) UrlClickHandler(org.thoughtcrime.securesms.util.UrlClickHandler) DimenRes(androidx.annotation.DimenRes) ConversationItemThumbnail(org.thoughtcrime.securesms.components.ConversationItemThumbnail) AttachmentDownloadJob(org.thoughtcrime.securesms.jobs.AttachmentDownloadJob) Spannable(android.text.Spannable) EmojiTextView(org.thoughtcrime.securesms.components.emoji.EmojiTextView) ClickableSpan(android.text.style.ClickableSpan) ViewUtil(org.thoughtcrime.securesms.util.ViewUtil) ChatColors(org.thoughtcrime.securesms.conversation.colors.ChatColors) R(org.thoughtcrime.securesms.R) MessageRecord(org.thoughtcrime.securesms.database.model.MessageRecord) AttributeSet(android.util.AttributeSet) Locale(java.util.Locale) View(android.view.View) Button(android.widget.Button) Recipient(org.thoughtcrime.securesms.recipients.Recipient) SlidesClickedListener(org.thoughtcrime.securesms.mms.SlidesClickedListener) QuoteView(org.thoughtcrime.securesms.components.QuoteView) MediaItem(com.google.android.exoplayer2.MediaItem) Outliner(org.thoughtcrime.securesms.components.Outliner) RecipientForeverObserver(org.thoughtcrime.securesms.recipients.RecipientForeverObserver) PorterDuff(android.graphics.PorterDuff) SharedContactView(org.thoughtcrime.securesms.components.SharedContactView) ViewGroup(android.view.ViewGroup) Sets(com.google.common.collect.Sets) Objects(java.util.Objects) Log(org.signal.core.util.logging.Log) List(java.util.List) TextView(android.widget.TextView) Slide(org.thoughtcrime.securesms.mms.Slide) MentionAnnotation(org.thoughtcrime.securesms.components.mention.MentionAnnotation) SearchUtil(org.thoughtcrime.securesms.util.SearchUtil) ActivityNotFoundException(android.content.ActivityNotFoundException) DateUtils(org.thoughtcrime.securesms.util.DateUtils) RelativeLayout(android.widget.RelativeLayout) GlideRequests(org.thoughtcrime.securesms.mms.GlideRequests) MessageDatabase(org.thoughtcrime.securesms.database.MessageDatabase) ReactionsConversationView(org.thoughtcrime.securesms.reactions.ReactionsConversationView) GiphyMp4PlaybackPolicy(org.thoughtcrime.securesms.giph.mp4.GiphyMp4PlaybackPolicy) Projection(org.thoughtcrime.securesms.util.Projection) VideoSlide(org.thoughtcrime.securesms.mms.VideoSlide) Typeface(android.graphics.Typeface) Context(android.content.Context) Spanned(android.text.Spanned) AlertDialog(androidx.appcompat.app.AlertDialog) InterceptableLongClickCopyLinkSpan(org.thoughtcrime.securesms.util.InterceptableLongClickCopyLinkSpan) BorderlessImageView(org.thoughtcrime.securesms.components.BorderlessImageView) MultiselectPart(org.thoughtcrime.securesms.conversation.mutiselect.MultiselectPart) GiphyMp4PlaybackPolicyEnforcer(org.thoughtcrime.securesms.giph.mp4.GiphyMp4PlaybackPolicyEnforcer) Intent(android.content.Intent) VibrateUtil(org.thoughtcrime.securesms.util.VibrateUtil) Linkify(android.text.util.Linkify) DatabaseAttachment(org.thoughtcrime.securesms.attachments.DatabaseAttachment) HashSet(java.util.HashSet) MmsSendJob(org.thoughtcrime.securesms.jobs.MmsSendJob) SuppressLint(android.annotation.SuppressLint) LifecycleOwner(androidx.lifecycle.LifecycleOwner) MotionEvent(android.view.MotionEvent) Colorizer(org.thoughtcrime.securesms.conversation.colors.Colorizer) AudioView(org.thoughtcrime.securesms.components.AudioView) Stub(org.thoughtcrime.securesms.util.views.Stub) BackgroundColorSpan(android.text.style.BackgroundColorSpan) Quote(org.thoughtcrime.securesms.database.model.Quote) Color(android.graphics.Color) TimeUnit(java.util.concurrent.TimeUnit) BadgeImageView(org.thoughtcrime.securesms.badges.BadgeImageView) CharacterStyle(android.text.style.CharacterStyle) ConversationItemFooter(org.thoughtcrime.securesms.components.ConversationItemFooter) Collections(java.util.Collections) VideoSlide(org.thoughtcrime.securesms.mms.VideoSlide) MediaMmsMessageRecord(org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord) LinkPreview(org.thoughtcrime.securesms.linkpreview.LinkPreview) MmsMessageRecord(org.thoughtcrime.securesms.database.model.MmsMessageRecord) MediaMmsMessageRecord(org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord) Uri(android.net.Uri) TextPaint(android.text.TextPaint) SuppressLint(android.annotation.SuppressLint) ImageSlide(org.thoughtcrime.securesms.mms.ImageSlide) ArrayList(java.util.ArrayList) ProjectionList(org.thoughtcrime.securesms.util.ProjectionList) List(java.util.List)

Example 34 with Optional

use of org.whispersystems.libsignal.util.guava.Optional in project Signal-Android by WhisperSystems.

the class LinkPreviewRepository method fetchMetadata.

@NonNull
private RequestController fetchMetadata(@NonNull String url, Consumer<Metadata> callback) {
    Call call = client.newCall(new Request.Builder().url(url).cacheControl(NO_CACHE).build());
    call.enqueue(new okhttp3.Callback() {

        @Override
        public void onFailure(@NonNull Call call, @NonNull IOException e) {
            Log.w(TAG, "Request failed.", e);
            callback.accept(Metadata.empty());
        }

        @Override
        public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
            if (!response.isSuccessful()) {
                Log.w(TAG, "Non-successful response. Code: " + response.code());
                callback.accept(Metadata.empty());
                return;
            } else if (response.body() == null) {
                Log.w(TAG, "No response body.");
                callback.accept(Metadata.empty());
                return;
            }
            String body = OkHttpUtil.readAsString(response.body(), FAILSAFE_MAX_TEXT_SIZE);
            OpenGraph openGraph = LinkPreviewUtil.parseOpenGraphFields(body);
            Optional<String> title = openGraph.getTitle();
            Optional<String> description = openGraph.getDescription();
            Optional<String> imageUrl = openGraph.getImageUrl();
            long date = openGraph.getDate();
            if (imageUrl.isPresent() && !LinkPreviewUtil.isValidPreviewUrl(imageUrl.get())) {
                Log.i(TAG, "Image URL was invalid or for a non-whitelisted domain. Skipping.");
                imageUrl = Optional.absent();
            }
            callback.accept(new Metadata(title, description, date, imageUrl));
        }
    });
    return new CallRequestController(call);
}
Also used : Response(okhttp3.Response) Call(okhttp3.Call) Optional(org.whispersystems.libsignal.util.guava.Optional) IOException(java.io.IOException) OpenGraph(org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil.OpenGraph) CallRequestController(org.thoughtcrime.securesms.net.CallRequestController) NonNull(androidx.annotation.NonNull)

Example 35 with Optional

use of org.whispersystems.libsignal.util.guava.Optional in project Signal-Android by WhisperSystems.

the class SenderKeyDistributionSendJob method onRun.

@Override
protected void onRun() throws Exception {
    GroupDatabase groupDatabase = SignalDatabase.groups();
    if (!groupDatabase.isCurrentMember(groupId, recipientId)) {
        Log.w(TAG, recipientId + " is no longer a member of " + groupId + "! Not sending.");
        return;
    }
    Recipient recipient = Recipient.resolved(recipientId);
    if (recipient.getSenderKeyCapability() != Recipient.Capability.SUPPORTED) {
        Log.w(TAG, recipientId + " does not support sender key! Not sending.");
        return;
    }
    if (recipient.isUnregistered()) {
        Log.w(TAG, recipient.getId() + " not registered!");
        return;
    }
    SignalServiceMessageSender messageSender = ApplicationDependencies.getSignalServiceMessageSender();
    List<SignalServiceAddress> address = Collections.singletonList(RecipientUtil.toSignalServiceAddress(context, recipient));
    DistributionId distributionId = groupDatabase.getOrCreateDistributionId(groupId);
    SenderKeyDistributionMessage message = messageSender.getOrCreateNewGroupSession(distributionId);
    List<Optional<UnidentifiedAccessPair>> access = UnidentifiedAccessUtil.getAccessFor(context, Collections.singletonList(recipient));
    SendMessageResult result = messageSender.sendSenderKeyDistributionMessage(distributionId, address, access, message, groupId.getDecodedId()).get(0);
    if (result.isSuccess()) {
        List<SignalProtocolAddress> addresses = result.getSuccess().getDevices().stream().map(device -> recipient.requireServiceId().toProtocolAddress(device)).collect(Collectors.toList());
        ApplicationDependencies.getProtocolStore().aci().markSenderKeySharedWith(distributionId, addresses);
    }
}
Also used : SignalDatabase(org.thoughtcrime.securesms.database.SignalDatabase) SendMessageResult(org.whispersystems.signalservice.api.messages.SendMessageResult) NonNull(androidx.annotation.NonNull) Data(org.thoughtcrime.securesms.jobmanager.Data) RecipientUtil(org.thoughtcrime.securesms.recipients.RecipientUtil) SignalServiceAddress(org.whispersystems.signalservice.api.push.SignalServiceAddress) UnidentifiedAccessPair(org.whispersystems.signalservice.api.crypto.UnidentifiedAccessPair) RecipientId(org.thoughtcrime.securesms.recipients.RecipientId) SignalProtocolAddress(org.whispersystems.libsignal.SignalProtocolAddress) Recipient(org.thoughtcrime.securesms.recipients.Recipient) DistributionId(org.whispersystems.signalservice.api.push.DistributionId) SignalServiceMessageSender(org.whispersystems.signalservice.api.SignalServiceMessageSender) ApplicationDependencies(org.thoughtcrime.securesms.dependencies.ApplicationDependencies) SenderKeyDistributionMessage(org.whispersystems.libsignal.protocol.SenderKeyDistributionMessage) NetworkConstraint(org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint) UnidentifiedAccessUtil(org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil) GroupDatabase(org.thoughtcrime.securesms.database.GroupDatabase) Collectors(java.util.stream.Collectors) Optional(org.whispersystems.libsignal.util.guava.Optional) TimeUnit(java.util.concurrent.TimeUnit) Log(org.signal.core.util.logging.Log) List(java.util.List) GroupId(org.thoughtcrime.securesms.groups.GroupId) Job(org.thoughtcrime.securesms.jobmanager.Job) Collections(java.util.Collections) Optional(org.whispersystems.libsignal.util.guava.Optional) SignalServiceMessageSender(org.whispersystems.signalservice.api.SignalServiceMessageSender) Recipient(org.thoughtcrime.securesms.recipients.Recipient) DistributionId(org.whispersystems.signalservice.api.push.DistributionId) SendMessageResult(org.whispersystems.signalservice.api.messages.SendMessageResult) SenderKeyDistributionMessage(org.whispersystems.libsignal.protocol.SenderKeyDistributionMessage) GroupDatabase(org.thoughtcrime.securesms.database.GroupDatabase) SignalServiceAddress(org.whispersystems.signalservice.api.push.SignalServiceAddress) SignalProtocolAddress(org.whispersystems.libsignal.SignalProtocolAddress)

Aggregations

Optional (org.whispersystems.libsignal.util.guava.Optional)61 Recipient (org.thoughtcrime.securesms.recipients.Recipient)33 NonNull (androidx.annotation.NonNull)32 List (java.util.List)32 Log (org.signal.core.util.logging.Log)28 SignalServiceAddress (org.whispersystems.signalservice.api.push.SignalServiceAddress)27 LinkedList (java.util.LinkedList)25 IOException (java.io.IOException)24 ArrayList (java.util.ArrayList)24 TimeUnit (java.util.concurrent.TimeUnit)24 RecipientId (org.thoughtcrime.securesms.recipients.RecipientId)24 Nullable (androidx.annotation.Nullable)22 SignalDatabase (org.thoughtcrime.securesms.database.SignalDatabase)22 Context (android.content.Context)21 Collections (java.util.Collections)20 Locale (java.util.Locale)18 ApplicationDependencies (org.thoughtcrime.securesms.dependencies.ApplicationDependencies)18 SignalStore (org.thoughtcrime.securesms.keyvalue.SignalStore)18 RecipientUtil (org.thoughtcrime.securesms.recipients.RecipientUtil)18 Stream (com.annimon.stream.Stream)16