From 3fda9e9eab4254e8fd033da2d8af3adcc09a3aba Mon Sep 17 00:00:00 2001 From: LucasGGamerM Date: Sat, 13 May 2023 18:42:25 -0300 Subject: [PATCH] feat: add file attachments view This also fixes crashes on Calckey due to now being able to handle any type of attachment. @sk22 this is also great for you --- .../displayitems/FileStatusDisplayItem.java | 60 +++++++++++++++++++ .../ui/displayitems/StatusDisplayItem.java | 12 +++- .../drawable/ic_fluent_attach_24_regular.xml | 9 +++ .../src/main/res/layout/display_item_file.xml | 59 ++++++++++++++++++ 4 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FileStatusDisplayItem.java create mode 100644 mastodon/src/main/res/drawable/ic_fluent_attach_24_regular.xml create mode 100644 mastodon/src/main/res/layout/display_item_file.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FileStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FileStatusDisplayItem.java new file mode 100644 index 000000000..91aa8fc5c --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FileStatusDisplayItem.java @@ -0,0 +1,60 @@ +package org.joinmastodon.android.ui.displayitems; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.text.TextUtils; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import org.joinmastodon.android.R; +import org.joinmastodon.android.fragments.BaseStatusListFragment; +import org.joinmastodon.android.model.Attachment; +import org.joinmastodon.android.model.Card; +import org.joinmastodon.android.model.Status; +import org.joinmastodon.android.ui.drawables.BlurhashCrossfadeDrawable; +import org.joinmastodon.android.ui.utils.UiUtils; + +import me.grishka.appkit.imageloader.ImageLoaderViewHolder; + +public class FileStatusDisplayItem extends StatusDisplayItem{ + private final Status status; + private final Attachment attachment; + + public FileStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, Attachment attachment, Status status){ + super(parentID, parentFragment); + this.status=status; + this.attachment=attachment; + } + + @Override + public Type getType(){ + return Type.FILE; + } + + public static class Holder extends StatusDisplayItem.Holder{ + private final TextView title, domain; + private boolean didClear; + + public Holder(Context context, ViewGroup parent){ + super(context, R.layout.display_item_file, parent); + title=findViewById(R.id.title); + domain=findViewById(R.id.domain); + findViewById(R.id.inner).setOnClickListener(this::onClick); + } + + @Override + public void onBind(FileStatusDisplayItem item){ + title.setText(item.attachment.description == null ? title.getContext().getText(R.string.media_no_description) : item.attachment.description); + domain.setText(Uri.parse(item.attachment.url).getHost()); + + } + + private void onClick(View v){ + UiUtils.openURL(itemView.getContext(), item.parentFragment.getAccountID(), item.attachment.url); + } + } +} + diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java index 545b8507d..274564a6d 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java @@ -79,6 +79,7 @@ public abstract class StatusDisplayItem{ case EXTENDED_FOOTER -> new ExtendedFooterStatusDisplayItem.Holder(activity, parent); case MEDIA_GRID -> new MediaGridStatusDisplayItem.Holder(activity, parent); case WARNING -> new WarningFilteredStatusDisplayItem.Holder(activity, parent); + case FILE -> new FileStatusDisplayItem.Holder(activity, parent); }; } @@ -185,7 +186,7 @@ public abstract class StatusDisplayItem{ replyLine.needBottomPadding=true; else header.needBottomPadding=true; - List imageAttachments=statusForContent.mediaAttachments.stream().filter(att->att.type.isImage()).collect(Collectors.toList()); + List imageAttachments=statusForContent.mediaAttachments.stream().filter(att->att.type.isImage() && !att.type.equals(Attachment.Type.UNKNOWN)).collect(Collectors.toList()); if(!imageAttachments.isEmpty()){ PhotoLayoutHelper.TiledLayoutResult layout=PhotoLayoutHelper.processThumbs(imageAttachments); items.add(new MediaGridStatusDisplayItem(parentID, fragment, layout, imageAttachments, statusForContent)); @@ -195,6 +196,12 @@ public abstract class StatusDisplayItem{ items.add(new AudioStatusDisplayItem(parentID, fragment, statusForContent, att)); } } + + List fileAttachments=statusForContent.mediaAttachments.stream().filter(att->att.type.equals(Attachment.Type.UNKNOWN)).collect(Collectors.toList()); + fileAttachments.forEach(attachment -> { + items.add(new FileStatusDisplayItem(parentID, fragment, attachment, statusForContent)); + }); + if(statusForContent.poll!=null){ buildPollItems(parentID, fragment, statusForContent.poll, items, statusForContent); } @@ -244,7 +251,8 @@ public abstract class StatusDisplayItem{ GAP, WARNING, EXTENDED_FOOTER, - MEDIA_GRID + MEDIA_GRID, + FILE } public static abstract class Holder extends BindableViewHolder implements UsableRecyclerView.DisableableClickable{ diff --git a/mastodon/src/main/res/drawable/ic_fluent_attach_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_attach_24_regular.xml new file mode 100644 index 000000000..7c31688d8 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_attach_24_regular.xml @@ -0,0 +1,9 @@ + + + diff --git a/mastodon/src/main/res/layout/display_item_file.xml b/mastodon/src/main/res/layout/display_item_file.xml new file mode 100644 index 000000000..b5a169fc7 --- /dev/null +++ b/mastodon/src/main/res/layout/display_item_file.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file