Add 'detailed' conversation style to show full file names.

Fixes #12442
Closes #12463
This commit is contained in:
Veniamin Vynohradov 2022-09-19 21:32:21 +03:00 committed by Greyson Parrelli
parent cdb7f07368
commit c131fb500d
8 changed files with 52 additions and 28 deletions

View file

@ -13,6 +13,7 @@ import org.thoughtcrime.securesms.contactshare.Contact;
import org.thoughtcrime.securesms.conversation.ConversationMessage;
import org.thoughtcrime.securesms.conversation.colors.Colorizable;
import org.thoughtcrime.securesms.conversation.colors.Colorizer;
import org.thoughtcrime.securesms.conversation.ConversationItemDisplayMode;
import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectPart;
import org.thoughtcrime.securesms.conversation.mutiselect.Multiselectable;
import org.thoughtcrime.securesms.database.model.InMemoryMessageRecord;
@ -47,7 +48,7 @@ public interface BindableConversationItem extends Unbindable, GiphyMp4Playable,
boolean isMessageRequestAccepted,
boolean canPlayInline,
@NonNull Colorizer colorizer,
boolean isCondensedMode);
@NonNull ConversationItemDisplayMode displayMode);
@NonNull ConversationMessage getConversationMessage();

View file

@ -90,7 +90,8 @@ public class DocumentView extends FrameLayout {
}
public void setDocument(final @NonNull Slide documentSlide,
final boolean showControls)
final boolean showControls,
final boolean showSingleLineFilename)
{
if (showControls && documentSlide.isPendingDownload()) {
controlToggle.displayQuick(downloadButton);
@ -106,6 +107,11 @@ public class DocumentView extends FrameLayout {
this.documentSlide = documentSlide;
// Android OS filenames are limited to 256 characters, so
// we don't need an additional max characters/lines constraint when
// [showSingleLineFilename] is false.
this.fileName.setSingleLine(showSingleLineFilename);
this.fileName.setText(OptionalUtil.or(documentSlide.getFileName(),
documentSlide.getCaption())
.orElse(getContext().getString(R.string.DocumentView_unnamed_file)));
@ -114,6 +120,12 @@ public class DocumentView extends FrameLayout {
this.setOnClickListener(new OpenClickedListener(documentSlide));
}
public void setDocument(final @NonNull Slide documentSlide,
final boolean showControls)
{
setDocument(documentSlide, showControls, true);
}
@Override
public void setFocusable(boolean focusable) {
super.setFocusable(focusable);

View file

@ -280,6 +280,8 @@ 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 ? ConversationItemDisplayMode.CONDENSED : ConversationItemDisplayMode.STANDARD;
conversationViewHolder.getBindable().bind(lifecycleOwner,
conversationMessage,
Optional.ofNullable(previousMessage != null ? previousMessage.getMessageRecord() : null),
@ -294,7 +296,7 @@ public class ConversationAdapter
isMessageRequestAccepted,
conversationMessage == inlineContent,
colorizer,
condensedMode);
displayMode);
if (conversationMessage == recordToPulse) {
recordToPulse = null;

View file

@ -18,7 +18,6 @@ package org.thoughtcrime.securesms.conversation;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
@ -114,7 +113,6 @@ import org.thoughtcrime.securesms.jobs.SmsSendJob;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory;
import org.thoughtcrime.securesms.mediapreview.MediaPreviewV2Activity;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.mms.ImageSlide;
import org.thoughtcrime.securesms.mms.PartAuthority;
@ -130,7 +128,6 @@ import org.thoughtcrime.securesms.recipients.RecipientForeverObserver;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.revealable.ViewOnceMessageView;
import org.thoughtcrime.securesms.util.DateUtils;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.InterceptableLongClickCopyLinkSpan;
import org.thoughtcrime.securesms.util.LinkUtil;
import org.thoughtcrime.securesms.util.LongClickMovementMethod;
@ -191,13 +188,8 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
private LiveRecipient recipient;
private GlideRequests glideRequests;
private ValueAnimator pulseOutlinerAlphaAnimator;
private Optional<MessageRecord> previousMessage;
/**
* Whether or not we're rendering this item in a constrained space.
* Today this is only {@link org.thoughtcrime.securesms.conversation.quotes.MessageQuotesBottomSheet}.
*/
private boolean isCondensedMode;
private Optional<MessageRecord> previousMessage;
private ConversationItemDisplayMode displayMode;
protected ConversationItemBodyBubble bodyBubble;
protected View reply;
@ -355,7 +347,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
boolean isMessageRequestAccepted,
boolean allowedToPlayInline,
@NonNull Colorizer colorizer,
boolean isCondensedMode)
@NonNull ConversationItemDisplayMode displayMode)
{
if (this.recipient != null) this.recipient.removeForeverObserver(this);
if (this.conversationRecipient != null) this.conversationRecipient.removeForeverObserver(this);
@ -376,7 +368,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
this.canPlayContent = false;
this.mediaItem = null;
this.colorizer = colorizer;
this.isCondensedMode = isCondensedMode;
this.displayMode = displayMode;
this.previousMessage = previousMessageRecord;
this.recipient.observeForever(this);
@ -422,7 +414,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (isCondensedMode) return super.dispatchTouchEvent(ev);
if (isCondensedMode()) return super.dispatchTouchEvent(ev);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
@ -906,12 +898,20 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
}
}
/**
* Whether or not we're rendering this item in a constrained space.
* Today this is only {@link org.thoughtcrime.securesms.conversation.quotes.MessageQuotesBottomSheet}.
*/
private boolean isCondensedMode() {
return displayMode == ConversationItemDisplayMode.CONDENSED;
}
/**
* Whether or not we want to condense the actual content of the bubble. e.g. shorten image height, text content, etc.
* Today, we only want to do this for the first message when we're in condensed mode.
*/
private boolean isContentCondensed() {
return isCondensedMode && !previousMessage.isPresent();
return isCondensedMode() && !previousMessage.isPresent();
}
private boolean isStoryReaction(MessageRecord messageRecord) {
@ -1187,7 +1187,11 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
if (giftViewStub.resolved()) giftViewStub.get().setVisibility(View.GONE);
//noinspection ConstantConditions
documentViewStub.get().setDocument(((MediaMmsMessageRecord) messageRecord).getSlideDeck().getDocumentSlide(), showControls);
documentViewStub.get().setDocument(
((MediaMmsMessageRecord) messageRecord).getSlideDeck().getDocumentSlide(),
showControls,
displayMode != ConversationItemDisplayMode.DETAILED
);
documentViewStub.get().setDocumentClickListener(new ThumbnailClickListener());
documentViewStub.get().setDownloadClickListener(singleDownloadClickListener);
documentViewStub.get().setOnLongClickListener(passthroughClickListener);
@ -1690,7 +1694,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
}
private void setHasBeenQuoted(@NonNull ConversationMessage message) {
if (message.hasBeenQuoted() && !isCondensedMode && quotedIndicator != null && batchSelected.isEmpty()) {
if (message.hasBeenQuoted() && !isCondensedMode() && quotedIndicator != null && batchSelected.isEmpty()) {
quotedIndicator.setVisibility(VISIBLE);
quotedIndicator.setOnClickListener(quotedIndicatorClickListener);
} else if (quotedIndicator != null) {
@ -2312,7 +2316,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
private class ThumbnailClickListener implements SlideClickListener {
public void onClick(final View v, final Slide slide) {
if (shouldInterceptClicks(messageRecord) || !batchSelected.isEmpty() || isCondensedMode) {
if (shouldInterceptClicks(messageRecord) || !batchSelected.isEmpty() || isCondensedMode()) {
performClick();
} else if (!canPlayContent && mediaItem != null && eventListener != null) {
eventListener.onPlayInlineContent(conversationMessage);

View file

@ -0,0 +1,10 @@
package org.thoughtcrime.securesms.conversation
enum class ConversationItemDisplayMode {
/** Normal rendering, used for normal bubbles in the conversation view */
STANDARD,
/** Smaller bubbles, often trimming text and shrinking images. Used for quote threads. */
CONDENSED,
/** Less length restrictions. Used to show more info in message details. */
DETAILED,
}

View file

@ -14,9 +14,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.cardview.widget.CardView;
import androidx.core.content.ContextCompat;
import androidx.core.content.res.ColorStateListInflaterCompat;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;
@ -51,8 +49,6 @@ import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.concurrent.ListenableFuture;
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
import org.thoughtcrime.securesms.util.views.AutoRounder;
import org.thoughtcrime.securesms.util.views.Stub;
import org.thoughtcrime.securesms.verify.VerifyIdentityActivity;
import org.whispersystems.signalservice.api.push.ServiceId;
@ -129,7 +125,7 @@ public final class ConversationUpdateItem extends FrameLayout
boolean isMessageRequestAccepted,
boolean allowedToPlayInline,
@NonNull Colorizer colorizer,
boolean isCondensedMode)
@NonNull ConversationItemDisplayMode displayMode)
{
this.batchSelected = batchSelected;

View file

@ -26,6 +26,7 @@ import org.thoughtcrime.securesms.conversation.ConversationItem;
import org.thoughtcrime.securesms.conversation.ConversationMessage;
import org.thoughtcrime.securesms.conversation.colors.Colorizable;
import org.thoughtcrime.securesms.conversation.colors.Colorizer;
import org.thoughtcrime.securesms.conversation.ConversationItemDisplayMode;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.giph.mp4.GiphyMp4Playable;
import org.thoughtcrime.securesms.giph.mp4.GiphyMp4PlaybackPolicyEnforcer;
@ -110,7 +111,7 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G
false,
true,
colorizer,
false);
ConversationItemDisplayMode.DETAILED);
}
private void bindErrorState(MessageRecord messageRecord) {

View file

@ -91,8 +91,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Signal.Text.Body"
android:singleLine="true"
android:maxLines="1"
android:clickable="false"
android:ellipsize="end"
tools:text="The-Anarchist-Tension-by-Alfredo-Bonanno.pdf"/>