1// CHECKSTYLE:OFF Generated code
2/* This file is auto-generated from VerticalGridSupportFragment.java.  DO NOT MODIFY. */
3
4/*
5 * Copyright (C) 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software distributed under the License
13 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14 * or implied. See the License for the specific language governing permissions and limitations under
15 * the License.
16 */
17package android.support.v17.leanback.app;
18
19import android.os.Bundle;
20import android.support.v17.leanback.R;
21import android.support.v17.leanback.transition.TransitionHelper;
22import android.support.v17.leanback.util.StateMachine.State;
23import android.support.v17.leanback.widget.BrowseFrameLayout;
24import android.support.v17.leanback.widget.ObjectAdapter;
25import android.support.v17.leanback.widget.OnChildLaidOutListener;
26import android.support.v17.leanback.widget.OnItemViewClickedListener;
27import android.support.v17.leanback.widget.OnItemViewSelectedListener;
28import android.support.v17.leanback.widget.Presenter;
29import android.support.v17.leanback.widget.Row;
30import android.support.v17.leanback.widget.RowPresenter;
31import android.support.v17.leanback.widget.VerticalGridPresenter;
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 VerticalGridFragment extends BaseFragment {
44    static final String TAG = "VerticalGF";
45    static boolean DEBUG = false;
46
47    private ObjectAdapter mAdapter;
48    private VerticalGridPresenter mGridPresenter;
49    VerticalGridPresenter.ViewHolder mGridViewHolder;
50    OnItemViewSelectedListener mOnItemViewSelectedListener;
51    private OnItemViewClickedListener mOnItemViewClickedListener;
52    private Object mSceneAfterEntranceTransition;
53    private int mSelectedPosition = -1;
54
55    /**
56     * State to setEntranceTransitionState(false)
57     */
58    final State STATE_SET_ENTRANCE_START_STATE = new State("SET_ENTRANCE_START_STATE") {
59        @Override
60        public void run() {
61            setEntranceTransitionState(false);
62        }
63    };
64
65    @Override
66    void createStateMachineStates() {
67        super.createStateMachineStates();
68        mStateMachine.addState(STATE_SET_ENTRANCE_START_STATE);
69    }
70
71    @Override
72    void createStateMachineTransitions() {
73        super.createStateMachineTransitions();
74        mStateMachine.addTransition(STATE_ENTRANCE_ON_PREPARED,
75                STATE_SET_ENTRANCE_START_STATE, EVT_ON_CREATEVIEW);
76    }
77
78    /**
79     * Sets the grid presenter.
80     */
81    public void setGridPresenter(VerticalGridPresenter gridPresenter) {
82        if (gridPresenter == null) {
83            throw new IllegalArgumentException("Grid presenter may not be null");
84        }
85        mGridPresenter = gridPresenter;
86        mGridPresenter.setOnItemViewSelectedListener(mViewSelectedListener);
87        if (mOnItemViewClickedListener != null) {
88            mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener);
89        }
90    }
91
92    /**
93     * Returns the grid presenter.
94     */
95    public VerticalGridPresenter getGridPresenter() {
96        return mGridPresenter;
97    }
98
99    /**
100     * Sets the object adapter for the fragment.
101     */
102    public void setAdapter(ObjectAdapter adapter) {
103        mAdapter = adapter;
104        updateAdapter();
105    }
106
107    /**
108     * Returns the object adapter.
109     */
110    public ObjectAdapter getAdapter() {
111        return mAdapter;
112    }
113
114    final private OnItemViewSelectedListener mViewSelectedListener =
115            new OnItemViewSelectedListener() {
116        @Override
117        public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
118                RowPresenter.ViewHolder rowViewHolder, Row row) {
119            int position = mGridViewHolder.getGridView().getSelectedPosition();
120            if (DEBUG) Log.v(TAG, "grid selected position " + position);
121            gridOnItemSelected(position);
122            if (mOnItemViewSelectedListener != null) {
123                mOnItemViewSelectedListener.onItemSelected(itemViewHolder, item,
124                        rowViewHolder, row);
125            }
126        }
127    };
128
129    final private OnChildLaidOutListener mChildLaidOutListener =
130            new OnChildLaidOutListener() {
131        @Override
132        public void onChildLaidOut(ViewGroup parent, View view, int position, long id) {
133            if (position == 0) {
134                showOrHideTitle();
135            }
136        }
137    };
138
139    /**
140     * Sets an item selection listener.
141     */
142    public void setOnItemViewSelectedListener(OnItemViewSelectedListener listener) {
143        mOnItemViewSelectedListener = listener;
144    }
145
146    void gridOnItemSelected(int position) {
147        if (position != mSelectedPosition) {
148            mSelectedPosition = position;
149            showOrHideTitle();
150        }
151    }
152
153    void showOrHideTitle() {
154        if (mGridViewHolder.getGridView().findViewHolderForAdapterPosition(mSelectedPosition)
155                == null) {
156            return;
157        }
158        if (!mGridViewHolder.getGridView().hasPreviousViewInSameRow(mSelectedPosition)) {
159            showTitle(true);
160        } else {
161            showTitle(false);
162        }
163    }
164
165    /**
166     * Sets an item clicked listener.
167     */
168    public void setOnItemViewClickedListener(OnItemViewClickedListener listener) {
169        mOnItemViewClickedListener = listener;
170        if (mGridPresenter != null) {
171            mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener);
172        }
173    }
174
175    /**
176     * Returns the item clicked listener.
177     */
178    public OnItemViewClickedListener getOnItemViewClickedListener() {
179        return mOnItemViewClickedListener;
180    }
181
182    @Override
183    public View onCreateView(LayoutInflater inflater, ViewGroup container,
184            Bundle savedInstanceState) {
185        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.lb_vertical_grid_fragment,
186                container, false);
187        ViewGroup gridFrame = (ViewGroup) root.findViewById(R.id.grid_frame);
188        installTitleView(inflater, gridFrame, savedInstanceState);
189        getProgressBarManager().setRootView(root);
190
191        ViewGroup gridDock = (ViewGroup) root.findViewById(R.id.browse_grid_dock);
192        mGridViewHolder = mGridPresenter.onCreateViewHolder(gridDock);
193        gridDock.addView(mGridViewHolder.view);
194        mGridViewHolder.getGridView().setOnChildLaidOutListener(mChildLaidOutListener);
195
196        mSceneAfterEntranceTransition = TransitionHelper.createScene(gridDock, new Runnable() {
197            @Override
198            public void run() {
199                setEntranceTransitionState(true);
200            }
201        });
202
203        updateAdapter();
204        return root;
205    }
206
207    private void setupFocusSearchListener() {
208        BrowseFrameLayout browseFrameLayout = (BrowseFrameLayout) getView().findViewById(
209                R.id.grid_frame);
210        browseFrameLayout.setOnFocusSearchListener(getTitleHelper().getOnFocusSearchListener());
211    }
212
213    @Override
214    public void onStart() {
215        super.onStart();
216        setupFocusSearchListener();
217    }
218
219    @Override
220    public void onDestroyView() {
221        super.onDestroyView();
222        mGridViewHolder = null;
223    }
224
225    /**
226     * Sets the selected item position.
227     */
228    public void setSelectedPosition(int position) {
229        mSelectedPosition = position;
230        if(mGridViewHolder != null && mGridViewHolder.getGridView().getAdapter() != null) {
231            mGridViewHolder.getGridView().setSelectedPositionSmooth(position);
232        }
233    }
234
235    private void updateAdapter() {
236        if (mGridViewHolder != null) {
237            mGridPresenter.onBindViewHolder(mGridViewHolder, mAdapter);
238            if (mSelectedPosition != -1) {
239                mGridViewHolder.getGridView().setSelectedPosition(mSelectedPosition);
240            }
241        }
242    }
243
244    @Override
245    protected Object createEntranceTransition() {
246        return TransitionHelper.loadTransition(FragmentUtil.getContext(VerticalGridFragment.this),
247                R.transition.lb_vertical_grid_entrance_transition);
248    }
249
250    @Override
251    protected void runEntranceTransition(Object entranceTransition) {
252        TransitionHelper.runTransition(mSceneAfterEntranceTransition, entranceTransition);
253    }
254
255    void setEntranceTransitionState(boolean afterTransition) {
256        mGridPresenter.setEntranceTransitionState(mGridViewHolder, afterTransition);
257    }
258}
259