ImageCardViewPresenter.java revision 86163d539e1aeb9ae7612def7aaf7dbfc5b88f28
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 * in compliance with the License. You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the License
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11 * or implied. See the License for the specific language governing permissions and limitations under
12 * the License.
13 */
14
15package android.support.v17.leanback.supportleanbackshowcase.cards.presenters;
16
17import android.content.Context;
18import android.graphics.drawable.ColorDrawable;
19import android.graphics.drawable.Drawable;
20import android.support.v17.leanback.supportleanbackshowcase.Constants;
21import android.support.v17.leanback.supportleanbackshowcase.R;
22import android.support.v17.leanback.supportleanbackshowcase.Utils;
23import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card;
24import android.support.v17.leanback.supportleanbackshowcase.cards.views.ImageCardViewReplacement;
25import android.util.Log;
26import android.view.View;
27
28import com.squareup.picasso.Picasso;
29
30import java.util.HashMap;
31
32/**
33 * A ImageCardViewPresenter is used to generate Views and bind Objects to them on demand. It
34 * contains an {@link ImageCardViewReplacement}.
35 */
36public class ImageCardViewPresenter extends AbstractCardPresenter<ImageCardViewReplacement> {
37
38    private static final String TAG = "ImageCardViewPresenter";
39    private final int mImageWidthInDp;
40    private final int mImageHeightDp;
41    private final Drawable mLoadingErrorDrawable;
42    private final HashMap<Object, Integer> mSelectedColors = new HashMap<Object, Integer>();
43    private int mDefaultFooterColor;
44
45    public ImageCardViewPresenter(Context context, int imageWidthInDp, int imageHeightInDp) {
46        super(context);
47        int color = context.getResources().getColor(R.color.loading_error_card_background);
48        mLoadingErrorDrawable = new ColorDrawable(color);
49
50        mDefaultFooterColor = context.getResources()
51                                     .getColor(R.color.default_card_footer_background_color);
52        mImageWidthInDp = imageWidthInDp;
53        mImageHeightDp = imageHeightInDp;
54    }
55
56    @Override protected ImageCardViewReplacement onCreateView() {
57        if (Constants.LOCAL_LOGD) Log.d(TAG, "onCreateView()");
58        final ImageCardViewReplacement cardView = new ImageCardViewReplacement(getContext(),
59                                                                               mImageWidthInDp,
60                                                                               mImageHeightDp);
61        cardView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
62            @Override public void onFocusChange(View v, boolean hasFocus) {
63                udateCardUi(cardView);
64            }
65        });
66        return cardView;
67    }
68
69    @Override public void onBindViewHolder(Card card, ImageCardViewReplacement cardView) {
70        if (Constants.LOCAL_LOGD) Log.d(TAG, "onBindViewHolder(Card,ImageCardViewReplacement)");
71        cardView.setTag(card);
72
73        // Display description iff there is one.
74        if (card.getDescription() == null || card.getDescription().length() == 0) {
75            cardView.getSecondaryTextView().setVisibility(View.GONE);
76            cardView.getPrimaryTextView().setLines(2);
77            cardView.getPrimaryTextView().setMaxLines(2);
78        } else {
79            cardView.getPrimaryTextView().setLines(1);
80            cardView.getPrimaryTextView().setMaxLines(1);
81            cardView.getSecondaryTextView().setText(card.getDescription());
82            cardView.getSecondaryTextView().setVisibility(View.VISIBLE);
83        }
84
85        // Display title iff there is one.
86        if (card.getTitle() == null || card.getTitle().length() == 0) {
87            cardView.getPrimaryTextView().setVisibility(View.GONE);
88            cardView.getSecondaryTextView().setLines(2);
89            cardView.getSecondaryTextView().setMaxLines(2);
90        } else {
91            cardView.getSecondaryTextView().setLines(1);
92            cardView.getSecondaryTextView().setMaxLines(1);
93            cardView.getPrimaryTextView().setText(card.getTitle());
94            cardView.getPrimaryTextView().setVisibility(View.VISIBLE);
95        }
96        // Load main image from an URI or a local resource.
97        if (card.getImageURI() != null) {
98            Utils.loadImageFromUri(getContext(), card.getImageURI(), cardView.getImageView(),
99                                   mImageWidthInDp, mImageHeightDp, true, mLoadingErrorDrawable);
100        } else if (card.getLocalImageResourceName() != null) {
101            int resourceId = getContext().getResources()
102                                         .getIdentifier(card.getLocalImageResourceName(),
103                                                        "drawable", getContext().getPackageName());
104            Picasso.with(getContext()).load(resourceId).resize(mImageWidthInDp, mImageHeightDp)
105                   .centerCrop().into(cardView.getImageView());
106        }
107
108        // Load footer icon from a local resource or hide it.
109        cardView.getViewById(R.id.container).setVisibility(View.VISIBLE);
110        if (card.getFooterLocalImageResourceName() != null) {
111            int resourceId = getContext().getResources()
112                                         .getIdentifier(card.getFooterLocalImageResourceName(),
113                                                        "drawable", getContext().getPackageName());
114            Picasso.with(getContext()).load(resourceId).into(cardView.getIconView());
115            cardView.getIconView().setVisibility(View.VISIBLE);
116        } else {
117            if (card.getDescription() == null || card.getDescription().isEmpty()) {
118                cardView.getViewById(R.id.container).setVisibility(View.GONE);
119            }
120            cardView.getIconView().setVisibility(View.GONE);
121        }
122
123        // Update background color depending on the card's focused state.
124        udateCardUi(cardView);
125    }
126
127    private void udateCardUi(ImageCardViewReplacement view) {
128        int color = mDefaultFooterColor;
129
130        if (view.getTag() != null) {
131            Card card = (Card) view.getTag();
132            if (card.getSelectedColor() != -1 && view.isSelected()) {
133                color = card.getSelectedColor();
134            }
135            if (card.getFooterColor() != -1) {
136                color = card.getFooterColor();
137            }
138        }
139        view.getInfoBoxView().setBackgroundColor(color);
140    }
141}
142