VerticalGridFragment.java revision a8d3588c80a232042474aca55a69df78c8ac8cb3
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.app;
15
16import android.support.v17.leanback.R;
17import android.support.v17.leanback.widget.VerticalGridPresenter;
18import android.support.v17.leanback.widget.ObjectAdapter;
19import android.support.v17.leanback.widget.OnItemClickedListener;
20import android.support.v17.leanback.widget.OnItemSelectedListener;
21import android.support.v17.leanback.widget.Presenter;
22import android.support.v17.leanback.widget.PresenterSelector;
23import android.support.v17.leanback.widget.RowPresenter;
24import android.support.v17.leanback.widget.SearchOrbView;
25import android.support.v17.leanback.widget.VerticalGridView;
26import android.util.Log;
27import android.app.Fragment;
28import android.graphics.drawable.Drawable;
29import android.os.Bundle;
30import android.view.LayoutInflater;
31import android.view.View;
32import android.view.ViewGroup;
33import android.widget.ImageView;
34import android.widget.TextView;
35
36/**
37 * Leanback fragment for a vertical grid.
38 *
39 * Renders a vertical grid of objects given a {@link VerticalGridPresenter} and
40 * an {@link ObjectAdapter}.
41 */
42public class VerticalGridFragment extends Fragment {
43    private static final String TAG = "VerticalGridFragment";
44    private static boolean DEBUG = false;
45
46    private Params mParams;
47    private ObjectAdapter mAdapter;
48    private VerticalGridPresenter mGridPresenter;
49    private VerticalGridPresenter.ViewHolder mGridViewHolder;
50    private OnItemSelectedListener mOnItemSelectedListener;
51    private OnItemClickedListener mOnItemClickedListener;
52    private View.OnClickListener mExternalOnSearchClickedListener;
53    private int mSelectedPosition = -1;
54
55    private ImageView mBadgeView;
56    private TextView mTitleView;
57    private ViewGroup mBrowseTitle;
58    private SearchOrbView mSearchOrbView;
59
60    public static class Params {
61        private String mTitle;
62        private Drawable mBadgeDrawable;
63
64        /**
65         * Sets the badge image.
66         */
67        public void setBadgeImage(Drawable drawable) {
68            mBadgeDrawable = drawable;
69        }
70
71        /**
72         * Returns the badge image.
73         */
74        public Drawable getBadgeImage() {
75            return mBadgeDrawable;
76        }
77
78        /**
79         * Sets a title for the browse fragment.
80         */
81        public void setTitle(String title) {
82            mTitle = title;
83        }
84
85        /**
86         * Returns the title for the browse fragment.
87         */
88        public String getTitle() {
89            return mTitle;
90        }
91    }
92
93    /**
94     * Set fragment parameters.
95     */
96    public void setParams(Params params) {
97        mParams = params;
98        setBadgeDrawable(mParams.mBadgeDrawable);
99        setTitle(mParams.mTitle);
100    }
101
102    /**
103     * Returns fragment parameters.
104     */
105    public Params getParams() {
106        return mParams;
107    }
108
109    /**
110     * Set the grid presenter.
111     */
112    public void setGridPresenter(VerticalGridPresenter gridPresenter) {
113        if (gridPresenter == null) {
114            throw new IllegalArgumentException("Grid presenter may not be null");
115        }
116        mGridPresenter = gridPresenter;
117        if (mOnItemSelectedListener != null) {
118            mGridPresenter.setOnItemSelectedListener(mOnItemSelectedListener);
119        }
120        if (mOnItemClickedListener != null) {
121            mGridPresenter.setOnItemClickedListener(mOnItemClickedListener);
122        }
123    }
124
125    /**
126     * Returns the grid presenter.
127     */
128    public VerticalGridPresenter getGridPresenter() {
129        return mGridPresenter;
130    }
131
132    /**
133     * Sets the object adapter for the fragment.
134     */
135    public void setAdapter(ObjectAdapter adapter) {
136        mAdapter = adapter;
137        updateAdapter();
138    }
139
140    /**
141     * Returns the object adapter.
142     */
143    public ObjectAdapter getAdapter() {
144        return mAdapter;
145    }
146
147    /**
148     * Sets an item selection listener.
149     */
150    public void setOnItemSelectedListener(OnItemSelectedListener listener) {
151        mOnItemSelectedListener = listener;
152        if (mGridPresenter != null) {
153            mGridPresenter.setOnItemSelectedListener(mOnItemSelectedListener);
154        }
155    }
156
157    // TODO: getitemselectedlistener?
158
159    /**
160     * Sets an item clicked listener.
161     */
162    public void setOnItemClickedListener(OnItemClickedListener listener) {
163        mOnItemClickedListener = listener;
164        if (mGridPresenter != null) {
165            mGridPresenter.setOnItemClickedListener(mOnItemClickedListener);
166        }
167    }
168
169    /**
170     * Returns the item clicked listener.
171     */
172    public OnItemClickedListener getOnItemClickedListener() {
173        return mOnItemClickedListener;
174    }
175
176    /**
177     * Sets a click listener for the search affordance.
178     *
179     * The presence of a listener will change the visibility of the search affordance in the
180     * title area. When set to non-null the title area will contain a call to search action.
181     *
182     * The listener onClick method will be invoked when the user click on the search action.
183     *
184     * @param listener The listener.
185     */
186    public void setOnSearchClickedListener(View.OnClickListener listener) {
187        mExternalOnSearchClickedListener = listener;
188        if (mSearchOrbView != null) {
189            mSearchOrbView.setOnOrbClickedListener(listener);
190        }
191    }
192
193    private void setBadgeDrawable(Drawable drawable) {
194        if (mBadgeView == null) {
195            return;
196        }
197        mBadgeView.setImageDrawable(drawable);
198        if (drawable != null) {
199            mBadgeView.setVisibility(View.VISIBLE);
200        } else {
201            mBadgeView.setVisibility(View.GONE);
202        }
203    }
204
205    private void setTitle(String title) {
206        if (mTitleView != null) {
207            mTitleView.setText(title);
208        }
209    }
210
211    @Override
212    public View onCreateView(LayoutInflater inflater, ViewGroup container,
213            Bundle savedInstanceState) {
214        View root = inflater.inflate(R.layout.lb_vertical_grid_fragment, container, false);
215
216        mBrowseTitle = (ViewGroup) root.findViewById(R.id.browse_title_group);
217        mBadgeView = (ImageView) mBrowseTitle.findViewById(R.id.browse_badge);
218        mTitleView = (TextView) mBrowseTitle.findViewById(R.id.browse_title);
219        mSearchOrbView = (SearchOrbView) mBrowseTitle.findViewById(R.id.browse_orb);
220        if (mExternalOnSearchClickedListener != null) {
221            mSearchOrbView.setOnOrbClickedListener(mExternalOnSearchClickedListener);
222        }
223
224        if (mParams != null) {
225            setBadgeDrawable(mParams.mBadgeDrawable);
226            setTitle(mParams.mTitle);
227        }
228
229        return root;
230    }
231
232    @Override
233    public void onViewCreated(View view, Bundle savedInstanceState) {
234        ViewGroup gridDock = (ViewGroup) view.findViewById(R.id.browse_grid_dock);
235        mGridViewHolder = mGridPresenter.onCreateViewHolder(gridDock);
236        gridDock.addView(mGridViewHolder.view);
237
238        updateAdapter();
239    }
240
241    @Override
242    public void onStart() {
243        super.onStart();
244        mGridViewHolder.getGridView().requestFocus();
245    }
246
247    @Override
248    public void onDestroyView() {
249        super.onDestroyView();
250        mGridViewHolder = null;
251    }
252
253    /**
254     * Sets the selected item position.
255     */
256    public void setSelectedPosition(int position) {
257        mSelectedPosition = position;
258        if(mGridViewHolder != null && mGridViewHolder.getGridView().getAdapter() != null) {
259            mGridViewHolder.getGridView().setSelectedPositionSmooth(position);
260        }
261    }
262
263    private void updateAdapter() {
264        if (mGridViewHolder != null) {
265            mGridPresenter.onBindViewHolder(mGridViewHolder, mAdapter);
266            if (mSelectedPosition != -1) {
267                mGridViewHolder.getGridView().setSelectedPosition(mSelectedPosition);
268            }
269        }
270    }
271}
272