/* * This file is part of Popcorn Time. * * Popcorn Time is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Popcorn Time is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Popcorn Time. If not, see <http://www.gnu.org/licenses/>. */ package pct.droid.tv.presenters; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.support.v17.leanback.widget.BaseCardView; import android.support.v17.leanback.widget.ImageCardView; import android.support.v17.leanback.widget.Presenter; import android.support.v7.graphics.Palette; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.squareup.picasso.Picasso; import com.squareup.picasso.Target; import java.util.ArrayList; import java.util.List; import pct.droid.base.providers.media.models.Media; import pct.droid.base.utils.AnimUtils; import pct.droid.tv.R; /* * A CardPresenter is used to generate Views and bind Objects to them on demand. * It contains an Image CardView */ public class MediaCardPresenter extends Presenter { private static Context mContext; private static int mCardWidth; private static int mCardHeight; private final int mDefaultInfoBackgroundColor; private final int mDefaultSelectedInfoBackgroundColor; public MediaCardPresenter(Context context) { mDefaultSelectedInfoBackgroundColor = context.getResources().getColor(R.color.primary_dark); mDefaultInfoBackgroundColor = context.getResources().getColor(R.color.default_background); mCardWidth = (int) context.getResources().getDimension(R.dimen.card_width); mCardHeight = (int) context.getResources().getDimension(R.dimen.card_height); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent) { mContext = parent.getContext(); final CustomImageCardView cardView = new CustomImageCardView(mContext) { @Override public void setSelected(boolean selected) { if (getCustomSelectedSwatch() != null && selected) { setInfoAreaBackgroundColor(getCustomSelectedSwatch().getRgb()); } else setInfoAreaBackgroundColor(selected ? mDefaultSelectedInfoBackgroundColor : mDefaultInfoBackgroundColor); super.setSelected(selected); } }; cardView.setInfoAreaBackgroundColor(mDefaultInfoBackgroundColor); cardView.setFocusable(true); cardView.setFocusableInTouchMode(true); return new ViewHolder(cardView); } @Override public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) { MediaCardItem overview = (MediaCardItem) object; if (overview.isLoading()) onBindLoadingViewHolder(viewHolder, overview); else onBindMediaViewHolder(viewHolder, overview); } public void onBindLoadingViewHolder(Presenter.ViewHolder viewHolder, MediaCardItem overview) { final CustomImageCardView cardView = (CustomImageCardView) viewHolder.view; cardView.setMainImageScaleType(ImageView.ScaleType.CENTER_INSIDE); cardView.setMainImage(mContext.getResources().getDrawable(R.drawable.placeholder_inset, null)); cardView.setTitleText(mContext.getString(R.string.loading)); cardView.setMainImageDimensions(mCardWidth, mCardHeight); } public void onBindMediaViewHolder(Presenter.ViewHolder viewHolder, MediaCardItem overview) { Media item = overview.getMedia(); final CustomImageCardView cardView = (CustomImageCardView) viewHolder.view; cardView.setTitleText(item.title); cardView.setContentText(!TextUtils.isEmpty(item.genre) ? item.genre : item.year); cardView.getMainImageView().setAlpha(1f); cardView.getMainImageView().setPadding(0,0,0,0); cardView.setMainImageDimensions(mCardWidth, mCardHeight); cardView.getMainImageView().setVisibility(View.GONE); cardView.setCustomSelectedSwatch(null); if (item.image != null) { Target target = new Target() { @Override public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) { Palette.from(bitmap).maximumColorCount(16).generate(new Palette.PaletteAsyncListener() { @Override public void onGenerated(Palette palette) { Palette.Swatch swatch = palette.getDarkMutedSwatch(); cardView.setCustomSelectedSwatch(swatch); cardView.getMainImageView().setImageBitmap(bitmap); cardView.getMainImageView().setVisibility(View.GONE); AnimUtils.fadeIn(cardView.getMainImageView()); } }); } @Override public void onBitmapFailed(Drawable errorDrawable) { cardView.getMainImageView().setImageResource(R.drawable.placeholder_inset); cardView.getMainImageView().setAlpha(0.4f); cardView.getMainImageView().setScaleType(ImageView.ScaleType.CENTER_INSIDE); cardView.getMainImageView().setVisibility(View.GONE); AnimUtils.fadeIn(cardView.getMainImageView()); } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } }; //load image Picasso.with(mContext).load(item.image).resize(mCardWidth, mCardHeight).centerCrop().into(target); cardView.setTarget(target); } else { cardView.getMainImageView().setImageResource(R.drawable.placeholder_inset); cardView.getMainImageView().setAlpha(0.4f); cardView.getMainImageView().setScaleType(ImageView.ScaleType.CENTER_INSIDE); cardView.getMainImageView().setVisibility(View.GONE); AnimUtils.fadeIn(cardView.getMainImageView()); } } @Override public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { CustomImageCardView cardView = (CustomImageCardView) viewHolder.view; // Remove references to images so that the garbage collector can free up memory cardView.setBadgeImage(null); cardView.setMainImage(null); if (cardView.getTarget() != null) { Picasso.with(mContext).cancelRequest(cardView.getTarget()); cardView.setTarget(null); } } public static class CustomImageCardView extends ImageCardView { private Palette.Swatch mCustomSelectedSwatch; private Target mTarget; public CustomImageCardView(Context context) { super(context); setInfoVisibility(BaseCardView.CARD_REGION_VISIBLE_ALWAYS); } public CustomImageCardView(Context context, AttributeSet attrs) { super(context, attrs); setInfoVisibility(BaseCardView.CARD_REGION_VISIBLE_ALWAYS); } public CustomImageCardView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setInfoVisibility(BaseCardView.CARD_REGION_VISIBLE_ALWAYS); } public Palette.Swatch getCustomSelectedSwatch() { return mCustomSelectedSwatch; } public void setCustomSelectedSwatch(Palette.Swatch customSelectedSwatch) { mCustomSelectedSwatch = customSelectedSwatch; } public Target getTarget() { return mTarget; } public void setTarget(Target target) { mTarget = target; } } public static class MediaCardItem { private Media mMedia; private boolean mLoading; public MediaCardItem(Media media) { mMedia = media; } public MediaCardItem(boolean loading) { mLoading = loading; } public Media getMedia() { return mMedia; } public boolean isLoading() { return mLoading; } } public static List<MediaCardItem> convertMediaToOverview(List<Media> items) { List<MediaCardItem> list = new ArrayList<>(); for (Media media : items) list.add(new MediaCardItem(media)); return list; } }