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