VerticalGridFragment.java revision 25aacd3f5896ec09053739cc731bdbab3a6f2b81
1739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout/*
2739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Copyright (C) 2014 The Android Open Source Project
3739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout *
4739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * in compliance with the License. You may obtain a copy of the License at
6739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout *
7739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * http://www.apache.org/licenses/LICENSE-2.0
8739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout *
9739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Unless required by applicable law or agreed to in writing, software distributed under the License
10739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * or implied. See the License for the specific language governing permissions and limitations under
12739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * the License.
13739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */
14739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutpackage android.support.v17.leanback.app;
15739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
16739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.R;
17e34cae48707e70442aca13e1b4ab55757292828dDake Guimport android.support.v17.leanback.widget.Row;
18739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.VerticalGridPresenter;
19739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.ObjectAdapter;
20739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.OnItemClickedListener;
21739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.OnItemSelectedListener;
22739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.SearchOrbView;
23739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.app.Fragment;
24739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.graphics.drawable.Drawable;
25739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.os.Bundle;
2625aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichetimport android.util.Log;
27739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.LayoutInflater;
28739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.View;
29739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.ViewGroup;
30739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.widget.ImageView;
31739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.widget.TextView;
32739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
33739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout/**
34739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Leanback fragment for a vertical grid.
35739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout *
36739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Renders a vertical grid of objects given a {@link VerticalGridPresenter} and
37739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * an {@link ObjectAdapter}.
38739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */
39739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutpublic class VerticalGridFragment extends Fragment {
40739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private static final String TAG = "VerticalGridFragment";
41739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private static boolean DEBUG = false;
42739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
43739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private Params mParams;
44739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private ObjectAdapter mAdapter;
45739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private VerticalGridPresenter mGridPresenter;
46739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private VerticalGridPresenter.ViewHolder mGridViewHolder;
47739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private OnItemSelectedListener mOnItemSelectedListener;
48739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private OnItemClickedListener mOnItemClickedListener;
49a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn    private View.OnClickListener mExternalOnSearchClickedListener;
50739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private int mSelectedPosition = -1;
51739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
52739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private ImageView mBadgeView;
53739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private TextView mTitleView;
54739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private ViewGroup mBrowseTitle;
55739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private SearchOrbView mSearchOrbView;
56e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private boolean mShowingTitle = true;
57e34cae48707e70442aca13e1b4ab55757292828dDake Gu
58e34cae48707e70442aca13e1b4ab55757292828dDake Gu    // transition related
59e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private static TransitionHelper sTransitionHelper = TransitionHelper.getInstance();
60e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private Object mTitleTransition;
61e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private Object mSceneWithTitle;
62e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private Object mSceneWithoutTitle;
63739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
64739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public static class Params {
65739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        private String mTitle;
66739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        private Drawable mBadgeDrawable;
67739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
68739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        /**
69739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         * Sets the badge image.
70739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         */
71739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        public void setBadgeImage(Drawable drawable) {
72739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mBadgeDrawable = drawable;
73739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
74739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
75739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        /**
76739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         * Returns the badge image.
77739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         */
78739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        public Drawable getBadgeImage() {
79739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            return mBadgeDrawable;
80739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
81739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
82739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        /**
83739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         * Sets a title for the browse fragment.
84739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         */
85739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        public void setTitle(String title) {
86739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mTitle = title;
87739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
88739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
89739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        /**
90739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         * Returns the title for the browse fragment.
91739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         */
92739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        public String getTitle() {
93739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            return mTitle;
94739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
95739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
96739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
97739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
98739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Set fragment parameters.
99739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
100739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setParams(Params params) {
101739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mParams = params;
102739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        setBadgeDrawable(mParams.mBadgeDrawable);
103739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        setTitle(mParams.mTitle);
104739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
105739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
106739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
107739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns fragment parameters.
108739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
109739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public Params getParams() {
110739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mParams;
111739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
112739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
113739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
114739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Set the grid presenter.
115739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
116739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setGridPresenter(VerticalGridPresenter gridPresenter) {
117739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (gridPresenter == null) {
118739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            throw new IllegalArgumentException("Grid presenter may not be null");
119739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
120739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mGridPresenter = gridPresenter;
121e34cae48707e70442aca13e1b4ab55757292828dDake Gu        mGridPresenter.setOnItemSelectedListener(mRowSelectedListener);
122739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mOnItemClickedListener != null) {
123739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridPresenter.setOnItemClickedListener(mOnItemClickedListener);
124739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
125739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
126739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
127739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
128739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the grid presenter.
129739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
130739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public VerticalGridPresenter getGridPresenter() {
131739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mGridPresenter;
132739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
133739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
134739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
135739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets the object adapter for the fragment.
136739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
137739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setAdapter(ObjectAdapter adapter) {
138739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mAdapter = adapter;
139739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        updateAdapter();
140739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
141739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
142739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
143739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the object adapter.
144739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
145739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public ObjectAdapter getAdapter() {
146739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mAdapter;
147739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
148739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
149e34cae48707e70442aca13e1b4ab55757292828dDake Gu    final private OnItemSelectedListener mRowSelectedListener = new OnItemSelectedListener() {
150e34cae48707e70442aca13e1b4ab55757292828dDake Gu        @Override
151e34cae48707e70442aca13e1b4ab55757292828dDake Gu        public void onItemSelected(Object item, Row row) {
152e34cae48707e70442aca13e1b4ab55757292828dDake Gu            int position = mGridViewHolder.getGridView().getSelectedPosition();
153e34cae48707e70442aca13e1b4ab55757292828dDake Gu            if (DEBUG) Log.v(TAG, "row selected position " + position);
154e34cae48707e70442aca13e1b4ab55757292828dDake Gu            onRowSelected(position);
155e34cae48707e70442aca13e1b4ab55757292828dDake Gu            if (mOnItemSelectedListener != null) {
156e34cae48707e70442aca13e1b4ab55757292828dDake Gu                mOnItemSelectedListener.onItemSelected(item, row);
157e34cae48707e70442aca13e1b4ab55757292828dDake Gu            }
158e34cae48707e70442aca13e1b4ab55757292828dDake Gu        }
159e34cae48707e70442aca13e1b4ab55757292828dDake Gu    };
160e34cae48707e70442aca13e1b4ab55757292828dDake Gu
161739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
162739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets an item selection listener.
163739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
164739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setOnItemSelectedListener(OnItemSelectedListener listener) {
165739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mOnItemSelectedListener = listener;
166739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
167739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
168e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private void onRowSelected(int position) {
169e34cae48707e70442aca13e1b4ab55757292828dDake Gu        if (position != mSelectedPosition) {
170e34cae48707e70442aca13e1b4ab55757292828dDake Gu            if (!mGridViewHolder.getGridView().hasPreviousViewInSameRow(position)) {
171e34cae48707e70442aca13e1b4ab55757292828dDake Gu                // if has no sibling in front of it,  show title
172e34cae48707e70442aca13e1b4ab55757292828dDake Gu                if (!mShowingTitle) {
173e34cae48707e70442aca13e1b4ab55757292828dDake Gu                    sTransitionHelper.runTransition(mSceneWithTitle, mTitleTransition);
174e34cae48707e70442aca13e1b4ab55757292828dDake Gu                    mShowingTitle = true;
175e34cae48707e70442aca13e1b4ab55757292828dDake Gu                }
176e34cae48707e70442aca13e1b4ab55757292828dDake Gu            } else if (mShowingTitle) {
177e34cae48707e70442aca13e1b4ab55757292828dDake Gu                sTransitionHelper.runTransition(mSceneWithoutTitle, mTitleTransition);
178e34cae48707e70442aca13e1b4ab55757292828dDake Gu                mShowingTitle = false;
179e34cae48707e70442aca13e1b4ab55757292828dDake Gu            }
180e34cae48707e70442aca13e1b4ab55757292828dDake Gu            mSelectedPosition = position;
181e34cae48707e70442aca13e1b4ab55757292828dDake Gu        }
182e34cae48707e70442aca13e1b4ab55757292828dDake Gu    }
183739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
184739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
185739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets an item clicked listener.
186739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
187739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setOnItemClickedListener(OnItemClickedListener listener) {
188739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mOnItemClickedListener = listener;
189739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mGridPresenter != null) {
190739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridPresenter.setOnItemClickedListener(mOnItemClickedListener);
191739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
192739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
193739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
194739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
195739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the item clicked listener.
196739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
197739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public OnItemClickedListener getOnItemClickedListener() {
198739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mOnItemClickedListener;
199739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
200739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
201a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn    /**
202a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     * Sets a click listener for the search affordance.
203a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     *
204a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     * The presence of a listener will change the visibility of the search affordance in the
205a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     * title area. When set to non-null the title area will contain a call to search action.
206a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     *
207a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     * The listener onClick method will be invoked when the user click on the search action.
208a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     *
209a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     * @param listener The listener.
210a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     */
211a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn    public void setOnSearchClickedListener(View.OnClickListener listener) {
212a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn        mExternalOnSearchClickedListener = listener;
213a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn        if (mSearchOrbView != null) {
214a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn            mSearchOrbView.setOnOrbClickedListener(listener);
215a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn        }
216a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn    }
217a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn
218739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private void setBadgeDrawable(Drawable drawable) {
219739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mBadgeView == null) {
220739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            return;
221739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
222739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mBadgeView.setImageDrawable(drawable);
223739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (drawable != null) {
224739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mBadgeView.setVisibility(View.VISIBLE);
225739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        } else {
226739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mBadgeView.setVisibility(View.GONE);
227739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
228739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
229739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
230739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private void setTitle(String title) {
231739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mTitleView != null) {
232739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mTitleView.setText(title);
233739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
234739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
235739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
236739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
237739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public View onCreateView(LayoutInflater inflater, ViewGroup container,
238739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            Bundle savedInstanceState) {
239e34cae48707e70442aca13e1b4ab55757292828dDake Gu        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.lb_vertical_grid_fragment,
240e34cae48707e70442aca13e1b4ab55757292828dDake Gu                container, false);
241739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
242739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mBrowseTitle = (ViewGroup) root.findViewById(R.id.browse_title_group);
243739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mBadgeView = (ImageView) mBrowseTitle.findViewById(R.id.browse_badge);
244739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mTitleView = (TextView) mBrowseTitle.findViewById(R.id.browse_title);
245739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mSearchOrbView = (SearchOrbView) mBrowseTitle.findViewById(R.id.browse_orb);
246a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn        if (mExternalOnSearchClickedListener != null) {
247a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn            mSearchOrbView.setOnOrbClickedListener(mExternalOnSearchClickedListener);
248a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn        }
249739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
250739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mParams != null) {
251739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            setBadgeDrawable(mParams.mBadgeDrawable);
252739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            setTitle(mParams.mTitle);
253739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
254739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
255e34cae48707e70442aca13e1b4ab55757292828dDake Gu        mSceneWithTitle = sTransitionHelper.createScene(root, new Runnable() {
256e34cae48707e70442aca13e1b4ab55757292828dDake Gu            @Override
257e34cae48707e70442aca13e1b4ab55757292828dDake Gu            public void run() {
258e34cae48707e70442aca13e1b4ab55757292828dDake Gu                mBrowseTitle.setVisibility(View.VISIBLE);
259e34cae48707e70442aca13e1b4ab55757292828dDake Gu            }
260e34cae48707e70442aca13e1b4ab55757292828dDake Gu        });
261e34cae48707e70442aca13e1b4ab55757292828dDake Gu        mSceneWithoutTitle = sTransitionHelper.createScene(root, new Runnable() {
262e34cae48707e70442aca13e1b4ab55757292828dDake Gu            @Override
263e34cae48707e70442aca13e1b4ab55757292828dDake Gu            public void run() {
264e34cae48707e70442aca13e1b4ab55757292828dDake Gu                mBrowseTitle.setVisibility(View.GONE);
265e34cae48707e70442aca13e1b4ab55757292828dDake Gu            }
266e34cae48707e70442aca13e1b4ab55757292828dDake Gu        });
267e34cae48707e70442aca13e1b4ab55757292828dDake Gu        mTitleTransition = sTransitionHelper.createTransitionSet(false);
268e34cae48707e70442aca13e1b4ab55757292828dDake Gu        Object fade = sTransitionHelper.createFadeTransition(
269e34cae48707e70442aca13e1b4ab55757292828dDake Gu                TransitionHelper.FADE_IN | TransitionHelper.FADE_OUT);
270e34cae48707e70442aca13e1b4ab55757292828dDake Gu        Object changeBounds = sTransitionHelper.createChangeBounds(false);
271e34cae48707e70442aca13e1b4ab55757292828dDake Gu        sTransitionHelper.addTransition(mTitleTransition, fade);
272e34cae48707e70442aca13e1b4ab55757292828dDake Gu        sTransitionHelper.addTransition(mTitleTransition, changeBounds);
273e34cae48707e70442aca13e1b4ab55757292828dDake Gu        sTransitionHelper.excludeChildren(mTitleTransition, R.id.browse_grid_dock, true);
274739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return root;
275739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
276739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
277739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
278739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void onViewCreated(View view, Bundle savedInstanceState) {
279739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        ViewGroup gridDock = (ViewGroup) view.findViewById(R.id.browse_grid_dock);
280739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mGridViewHolder = mGridPresenter.onCreateViewHolder(gridDock);
281739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        gridDock.addView(mGridViewHolder.view);
282739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
283739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        updateAdapter();
284739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
285739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
286739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
287739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void onStart() {
288739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        super.onStart();
289739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mGridViewHolder.getGridView().requestFocus();
290739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
291739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
292739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
293739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void onDestroyView() {
294739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        super.onDestroyView();
295739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mGridViewHolder = null;
296739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
297739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
298739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
299739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets the selected item position.
300739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
301739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setSelectedPosition(int position) {
302739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mSelectedPosition = position;
303739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if(mGridViewHolder != null && mGridViewHolder.getGridView().getAdapter() != null) {
304739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridViewHolder.getGridView().setSelectedPositionSmooth(position);
305739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
306739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
307739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
308739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private void updateAdapter() {
309739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mGridViewHolder != null) {
310739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridPresenter.onBindViewHolder(mGridViewHolder, mAdapter);
311739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            if (mSelectedPosition != -1) {
312739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                mGridViewHolder.getGridView().setSelectedPosition(mSelectedPosition);
313739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            }
314739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
315739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
316739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout}
317