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 17 package com.google.android.leanbackjank.presenter; 18 19 import android.net.Uri; 20 import android.view.ViewGroup; 21 22 import androidx.core.content.res.ResourcesCompat; 23 import androidx.leanback.widget.ImageCardView; 24 import androidx.leanback.widget.Presenter; 25 26 import com.bumptech.glide.Glide; 27 import com.bumptech.glide.load.resource.drawable.GlideDrawable; 28 import com.bumptech.glide.request.RequestListener; 29 import com.bumptech.glide.request.target.Target; 30 import com.google.android.leanbackjank.R; 31 import com.google.android.leanbackjank.model.VideoInfo; 32 33 public class CardPresenter extends Presenter { 34 private int mSelectedBackgroundColor = -1; 35 private int mDefaultBackgroundColor = -1; 36 private int mCardWidth; 37 private int mCardHeight; 38 39 public CardPresenter(int width, int height) { 40 mCardWidth = width; 41 mCardHeight = height; 42 } 43 44 @Override 45 public ViewHolder onCreateViewHolder(ViewGroup parent) { 46 mDefaultBackgroundColor = 47 ResourcesCompat.getColor(parent.getResources(), R.color.jank_blue, null); 48 mSelectedBackgroundColor = 49 ResourcesCompat.getColor(parent.getResources(), R.color.jank_red, null); 50 51 ImageCardView cardView = new ImageCardView(parent.getContext()) { 52 @Override 53 public void setSelected(boolean selected) { 54 findViewById(R.id.info_field).setBackgroundColor( 55 selected ? mSelectedBackgroundColor : mDefaultBackgroundColor); 56 super.setSelected(selected); 57 } 58 }; 59 60 cardView.setFocusable(true); 61 cardView.setFocusableInTouchMode(true); 62 return new ViewHolder(cardView); 63 } 64 65 @Override 66 public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) { 67 VideoInfo videoInfo = (VideoInfo) item; 68 69 final ImageCardView cardView = (ImageCardView) viewHolder.view; 70 cardView.setTitleText(videoInfo.getTitle()); 71 cardView.setContentText(videoInfo.getStudio()); 72 cardView.setMainImageDimensions(mCardWidth, mCardHeight); 73 cardView.setBackgroundColor(mDefaultBackgroundColor); 74 75 Glide.with(cardView.getContext()) 76 .load(videoInfo.getImageUri()) 77 .listener(new RequestListener<Uri, GlideDrawable>() { 78 @Override 79 public boolean onException(Exception e, Uri uri, Target<GlideDrawable> target, 80 boolean b) { 81 return false; 82 } 83 84 @Override 85 public boolean onResourceReady(GlideDrawable glideDrawable, Uri uri, 86 Target<GlideDrawable> target, boolean b, boolean b1) { 87 // Remove the background color to reduce overdraw. 88 cardView.setBackground(null); 89 return false; 90 } 91 }) 92 .into(cardView.getMainImageView()); 93 } 94 95 @Override 96 public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { 97 ImageCardView cardView = (ImageCardView) viewHolder.view; 98 99 // Remove references to images so that the garbage collector can free up memory. 100 cardView.setBadgeImage(null); 101 cardView.setMainImage(null); 102 } 103 } 104