1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.google.android.leanbackjank.presenter;
18
19import android.net.Uri;
20import android.support.v17.leanback.widget.ImageCardView;
21import android.support.v17.leanback.widget.Presenter;
22import android.support.v4.content.res.ResourcesCompat;
23import android.view.ViewGroup;
24
25import com.bumptech.glide.Glide;
26import com.bumptech.glide.load.resource.drawable.GlideDrawable;
27import com.bumptech.glide.request.RequestListener;
28import com.bumptech.glide.request.target.Target;
29import com.google.android.leanbackjank.R;
30import com.google.android.leanbackjank.model.VideoInfo;
31
32public class CardPresenter extends Presenter {
33    private int mSelectedBackgroundColor = -1;
34    private int mDefaultBackgroundColor = -1;
35    private int mCardWidth;
36    private int mCardHeight;
37
38    public CardPresenter(int width, int height) {
39        mCardWidth = width;
40        mCardHeight = height;
41    }
42
43    @Override
44    public ViewHolder onCreateViewHolder(ViewGroup parent) {
45        mDefaultBackgroundColor =
46                ResourcesCompat.getColor(parent.getResources(), R.color.jank_blue, null);
47        mSelectedBackgroundColor =
48                ResourcesCompat.getColor(parent.getResources(), R.color.jank_red, null);
49
50        ImageCardView cardView = new ImageCardView(parent.getContext()) {
51            @Override
52            public void setSelected(boolean selected) {
53                findViewById(R.id.info_field).setBackgroundColor(
54                        selected ? mSelectedBackgroundColor : mDefaultBackgroundColor);
55                super.setSelected(selected);
56            }
57        };
58
59        cardView.setFocusable(true);
60        cardView.setFocusableInTouchMode(true);
61        return new ViewHolder(cardView);
62    }
63
64    @Override
65    public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
66        VideoInfo videoInfo = (VideoInfo) item;
67
68        final ImageCardView cardView = (ImageCardView) viewHolder.view;
69        cardView.setTitleText(videoInfo.getTitle());
70        cardView.setContentText(videoInfo.getStudio());
71        cardView.setMainImageDimensions(mCardWidth, mCardHeight);
72        cardView.setBackgroundColor(mDefaultBackgroundColor);
73
74        Glide.with(cardView.getContext())
75                .load(videoInfo.getImageUri())
76                .listener(new RequestListener<Uri, GlideDrawable>() {
77                    @Override
78                    public boolean onException(Exception e, Uri uri, Target<GlideDrawable> target,
79                            boolean b) {
80                        return false;
81                    }
82
83                    @Override
84                    public boolean onResourceReady(GlideDrawable glideDrawable, Uri uri,
85                            Target<GlideDrawable> target, boolean b, boolean b1) {
86                        // Remove the background color to reduce overdraw.
87                        cardView.setBackground(null);
88                        return false;
89                    }
90                })
91                .into(cardView.getMainImageView());
92    }
93
94    @Override
95    public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
96        ImageCardView cardView = (ImageCardView) viewHolder.view;
97
98        // Remove references to images so that the garbage collector can free up memory.
99        cardView.setBadgeImage(null);
100        cardView.setMainImage(null);
101    }
102}
103