AntennaPod/app/src/main/java/de/danoeh/antennapod/adapter/CoverLoader.java

135 lines
4.4 KiB
Java

package de.danoeh.antennapod.adapter;
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 de.danoeh.antennapod.activity.MainActivity;
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 MainActivity activity;
private TextView fallbackTitle;
public CoverLoader(MainActivity activity) {
this.activity = activity;
}
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);
}
}
}
}