Fix infinite spinner on scheduled link preview bug.
This commit is contained in:
parent
cd38c99f7e
commit
9ed3e8befb
14 changed files with 40 additions and 47 deletions
|
@ -210,7 +210,7 @@ class V2ConversationItemShapeTest {
|
|||
|
||||
private val colorizer = Colorizer()
|
||||
|
||||
override val displayMode: ConversationItemDisplayMode = ConversationItemDisplayMode.STANDARD
|
||||
override val displayMode: ConversationItemDisplayMode = ConversationItemDisplayMode.Standard
|
||||
|
||||
override val clickListener: ConversationAdapter.ItemClickListener = FakeConversationItemClickListener
|
||||
override val selectedItems: Set<MultiselectPart> = emptySet()
|
||||
|
|
|
@ -322,12 +322,12 @@ public class ConversationItemFooter extends ConstraintLayout {
|
|||
} else {
|
||||
long timestamp = messageRecord.getTimestamp();
|
||||
if (messageRecord.isEditMessage()) {
|
||||
if (displayMode == ConversationItemDisplayMode.EDIT_HISTORY) {
|
||||
if (displayMode == ConversationItemDisplayMode.EditHistory.INSTANCE) {
|
||||
timestamp = messageRecord.getDateSent();
|
||||
}
|
||||
}
|
||||
String date = DateUtils.getDatelessRelativeTimeSpanString(getContext(), locale, timestamp);
|
||||
if (displayMode != ConversationItemDisplayMode.DETAILED && messageRecord.isEditMessage() && messageRecord.isLatestRevision()) {
|
||||
if (displayMode != ConversationItemDisplayMode.Detailed.INSTANCE && messageRecord.isEditMessage() && messageRecord.isLatestRevision()) {
|
||||
date = getContext().getString(R.string.ConversationItem_edited_timestamp_footer, date);
|
||||
}
|
||||
dateView.setText(date);
|
||||
|
|
|
@ -163,10 +163,10 @@ public class LinkPreviewView extends FrameLayout {
|
|||
}
|
||||
|
||||
public void setLinkPreview(@NonNull GlideRequests glideRequests, @NonNull LinkPreview linkPreview, boolean showThumbnail) {
|
||||
setLinkPreview(glideRequests, linkPreview, showThumbnail, true);
|
||||
setLinkPreview(glideRequests, linkPreview, showThumbnail, true, false);
|
||||
}
|
||||
|
||||
public void setLinkPreview(@NonNull GlideRequests glideRequests, @NonNull LinkPreview linkPreview, boolean showThumbnail, boolean showDescription) {
|
||||
public void setLinkPreview(@NonNull GlideRequests glideRequests, @NonNull LinkPreview linkPreview, boolean showThumbnail, boolean showDescription, boolean scheduleMessageMode) {
|
||||
spinner.setVisibility(GONE);
|
||||
noPreview.setVisibility(GONE);
|
||||
|
||||
|
@ -216,7 +216,7 @@ public class LinkPreviewView extends FrameLayout {
|
|||
if (showThumbnail && linkPreview.getThumbnail().isPresent()) {
|
||||
thumbnail.setVisibility(VISIBLE);
|
||||
thumbnailState.applyState(thumbnail);
|
||||
thumbnail.get().setImageResource(glideRequests, new ImageSlide(linkPreview.getThumbnail().get()), type == TYPE_CONVERSATION, false);
|
||||
thumbnail.get().setImageResource(glideRequests, new ImageSlide(linkPreview.getThumbnail().get()), type == TYPE_CONVERSATION && !scheduleMessageMode, false);
|
||||
thumbnail.get().showDownloadText(false);
|
||||
} else if (callLinkRootKey != null) {
|
||||
thumbnail.setVisibility(VISIBLE);
|
||||
|
|
|
@ -114,8 +114,7 @@ public class ConversationAdapter
|
|||
private ConversationMessage inlineContent;
|
||||
private Colorizer colorizer;
|
||||
private boolean isTypingViewEnabled;
|
||||
private ConversationItemDisplayMode condensedMode;
|
||||
private boolean scheduledMessagesMode;
|
||||
private ConversationItemDisplayMode displayMode;
|
||||
private PulseRequest pulseRequest;
|
||||
|
||||
public ConversationAdapter(@NonNull Context context,
|
||||
|
@ -252,12 +251,7 @@ public class ConversationAdapter
|
|||
}
|
||||
|
||||
public void setCondensedMode(ConversationItemDisplayMode condensedMode) {
|
||||
this.condensedMode = condensedMode;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void setScheduledMessagesMode(boolean scheduledMessagesMode) {
|
||||
this.scheduledMessagesMode = scheduledMessagesMode;
|
||||
this.displayMode = condensedMode;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
|
@ -276,7 +270,7 @@ public class ConversationAdapter
|
|||
ConversationMessage previousMessage = adapterPosition < getItemCount() - 1 && !isFooterPosition(adapterPosition + 1) ? getItem(adapterPosition + 1) : null;
|
||||
ConversationMessage nextMessage = adapterPosition > 0 && !isHeaderPosition(adapterPosition - 1) ? getItem(adapterPosition - 1) : null;
|
||||
|
||||
ConversationItemDisplayMode displayMode = condensedMode != null ? condensedMode : ConversationItemDisplayMode.STANDARD;
|
||||
ConversationItemDisplayMode itemDisplayMode = displayMode != null ? displayMode : ConversationItemDisplayMode.Standard.INSTANCE;
|
||||
|
||||
conversationViewHolder.getBindable().bind(lifecycleOwner,
|
||||
conversationMessage,
|
||||
|
@ -288,11 +282,11 @@ public class ConversationAdapter
|
|||
conversationMessage.getThreadRecipient(),
|
||||
searchQuery,
|
||||
conversationMessage == recordToPulse,
|
||||
hasWallpaper && displayMode.displayWallpaper(),
|
||||
hasWallpaper && itemDisplayMode.displayWallpaper(),
|
||||
isMessageRequestAccepted,
|
||||
conversationMessage == inlineContent,
|
||||
colorizer,
|
||||
displayMode);
|
||||
itemDisplayMode);
|
||||
|
||||
if (conversationMessage == recordToPulse) {
|
||||
recordToPulse = null;
|
||||
|
@ -331,9 +325,9 @@ public class ConversationAdapter
|
|||
|
||||
if (conversationMessage == null) return -1;
|
||||
|
||||
if (scheduledMessagesMode) {
|
||||
if (displayMode.getScheduleMessageMode()) {
|
||||
calendar.setTimeInMillis(((MediaMmsMessageRecord) conversationMessage.getMessageRecord()).getScheduledDate());
|
||||
} else if (condensedMode == ConversationItemDisplayMode.EDIT_HISTORY) {
|
||||
} else if (displayMode == ConversationItemDisplayMode.EditHistory.INSTANCE) {
|
||||
calendar.setTimeInMillis(conversationMessage.getMessageRecord().getDateSent());
|
||||
} else {
|
||||
calendar.setTimeInMillis(conversationMessage.getConversationTimestamp());
|
||||
|
@ -351,9 +345,9 @@ public class ConversationAdapter
|
|||
Context context = viewHolder.itemView.getContext();
|
||||
ConversationMessage conversationMessage = Objects.requireNonNull(getItem(position));
|
||||
|
||||
if (scheduledMessagesMode) {
|
||||
if (displayMode.getScheduleMessageMode()) {
|
||||
viewHolder.setText(DateUtils.getScheduledMessagesDateHeaderString(viewHolder.itemView.getContext(), locale, ((MediaMmsMessageRecord) conversationMessage.getMessageRecord()).getScheduledDate()));
|
||||
} else if (condensedMode == ConversationItemDisplayMode.EDIT_HISTORY) {
|
||||
} else if (displayMode == ConversationItemDisplayMode.EditHistory.INSTANCE) {
|
||||
viewHolder.setText(DateUtils.getConversationDateHeaderString(viewHolder.itemView.getContext(), locale, conversationMessage.getMessageRecord().getDateSent()));
|
||||
} else {
|
||||
viewHolder.setText(DateUtils.getConversationDateHeaderString(viewHolder.itemView.getContext(), locale, conversationMessage.getConversationTimestamp()));
|
||||
|
|
|
@ -928,7 +928,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
|
|||
* Today this is only {@link org.thoughtcrime.securesms.conversation.quotes.MessageQuotesBottomSheet}.
|
||||
*/
|
||||
private boolean isCondensedMode() {
|
||||
return displayMode == ConversationItemDisplayMode.CONDENSED;
|
||||
return displayMode instanceof ConversationItemDisplayMode.Condensed;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1182,7 +1182,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
|
|||
ViewUtil.updateLayoutParamsIfNonNull(groupSenderHolder, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
ViewUtil.setTopMargin(linkPreviewStub.get(), 0);
|
||||
} else {
|
||||
linkPreviewStub.get().setLinkPreview(glideRequests, linkPreview, true, !isContentCondensed());
|
||||
linkPreviewStub.get().setLinkPreview(glideRequests, linkPreview, true, !isContentCondensed(), displayMode.getScheduleMessageMode());
|
||||
linkPreviewStub.get().setDownloadClickedListener(downloadClickListener);
|
||||
setLinkPreviewCorners(messageRecord, previousRecord, nextRecord, isGroupThread, false);
|
||||
ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
|
@ -1242,7 +1242,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
|
|||
documentViewStub.get().setDocument(
|
||||
((MediaMmsMessageRecord) messageRecord).getSlideDeck().getDocumentSlide(),
|
||||
showControls,
|
||||
displayMode != ConversationItemDisplayMode.DETAILED
|
||||
displayMode != ConversationItemDisplayMode.Detailed.INSTANCE
|
||||
);
|
||||
documentViewStub.get().setDocumentClickListener(new ThumbnailClickListener());
|
||||
documentViewStub.get().setDownloadClickListener(singleDownloadClickListener);
|
||||
|
@ -1764,7 +1764,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
|
|||
}
|
||||
|
||||
private void setHasBeenQuoted(@NonNull ConversationMessage message) {
|
||||
if (message.hasBeenQuoted() && !isCondensedMode() && quotedIndicator != null && batchSelected.isEmpty() && displayMode != ConversationItemDisplayMode.EDIT_HISTORY) {
|
||||
if (message.hasBeenQuoted() && !isCondensedMode() && quotedIndicator != null && batchSelected.isEmpty() && displayMode != ConversationItemDisplayMode.EditHistory.INSTANCE) {
|
||||
quotedIndicator.setVisibility(VISIBLE);
|
||||
quotedIndicator.setOnClickListener(quotedIndicatorClickListener);
|
||||
} else if (quotedIndicator != null) {
|
||||
|
@ -1787,11 +1787,11 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
|
|||
}
|
||||
|
||||
private boolean forceFooter(@NonNull MessageRecord messageRecord) {
|
||||
return hasAudio(messageRecord) || MessageRecordUtil.isEditMessage(messageRecord) || displayMode == ConversationItemDisplayMode.EDIT_HISTORY;
|
||||
return hasAudio(messageRecord) || MessageRecordUtil.isEditMessage(messageRecord) || displayMode == ConversationItemDisplayMode.EditHistory.INSTANCE;
|
||||
}
|
||||
|
||||
private boolean forceGroupHeader(@NonNull MessageRecord messageRecord) {
|
||||
return displayMode == ConversationItemDisplayMode.EDIT_HISTORY;
|
||||
return displayMode == ConversationItemDisplayMode.EditHistory.INSTANCE;
|
||||
}
|
||||
|
||||
private ConversationItemFooter getActiveFooter(@NonNull MessageRecord messageRecord) {
|
||||
|
@ -1895,7 +1895,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
|
|||
|
||||
int background;
|
||||
|
||||
if (isSingularMessage(current, previous, next, isGroupThread) || displayMode == ConversationItemDisplayMode.EDIT_HISTORY) {
|
||||
if (isSingularMessage(current, previous, next, isGroupThread) || displayMode == ConversationItemDisplayMode.EditHistory.INSTANCE) {
|
||||
if (current.isOutgoing()) {
|
||||
background = R.drawable.message_bubble_background_sent_alone;
|
||||
outliner.setRadius(bigRadius);
|
||||
|
@ -1991,11 +1991,11 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
|
|||
int spacingTop = readDimen(context, R.dimen.conversation_vertical_message_spacing_collapse);
|
||||
int spacingBottom = spacingTop;
|
||||
|
||||
if (isStartOfMessageCluster(current, previous, isGroupThread) && (displayMode != ConversationItemDisplayMode.EDIT_HISTORY || next.isEmpty())) {
|
||||
if (isStartOfMessageCluster(current, previous, isGroupThread) && (displayMode != ConversationItemDisplayMode.EditHistory.INSTANCE || next.isEmpty())) {
|
||||
spacingTop = readDimen(context, R.dimen.conversation_vertical_message_spacing_default);
|
||||
}
|
||||
|
||||
if (isEndOfMessageCluster(current, next, isGroupThread) || displayMode == ConversationItemDisplayMode.EDIT_HISTORY) {
|
||||
if (isEndOfMessageCluster(current, next, isGroupThread) || displayMode == ConversationItemDisplayMode.EditHistory.INSTANCE) {
|
||||
spacingBottom = readDimen(context, R.dimen.conversation_vertical_message_spacing_default);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
package org.thoughtcrime.securesms.conversation
|
||||
|
||||
enum class ConversationItemDisplayMode {
|
||||
sealed class ConversationItemDisplayMode(val scheduleMessageMode: Boolean = false) {
|
||||
/** Normal rendering, used for normal bubbles in the conversation view */
|
||||
STANDARD,
|
||||
object Standard : ConversationItemDisplayMode()
|
||||
|
||||
/** Smaller bubbles, often trimming text and shrinking images. Used for quote threads. */
|
||||
CONDENSED,
|
||||
class Condensed(scheduleMessageMode: Boolean) : ConversationItemDisplayMode(scheduleMessageMode)
|
||||
|
||||
/** Smaller bubbles, always singular bubbles, with a footer. Used for edit message history. */
|
||||
EDIT_HISTORY,
|
||||
object EditHistory : ConversationItemDisplayMode()
|
||||
|
||||
/** Less length restrictions. Used to show more info in message details. */
|
||||
DETAILED;
|
||||
object Detailed : ConversationItemDisplayMode()
|
||||
|
||||
fun displayWallpaper(): Boolean {
|
||||
return this == STANDARD || this == DETAILED
|
||||
return this == Standard || this == Detailed
|
||||
}
|
||||
}
|
||||
|
|
|
@ -93,8 +93,7 @@ class ScheduledMessagesBottomSheet : FixedRoundedCornerBottomSheetDialogFragment
|
|||
val colorizer = Colorizer()
|
||||
|
||||
messageAdapter = ConversationAdapter(requireContext(), viewLifecycleOwner, GlideApp.with(this), Locale.getDefault(), ConversationAdapterListener(), conversationRecipient.hasWallpaper(), colorizer).apply {
|
||||
setCondensedMode(ConversationItemDisplayMode.CONDENSED)
|
||||
setScheduledMessagesMode(true)
|
||||
setCondensedMode(ConversationItemDisplayMode.Condensed(scheduleMessageMode = true))
|
||||
}
|
||||
|
||||
val list: RecyclerView = view.findViewById<RecyclerView>(R.id.scheduled_list).apply {
|
||||
|
|
|
@ -74,7 +74,7 @@ class MessageQuotesBottomSheet : FixedRoundedCornerBottomSheetDialogFragment() {
|
|||
val colorizer = Colorizer()
|
||||
|
||||
messageAdapter = ConversationAdapter(requireContext(), viewLifecycleOwner, GlideApp.with(this), Locale.getDefault(), ConversationAdapterListener(), conversationRecipient.hasWallpaper(), colorizer).apply {
|
||||
setCondensedMode(ConversationItemDisplayMode.CONDENSED)
|
||||
setCondensedMode(ConversationItemDisplayMode.Condensed(scheduleMessageMode = false))
|
||||
}
|
||||
|
||||
val list: RecyclerView = view.findViewById<RecyclerView>(R.id.quotes_list).apply {
|
||||
|
|
|
@ -91,7 +91,7 @@ class EditMessageHistoryDialog : FixedRoundedCornerBottomSheetDialogFragment() {
|
|||
conversationRecipient.hasWallpaper(),
|
||||
colorizer
|
||||
).apply {
|
||||
setCondensedMode(ConversationItemDisplayMode.EDIT_HISTORY)
|
||||
setCondensedMode(ConversationItemDisplayMode.EditHistory)
|
||||
}
|
||||
|
||||
binding.editHistoryList.apply {
|
||||
|
|
|
@ -187,7 +187,7 @@ class ConversationAdapterV2(
|
|||
}
|
||||
|
||||
override val displayMode: ConversationItemDisplayMode
|
||||
get() = condensedMode ?: ConversationItemDisplayMode.STANDARD
|
||||
get() = condensedMode ?: ConversationItemDisplayMode.Standard
|
||||
|
||||
override fun onStartExpirationTimeout(messageRecord: MessageRecord) {
|
||||
startExpirationTimeout(messageRecord)
|
||||
|
@ -484,7 +484,7 @@ class ConversationAdapterV2(
|
|||
get() = getConversationMessage(bindingAdapterPosition - 1)?.messageRecord.toOptional()
|
||||
|
||||
protected val displayMode: ConversationItemDisplayMode
|
||||
get() = condensedMode ?: ConversationItemDisplayMode.STANDARD
|
||||
get() = condensedMode ?: ConversationItemDisplayMode.Standard
|
||||
|
||||
override val conversationMessage: ConversationMessage
|
||||
get() = bindable.conversationMessage
|
||||
|
|
|
@ -448,7 +448,7 @@ open class V2ConversationItemTextOnlyViewHolder<Model : MappingModel<Model>>(
|
|||
}
|
||||
|
||||
private fun isContentCondensed(): Boolean {
|
||||
return conversationContext.displayMode == ConversationItemDisplayMode.CONDENSED && conversationContext.getPreviousMessage(bindingAdapterPosition) == null
|
||||
return conversationContext.displayMode is ConversationItemDisplayMode.Condensed && conversationContext.getPreviousMessage(bindingAdapterPosition) == null
|
||||
}
|
||||
|
||||
private fun presentFooterExpiry() {
|
||||
|
@ -605,7 +605,7 @@ open class V2ConversationItemTextOnlyViewHolder<Model : MappingModel<Model>>(
|
|||
binding.conversationItemFooterDate.text = conversationMessage.formattedDate
|
||||
} else {
|
||||
var date = conversationMessage.formattedDate
|
||||
if (conversationContext.displayMode != ConversationItemDisplayMode.DETAILED && record is MediaMmsMessageRecord && record.isEditMessage()) {
|
||||
if (conversationContext.displayMode != ConversationItemDisplayMode.Detailed && record is MediaMmsMessageRecord && record.isEditMessage()) {
|
||||
date = getContext().getString(R.string.ConversationItem_edited_timestamp_footer, date)
|
||||
}
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ class V2OnDispatchTouchEventListener(
|
|||
}
|
||||
|
||||
override fun onDispatchTouchEvent(view: View, motionEvent: MotionEvent) {
|
||||
if (conversationContext.displayMode == ConversationItemDisplayMode.CONDENSED) {
|
||||
if (conversationContext.displayMode is ConversationItemDisplayMode.Condensed) {
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -138,7 +138,7 @@ public class LongMessageFragment extends FullScreenDialogFragment {
|
|||
} else {
|
||||
text.setMentionBackgroundTint(ContextCompat.getColor(requireContext(), R.color.transparent_black_40));
|
||||
}
|
||||
footer.setMessageRecord(message.get().getMessageRecord(), Locale.getDefault(), ConversationItemDisplayMode.STANDARD);
|
||||
footer.setMessageRecord(message.get().getMessageRecord(), Locale.getDefault(), ConversationItemDisplayMode.Standard.INSTANCE);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -111,7 +111,7 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G
|
|||
false,
|
||||
true,
|
||||
colorizer,
|
||||
ConversationItemDisplayMode.DETAILED);
|
||||
ConversationItemDisplayMode.Detailed.INSTANCE);
|
||||
}
|
||||
|
||||
private void bindErrorState(MessageRecord messageRecord) {
|
||||
|
|
Loading…
Add table
Reference in a new issue