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