package com.simplecity.amp_library.ui.modelviews; import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.model.StreamEncoder; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.ImageViewTarget; import com.bumptech.glide.request.target.Target; import com.simplecity.amp_library.R; import com.simplecity.amp_library.glide.loader.TypeLoader; import com.simplecity.amp_library.glide.utils.BitmapAndSize; import com.simplecity.amp_library.glide.utils.BitmapAndSizeDecoder; import com.simplecity.amp_library.model.ArtworkModel; import com.simplecity.amp_library.model.ArtworkProvider; import com.simplecity.amp_library.utils.ColorUtils; import java.io.File; import java.io.InputStream; public class ArtworkView extends BaseAdaptableItem<ArtworkModel, ArtworkView.ViewHolder> { public interface GlideListener { void onArtworkLoadFailed(ArtworkView artworkView); } @ArtworkProvider.Type private int type; private ArtworkProvider artworkProvider; private GlideListener listener; public File file; private boolean selected; private boolean isCustom; public ArtworkView(int type, ArtworkProvider artworkProvider, GlideListener listener) { this(type, artworkProvider, listener, null, false); } public ArtworkView(int type, ArtworkProvider artworkProvider, GlideListener listener, File file, boolean isCustom) { this.type = type; this.artworkProvider = artworkProvider; this.listener = listener; this.file = file; this.isCustom = isCustom; } public void setSelected(boolean selected) { this.selected = selected; } public boolean isSelected() { return selected; } @Override public int getViewType() { return ViewType.ARTWORK; } @Override public int getLayoutResId() { return R.layout.list_item_artwork; } @Override public void bindView(ViewHolder holder) { long time = System.currentTimeMillis(); holder.textContainer.setBackground(null); holder.progressBar.setVisibility(View.VISIBLE); holder.lineTwo.setText(null); Glide.with(holder.itemView.getContext()) .using(new TypeLoader(type, file), InputStream.class) .from(ArtworkProvider.class) .as(BitmapAndSize.class) .sourceEncoder(new StreamEncoder()) .decoder(new BitmapAndSizeDecoder(holder.itemView.getContext())) .diskCacheStrategy(DiskCacheStrategy.NONE) .load(artworkProvider) .listener(new RequestListener<ArtworkProvider, BitmapAndSize>() { @Override public boolean onException(Exception e, ArtworkProvider model, Target<BitmapAndSize> target, boolean isFirstResource) { if (listener != null) { if (holder.itemView.getHandler() != null) { holder.itemView.getHandler().postDelayed(() -> listener.onArtworkLoadFailed(ArtworkView.this), System.currentTimeMillis() + 1000 - time); } } return false; } @Override public boolean onResourceReady(BitmapAndSize resource, ArtworkProvider model, Target<BitmapAndSize> target, boolean isFromMemoryCache, boolean isFirstResource) { return false; } }) .into(new ImageViewTarget<BitmapAndSize>(((ArtworkView.ViewHolder) holder).imageView) { @Override protected void setResource(BitmapAndSize resource) { holder.textContainer.setBackgroundResource(R.drawable.text_protection_scrim_reversed); holder.progressBar.setVisibility(View.GONE); holder.imageView.setImageBitmap(resource.bitmap); holder.lineTwo.setText(String.format("%sx%spx", resource.size.width, resource.size.height)); } }); holder.lineOne.setText(ArtworkModel.getTypeString(type)); if (type == ArtworkProvider.Type.FOLDER && file != null) { holder.lineOne.setText(file.getName()); } if (isCustom && file != null && file.getPath().contains("custom_artwork")) { holder.lineOne.setText(holder.itemView.getContext().getString(R.string.artwork_type_custom)); } holder.checkView.setVisibility(isSelected() ? View.VISIBLE : View.GONE); } @Override public ViewHolder getViewHolder(ViewGroup parent) { return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(getLayoutResId(), parent, false)); } @Override public ArtworkModel getItem() { return new ArtworkModel(type, file); } public static class ViewHolder extends RecyclerView.ViewHolder { public ImageView imageView; public TextView lineOne; public TextView lineTwo; public View checkView; public View textContainer; public ProgressBar progressBar; public ViewHolder(View itemView) { super(itemView); imageView = (ImageView) itemView.findViewById(R.id.imageView); lineOne = (TextView) itemView.findViewById(R.id.line_one); lineTwo = (TextView) itemView.findViewById(R.id.line_two); checkView = itemView.findViewById(R.id.checkView); textContainer = itemView.findViewById(R.id.textContainer); progressBar = (ProgressBar) itemView.findViewById(R.id.progressBar); DrawableCompat.setTint(DrawableCompat.wrap(checkView.getBackground()), ColorUtils.getAccentColor()); } @Override public String toString() { return "ArtworkView.ViewHolder"; } } }