ImageCardViewPresenter.java revision 86163d539e1aeb9ae7612def7aaf7dbfc5b88f28
186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn/* 286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * Copyright (C) 2015 The Android Open Source Project 386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * 486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * in compliance with the License. You may obtain a copy of the License at 686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * 786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * http://www.apache.org/licenses/LICENSE-2.0 886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * 986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * Unless required by applicable law or agreed to in writing, software distributed under the License 1086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 1186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * or implied. See the License for the specific language governing permissions and limitations under 1286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * the License. 1386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn */ 1486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 1586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnpackage android.support.v17.leanback.supportleanbackshowcase.cards.presenters; 1686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 1786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.content.Context; 1886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.graphics.drawable.ColorDrawable; 1986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.graphics.drawable.Drawable; 2086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.supportleanbackshowcase.Constants; 2186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.supportleanbackshowcase.R; 2286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.supportleanbackshowcase.Utils; 2386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.supportleanbackshowcase.cards.models.Card; 2486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.supportleanbackshowcase.cards.views.ImageCardViewReplacement; 2586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.util.Log; 2686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.view.View; 2786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 2886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport com.squareup.picasso.Picasso; 2986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 3086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport java.util.HashMap; 3186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 3286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn/** 3386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * A ImageCardViewPresenter is used to generate Views and bind Objects to them on demand. It 3486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * contains an {@link ImageCardViewReplacement}. 3586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn */ 3686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnpublic class ImageCardViewPresenter extends AbstractCardPresenter<ImageCardViewReplacement> { 3786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 3886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn private static final String TAG = "ImageCardViewPresenter"; 3986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn private final int mImageWidthInDp; 4086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn private final int mImageHeightDp; 4186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn private final Drawable mLoadingErrorDrawable; 4286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn private final HashMap<Object, Integer> mSelectedColors = new HashMap<Object, Integer>(); 4386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn private int mDefaultFooterColor; 4486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 4586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn public ImageCardViewPresenter(Context context, int imageWidthInDp, int imageHeightInDp) { 4686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn super(context); 4786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn int color = context.getResources().getColor(R.color.loading_error_card_background); 4886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn mLoadingErrorDrawable = new ColorDrawable(color); 4986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 5086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn mDefaultFooterColor = context.getResources() 5186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn .getColor(R.color.default_card_footer_background_color); 5286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn mImageWidthInDp = imageWidthInDp; 5386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn mImageHeightDp = imageHeightInDp; 5486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } 5586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 5686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn @Override protected ImageCardViewReplacement onCreateView() { 5786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn if (Constants.LOCAL_LOGD) Log.d(TAG, "onCreateView()"); 5886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn final ImageCardViewReplacement cardView = new ImageCardViewReplacement(getContext(), 5986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn mImageWidthInDp, 6086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn mImageHeightDp); 6186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.setOnFocusChangeListener(new View.OnFocusChangeListener() { 6286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn @Override public void onFocusChange(View v, boolean hasFocus) { 6386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn udateCardUi(cardView); 6486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } 6586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn }); 6686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn return cardView; 6786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } 6886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 6986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn @Override public void onBindViewHolder(Card card, ImageCardViewReplacement cardView) { 7086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn if (Constants.LOCAL_LOGD) Log.d(TAG, "onBindViewHolder(Card,ImageCardViewReplacement)"); 7186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.setTag(card); 7286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 7386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn // Display description iff there is one. 7486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn if (card.getDescription() == null || card.getDescription().length() == 0) { 7586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getSecondaryTextView().setVisibility(View.GONE); 7686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getPrimaryTextView().setLines(2); 7786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getPrimaryTextView().setMaxLines(2); 7886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } else { 7986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getPrimaryTextView().setLines(1); 8086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getPrimaryTextView().setMaxLines(1); 8186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getSecondaryTextView().setText(card.getDescription()); 8286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getSecondaryTextView().setVisibility(View.VISIBLE); 8386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } 8486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 8586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn // Display title iff there is one. 8686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn if (card.getTitle() == null || card.getTitle().length() == 0) { 8786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getPrimaryTextView().setVisibility(View.GONE); 8886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getSecondaryTextView().setLines(2); 8986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getSecondaryTextView().setMaxLines(2); 9086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } else { 9186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getSecondaryTextView().setLines(1); 9286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getSecondaryTextView().setMaxLines(1); 9386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getPrimaryTextView().setText(card.getTitle()); 9486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getPrimaryTextView().setVisibility(View.VISIBLE); 9586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } 9686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn // Load main image from an URI or a local resource. 9786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn if (card.getImageURI() != null) { 9886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn Utils.loadImageFromUri(getContext(), card.getImageURI(), cardView.getImageView(), 9986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn mImageWidthInDp, mImageHeightDp, true, mLoadingErrorDrawable); 10086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } else if (card.getLocalImageResourceName() != null) { 10186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn int resourceId = getContext().getResources() 10286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn .getIdentifier(card.getLocalImageResourceName(), 10386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn "drawable", getContext().getPackageName()); 10486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn Picasso.with(getContext()).load(resourceId).resize(mImageWidthInDp, mImageHeightDp) 10586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn .centerCrop().into(cardView.getImageView()); 10686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } 10786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 10886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn // Load footer icon from a local resource or hide it. 10986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getViewById(R.id.container).setVisibility(View.VISIBLE); 11086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn if (card.getFooterLocalImageResourceName() != null) { 11186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn int resourceId = getContext().getResources() 11286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn .getIdentifier(card.getFooterLocalImageResourceName(), 11386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn "drawable", getContext().getPackageName()); 11486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn Picasso.with(getContext()).load(resourceId).into(cardView.getIconView()); 11586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getIconView().setVisibility(View.VISIBLE); 11686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } else { 11786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn if (card.getDescription() == null || card.getDescription().isEmpty()) { 11886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getViewById(R.id.container).setVisibility(View.GONE); 11986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } 12086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn cardView.getIconView().setVisibility(View.GONE); 12186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } 12286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 12386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn // Update background color depending on the card's focused state. 12486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn udateCardUi(cardView); 12586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } 12686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 12786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn private void udateCardUi(ImageCardViewReplacement view) { 12886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn int color = mDefaultFooterColor; 12986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn 13086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn if (view.getTag() != null) { 13186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn Card card = (Card) view.getTag(); 13286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn if (card.getSelectedColor() != -1 && view.isSelected()) { 13386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn color = card.getSelectedColor(); 13486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } 13586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn if (card.getFooterColor() != -1) { 13686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn color = card.getFooterColor(); 13786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } 13886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } 13986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn view.getInfoBoxView().setBackgroundColor(color); 14086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn } 14186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn} 142