158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell/*
258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * Copyright (C) 2016 The Android Open Source Project
358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell *
458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * Licensed under the Apache License, Version 2.0 (the "License");
558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * you may not use this file except in compliance with the License.
658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * You may obtain a copy of the License at
758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell *
858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell *      http://www.apache.org/licenses/LICENSE-2.0
958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell *
1058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * Unless required by applicable law or agreed to in writing, software
1158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * distributed under the License is distributed on an "AS IS" BASIS,
1258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * See the License for the specific language governing permissions and
1458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell * limitations under the License
1558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell */
1658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
1758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellpackage com.google.android.leanbackjank.presenter;
1858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
19f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassellimport android.net.Uri;
20def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport android.view.ViewGroup;
21def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas
22def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.core.content.res.ResourcesCompat;
23ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.ImageCardView;
24ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.Presenter;
2558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
2658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.bumptech.glide.Glide;
27f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassellimport com.bumptech.glide.load.resource.drawable.GlideDrawable;
28f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassellimport com.bumptech.glide.request.RequestListener;
29f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassellimport com.bumptech.glide.request.target.Target;
3058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.R;
3158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellimport com.google.android.leanbackjank.model.VideoInfo;
3258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
3358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassellpublic class CardPresenter extends Presenter {
3458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    private int mSelectedBackgroundColor = -1;
3558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    private int mDefaultBackgroundColor = -1;
3658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    private int mCardWidth;
3758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    private int mCardHeight;
3858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
3958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    public CardPresenter(int width, int height) {
4058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        mCardWidth = width;
4158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        mCardHeight = height;
4258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    }
4358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
4458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    @Override
4558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    public ViewHolder onCreateViewHolder(ViewGroup parent) {
46a3eaac19490539262eff7832eff880566c57cafcAurimas Liutikas        mDefaultBackgroundColor =
47a3eaac19490539262eff7832eff880566c57cafcAurimas Liutikas                ResourcesCompat.getColor(parent.getResources(), R.color.jank_blue, null);
48a3eaac19490539262eff7832eff880566c57cafcAurimas Liutikas        mSelectedBackgroundColor =
49a3eaac19490539262eff7832eff880566c57cafcAurimas Liutikas                ResourcesCompat.getColor(parent.getResources(), R.color.jank_red, null);
5058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
5158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        ImageCardView cardView = new ImageCardView(parent.getContext()) {
5258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            @Override
5358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            public void setSelected(boolean selected) {
54f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                findViewById(R.id.info_field).setBackgroundColor(
55f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                        selected ? mSelectedBackgroundColor : mDefaultBackgroundColor);
5658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell                super.setSelected(selected);
5758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell            }
5858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        };
5958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
6058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        cardView.setFocusable(true);
6158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        cardView.setFocusableInTouchMode(true);
6258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        return new ViewHolder(cardView);
6358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    }
6458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
6558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    @Override
6658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
6758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        VideoInfo videoInfo = (VideoInfo) item;
6858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
69f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell        final ImageCardView cardView = (ImageCardView) viewHolder.view;
7058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        cardView.setTitleText(videoInfo.getTitle());
7158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        cardView.setContentText(videoInfo.getStudio());
7258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        cardView.setMainImageDimensions(mCardWidth, mCardHeight);
73f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell        cardView.setBackgroundColor(mDefaultBackgroundColor);
7458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
7558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        Glide.with(cardView.getContext())
7658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell                .load(videoInfo.getImageUri())
77f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                .listener(new RequestListener<Uri, GlideDrawable>() {
78f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                    @Override
79f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                    public boolean onException(Exception e, Uri uri, Target<GlideDrawable> target,
80f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                            boolean b) {
81f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                        return false;
82f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                    }
83f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell
84f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                    @Override
85f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                    public boolean onResourceReady(GlideDrawable glideDrawable, Uri uri,
86f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                            Target<GlideDrawable> target, boolean b, boolean b1) {
87f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                        // Remove the background color to reduce overdraw.
88f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                        cardView.setBackground(null);
89f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                        return false;
90f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                    }
91f30fe4064a0b3934ba4e780feac8c11e20e267f4Bryan Cassell                })
9258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell                .into(cardView.getMainImageView());
9358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    }
9458b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
9558b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    @Override
9658b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
9758b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        ImageCardView cardView = (ImageCardView) viewHolder.view;
9858b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell
9958b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        // Remove references to images so that the garbage collector can free up memory.
10058b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        cardView.setBadgeImage(null);
10158b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell        cardView.setMainImage(null);
10258b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell    }
10358b7bbb83053e664ada2e1ace49f8960dfecdbfdBryan Cassell}
104