VerticalGridSupportFragment.java revision a373804d10f93a9488adc35cf6ce44dce09b3778
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.transition.TransitionHelper;
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.VerticalGridPresenter;
28import android.support.v17.leanback.widget.ObjectAdapter;
29import android.os.Bundle;
30import android.util.Log;
31import android.view.LayoutInflater;
32import android.view.View;
33import android.view.ViewGroup;
34
35/**
36 * A fragment for creating leanback vertical grids.
37 *
38 * <p>Renders a vertical grid of objects given a {@link VerticalGridPresenter} and
39 * an {@link ObjectAdapter}.
40 */
41public class VerticalGridSupportFragment extends BaseSupportFragment {
42    private static final String TAG = "VerticalGridSupportFragment";
43    private static boolean DEBUG = false;
44
45    private ObjectAdapter mAdapter;
46    private VerticalGridPresenter mGridPresenter;
47    private VerticalGridPresenter.ViewHolder mGridViewHolder;
48    private OnItemViewSelectedListener mOnItemViewSelectedListener;
49    private OnItemViewClickedListener mOnItemViewClickedListener;
50    private Object mSceneAfterEntranceTransition;
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        ViewGroup gridFrame = (ViewGroup) root.findViewById(R.id.grid_frame);
163        installTitleView(inflater, gridFrame, savedInstanceState);
164        getProgressBarManager().setRootView(root);
165        return root;
166    }
167
168    @Override
169    public void onViewCreated(View view, Bundle savedInstanceState) {
170        super.onViewCreated(view, savedInstanceState);
171        ViewGroup gridDock = (ViewGroup) view.findViewById(R.id.browse_grid_dock);
172        mGridViewHolder = mGridPresenter.onCreateViewHolder(gridDock);
173        gridDock.addView(mGridViewHolder.view);
174        mGridViewHolder.getGridView().setOnChildLaidOutListener(mChildLaidOutListener);
175
176        mSceneAfterEntranceTransition = TransitionHelper.createScene(gridDock, new Runnable() {
177            @Override
178            public void run() {
179                setEntranceTransitionState(true);
180            }
181        });
182
183        updateAdapter();
184    }
185
186    private void setupFocusSearchListener() {
187        BrowseFrameLayout browseFrameLayout = (BrowseFrameLayout) getView().findViewById(
188                R.id.grid_frame);
189        browseFrameLayout.setOnFocusSearchListener(getTitleHelper().getOnFocusSearchListener());
190    }
191
192    @Override
193    public void onStart() {
194        super.onStart();
195        setupFocusSearchListener();
196        if (isEntranceTransitionEnabled()) {
197            setEntranceTransitionState(false);
198        }
199    }
200
201    @Override
202    public void onDestroyView() {
203        super.onDestroyView();
204        mGridViewHolder = null;
205    }
206
207    /**
208     * Sets the selected item position.
209     */
210    public void setSelectedPosition(int position) {
211        mSelectedPosition = position;
212        if(mGridViewHolder != null && mGridViewHolder.getGridView().getAdapter() != null) {
213            mGridViewHolder.getGridView().setSelectedPositionSmooth(position);
214        }
215    }
216
217    private void updateAdapter() {
218        if (mGridViewHolder != null) {
219            mGridPresenter.onBindViewHolder(mGridViewHolder, mAdapter);
220            if (mSelectedPosition != -1) {
221                mGridViewHolder.getGridView().setSelectedPosition(mSelectedPosition);
222            }
223        }
224    }
225
226    @Override
227    protected Object createEntranceTransition() {
228        return TransitionHelper.loadTransition(getActivity(),
229                R.transition.lb_vertical_grid_entrance_transition);
230    }
231
232    @Override
233    protected void runEntranceTransition(Object entranceTransition) {
234        TransitionHelper.runTransition(mSceneAfterEntranceTransition, entranceTransition);
235    }
236
237    void setEntranceTransitionState(boolean afterTransition) {
238        mGridPresenter.setEntranceTransitionState(mGridViewHolder, afterTransition);
239    }
240}
241