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