1/* This file is auto-generated from VerticalGridFragment.java.  DO NOT MODIFY. */
2
3/*
4 * Copyright (C) 2014 The Android Open Source Project
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
7 * in compliance with the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software distributed under the License
12 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
13 * or implied. See the License for the specific language governing permissions and limitations under
14 * the License.
15 */
16package android.support.v17.leanback.app;
17
18import android.support.annotation.ColorInt;
19import android.support.v17.leanback.R;
20import android.support.v17.leanback.widget.BrowseFrameLayout;
21import android.support.v17.leanback.widget.OnChildLaidOutListener;
22import android.support.v17.leanback.widget.OnItemViewClickedListener;
23import android.support.v17.leanback.widget.OnItemViewSelectedListener;
24import android.support.v17.leanback.widget.Presenter;
25import android.support.v17.leanback.widget.Row;
26import android.support.v17.leanback.widget.RowPresenter;
27import android.support.v17.leanback.widget.TitleHelper;
28import android.support.v17.leanback.widget.TitleView;
29import android.support.v17.leanback.widget.VerticalGridPresenter;
30import android.support.v17.leanback.widget.ObjectAdapter;
31import android.os.Bundle;
32import android.util.Log;
33import android.view.LayoutInflater;
34import android.view.View;
35import android.view.ViewGroup;
36
37/**
38 * A fragment for creating leanback vertical grids.
39 *
40 * <p>Renders a vertical grid of objects given a {@link VerticalGridPresenter} and
41 * an {@link ObjectAdapter}.
42 */
43public class VerticalGridSupportFragment extends BrandedSupportFragment {
44    private static final String TAG = "VerticalGridSupportFragment";
45    private static boolean DEBUG = false;
46
47    private ObjectAdapter mAdapter;
48    private VerticalGridPresenter mGridPresenter;
49    private VerticalGridPresenter.ViewHolder mGridViewHolder;
50    private OnItemViewSelectedListener mOnItemViewSelectedListener;
51    private OnItemViewClickedListener mOnItemViewClickedListener;
52    private int mSelectedPosition = -1;
53
54    /**
55     * Sets the grid presenter.
56     */
57    public void setGridPresenter(VerticalGridPresenter gridPresenter) {
58        if (gridPresenter == null) {
59            throw new IllegalArgumentException("Grid presenter may not be null");
60        }
61        mGridPresenter = gridPresenter;
62        mGridPresenter.setOnItemViewSelectedListener(mViewSelectedListener);
63        if (mOnItemViewClickedListener != null) {
64            mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener);
65        }
66    }
67
68    /**
69     * Returns the grid presenter.
70     */
71    public VerticalGridPresenter getGridPresenter() {
72        return mGridPresenter;
73    }
74
75    /**
76     * Sets the object adapter for the fragment.
77     */
78    public void setAdapter(ObjectAdapter adapter) {
79        mAdapter = adapter;
80        updateAdapter();
81    }
82
83    /**
84     * Returns the object adapter.
85     */
86    public ObjectAdapter getAdapter() {
87        return mAdapter;
88    }
89
90    final private OnItemViewSelectedListener mViewSelectedListener =
91            new OnItemViewSelectedListener() {
92        @Override
93        public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
94                RowPresenter.ViewHolder rowViewHolder, Row row) {
95            int position = mGridViewHolder.getGridView().getSelectedPosition();
96            if (DEBUG) Log.v(TAG, "grid selected position " + position);
97            gridOnItemSelected(position);
98            if (mOnItemViewSelectedListener != null) {
99                mOnItemViewSelectedListener.onItemSelected(itemViewHolder, item,
100                        rowViewHolder, row);
101            }
102        }
103    };
104
105    final private OnChildLaidOutListener mChildLaidOutListener =
106            new OnChildLaidOutListener() {
107        @Override
108        public void onChildLaidOut(ViewGroup parent, View view, int position, long id) {
109            if (position == 0) {
110                showOrHideTitle();
111            }
112        }
113    };
114
115    /**
116     * Sets an item selection listener.
117     */
118    public void setOnItemViewSelectedListener(OnItemViewSelectedListener listener) {
119        mOnItemViewSelectedListener = listener;
120    }
121
122    private void gridOnItemSelected(int position) {
123        if (position != mSelectedPosition) {
124            mSelectedPosition = position;
125            showOrHideTitle();
126        }
127    }
128
129    private void showOrHideTitle() {
130        if (mGridViewHolder.getGridView().findViewHolderForAdapterPosition(mSelectedPosition)
131                == null) {
132            return;
133        }
134        if (!mGridViewHolder.getGridView().hasPreviousViewInSameRow(mSelectedPosition)) {
135            showTitle(true);
136        } else {
137            showTitle(false);
138        }
139    }
140
141    /**
142     * Sets an item clicked listener.
143     */
144    public void setOnItemViewClickedListener(OnItemViewClickedListener listener) {
145        mOnItemViewClickedListener = listener;
146        if (mGridPresenter != null) {
147            mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener);
148        }
149    }
150
151    /**
152     * Returns the item clicked listener.
153     */
154    public OnItemViewClickedListener getOnItemViewClickedListener() {
155        return mOnItemViewClickedListener;
156    }
157
158    @Override
159    public View onCreateView(LayoutInflater inflater, ViewGroup container,
160            Bundle savedInstanceState) {
161        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.lb_vertical_grid_fragment,
162                container, false);
163        setTitleView((TitleView) root.findViewById(R.id.browse_title_group));
164        return root;
165    }
166
167    @Override
168    public void onViewCreated(View view, Bundle savedInstanceState) {
169        super.onViewCreated(view, savedInstanceState);
170        ViewGroup gridDock = (ViewGroup) view.findViewById(R.id.browse_grid_dock);
171        mGridViewHolder = mGridPresenter.onCreateViewHolder(gridDock);
172        gridDock.addView(mGridViewHolder.view);
173        mGridViewHolder.getGridView().setOnChildLaidOutListener(mChildLaidOutListener);
174
175        updateAdapter();
176    }
177
178    private void setupFocusSearchListener() {
179        BrowseFrameLayout browseFrameLayout = (BrowseFrameLayout) getView().findViewById(
180                R.id.grid_frame);
181        browseFrameLayout.setOnFocusSearchListener(getTitleHelper().getOnFocusSearchListener());
182    }
183
184    @Override
185    public void onStart() {
186        super.onStart();
187        setupFocusSearchListener();
188        mGridViewHolder.getGridView().requestFocus();
189    }
190
191    @Override
192    public void onDestroyView() {
193        super.onDestroyView();
194        mGridViewHolder = null;
195    }
196
197    /**
198     * Sets the selected item position.
199     */
200    public void setSelectedPosition(int position) {
201        mSelectedPosition = position;
202        if(mGridViewHolder != null && mGridViewHolder.getGridView().getAdapter() != null) {
203            mGridViewHolder.getGridView().setSelectedPositionSmooth(position);
204        }
205    }
206
207    private void updateAdapter() {
208        if (mGridViewHolder != null) {
209            mGridPresenter.onBindViewHolder(mGridViewHolder, mAdapter);
210            if (mSelectedPosition != -1) {
211                mGridViewHolder.getGridView().setSelectedPosition(mSelectedPosition);
212            }
213        }
214    }
215}
216