VerticalGridSupportFragment.java revision e7246ef136ed686d8caf339d4d1fd8e37b499c6a
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.v17.leanback.R;
19import android.support.v17.leanback.widget.BrowseFrameLayout;
20import android.support.v17.leanback.widget.OnChildLaidOutListener;
21import android.support.v17.leanback.widget.OnItemViewClickedListener;
22import android.support.v17.leanback.widget.OnItemViewSelectedListener;
23import android.support.v17.leanback.widget.Presenter;
24import android.support.v17.leanback.widget.Row;
25import android.support.v17.leanback.widget.RowPresenter;
26import android.support.v17.leanback.widget.TitleHelper;
27import android.support.v17.leanback.widget.TitleView;
28import android.support.v17.leanback.widget.VerticalGridPresenter;
29import android.support.v17.leanback.widget.ObjectAdapter;
30import android.os.Bundle;
31import android.util.Log;
32import android.view.LayoutInflater;
33import android.view.View;
34import android.view.ViewGroup;
35
36/**
37 * A fragment for creating leanback vertical grids.
38 *
39 * <p>Renders a vertical grid of objects given a {@link VerticalGridPresenter} and
40 * an {@link ObjectAdapter}.
41 */
42public class VerticalGridSupportFragment extends BrandedSupportFragment {
43    private static final String TAG = "VerticalGridSupportFragment";
44    private static boolean DEBUG = false;
45
46    private ObjectAdapter mAdapter;
47    private VerticalGridPresenter mGridPresenter;
48    private VerticalGridPresenter.ViewHolder mGridViewHolder;
49    private OnItemViewSelectedListener mOnItemViewSelectedListener;
50    private OnItemViewClickedListener mOnItemViewClickedListener;
51    private int mSelectedPosition = -1;
52
53    /**
54     * Sets the grid presenter.
55     */
56    public void setGridPresenter(VerticalGridPresenter gridPresenter) {
57        if (gridPresenter == null) {
58            throw new IllegalArgumentException("Grid presenter may not be null");
59        }
60        mGridPresenter = gridPresenter;
61        mGridPresenter.setOnItemViewSelectedListener(mViewSelectedListener);
62        if (mOnItemViewClickedListener != null) {
63            mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener);
64        }
65    }
66
67    /**
68     * Returns the grid presenter.
69     */
70    public VerticalGridPresenter getGridPresenter() {
71        return mGridPresenter;
72    }
73
74    /**
75     * Sets the object adapter for the fragment.
76     */
77    public void setAdapter(ObjectAdapter adapter) {
78        mAdapter = adapter;
79        updateAdapter();
80    }
81
82    /**
83     * Returns the object adapter.
84     */
85    public ObjectAdapter getAdapter() {
86        return mAdapter;
87    }
88
89    final private OnItemViewSelectedListener mViewSelectedListener =
90            new OnItemViewSelectedListener() {
91        @Override
92        public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
93                RowPresenter.ViewHolder rowViewHolder, Row row) {
94            int position = mGridViewHolder.getGridView().getSelectedPosition();
95            if (DEBUG) Log.v(TAG, "grid selected position " + position);
96            gridOnItemSelected(position);
97            if (mOnItemViewSelectedListener != null) {
98                mOnItemViewSelectedListener.onItemSelected(itemViewHolder, item,
99                        rowViewHolder, row);
100            }
101        }
102    };
103
104    final private OnChildLaidOutListener mChildLaidOutListener =
105            new OnChildLaidOutListener() {
106        @Override
107        public void onChildLaidOut(ViewGroup parent, View view, int position, long id) {
108            if (position == 0) {
109                showOrHideTitle();
110            }
111        }
112    };
113
114    /**
115     * Sets an item selection listener.
116     */
117    public void setOnItemViewSelectedListener(OnItemViewSelectedListener listener) {
118        mOnItemViewSelectedListener = listener;
119    }
120
121    private void gridOnItemSelected(int position) {
122        if (position != mSelectedPosition) {
123            mSelectedPosition = position;
124            showOrHideTitle();
125        }
126    }
127
128    private void showOrHideTitle() {
129        if (mGridViewHolder.getGridView().findViewHolderForAdapterPosition(mSelectedPosition)
130                == null) {
131            return;
132        }
133        if (!mGridViewHolder.getGridView().hasPreviousViewInSameRow(mSelectedPosition)) {
134            showTitle(true);
135        } else {
136            showTitle(false);
137        }
138    }
139
140    /**
141     * Sets an item clicked listener.
142     */
143    public void setOnItemViewClickedListener(OnItemViewClickedListener listener) {
144        mOnItemViewClickedListener = listener;
145        if (mGridPresenter != null) {
146            mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener);
147        }
148    }
149
150    /**
151     * Returns the item clicked listener.
152     */
153    public OnItemViewClickedListener getOnItemViewClickedListener() {
154        return mOnItemViewClickedListener;
155    }
156
157    @Override
158    public View onCreateView(LayoutInflater inflater, ViewGroup container,
159            Bundle savedInstanceState) {
160        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.lb_vertical_grid_fragment,
161                container, false);
162        setTitleView((TitleView) root.findViewById(R.id.browse_title_group));
163        return root;
164    }
165
166    @Override
167    public void onViewCreated(View view, Bundle savedInstanceState) {
168        super.onViewCreated(view, savedInstanceState);
169        ViewGroup gridDock = (ViewGroup) view.findViewById(R.id.browse_grid_dock);
170        mGridViewHolder = mGridPresenter.onCreateViewHolder(gridDock);
171        gridDock.addView(mGridViewHolder.view);
172        mGridViewHolder.getGridView().setOnChildLaidOutListener(mChildLaidOutListener);
173
174        updateAdapter();
175    }
176
177    private void setupFocusSearchListener() {
178        BrowseFrameLayout browseFrameLayout = (BrowseFrameLayout) getView().findViewById(
179                R.id.grid_frame);
180        browseFrameLayout.setOnFocusSearchListener(getTitleHelper().getOnFocusSearchListener());
181    }
182
183    @Override
184    public void onStart() {
185        super.onStart();
186        setupFocusSearchListener();
187        mGridViewHolder.getGridView().requestFocus();
188    }
189
190    @Override
191    public void onDestroyView() {
192        super.onDestroyView();
193        mGridViewHolder = null;
194    }
195
196    /**
197     * Sets the selected item position.
198     */
199    public void setSelectedPosition(int position) {
200        mSelectedPosition = position;
201        if(mGridViewHolder != null && mGridViewHolder.getGridView().getAdapter() != null) {
202            mGridViewHolder.getGridView().setSelectedPositionSmooth(position);
203        }
204    }
205
206    private void updateAdapter() {
207        if (mGridViewHolder != null) {
208            mGridPresenter.onBindViewHolder(mGridViewHolder, mAdapter);
209            if (mSelectedPosition != -1) {
210                mGridViewHolder.getGridView().setSelectedPosition(mSelectedPosition);
211            }
212        }
213    }
214}
215