diff options
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/ui/CoverLoader.java')
-rw-r--r-- | app/src/main/java/de/danoeh/antennapod/ui/CoverLoader.java | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/ui/CoverLoader.java b/app/src/main/java/de/danoeh/antennapod/ui/CoverLoader.java new file mode 100644 index 000000000..370a15919 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/ui/CoverLoader.java @@ -0,0 +1,132 @@ +package de.danoeh.antennapod.ui; + +import android.graphics.drawable.Drawable; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.bumptech.glide.Glide; +import com.bumptech.glide.RequestBuilder; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.CustomViewTarget; +import com.bumptech.glide.request.transition.Transition; + +import java.lang.ref.WeakReference; + +public class CoverLoader { + private int resource = 0; + private String uri; + private String fallbackUri; + private ImageView imgvCover; + private boolean textAndImageCombined; + private TextView fallbackTitle; + + public CoverLoader() { + } + + public CoverLoader withUri(String uri) { + this.uri = uri; + return this; + } + + public CoverLoader withResource(int resource) { + this.resource = resource; + return this; + } + + public CoverLoader withFallbackUri(String uri) { + fallbackUri = uri; + return this; + } + + public CoverLoader withCoverView(ImageView coverView) { + imgvCover = coverView; + return this; + } + + public CoverLoader withPlaceholderView(TextView title) { + this.fallbackTitle = title; + return this; + } + + /** + * Set cover text and if it should be shown even if there is a cover image. + * @param fallbackTitle Fallback title text + * @param textAndImageCombined Show cover text even if there is a cover image? + */ + @NonNull + public CoverLoader withPlaceholderView(TextView fallbackTitle, boolean textAndImageCombined) { + this.fallbackTitle = fallbackTitle; + this.textAndImageCombined = textAndImageCombined; + return this; + } + + public void load() { + CoverTarget coverTarget = new CoverTarget(fallbackTitle, imgvCover, textAndImageCombined); + + if (resource != 0) { + Glide.with(imgvCover).clear(coverTarget); + imgvCover.setImageResource(resource); + CoverTarget.setTitleVisibility(fallbackTitle, textAndImageCombined); + return; + } + + RequestOptions options = new RequestOptions() + .fitCenter() + .dontAnimate(); + + RequestBuilder<Drawable> builder = Glide.with(imgvCover) + .as(Drawable.class) + .load(uri) + .apply(options); + + if (fallbackUri != null) { + builder = builder.error(Glide.with(imgvCover) + .as(Drawable.class) + .load(fallbackUri) + .apply(options)); + } + + builder.into(coverTarget); + } + + static class CoverTarget extends CustomViewTarget<ImageView, Drawable> { + private final WeakReference<TextView> fallbackTitle; + private final WeakReference<ImageView> cover; + private final boolean textAndImageCombined; + + public CoverTarget(TextView fallbackTitle, ImageView coverImage, boolean textAndImageCombined) { + super(coverImage); + this.fallbackTitle = new WeakReference<>(fallbackTitle); + this.cover = new WeakReference<>(coverImage); + this.textAndImageCombined = textAndImageCombined; + } + + @Override + public void onLoadFailed(Drawable errorDrawable) { + setTitleVisibility(fallbackTitle.get(), true); + } + + @Override + public void onResourceReady(@NonNull Drawable resource, + @Nullable Transition<? super Drawable> transition) { + ImageView ivCover = cover.get(); + ivCover.setImageDrawable(resource); + setTitleVisibility(fallbackTitle.get(), textAndImageCombined); + } + + @Override + protected void onResourceCleared(@Nullable Drawable placeholder) { + ImageView ivCover = cover.get(); + ivCover.setImageDrawable(placeholder); + setTitleVisibility(fallbackTitle.get(), textAndImageCombined); + } + + static void setTitleVisibility(TextView fallbackTitle, boolean textAndImageCombined) { + if (fallbackTitle != null) { + fallbackTitle.setVisibility(textAndImageCombined ? View.VISIBLE : View.GONE); + } + } + } +}
\ No newline at end of file |