diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java index 6e409138..0c9d1566 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java @@ -13,12 +13,12 @@ import android.widget.ImageView; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; +import android.widget.Toast; import android.widget.ToggleButton; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.content.res.AppCompatResources; import androidx.emoji.text.EmojiCompat; import androidx.recyclerview.widget.RecyclerView; @@ -49,6 +49,7 @@ import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.Objects; import at.connyduck.sparkbutton.SparkButton; import at.connyduck.sparkbutton.SparkEventListener; @@ -71,7 +72,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { private ImageView[] mediaOverlays; private TextView sensitiveMediaWarning; private View sensitiveMediaShow; - protected TextView mediaLabel; + protected TextView[] mediaLabels; private ToggleButton contentWarningButton; protected ImageView avatarInset; @@ -124,7 +125,12 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { }; sensitiveMediaWarning = itemView.findViewById(R.id.status_sensitive_media_warning); sensitiveMediaShow = itemView.findViewById(R.id.status_sensitive_media_button); - mediaLabel = itemView.findViewById(R.id.status_media_label); + mediaLabels = new TextView[]{ + itemView.findViewById(R.id.status_media_label_1), + itemView.findViewById(R.id.status_media_label_2), + itemView.findViewById(R.id.status_media_label_3), + itemView.findViewById(R.id.status_media_label_4) + }; contentWarningDescription = itemView.findViewById(R.id.status_content_warning_description); contentWarningButton = itemView.findViewById(R.id.status_content_warning_button); avatarInset = itemView.findViewById(R.id.status_avatar_inset); @@ -435,12 +441,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { mediaOverlays[i].setVisibility(View.GONE); } - final int urlIndex = i; - mediaPreviews[i].setOnClickListener(v -> { - if (getAdapterPosition() != RecyclerView.NO_POSITION) { - listener.onViewMedia(getAdapterPosition(), urlIndex, v); - } - }); + setAttachmentClickListeners(mediaPreviews[i], listener, i, attachments.get(i)); if (n <= 2) { mediaPreviews[0].getLayoutParams().height = getMediaPreviewHeight(context) * 2; @@ -490,18 +491,6 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { } } - @NonNull - private static String getLabelTypeText(Context context, Attachment.Type type) { - switch (type) { - default: - case IMAGE: - return context.getString(R.string.status_media_images); - case GIFV: - case VIDEO: - return context.getString(R.string.status_media_video); - } - } - @DrawableRes private static int getLabelIcon(Attachment.Type type) { switch (type) { @@ -515,29 +504,54 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { } protected void setMediaLabel(List attachments, boolean sensitive, - final StatusActionListener listener) { - if (attachments.size() == 0) { - mediaLabel.setVisibility(View.GONE); - return; - } - mediaLabel.setVisibility(View.VISIBLE); - - // Set the label's text. + final StatusActionListener listener, boolean showingContent) { Context context = itemView.getContext(); - String labelText = getLabelTypeText(context, attachments.get(0).getType()); - if (sensitive) { - String sensitiveText = context.getString(R.string.status_sensitive_media_title); - labelText += String.format(" (%s)", sensitiveText); + for (int i = 0; i < mediaLabels.length; i++) { + TextView mediaLabel = mediaLabels[i]; + if (i < attachments.size()) { + Attachment attachment = attachments.get(i); + mediaLabel.setVisibility(View.VISIBLE); + + if (sensitive && !showingContent) { + mediaLabel.setText(R.string.status_sensitive_media_title); + } else { + mediaLabel.setText(getAttachmentDescription(context, attachment)); + } + + // Set the icon next to the label. + int drawableId = getLabelIcon(attachments.get(0).getType()); + Drawable drawable = Objects.requireNonNull(context.getDrawable(drawableId)); + ThemeUtils.setDrawableTint(context, drawable, android.R.attr.textColorTertiary); + mediaLabel.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null); + + setAttachmentClickListeners(mediaLabel, listener, i, attachment); + } else { + mediaLabel.setVisibility(View.GONE); + } } - mediaLabel.setText(labelText); + } - // Set the icon next to the label. - int drawableId = getLabelIcon(attachments.get(0).getType()); - Drawable drawable = AppCompatResources.getDrawable(context, drawableId); - ThemeUtils.setDrawableTint(context, drawable, android.R.attr.textColorTertiary); - mediaLabel.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null); + private void setAttachmentClickListeners(View view, StatusActionListener listener, + int index, Attachment attachment) { + view.setOnClickListener(v -> { + if (getAdapterPosition() != RecyclerView.NO_POSITION) { + listener.onViewMedia(getAdapterPosition(), index, null); + } + }); + view.setOnLongClickListener(v -> { + CharSequence description = getAttachmentDescription(view.getContext(), attachment); + Toast.makeText(view.getContext(), description, Toast.LENGTH_LONG).show(); + return true; + }); + } - mediaLabel.setOnClickListener(v -> listener.onViewMedia(getAdapterPosition(), 0, null)); + private CharSequence getAttachmentDescription(Context context, Attachment attachment) { + if (TextUtils.isEmpty(attachment.getDescription())) { + return context + .getString(R.string.description_status_media_no_description_placeholder); + } else { + return attachment.getDescription(); + } } protected void hideSensitiveMediaWarning() { @@ -641,9 +655,11 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { hideSensitiveMediaWarning(); } // Hide the unused label. - mediaLabel.setVisibility(View.GONE); + for (TextView mediaLabel : mediaLabels) { + mediaLabel.setVisibility(View.GONE); + } } else { - setMediaLabel(attachments, sensitive, listener); + setMediaLabel(attachments, sensitive, listener, status.isShowingContent()); // Hide all unused views. mediaPreviews[0].setVisibility(View.GONE); mediaPreviews[1].setVisibility(View.GONE); diff --git a/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationViewHolder.java index 2acf5e86..1b8adba1 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationViewHolder.java @@ -24,6 +24,9 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.ToggleButton; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; import com.keylesspalace.tusky.R; import com.keylesspalace.tusky.adapter.StatusBaseViewHolder; import com.keylesspalace.tusky.entity.Attachment; @@ -33,8 +36,6 @@ import com.keylesspalace.tusky.util.SmartLengthInputFilter; import java.util.List; -import androidx.recyclerview.widget.RecyclerView; - public class ConversationViewHolder extends StatusBaseViewHolder { private static final InputFilter[] COLLAPSE_INPUT_FILTER = new InputFilter[]{SmartLengthInputFilter.INSTANCE}; private static final InputFilter[] NO_INPUT_FILTER = new InputFilter[0]; @@ -87,9 +88,11 @@ public class ConversationViewHolder extends StatusBaseViewHolder { hideSensitiveMediaWarning(); } // Hide the unused label. - mediaLabel.setVisibility(View.GONE); + for (TextView mediaLabel : mediaLabels) { + mediaLabel.setVisibility(View.GONE); + } } else { - setMediaLabel(attachments, sensitive, listener); + setMediaLabel(attachments, sensitive, listener, status.getShowingHiddenContent()); // Hide all unused views. mediaPreviews[0].setVisibility(View.GONE); mediaPreviews[1].setVisibility(View.GONE); diff --git a/app/src/main/res/layout/item_conversation.xml b/app/src/main/res/layout/item_conversation.xml index cd257b21..899b5b04 100644 --- a/app/src/main/res/layout/item_conversation.xml +++ b/app/src/main/res/layout/item_conversation.xml @@ -328,17 +328,58 @@ app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + + + + + + + + + + +