Apply several fixes for beta feedback.

* Remove overscroll from avatar picker recyclers.
* Center crop wallpaper previews.
* If no media thumb exists, return bubble projection instead.
fork-5.53.8
Alex Hart 2021-07-23 13:47:43 -03:00 zatwierdzone przez GitHub
rodzic 2dd8f24e14
commit 740977164b
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
14 zmienionych plików z 138 dodań i 103 usunięć

Wyświetl plik

@ -700,8 +700,8 @@ public class ConversationAdapter
} }
@NonNull @NonNull
public @Override Projection getProjection(@NonNull ViewGroup recyclerView) { public @Override Projection getGiphyMp4PlayableProjection(@NonNull ViewGroup recyclerView) {
return getBindable().getProjection(recyclerView); return getBindable().getGiphyMp4PlayableProjection(recyclerView);
} }
@Override @Override

Wyświetl plik

@ -128,6 +128,7 @@ import org.thoughtcrime.securesms.util.UrlClickHandler;
import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.VibrateUtil; import org.thoughtcrime.securesms.util.VibrateUtil;
import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.views.NullableStub;
import org.thoughtcrime.securesms.util.views.Stub; import org.thoughtcrime.securesms.util.views.Stub;
import org.thoughtcrime.securesms.video.exo.AttachmentMediaSourceFactory; import org.thoughtcrime.securesms.video.exo.AttachmentMediaSourceFactory;
import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.libsignal.util.guava.Optional;
@ -184,19 +185,19 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
private AlertView alertView; private AlertView alertView;
protected ReactionsConversationView reactionsView; protected ReactionsConversationView reactionsView;
private @NonNull Set<ConversationMessage> batchSelected = new HashSet<>(); private @NonNull Set<ConversationMessage> batchSelected = new HashSet<>();
private @NonNull Outliner outliner = new Outliner(); private @NonNull Outliner outliner = new Outliner();
private @NonNull Outliner pulseOutliner = new Outliner(); private @NonNull Outliner pulseOutliner = new Outliner();
private @NonNull List<Outliner> outliners = new ArrayList<>(2); private @NonNull List<Outliner> outliners = new ArrayList<>(2);
private LiveRecipient conversationRecipient; private LiveRecipient conversationRecipient;
private Stub<ConversationItemThumbnail> mediaThumbnailStub; private NullableStub<ConversationItemThumbnail> mediaThumbnailStub;
private Stub<AudioView> audioViewStub; private Stub<AudioView> audioViewStub;
private Stub<DocumentView> documentViewStub; private Stub<DocumentView> documentViewStub;
private Stub<SharedContactView> sharedContactStub; private Stub<SharedContactView> sharedContactStub;
private Stub<LinkPreviewView> linkPreviewStub; private Stub<LinkPreviewView> linkPreviewStub;
private Stub<BorderlessImageView> stickerStub; private Stub<BorderlessImageView> stickerStub;
private Stub<ViewOnceMessageView> revealableStub; private Stub<ViewOnceMessageView> revealableStub;
private @Nullable EventListener eventListener; private @Nullable EventListener eventListener;
private int defaultBubbleColor; private int defaultBubbleColor;
private int defaultBubbleColorForWallpaper; private int defaultBubbleColorForWallpaper;
@ -243,26 +244,26 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
this.backgroundDrawable = new ClipProjectionDrawable(Objects.requireNonNull(ContextCompat.getDrawable(getContext(), this.backgroundDrawable = new ClipProjectionDrawable(Objects.requireNonNull(ContextCompat.getDrawable(getContext(),
R.drawable.conversation_item_background))); R.drawable.conversation_item_background)));
this.bodyText = findViewById(R.id.conversation_item_body); this.bodyText = findViewById(R.id.conversation_item_body);
this.footer = findViewById(R.id.conversation_item_footer); this.footer = findViewById(R.id.conversation_item_footer);
this.stickerFooter = findViewById(R.id.conversation_item_sticker_footer); this.stickerFooter = findViewById(R.id.conversation_item_sticker_footer);
this.groupSender = findViewById(R.id.group_message_sender); this.groupSender = findViewById(R.id.group_message_sender);
this.alertView = findViewById(R.id.indicators_parent); this.alertView = findViewById(R.id.indicators_parent);
this.contactPhoto = findViewById(R.id.contact_photo); this.contactPhoto = findViewById(R.id.contact_photo);
this.contactPhotoHolder = findViewById(R.id.contact_photo_container); this.contactPhotoHolder = findViewById(R.id.contact_photo_container);
this.bodyBubble = findViewById(R.id.body_bubble); this.bodyBubble = findViewById(R.id.body_bubble);
this.mediaThumbnailStub = new Stub<>(findViewById(R.id.image_view_stub)); this.mediaThumbnailStub = new NullableStub<>(findViewById(R.id.image_view_stub));
this.audioViewStub = new Stub<>(findViewById(R.id.audio_view_stub)); this.audioViewStub = new Stub<>(findViewById(R.id.audio_view_stub));
this.documentViewStub = new Stub<>(findViewById(R.id.document_view_stub)); this.documentViewStub = new Stub<>(findViewById(R.id.document_view_stub));
this.sharedContactStub = new Stub<>(findViewById(R.id.shared_contact_view_stub)); this.sharedContactStub = new Stub<>(findViewById(R.id.shared_contact_view_stub));
this.linkPreviewStub = new Stub<>(findViewById(R.id.link_preview_stub)); this.linkPreviewStub = new Stub<>(findViewById(R.id.link_preview_stub));
this.stickerStub = new Stub<>(findViewById(R.id.sticker_view_stub)); this.stickerStub = new Stub<>(findViewById(R.id.sticker_view_stub));
this.revealableStub = new Stub<>(findViewById(R.id.revealable_view_stub)); this.revealableStub = new Stub<>(findViewById(R.id.revealable_view_stub));
this.groupSenderHolder = findViewById(R.id.group_sender_holder); this.groupSenderHolder = findViewById(R.id.group_sender_holder);
this.quoteView = findViewById(R.id.quote_view); this.quoteView = findViewById(R.id.quote_view);
this.reply = findViewById(R.id.reply_icon_wrapper); this.reply = findViewById(R.id.reply_icon_wrapper);
this.replyIcon = findViewById(R.id.reply_icon); this.replyIcon = findViewById(R.id.reply_icon);
this.reactionsView = findViewById(R.id.reactions_view); this.reactionsView = findViewById(R.id.reactions_view);
setOnClickListener(new ClickListener(null)); setOnClickListener(new ClickListener(null));
@ -425,7 +426,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
if (hasAudio(messageRecord)) { if (hasAudio(messageRecord)) {
availableWidth = audioViewStub.get().getMeasuredWidth() + ViewUtil.getLeftMargin(audioViewStub.get()) + ViewUtil.getRightMargin(audioViewStub.get()); availableWidth = audioViewStub.get().getMeasuredWidth() + ViewUtil.getLeftMargin(audioViewStub.get()) + ViewUtil.getRightMargin(audioViewStub.get());
} else if (!isViewOnceMessage(messageRecord) && (hasThumbnail(messageRecord) || hasBigImageLinkPreview(messageRecord))) { } else if (!isViewOnceMessage(messageRecord) && (hasThumbnail(messageRecord) || hasBigImageLinkPreview(messageRecord))) {
availableWidth = mediaThumbnailStub.get().getMeasuredWidth(); availableWidth = mediaThumbnailStub.require().getMeasuredWidth();
} else { } else {
availableWidth = bodyBubble.getMeasuredWidth() - bodyBubble.getPaddingLeft() - bodyBubble.getPaddingRight(); availableWidth = bodyBubble.getMeasuredWidth() - bodyBubble.getPaddingLeft() - bodyBubble.getPaddingRight();
} }
@ -507,7 +508,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
bodyBubble.setOutliners(outliners); bodyBubble.setOutliners(outliners);
if (mediaThumbnailStub.resolved()) { if (mediaThumbnailStub.resolved()) {
mediaThumbnailStub.get().setPulseOutliner(pulseOutliner); mediaThumbnailStub.require().setPulseOutliner(pulseOutliner);
} }
if (audioViewStub.resolved()) { if (audioViewStub.resolved()) {
@ -550,9 +551,9 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
} }
if (mediaThumbnailStub.resolved()) { if (mediaThumbnailStub.resolved()) {
mediaThumbnailStub.get().setFocusable(!shouldInterceptClicks(conversationMessage.getMessageRecord()) && batchSelected.isEmpty()); mediaThumbnailStub.require().setFocusable(!shouldInterceptClicks(conversationMessage.getMessageRecord()) && batchSelected.isEmpty());
mediaThumbnailStub.get().setClickable(!shouldInterceptClicks(conversationMessage.getMessageRecord()) && batchSelected.isEmpty()); mediaThumbnailStub.require().setClickable(!shouldInterceptClicks(conversationMessage.getMessageRecord()) && batchSelected.isEmpty());
mediaThumbnailStub.get().setLongClickable(batchSelected.isEmpty()); mediaThumbnailStub.require().setLongClickable(batchSelected.isEmpty());
} }
if (audioViewStub.resolved()) { if (audioViewStub.resolved()) {
@ -574,7 +575,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
bodyBubble.invalidate(); bodyBubble.invalidate();
if (mediaThumbnailStub.resolved()) { if (mediaThumbnailStub.resolved()) {
mediaThumbnailStub.get().invalidate(); mediaThumbnailStub.require().invalidate();
} }
}); });
pulseOutlinerAlphaAnimator.start(); pulseOutlinerAlphaAnimator.start();
@ -752,7 +753,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
if (isViewOnceMessage(messageRecord) && !messageRecord.isRemoteDelete()) { if (isViewOnceMessage(messageRecord) && !messageRecord.isRemoteDelete()) {
revealableStub.get().setVisibility(VISIBLE); revealableStub.get().setVisibility(VISIBLE);
if (mediaThumbnailStub.resolved()) mediaThumbnailStub.get().setVisibility(View.GONE); if (mediaThumbnailStub.resolved()) mediaThumbnailStub.require().setVisibility(View.GONE);
if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE); if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE);
if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE); if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE);
if (sharedContactStub.resolved()) sharedContactStub.get().setVisibility(GONE); if (sharedContactStub.resolved()) sharedContactStub.get().setVisibility(GONE);
@ -767,7 +768,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
} else if (hasSharedContact(messageRecord)) { } else if (hasSharedContact(messageRecord)) {
sharedContactStub.get().setVisibility(VISIBLE); sharedContactStub.get().setVisibility(VISIBLE);
if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE); if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE);
if (mediaThumbnailStub.resolved()) mediaThumbnailStub.get().setVisibility(View.GONE); if (mediaThumbnailStub.resolved()) mediaThumbnailStub.require().setVisibility(View.GONE);
if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE); if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE);
if (linkPreviewStub.resolved()) linkPreviewStub.get().setVisibility(GONE); if (linkPreviewStub.resolved()) linkPreviewStub.get().setVisibility(GONE);
if (stickerStub.resolved()) stickerStub.get().setVisibility(View.GONE); if (stickerStub.resolved()) stickerStub.get().setVisibility(View.GONE);
@ -786,7 +787,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
} else if (hasLinkPreview(messageRecord) && messageRequestAccepted) { } else if (hasLinkPreview(messageRecord) && messageRequestAccepted) {
linkPreviewStub.get().setVisibility(View.VISIBLE); linkPreviewStub.get().setVisibility(View.VISIBLE);
if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE); if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE);
if (mediaThumbnailStub.resolved()) mediaThumbnailStub.get().setVisibility(View.GONE); if (mediaThumbnailStub.resolved()) mediaThumbnailStub.require().setVisibility(View.GONE);
if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE); if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE);
if (sharedContactStub.resolved()) sharedContactStub.get().setVisibility(GONE); if (sharedContactStub.resolved()) sharedContactStub.get().setVisibility(GONE);
if (stickerStub.resolved()) stickerStub.get().setVisibility(View.GONE); if (stickerStub.resolved()) stickerStub.get().setVisibility(View.GONE);
@ -796,12 +797,12 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
LinkPreview linkPreview = ((MmsMessageRecord) messageRecord).getLinkPreviews().get(0); LinkPreview linkPreview = ((MmsMessageRecord) messageRecord).getLinkPreviews().get(0);
if (hasBigImageLinkPreview(messageRecord)) { if (hasBigImageLinkPreview(messageRecord)) {
mediaThumbnailStub.get().setVisibility(VISIBLE); mediaThumbnailStub.require().setVisibility(VISIBLE);
mediaThumbnailStub.get().setMinimumThumbnailWidth(readDimen(R.dimen.media_bubble_min_width_with_content)); mediaThumbnailStub.require().setMinimumThumbnailWidth(readDimen(R.dimen.media_bubble_min_width_with_content));
mediaThumbnailStub.get().setImageResource(glideRequests, Collections.singletonList(new ImageSlide(context, linkPreview.getThumbnail().get())), showControls, false); mediaThumbnailStub.require().setImageResource(glideRequests, Collections.singletonList(new ImageSlide(context, linkPreview.getThumbnail().get())), showControls, false);
mediaThumbnailStub.get().setThumbnailClickListener(new LinkPreviewThumbnailClickListener()); mediaThumbnailStub.require().setThumbnailClickListener(new LinkPreviewThumbnailClickListener());
mediaThumbnailStub.get().setDownloadClickListener(downloadClickListener); mediaThumbnailStub.require().setDownloadClickListener(downloadClickListener);
mediaThumbnailStub.get().setOnLongClickListener(passthroughClickListener); mediaThumbnailStub.require().setOnLongClickListener(passthroughClickListener);
linkPreviewStub.get().setLinkPreview(glideRequests, linkPreview, false); linkPreviewStub.get().setLinkPreview(glideRequests, linkPreview, false);
@ -825,7 +826,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
footer.setVisibility(VISIBLE); footer.setVisibility(VISIBLE);
} else if (hasAudio(messageRecord)) { } else if (hasAudio(messageRecord)) {
audioViewStub.get().setVisibility(View.VISIBLE); audioViewStub.get().setVisibility(View.VISIBLE);
if (mediaThumbnailStub.resolved()) mediaThumbnailStub.get().setVisibility(View.GONE); if (mediaThumbnailStub.resolved()) mediaThumbnailStub.require().setVisibility(View.GONE);
if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE); if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE);
if (sharedContactStub.resolved()) sharedContactStub.get().setVisibility(GONE); if (sharedContactStub.resolved()) sharedContactStub.get().setVisibility(GONE);
if (linkPreviewStub.resolved()) linkPreviewStub.get().setVisibility(GONE); if (linkPreviewStub.resolved()) linkPreviewStub.get().setVisibility(GONE);
@ -850,7 +851,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
footer.setVisibility(VISIBLE); footer.setVisibility(VISIBLE);
} else if (hasDocument(messageRecord)) { } else if (hasDocument(messageRecord)) {
documentViewStub.get().setVisibility(View.VISIBLE); documentViewStub.get().setVisibility(View.VISIBLE);
if (mediaThumbnailStub.resolved()) mediaThumbnailStub.get().setVisibility(View.GONE); if (mediaThumbnailStub.resolved()) mediaThumbnailStub.require().setVisibility(View.GONE);
if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE); if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE);
if (sharedContactStub.resolved()) sharedContactStub.get().setVisibility(GONE); if (sharedContactStub.resolved()) sharedContactStub.get().setVisibility(GONE);
if (linkPreviewStub.resolved()) linkPreviewStub.get().setVisibility(GONE); if (linkPreviewStub.resolved()) linkPreviewStub.get().setVisibility(GONE);
@ -871,7 +872,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
bodyBubble.setBackgroundColor(Color.TRANSPARENT); bodyBubble.setBackgroundColor(Color.TRANSPARENT);
stickerStub.get().setVisibility(View.VISIBLE); stickerStub.get().setVisibility(View.VISIBLE);
if (mediaThumbnailStub.resolved()) mediaThumbnailStub.get().setVisibility(View.GONE); if (mediaThumbnailStub.resolved()) mediaThumbnailStub.require().setVisibility(View.GONE);
if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE); if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE);
if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE); if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE);
if (sharedContactStub.resolved()) sharedContactStub.get().setVisibility(GONE); if (sharedContactStub.resolved()) sharedContactStub.get().setVisibility(GONE);
@ -897,7 +898,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
footer.setVisibility(VISIBLE); footer.setVisibility(VISIBLE);
} else if (hasThumbnail(messageRecord)) { } else if (hasThumbnail(messageRecord)) {
mediaThumbnailStub.get().setVisibility(View.VISIBLE); mediaThumbnailStub.require().setVisibility(View.VISIBLE);
if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE); if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE);
if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE); if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE);
if (sharedContactStub.resolved()) sharedContactStub.get().setVisibility(GONE); if (sharedContactStub.resolved()) sharedContactStub.get().setVisibility(GONE);
@ -906,25 +907,25 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
if (revealableStub.resolved()) revealableStub.get().setVisibility(View.GONE); if (revealableStub.resolved()) revealableStub.get().setVisibility(View.GONE);
List<Slide> thumbnailSlides = ((MmsMessageRecord) messageRecord).getSlideDeck().getThumbnailSlides(); List<Slide> thumbnailSlides = ((MmsMessageRecord) messageRecord).getSlideDeck().getThumbnailSlides();
mediaThumbnailStub.get().setMinimumThumbnailWidth(readDimen(isCaptionlessMms(messageRecord) ? R.dimen.media_bubble_min_width_solo mediaThumbnailStub.require().setMinimumThumbnailWidth(readDimen(isCaptionlessMms(messageRecord) ? R.dimen.media_bubble_min_width_solo
: R.dimen.media_bubble_min_width_with_content)); : R.dimen.media_bubble_min_width_with_content));
mediaThumbnailStub.get().setImageResource(glideRequests, mediaThumbnailStub.require().setImageResource(glideRequests,
thumbnailSlides, thumbnailSlides,
showControls, showControls,
false); false);
mediaThumbnailStub.get().setThumbnailClickListener(new ThumbnailClickListener()); mediaThumbnailStub.require().setThumbnailClickListener(new ThumbnailClickListener());
mediaThumbnailStub.get().setDownloadClickListener(downloadClickListener); mediaThumbnailStub.require().setDownloadClickListener(downloadClickListener);
mediaThumbnailStub.get().setOnLongClickListener(passthroughClickListener); mediaThumbnailStub.require().setOnLongClickListener(passthroughClickListener);
mediaThumbnailStub.get().setOnClickListener(passthroughClickListener); mediaThumbnailStub.require().setOnClickListener(passthroughClickListener);
mediaThumbnailStub.get().showShade(TextUtils.isEmpty(messageRecord.getDisplayBody(getContext())) && !hasExtraText(messageRecord)); mediaThumbnailStub.require().showShade(TextUtils.isEmpty(messageRecord.getDisplayBody(getContext())) && !hasExtraText(messageRecord));
if (!messageRecord.isOutgoing()) { if (!messageRecord.isOutgoing()) {
mediaThumbnailStub.get().setConversationColor(getDefaultBubbleColor(hasWallpaper)); mediaThumbnailStub.require().setConversationColor(getDefaultBubbleColor(hasWallpaper));
} else { } else {
mediaThumbnailStub.get().setConversationColor(Color.TRANSPARENT); mediaThumbnailStub.require().setConversationColor(Color.TRANSPARENT);
} }
mediaThumbnailStub.get().setBorderless(false); mediaThumbnailStub.require().setBorderless(false);
setThumbnailCorners(messageRecord, previousRecord, nextRecord, isGroupThread); setThumbnailCorners(messageRecord, previousRecord, nextRecord, isGroupThread);
@ -949,7 +950,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
} }
} else { } else {
if (mediaThumbnailStub.resolved()) mediaThumbnailStub.get().setVisibility(View.GONE); if (mediaThumbnailStub.resolved()) mediaThumbnailStub.require().setVisibility(View.GONE);
if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE); if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE);
if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE); if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE);
if (sharedContactStub.resolved()) sharedContactStub.get().setVisibility(GONE); if (sharedContactStub.resolved()) sharedContactStub.get().setVisibility(GONE);
@ -1025,9 +1026,9 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
} }
if (ViewUtil.isRtl(this)) { if (ViewUtil.isRtl(this)) {
mediaThumbnailStub.get().setCorners(topEnd, topStart, bottomStart, bottomEnd); mediaThumbnailStub.require().setCorners(topEnd, topStart, bottomStart, bottomEnd);
} else { } else {
mediaThumbnailStub.get().setCorners(topStart, topEnd, bottomEnd, bottomStart); mediaThumbnailStub.require().setCorners(topStart, topEnd, bottomEnd, bottomStart);
} }
} }
@ -1161,7 +1162,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
} }
if (mediaThumbnailStub.resolved()) { if (mediaThumbnailStub.resolved()) {
ViewUtil.setTopMargin(mediaThumbnailStub.get(), readDimen(R.dimen.message_bubble_top_padding)); ViewUtil.setTopMargin(mediaThumbnailStub.require(), readDimen(R.dimen.message_bubble_top_padding));
} else if (startOfCluster && !current.isOutgoing() && groupThread) { } else if (startOfCluster && !current.isOutgoing() && groupThread) {
ViewUtil.setTopMargin(quoteView, readDimen(R.dimen.message_bubble_quote_negative_margin)); ViewUtil.setTopMargin(quoteView, readDimen(R.dimen.message_bubble_quote_negative_margin));
} else { } else {
@ -1177,7 +1178,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
} }
if (mediaThumbnailStub.resolved()) { if (mediaThumbnailStub.resolved()) {
ViewUtil.setTopMargin(mediaThumbnailStub.get(), 0); ViewUtil.setTopMargin(mediaThumbnailStub.require(), 0);
} }
} }
} }
@ -1219,7 +1220,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
footer.setVisibility(GONE); footer.setVisibility(GONE);
stickerFooter.setVisibility(GONE); stickerFooter.setVisibility(GONE);
if (sharedContactStub.resolved()) sharedContactStub.get().getFooter().setVisibility(GONE); if (sharedContactStub.resolved()) sharedContactStub.get().getFooter().setVisibility(GONE);
if (mediaThumbnailStub.resolved()) mediaThumbnailStub.get().getFooter().setVisibility(GONE); if (mediaThumbnailStub.resolved()) mediaThumbnailStub.require().getFooter().setVisibility(GONE);
boolean differentTimestamps = next.isPresent() && !DateUtils.isSameExtendedRelativeTimestamp(context, locale, next.get().getTimestamp(), current.getTimestamp()); boolean differentTimestamps = next.isPresent() && !DateUtils.isSameExtendedRelativeTimestamp(context, locale, next.get().getTimestamp(), current.getTimestamp());
@ -1260,7 +1261,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
} else if (hasSharedContact(messageRecord) && TextUtils.isEmpty(messageRecord.getDisplayBody(getContext()))) { } else if (hasSharedContact(messageRecord) && TextUtils.isEmpty(messageRecord.getDisplayBody(getContext()))) {
return sharedContactStub.get().getFooter(); return sharedContactStub.get().getFooter();
} else if (hasOnlyThumbnail(messageRecord) && TextUtils.isEmpty(messageRecord.getDisplayBody(getContext()))) { } else if (hasOnlyThumbnail(messageRecord) && TextUtils.isEmpty(messageRecord.getDisplayBody(getContext()))) {
return mediaThumbnailStub.get().getFooter(); return mediaThumbnailStub.require().getFooter();
} else { } else {
return footer; return footer;
} }
@ -1494,7 +1495,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
@Override @Override
public void showProjectionArea() { public void showProjectionArea() {
if (mediaThumbnailStub != null && mediaThumbnailStub.resolved()) { if (mediaThumbnailStub != null && mediaThumbnailStub.resolved()) {
mediaThumbnailStub.get().showThumbnailView(); mediaThumbnailStub.require().showThumbnailView();
bodyBubble.setVideoPlayerProjection(null); bodyBubble.setVideoPlayerProjection(null);
updateSelectedBackgroundDrawableProjections(); updateSelectedBackgroundDrawableProjections();
} }
@ -1503,9 +1504,9 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
@Override @Override
public void hideProjectionArea() { public void hideProjectionArea() {
if (mediaThumbnailStub != null && mediaThumbnailStub.resolved()) { if (mediaThumbnailStub != null && mediaThumbnailStub.resolved()) {
mediaThumbnailStub.get().hideThumbnailView(); mediaThumbnailStub.require().hideThumbnailView();
mediaThumbnailStub.get().getDrawingRect(thumbnailMaskingRect); mediaThumbnailStub.require().getDrawingRect(thumbnailMaskingRect);
bodyBubble.setVideoPlayerProjection(Projection.relativeToViewWithCommonRoot(mediaThumbnailStub.get(), bodyBubble, null)); bodyBubble.setVideoPlayerProjection(Projection.relativeToViewWithCommonRoot(mediaThumbnailStub.require(), bodyBubble, null));
updateSelectedBackgroundDrawableProjections(); updateSelectedBackgroundDrawableProjections();
} }
} }
@ -1532,27 +1533,19 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
} }
@Override @Override
public @NonNull Projection getProjection(@NonNull ViewGroup recyclerView) { public @NonNull Projection getGiphyMp4PlayableProjection(@NonNull ViewGroup recyclerView) {
return Projection.relativeToParent(recyclerView, mediaThumbnailStub.get(), mediaThumbnailStub.get().getCorners()) if (mediaThumbnailStub != null && mediaThumbnailStub.isResolvable()) {
.translateX(bodyBubble.getTranslationX()); return Projection.relativeToParent(recyclerView, mediaThumbnailStub.require(), mediaThumbnailStub.require().getCorners())
.translateX(bodyBubble.getTranslationX());
} else {
return Projection.relativeToParent(recyclerView, bodyBubble, bodyBubbleCorners)
.translateX(bodyBubble.getTranslationX());
}
} }
@Override @Override
public boolean canPlayContent() { public boolean canPlayContent() {
return mediaThumbnailStub != null && canPlayContent; return mediaThumbnailStub != null && mediaThumbnailStub.isResolvable() && canPlayContent;
}
public @NonNull Rect getThumbnailMaskingRect(@NonNull ViewGroup parent) {
Rect rect = new Rect();
rect.set(thumbnailMaskingRect);
parent.offsetDescendantRectToMyCoords(mediaThumbnailStub.get(), rect);
return rect;
}
public @NonNull Projection.Corners getThumbnailCorners() {
return mediaThumbnailStub.get().getCorners();
} }
@Override @Override

Wyświetl plik

@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.conversation;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.Path;
import android.view.View; import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -57,7 +56,7 @@ public final class ConversationItemMaskTarget extends MaskView.MaskTarget {
).toList(); ).toList();
if (videoContainer != null) { if (videoContainer != null) {
projections.add(conversationItem.getProjection((RecyclerView) conversationItem.getParent())); projections.add(conversationItem.getGiphyMp4PlayableProjection((RecyclerView) conversationItem.getParent()));
} }
for (Projection projection : projections) { for (Projection projection : projections) {

Wyświetl plik

@ -209,7 +209,7 @@ public final class ConversationUpdateItem extends FrameLayout
} }
@Override @Override
public @NonNull Projection getProjection(@NonNull ViewGroup recyclerView) { public @NonNull Projection getGiphyMp4PlayableProjection(@NonNull ViewGroup recyclerView) {
throw new UnsupportedOperationException("ConversationUpdateItems cannot be projected into."); throw new UnsupportedOperationException("ConversationUpdateItems cannot be projected into.");
} }

Wyświetl plik

@ -45,7 +45,7 @@ public interface GiphyMp4Playable {
* Width, height, and (x,y) of view which video player will "project" into * Width, height, and (x,y) of view which video player will "project" into
* @param viewGroup * @param viewGroup
*/ */
@NonNull Projection getProjection(@NonNull ViewGroup viewGroup); @NonNull Projection getGiphyMp4PlayableProjection(@NonNull ViewGroup viewGroup);
/** /**
* Specifies whether the content can start playing. * Specifies whether the content can start playing.

Wyświetl plik

@ -8,7 +8,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.thoughtcrime.securesms.conversation.ConversationItemSwipeCallback;
import org.thoughtcrime.securesms.util.Projection; import org.thoughtcrime.securesms.util.Projection;
import java.util.ArrayList; import java.util.ArrayList;
@ -86,7 +85,7 @@ public final class GiphyMp4ProjectionRecycler implements GiphyMp4PlaybackControl
} }
private void updateDisplay(@NonNull RecyclerView recyclerView, @NonNull GiphyMp4ProjectionPlayerHolder holder, @NonNull GiphyMp4Playable giphyMp4Playable) { private void updateDisplay(@NonNull RecyclerView recyclerView, @NonNull GiphyMp4ProjectionPlayerHolder holder, @NonNull GiphyMp4Playable giphyMp4Playable) {
Projection projection = giphyMp4Playable.getProjection(recyclerView); Projection projection = giphyMp4Playable.getGiphyMp4PlayableProjection(recyclerView);
holder.getContainer().setX(projection.getX()); holder.getContainer().setX(projection.getX());
holder.getContainer().setY(projection.getY()); holder.getContainer().setY(projection.getY());

Wyświetl plik

@ -82,7 +82,7 @@ final class GiphyMp4ViewHolder extends RecyclerView.ViewHolder implements GiphyM
} }
@Override @Override
public @NonNull Projection getProjection(@NonNull ViewGroup recyclerView) { public @NonNull Projection getGiphyMp4PlayableProjection(@NonNull ViewGroup recyclerView) {
return Projection.relativeToParent(recyclerView, container, CORNERS); return Projection.relativeToParent(recyclerView, container, CORNERS);
} }

Wyświetl plik

@ -238,8 +238,8 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G
} }
@Override @Override
public @NonNull Projection getProjection(@NonNull ViewGroup recyclerview) { public @NonNull Projection getGiphyMp4PlayableProjection(@NonNull ViewGroup recyclerview) {
return conversationItem.getProjection(recyclerview); return conversationItem.getGiphyMp4PlayableProjection(recyclerview);
} }
@Override public @Override public
@ -257,7 +257,7 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G
Set<Projection> projections = new HashSet<>(); Set<Projection> projections = new HashSet<>();
if (canPlayContent()) { if (canPlayContent()) {
projections.add(conversationItem.getProjection((ViewGroup) itemView)); projections.add(conversationItem.getGiphyMp4PlayableProjection((ViewGroup) itemView));
} }
projections.addAll(Stream.of(conversationItem.getColorizerProjections()) projections.addAll(Stream.of(conversationItem.getColorizerProjections())

Wyświetl plik

@ -0,0 +1,40 @@
package org.thoughtcrime.securesms.util.views;
import android.view.ViewStub;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.Objects;
public class NullableStub<T> {
private ViewStub viewStub;
private T view;
public NullableStub(@Nullable ViewStub viewStub) {
this.viewStub = viewStub;
}
private @Nullable T get() {
if (viewStub != null && view == null) {
view = (T) viewStub.inflate();
viewStub = null;
}
return view;
}
public @NonNull T require() {
return Objects.requireNonNull(get());
}
public boolean isResolvable() {
return viewStub != null || resolved();
}
public boolean resolved() {
return view != null;
}
}

Wyświetl plik

@ -112,6 +112,7 @@
android:clipChildren="false" android:clipChildren="false"
android:clipToPadding="false" android:clipToPadding="false"
android:paddingBottom="80dp" android:paddingBottom="80dp"
android:overScrollMode="never"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"

Wyświetl plik

@ -14,7 +14,7 @@
android:id="@+id/chat_wallpaper_preview" android:id="@+id/chat_wallpaper_preview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:scaleType="fitXY" android:scaleType="centerCrop"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Signal.WallpaperPreview" app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Signal.WallpaperPreview"
tools:src="@drawable/test_gradient" /> tools:src="@drawable/test_gradient" />

Wyświetl plik

@ -53,6 +53,7 @@
android:layout_marginEnd="@dimen/dsl_settings_gutter" android:layout_marginEnd="@dimen/dsl_settings_gutter"
android:clipChildren="false" android:clipChildren="false"
android:clipToPadding="false" android:clipToPadding="false"
android:overScrollMode="never"
android:paddingBottom="80dp" android:paddingBottom="80dp"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"

Wyświetl plik

@ -52,6 +52,7 @@
android:layout_marginEnd="@dimen/dsl_settings_gutter" android:layout_marginEnd="@dimen/dsl_settings_gutter"
android:clipChildren="false" android:clipChildren="false"
android:clipToPadding="false" android:clipToPadding="false"
android:overScrollMode="never"
android:paddingBottom="80dp" android:paddingBottom="80dp"
android:visibility="gone" android:visibility="gone"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"

Wyświetl plik

@ -87,6 +87,7 @@
android:layout_marginEnd="@dimen/dsl_settings_gutter" android:layout_marginEnd="@dimen/dsl_settings_gutter"
android:clipChildren="false" android:clipChildren="false"
android:clipToPadding="false" android:clipToPadding="false"
android:overScrollMode="never"
android:paddingBottom="80dp" android:paddingBottom="80dp"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"