From eda15268301ddced0455da4e4c714d37a92c2d40 Mon Sep 17 00:00:00 2001 From: Grishka Date: Fri, 13 Sep 2024 00:47:04 +0300 Subject: [PATCH] Show an overlay on image attachments that failed to load --- .../fragments/BaseStatusListFragment.java | 4 +++ .../MediaGridStatusDisplayItem.java | 17 +++++++++++ .../ui/displayitems/StatusDisplayItem.java | 5 ++-- .../utils/MediaAttachmentViewController.java | 27 +++++++++++++++++ .../src/main/res/drawable/broken_media.xml | 20 +++++++++++++ .../main/res/layout/display_item_photo.xml | 30 +++++++++++++++++++ mastodon/src/main/res/values/strings.xml | 1 + 7 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 mastodon/src/main/res/drawable/broken_media.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java index 7eee2a94..e6f558fb 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java @@ -700,6 +700,10 @@ public abstract class BaseStatusListFragment exten anim.start(); } + public void retryFailedImages(){ + imgLoader.retryFailedRequests(); + } + protected class DisplayItemsAdapter extends UsableRecyclerView.Adapter> implements ImageLoaderRecyclerAdapter{ public DisplayItemsAdapter(){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/MediaGridStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/MediaGridStatusDisplayItem.java index e3e3d7fe..dd9ec478 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/MediaGridStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/MediaGridStatusDisplayItem.java @@ -9,6 +9,7 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.text.TextUtils; +import android.util.Log; import android.util.Pair; import android.view.Gravity; import android.view.View; @@ -110,6 +111,7 @@ public class MediaGridStatusDisplayItem extends StatusDisplayItem{ private static final ColorDrawable drawableForWhenThereIsNoBlurhash=new ColorDrawable(0xffffffff); private final TextView hideSensitiveButton; private final TextView sensitiveText; + private boolean thereAreFailedImages; public Holder(Activity activity, ViewGroup parent){ super(new FrameLayoutThatOnlyMeasuresFirstChild(activity)); @@ -143,6 +145,7 @@ public class MediaGridStatusDisplayItem extends StatusDisplayItem{ @Override public void onBind(MediaGridStatusDisplayItem item){ + thereAreFailedImages=false; wrapper.setPadding(0, 0, 0, item.inset ? 0 : V.dp(8)); layout.setTiledLayout(item.tiledLayout); @@ -220,9 +223,23 @@ public class MediaGridStatusDisplayItem extends StatusDisplayItem{ controllers.get(index).clearImage(); } + @Override + public void onImageLoadingFailed(int index, Throwable error){ + controllers.get(index).showFailedOverlay(); + thereAreFailedImages=true; + } + private void onViewClick(View v){ int index=(Integer)v.getTag(); ((PhotoViewerHost) item.parentFragment).openPhotoViewer(item.parentID, item.status, index, this); + if(thereAreFailedImages){ + for(MediaAttachmentViewController controller:controllers){ + if(controller.isFailedOverlayShown()){ + controller.clearImage(); + } + } + item.parentFragment.retryFailedImages(); + } } private void onAltTextClick(View v){ 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 38680078..c5eecd40 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 @@ -11,7 +11,6 @@ import android.view.ViewGroup; import org.joinmastodon.android.R; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.fragments.BaseStatusListFragment; -import org.joinmastodon.android.fragments.StatusListFragment; import org.joinmastodon.android.fragments.ThreadFragment; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.Attachment; @@ -35,7 +34,7 @@ import me.grishka.appkit.views.UsableRecyclerView; public abstract class StatusDisplayItem{ public final String parentID; - public final BaseStatusListFragment parentFragment; + public final BaseStatusListFragment parentFragment; public boolean inset; public int index; @@ -45,7 +44,7 @@ public abstract class StatusDisplayItem{ public static final int FLAG_MEDIA_FORCE_HIDDEN=1 << 3; public static final int FLAG_NO_HEADER=1 << 4; - public StatusDisplayItem(String parentID, BaseStatusListFragment parentFragment){ + public StatusDisplayItem(String parentID, BaseStatusListFragment parentFragment){ this.parentID=parentID; this.parentFragment=parentFragment; } diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/MediaAttachmentViewController.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/MediaAttachmentViewController.java index b8b57f2b..baf18621 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/MediaAttachmentViewController.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/MediaAttachmentViewController.java @@ -16,6 +16,8 @@ import org.joinmastodon.android.ui.displayitems.MediaGridStatusDisplayItem; import org.joinmastodon.android.ui.drawables.BlurhashCrossfadeDrawable; import org.joinmastodon.android.ui.drawables.PlayIconDrawable; +import me.grishka.appkit.utils.V; + public class MediaAttachmentViewController{ public final View view; public final MediaGridStatusDisplayItem.GridItemType type; @@ -23,6 +25,8 @@ public class MediaAttachmentViewController{ public final View altButton; public final TextView duration; public final View playButton; + public final View failedOverlay; + public final View failedText; private BlurhashCrossfadeDrawable crossfadeDrawable=new BlurhashCrossfadeDrawable(); private final Context context; private boolean didClear; @@ -39,6 +43,8 @@ public class MediaAttachmentViewController{ altButton=view.findViewById(R.id.alt_button); duration=view.findViewById(R.id.duration); playButton=view.findViewById(R.id.play_button); + failedOverlay=view.findViewById(R.id.failed_overlay); + failedText=view.findViewById(R.id.failed_text); this.type=type; this.context=context; if(playButton!=null){ @@ -65,6 +71,11 @@ public class MediaAttachmentViewController{ duration.setText(UiUtils.formatMediaDuration((int)attachment.getDuration())); } didClear=false; + if(failedOverlay!=null){ + V.cancelVisibilityAnimation(failedOverlay); + failedOverlay.setVisibility(View.GONE); + failedText.setVisibility(status.mediaAttachments.size()>1 ? View.GONE : View.VISIBLE); + } } public void setImage(Drawable drawable){ @@ -76,11 +87,27 @@ public class MediaAttachmentViewController{ photo.setImageDrawable(null); photo.setImageDrawable(crossfadeDrawable); } + if(failedOverlay!=null && failedOverlay.getVisibility()!=View.GONE){ + V.setVisibilityAnimated(failedOverlay, View.GONE); + } } public void clearImage(){ crossfadeDrawable.setCrossfadeAlpha(1f); crossfadeDrawable.setImageDrawable(null); didClear=true; + if(failedOverlay!=null && failedOverlay.getVisibility()!=View.GONE){ + V.setVisibilityAnimated(failedOverlay, View.GONE); + } + } + + public void showFailedOverlay(){ + if(failedOverlay!=null){ + V.setVisibilityAnimated(failedOverlay, View.VISIBLE); + } + } + + public boolean isFailedOverlayShown(){ + return failedOverlay!=null && failedOverlay.getVisibility()!=View.GONE; } } diff --git a/mastodon/src/main/res/drawable/broken_media.xml b/mastodon/src/main/res/drawable/broken_media.xml new file mode 100644 index 00000000..d4a10da3 --- /dev/null +++ b/mastodon/src/main/res/drawable/broken_media.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/mastodon/src/main/res/layout/display_item_photo.xml b/mastodon/src/main/res/layout/display_item_photo.xml index b0602897..57638501 100644 --- a/mastodon/src/main/res/layout/display_item_photo.xml +++ b/mastodon/src/main/res/layout/display_item_photo.xml @@ -15,4 +15,34 @@ + + + + + + + + \ No newline at end of file diff --git a/mastodon/src/main/res/values/strings.xml b/mastodon/src/main/res/values/strings.xml index 11e3d550..220eb1c3 100644 --- a/mastodon/src/main/res/values/strings.xml +++ b/mastodon/src/main/res/values/strings.xml @@ -777,4 +777,5 @@ We are sorry, an error occurred and we have not been able to process your donation.\n\nPlease retry in a few minutes. Donate to Mastodon Manage donations + Couldn’t load image \ No newline at end of file