DetailsOverviewRowPresenter.java revision 7c004076d5289caa0af7b5fb04cf7a3374be56b1
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 android.support.v17.leanback.widget;
15
16import android.content.Context;
17import android.graphics.Color;
18import android.support.v17.leanback.R;
19import android.util.TypedValue;
20import android.view.LayoutInflater;
21import android.view.View;
22import android.view.ViewGroup;
23import android.widget.FrameLayout;
24import android.widget.ImageView;
25
26import java.util.Collection;
27
28/**
29 * DetailsOverviewRowPresenter renders {@link DetailsOverviewRow} to display an
30 * overview of an item. Typically this row will be the first row in a fragment
31 * such as {@link android.support.v17.leanback.app.DetailsFragment
32 * DetailsFragment}.
33 *
34 * <p>The detailed description is rendered using a {@link Presenter}.
35 */
36public class DetailsOverviewRowPresenter extends RowPresenter {
37
38    private static final String TAG = "DetailsOverviewRowPresenter";
39    private static final boolean DEBUG = false;
40
41    public static class ViewHolder extends RowPresenter.ViewHolder {
42        final ImageView mImageView;
43        final FrameLayout mDetailsDescriptionFrame;
44        final HorizontalGridView mActionsRow;
45        Presenter.ViewHolder mDetailsDescriptionViewHolder;
46
47        public ViewHolder(View rootView) {
48            super(rootView);
49            mImageView = (ImageView) rootView.findViewById(R.id.details_overview_image);
50            mDetailsDescriptionFrame =
51                    (FrameLayout) rootView.findViewById(R.id.details_overview_description);
52            mActionsRow =
53                    (HorizontalGridView) rootView.findViewById(R.id.details_overview_actions);
54        }
55    }
56
57    private final Presenter mDetailsPresenter;
58    private final ActionPresenterSelector mActionPresenterSelector;
59    private final ItemBridgeAdapter mActionBridgeAdapter;
60    private int mBackgroundColor = Color.TRANSPARENT;
61    private boolean mBackgroundColorSet;
62    private boolean mIsStyleLarge = true;
63
64    /**
65     * Constructor that uses the given {@link Presenter} to render the detailed
66     * description for the row.
67     */
68    public DetailsOverviewRowPresenter(Presenter detailsPresenter) {
69        setHeaderPresenter(null);
70        setSelectEffectEnabled(false);
71        mDetailsPresenter = detailsPresenter;
72        mActionPresenterSelector = new ActionPresenterSelector();
73        mActionBridgeAdapter = new ItemBridgeAdapter();
74    }
75
76    /**
77     * Sets the listener for action click events.
78     */
79    public void setOnActionClickedListener(OnActionClickedListener listener) {
80        mActionPresenterSelector.setOnActionClickedListener(listener);
81    }
82
83    /**
84     * Gets the listener for action click events.
85     */
86    public OnActionClickedListener getOnActionClickedListener() {
87        return mActionPresenterSelector.getOnActionClickedListener();
88    }
89
90    /**
91     * Sets the background color.  If not set a default from the theme will be used.
92     */
93    public void setBackgroundColor(int color) {
94        mBackgroundColor = color;
95        mBackgroundColorSet = true;
96    }
97
98    /**
99     * Returns the background color.  If no background color was set, returns transparent.
100     */
101    public int getBackgroundColor() {
102        return mBackgroundColor;
103    }
104
105    /**
106     * Sets the layout style to be large or small.
107     * The default is large.
108     */
109    public void setStyleLarge(boolean large) {
110        mIsStyleLarge = large;
111    }
112
113    /**
114     * Returns true if the layout style is large.
115     */
116    public boolean isStyleLarge() {
117        return mIsStyleLarge;
118    }
119
120    private int getDefaultBackgroundColor(Context context) {
121        TypedValue outValue = new TypedValue();
122        context.getTheme().resolveAttribute(android.R.attr.colorBackground, outValue, true);
123        return context.getResources().getColor(outValue.resourceId);
124    }
125
126    @Override
127    protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) {
128        View v = LayoutInflater.from(parent.getContext())
129            .inflate(R.layout.lb_details_overview, parent, false);
130        ViewHolder vh = new ViewHolder(v);
131
132        vh.mDetailsDescriptionViewHolder =
133            mDetailsPresenter.onCreateViewHolder(vh.mDetailsDescriptionFrame);
134        vh.mDetailsDescriptionFrame.addView(vh.mDetailsDescriptionViewHolder.view);
135
136        initDetailsOverview(v.findViewById(R.id.details_overview));
137
138        return vh;
139    }
140
141    private void initDetailsOverview(View view) {
142        int resId = mIsStyleLarge ? R.dimen.lb_details_overview_height_large :
143            R.dimen.lb_details_overview_height_small;
144
145        ViewGroup.LayoutParams lp = view.getLayoutParams();
146        lp.height = view.getResources().getDimensionPixelSize(resId);
147        view.setLayoutParams(lp);
148
149        view.setBackgroundColor(mBackgroundColorSet ?
150                mBackgroundColor : getDefaultBackgroundColor(view.getContext()));
151
152    }
153
154    @Override
155    protected void onBindRowViewHolder(RowPresenter.ViewHolder holder, Object item) {
156        super.onBindRowViewHolder(holder, item);
157
158        DetailsOverviewRow row = (DetailsOverviewRow) item;
159        ViewHolder vh = (ViewHolder) holder;
160        if (row.getImageDrawable() != null) {
161            vh.mImageView.setImageDrawable(row.getImageDrawable());
162        }
163        if (vh.mDetailsDescriptionViewHolder == null) {
164        }
165        mDetailsPresenter.onBindViewHolder(vh.mDetailsDescriptionViewHolder, row);
166
167        mActionBridgeAdapter.clear();
168        ArrayObjectAdapter aoa = new ArrayObjectAdapter(mActionPresenterSelector);
169        aoa.addAll(0, (Collection)row.getActions());
170        mActionBridgeAdapter.setAdapter(aoa);
171        vh.mActionsRow.setAdapter(mActionBridgeAdapter);
172    }
173
174    @Override
175    protected void onUnbindRowViewHolder(RowPresenter.ViewHolder holder) {
176        super.onUnbindRowViewHolder(holder);
177
178        ViewHolder vh = (ViewHolder) holder;
179        if (vh.mDetailsDescriptionViewHolder != null) {
180            mDetailsPresenter.onUnbindViewHolder(vh.mDetailsDescriptionViewHolder);
181        }
182
183        vh.mActionsRow.setAdapter(null);
184    }
185}
186