1/* 2 * Copyright (C) 2014 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 */ 14package com.example.android.leanback; 15 16import android.content.Context; 17import android.graphics.drawable.Drawable; 18import android.os.Bundle; 19import android.text.TextUtils; 20import android.util.Log; 21import android.view.ContextThemeWrapper; 22import android.view.View.MeasureSpec; 23import android.view.ViewGroup; 24import android.view.ViewGroup.LayoutParams; 25 26import androidx.core.content.res.ResourcesCompat; 27import androidx.leanback.widget.ImageCardView; 28import androidx.leanback.widget.Presenter; 29 30import java.util.List; 31import java.util.Random; 32 33public class CardPresenter extends Presenter { 34 35 // String constant 36 private static final String TAG = "CardPresenter"; 37 public static final String IMAGE = "ImageResourceId"; 38 public static final String TITLE = "Title"; 39 public static final String CONTENT = "Content"; 40 41 private static final int IMAGE_HEIGHT_DP = 120; 42 43 private static Random sRand = new Random(); 44 private int mRowHeight = 0; 45 private int mExpandedRowHeight = 0; 46 47 private int mCardThemeResId; 48 private Context mContextThemeWrapper; 49 50 public CardPresenter(int cardThemeResId) { 51 mCardThemeResId = cardThemeResId; 52 } 53 54 public CardPresenter() { 55 mCardThemeResId = 0; 56 } 57 58 private void setupRowHeights(Context context) { 59 if (mRowHeight == 0) { 60 float density = context.getResources().getDisplayMetrics().density; 61 int height = (int) (IMAGE_HEIGHT_DP * density + 0.5f); 62 63 ImageCardView v = new ImageCardView(context); 64 v.setMainImageDimensions(LayoutParams.WRAP_CONTENT, height); 65 v.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); 66 mRowHeight = v.getMeasuredHeight(); 67 v.setActivated(true); 68 v.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); 69 mExpandedRowHeight = v.getMeasuredHeight(); 70 } 71 } 72 73 public int getRowHeight(Context context) { 74 setupRowHeights(context); 75 return mRowHeight; 76 } 77 78 public int getExpandedRowHeight(Context context) { 79 setupRowHeights(context); 80 return mExpandedRowHeight; 81 } 82 83 @Override 84 public ViewHolder onCreateViewHolder(ViewGroup parent) { 85 Log.d(TAG, "onCreateViewHolder"); 86 Context context = parent.getContext(); 87 if (mCardThemeResId != 0) { 88 if (mContextThemeWrapper == null) { 89 mContextThemeWrapper = new ContextThemeWrapper(context, mCardThemeResId); 90 } 91 context = mContextThemeWrapper; 92 } 93 ImageCardView v = new ImageCardView(context); 94 v.setFocusable(true); 95 v.setFocusableInTouchMode(true); 96 // Randomly makes image view crop as a square or just stretch to original 97 // aspect ratio. 98 if (sRand.nextBoolean()) { 99 v.setMainImageAdjustViewBounds(false); 100 v.setMainImageDimensions(getRowHeight(parent.getContext()), 101 getRowHeight(parent.getContext())); 102 } else { 103 v.setMainImageAdjustViewBounds(true); 104 v.setMainImageDimensions(LayoutParams.WRAP_CONTENT, 105 getRowHeight(parent.getContext())); 106 } 107 return new ViewHolder(v); 108 } 109 110 @Override 111 public void onBindViewHolder(ViewHolder viewHolder, Object item) { 112 Log.d(TAG, "onBindViewHolder for " + item.toString()); 113 PhotoItem photoItem = (PhotoItem) item; 114 final Context context = viewHolder.view.getContext(); 115 Drawable drawable = ResourcesCompat.getDrawable(context.getResources(), 116 photoItem.getImageResourceId(), context.getTheme()); 117 ((ImageCardView) viewHolder.view).setMainImage(drawable); 118 ((ImageCardView) viewHolder.view).setTitleText(photoItem.getTitle()); 119 if (!TextUtils.isEmpty(photoItem.getContent())) { 120 ((ImageCardView) viewHolder.view).setContentText(photoItem.getContent()); 121 } 122 } 123 124 @Override 125 public void onBindViewHolder(ViewHolder viewHolder, Object item, List<Object> payloads) { 126 if (payloads.isEmpty()) { 127 super.onBindViewHolder(viewHolder, item, payloads); 128 } else { 129 PhotoItem photoItem = (PhotoItem) item; 130 Bundle o = (Bundle) payloads.get(0); 131 for (String key : o.keySet()) { 132 if (key.equals(IMAGE)) { 133 final Context context = viewHolder.view.getContext(); 134 Drawable drawable = ResourcesCompat.getDrawable(context.getResources(), 135 photoItem.getImageResourceId(), context.getTheme()); 136 ((ImageCardView) viewHolder.view).setMainImage(drawable); 137 } 138 if (key.equals(CONTENT)) { 139 ((ImageCardView) viewHolder.view).setContentText(photoItem.getContent()); 140 } 141 if (key.equals(TITLE)) { 142 ((ImageCardView) viewHolder.view).setTitleText(photoItem.getTitle()); 143 } 144 } 145 } 146 } 147 148 @Override 149 public void onUnbindViewHolder(ViewHolder viewHolder) { 150 Log.d(TAG, "onUnbindViewHolder"); 151 } 152} 153