DetailsOverviewRowPresenter.java revision d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1
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        FocusHighlightHelper.setupActionItemFocusHighlight(mActionBridgeAdapter);
75    }
76
77    /**
78     * Sets the listener for action click events.
79     */
80    public void setOnActionClickedListener(OnActionClickedListener listener) {
81        mActionPresenterSelector.setOnActionClickedListener(listener);
82    }
83
84    /**
85     * Gets the listener for action click events.
86     */
87    public OnActionClickedListener getOnActionClickedListener() {
88        return mActionPresenterSelector.getOnActionClickedListener();
89    }
90
91    /**
92     * Sets the background color.  If not set a default from the theme will be used.
93     */
94    public void setBackgroundColor(int color) {
95        mBackgroundColor = color;
96        mBackgroundColorSet = true;
97    }
98
99    /**
100     * Returns the background color.  If no background color was set, returns transparent.
101     */
102    public int getBackgroundColor() {
103        return mBackgroundColor;
104    }
105
106    /**
107     * Sets the layout style to be large or small.
108     * The default is large.
109     */
110    public void setStyleLarge(boolean large) {
111        mIsStyleLarge = large;
112    }
113
114    /**
115     * Returns true if the layout style is large.
116     */
117    public boolean isStyleLarge() {
118        return mIsStyleLarge;
119    }
120
121    private int getDefaultBackgroundColor(Context context) {
122        TypedValue outValue = new TypedValue();
123        context.getTheme().resolveAttribute(android.R.attr.colorBackground, outValue, true);
124        return context.getResources().getColor(outValue.resourceId);
125    }
126
127    @Override
128    protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) {
129        View v = LayoutInflater.from(parent.getContext())
130            .inflate(R.layout.lb_details_overview, parent, false);
131        ViewHolder vh = new ViewHolder(v);
132
133        vh.mDetailsDescriptionViewHolder =
134            mDetailsPresenter.onCreateViewHolder(vh.mDetailsDescriptionFrame);
135        vh.mDetailsDescriptionFrame.addView(vh.mDetailsDescriptionViewHolder.view);
136
137        initDetailsOverview(v.findViewById(R.id.details_overview));
138
139        return vh;
140    }
141
142    private void initDetailsOverview(View view) {
143        int resId = mIsStyleLarge ? R.dimen.lb_details_overview_height_large :
144            R.dimen.lb_details_overview_height_small;
145
146        ViewGroup.LayoutParams lp = view.getLayoutParams();
147        lp.height = view.getResources().getDimensionPixelSize(resId);
148        view.setLayoutParams(lp);
149
150        view.setBackgroundColor(mBackgroundColorSet ?
151                mBackgroundColor : getDefaultBackgroundColor(view.getContext()));
152
153    }
154
155    @Override
156    protected void onBindRowViewHolder(RowPresenter.ViewHolder holder, Object item) {
157        super.onBindRowViewHolder(holder, item);
158
159        DetailsOverviewRow row = (DetailsOverviewRow) item;
160        ViewHolder vh = (ViewHolder) holder;
161        if (row.getImageDrawable() != null) {
162            vh.mImageView.setImageDrawable(row.getImageDrawable());
163        }
164        if (vh.mDetailsDescriptionViewHolder == null) {
165        }
166        mDetailsPresenter.onBindViewHolder(vh.mDetailsDescriptionViewHolder, row);
167
168        mActionBridgeAdapter.clear();
169        ArrayObjectAdapter aoa = new ArrayObjectAdapter(mActionPresenterSelector);
170        aoa.addAll(0, (Collection)row.getActions());
171        mActionBridgeAdapter.setAdapter(aoa);
172        vh.mActionsRow.setAdapter(mActionBridgeAdapter);
173    }
174
175    @Override
176    protected void onUnbindRowViewHolder(RowPresenter.ViewHolder holder) {
177        super.onUnbindRowViewHolder(holder);
178
179        ViewHolder vh = (ViewHolder) holder;
180        if (vh.mDetailsDescriptionViewHolder != null) {
181            mDetailsPresenter.onUnbindViewHolder(vh.mDetailsDescriptionViewHolder);
182        }
183
184        vh.mActionsRow.setAdapter(null);
185    }
186}
187