VerticalGridFragment.java revision e34cae48707e70442aca13e1b4ab55757292828d
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.Presenter;
23739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.PresenterSelector;
24739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.RowPresenter;
25739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.SearchOrbView;
26739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.VerticalGridView;
27739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.util.Log;
28739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.app.Fragment;
29739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.graphics.drawable.Drawable;
30739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.os.Bundle;
31739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.LayoutInflater;
32739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.View;
33739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.ViewGroup;
34739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.widget.ImageView;
35739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.widget.TextView;
36739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
37739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout/**
38739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Leanback fragment for a vertical grid.
39739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout *
40739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Renders a vertical grid of objects given a {@link VerticalGridPresenter} and
41739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * an {@link ObjectAdapter}.
42739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */
43739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutpublic class VerticalGridFragment extends Fragment {
44739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private static final String TAG = "VerticalGridFragment";
45739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private static boolean DEBUG = false;
46739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
47739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private Params mParams;
48739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private ObjectAdapter mAdapter;
49739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private VerticalGridPresenter mGridPresenter;
50739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private VerticalGridPresenter.ViewHolder mGridViewHolder;
51739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private OnItemSelectedListener mOnItemSelectedListener;
52739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private OnItemClickedListener mOnItemClickedListener;
53a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn    private View.OnClickListener mExternalOnSearchClickedListener;
54739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private int mSelectedPosition = -1;
55739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
56739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private ImageView mBadgeView;
57739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private TextView mTitleView;
58739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private ViewGroup mBrowseTitle;
59739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private SearchOrbView mSearchOrbView;
60e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private boolean mShowingTitle = true;
61e34cae48707e70442aca13e1b4ab55757292828dDake Gu
62e34cae48707e70442aca13e1b4ab55757292828dDake Gu    // transition related
63e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private static TransitionHelper sTransitionHelper = TransitionHelper.getInstance();
64e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private Object mTitleTransition;
65e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private Object mSceneWithTitle;
66e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private Object mSceneWithoutTitle;
67739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
68739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public static class Params {
69739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        private String mTitle;
70739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        private Drawable mBadgeDrawable;
71739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
72739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        /**
73739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         * Sets the badge image.
74739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         */
75739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        public void setBadgeImage(Drawable drawable) {
76739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mBadgeDrawable = drawable;
77739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
78739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
79739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        /**
80739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         * Returns the badge image.
81739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         */
82739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        public Drawable getBadgeImage() {
83739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            return mBadgeDrawable;
84739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
85739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
86739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        /**
87739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         * Sets a title for the browse fragment.
88739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         */
89739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        public void setTitle(String title) {
90739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mTitle = title;
91739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
92739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
93739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        /**
94739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         * Returns the title for the browse fragment.
95739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout         */
96739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        public String getTitle() {
97739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            return mTitle;
98739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
99739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
100739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
101739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
102739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Set fragment parameters.
103739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
104739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setParams(Params params) {
105739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mParams = params;
106739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        setBadgeDrawable(mParams.mBadgeDrawable);
107739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        setTitle(mParams.mTitle);
108739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
109739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
110739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
111739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns fragment parameters.
112739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
113739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public Params getParams() {
114739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mParams;
115739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
116739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
117739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
118739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Set the grid presenter.
119739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
120739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setGridPresenter(VerticalGridPresenter gridPresenter) {
121739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (gridPresenter == null) {
122739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            throw new IllegalArgumentException("Grid presenter may not be null");
123739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
124739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mGridPresenter = gridPresenter;
125e34cae48707e70442aca13e1b4ab55757292828dDake Gu        mGridPresenter.setOnItemSelectedListener(mRowSelectedListener);
126739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mOnItemClickedListener != null) {
127739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridPresenter.setOnItemClickedListener(mOnItemClickedListener);
128739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
129739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
130739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
131739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
132739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the grid presenter.
133739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
134739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public VerticalGridPresenter getGridPresenter() {
135739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mGridPresenter;
136739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
137739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
138739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
139739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets the object adapter for the fragment.
140739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
141739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setAdapter(ObjectAdapter adapter) {
142739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mAdapter = adapter;
143739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        updateAdapter();
144739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
145739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
146739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
147739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the object adapter.
148739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
149739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public ObjectAdapter getAdapter() {
150739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mAdapter;
151739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
152739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
153e34cae48707e70442aca13e1b4ab55757292828dDake Gu    final private OnItemSelectedListener mRowSelectedListener = new OnItemSelectedListener() {
154e34cae48707e70442aca13e1b4ab55757292828dDake Gu        @Override
155e34cae48707e70442aca13e1b4ab55757292828dDake Gu        public void onItemSelected(Object item, Row row) {
156e34cae48707e70442aca13e1b4ab55757292828dDake Gu            int position = mGridViewHolder.getGridView().getSelectedPosition();
157e34cae48707e70442aca13e1b4ab55757292828dDake Gu            if (DEBUG) Log.v(TAG, "row selected position " + position);
158e34cae48707e70442aca13e1b4ab55757292828dDake Gu            onRowSelected(position);
159e34cae48707e70442aca13e1b4ab55757292828dDake Gu            if (mOnItemSelectedListener != null) {
160e34cae48707e70442aca13e1b4ab55757292828dDake Gu                mOnItemSelectedListener.onItemSelected(item, row);
161e34cae48707e70442aca13e1b4ab55757292828dDake Gu            }
162e34cae48707e70442aca13e1b4ab55757292828dDake Gu        }
163e34cae48707e70442aca13e1b4ab55757292828dDake Gu    };
164e34cae48707e70442aca13e1b4ab55757292828dDake Gu
165739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
166739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets an item selection listener.
167739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
168739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setOnItemSelectedListener(OnItemSelectedListener listener) {
169739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mOnItemSelectedListener = listener;
170739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
171739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
172e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private void onRowSelected(int position) {
173e34cae48707e70442aca13e1b4ab55757292828dDake Gu        if (position != mSelectedPosition) {
174e34cae48707e70442aca13e1b4ab55757292828dDake Gu            if (!mGridViewHolder.getGridView().hasPreviousViewInSameRow(position)) {
175e34cae48707e70442aca13e1b4ab55757292828dDake Gu                // if has no sibling in front of it,  show title
176e34cae48707e70442aca13e1b4ab55757292828dDake Gu                if (!mShowingTitle) {
177e34cae48707e70442aca13e1b4ab55757292828dDake Gu                    sTransitionHelper.runTransition(mSceneWithTitle, mTitleTransition);
178e34cae48707e70442aca13e1b4ab55757292828dDake Gu                    mShowingTitle = true;
179e34cae48707e70442aca13e1b4ab55757292828dDake Gu                }
180e34cae48707e70442aca13e1b4ab55757292828dDake Gu            } else if (mShowingTitle) {
181e34cae48707e70442aca13e1b4ab55757292828dDake Gu                sTransitionHelper.runTransition(mSceneWithoutTitle, mTitleTransition);
182e34cae48707e70442aca13e1b4ab55757292828dDake Gu                mShowingTitle = false;
183e34cae48707e70442aca13e1b4ab55757292828dDake Gu            }
184e34cae48707e70442aca13e1b4ab55757292828dDake Gu            mSelectedPosition = position;
185e34cae48707e70442aca13e1b4ab55757292828dDake Gu        }
186e34cae48707e70442aca13e1b4ab55757292828dDake Gu    }
187739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
188739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
189739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets an item clicked listener.
190739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
191739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setOnItemClickedListener(OnItemClickedListener listener) {
192739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mOnItemClickedListener = listener;
193739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mGridPresenter != null) {
194739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridPresenter.setOnItemClickedListener(mOnItemClickedListener);
195739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
196739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
197739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
198739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
199739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the item clicked listener.
200739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
201739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public OnItemClickedListener getOnItemClickedListener() {
202739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mOnItemClickedListener;
203739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
204739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
205a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn    /**
206a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     * Sets a click listener for the search affordance.
207a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     *
208a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     * The presence of a listener will change the visibility of the search affordance in the
209a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     * title area. When set to non-null the title area will contain a call to search action.
210a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     *
211a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     * The listener onClick method will be invoked when the user click on the search action.
212a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     *
213a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     * @param listener The listener.
214a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     */
215a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn    public void setOnSearchClickedListener(View.OnClickListener listener) {
216a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn        mExternalOnSearchClickedListener = listener;
217a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn        if (mSearchOrbView != null) {
218a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn            mSearchOrbView.setOnOrbClickedListener(listener);
219a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn        }
220a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn    }
221a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn
222739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private void setBadgeDrawable(Drawable drawable) {
223739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mBadgeView == null) {
224739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            return;
225739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
226739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mBadgeView.setImageDrawable(drawable);
227739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (drawable != null) {
228739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mBadgeView.setVisibility(View.VISIBLE);
229739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        } else {
230739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mBadgeView.setVisibility(View.GONE);
231739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
232739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
233739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
234739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private void setTitle(String title) {
235739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mTitleView != null) {
236739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mTitleView.setText(title);
237739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
238739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
239739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
240739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
241739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public View onCreateView(LayoutInflater inflater, ViewGroup container,
242739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            Bundle savedInstanceState) {
243e34cae48707e70442aca13e1b4ab55757292828dDake Gu        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.lb_vertical_grid_fragment,
244e34cae48707e70442aca13e1b4ab55757292828dDake Gu                container, false);
245739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
246739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mBrowseTitle = (ViewGroup) root.findViewById(R.id.browse_title_group);
247739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mBadgeView = (ImageView) mBrowseTitle.findViewById(R.id.browse_badge);
248739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mTitleView = (TextView) mBrowseTitle.findViewById(R.id.browse_title);
249739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mSearchOrbView = (SearchOrbView) mBrowseTitle.findViewById(R.id.browse_orb);
250a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn        if (mExternalOnSearchClickedListener != null) {
251a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn            mSearchOrbView.setOnOrbClickedListener(mExternalOnSearchClickedListener);
252a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn        }
253739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
254739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mParams != null) {
255739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            setBadgeDrawable(mParams.mBadgeDrawable);
256739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            setTitle(mParams.mTitle);
257739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
258739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
259e34cae48707e70442aca13e1b4ab55757292828dDake Gu        mSceneWithTitle = sTransitionHelper.createScene(root, new Runnable() {
260e34cae48707e70442aca13e1b4ab55757292828dDake Gu            @Override
261e34cae48707e70442aca13e1b4ab55757292828dDake Gu            public void run() {
262e34cae48707e70442aca13e1b4ab55757292828dDake Gu                mBrowseTitle.setVisibility(View.VISIBLE);
263e34cae48707e70442aca13e1b4ab55757292828dDake Gu            }
264e34cae48707e70442aca13e1b4ab55757292828dDake Gu        });
265e34cae48707e70442aca13e1b4ab55757292828dDake Gu        mSceneWithoutTitle = sTransitionHelper.createScene(root, new Runnable() {
266e34cae48707e70442aca13e1b4ab55757292828dDake Gu            @Override
267e34cae48707e70442aca13e1b4ab55757292828dDake Gu            public void run() {
268e34cae48707e70442aca13e1b4ab55757292828dDake Gu                mBrowseTitle.setVisibility(View.GONE);
269e34cae48707e70442aca13e1b4ab55757292828dDake Gu            }
270e34cae48707e70442aca13e1b4ab55757292828dDake Gu        });
271e34cae48707e70442aca13e1b4ab55757292828dDake Gu        mTitleTransition = sTransitionHelper.createTransitionSet(false);
272e34cae48707e70442aca13e1b4ab55757292828dDake Gu        Object fade = sTransitionHelper.createFadeTransition(
273e34cae48707e70442aca13e1b4ab55757292828dDake Gu                TransitionHelper.FADE_IN | TransitionHelper.FADE_OUT);
274e34cae48707e70442aca13e1b4ab55757292828dDake Gu        Object changeBounds = sTransitionHelper.createChangeBounds(false);
275e34cae48707e70442aca13e1b4ab55757292828dDake Gu        sTransitionHelper.addTransition(mTitleTransition, fade);
276e34cae48707e70442aca13e1b4ab55757292828dDake Gu        sTransitionHelper.addTransition(mTitleTransition, changeBounds);
277e34cae48707e70442aca13e1b4ab55757292828dDake Gu        sTransitionHelper.excludeChildren(mTitleTransition, R.id.browse_grid_dock, true);
278739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return root;
279739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
280739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
281739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
282739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void onViewCreated(View view, Bundle savedInstanceState) {
283739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        ViewGroup gridDock = (ViewGroup) view.findViewById(R.id.browse_grid_dock);
284739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mGridViewHolder = mGridPresenter.onCreateViewHolder(gridDock);
285739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        gridDock.addView(mGridViewHolder.view);
286739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
287739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        updateAdapter();
288739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
289739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
290739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
291739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void onStart() {
292739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        super.onStart();
293739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mGridViewHolder.getGridView().requestFocus();
294739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
295739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
296739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
297739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void onDestroyView() {
298739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        super.onDestroyView();
299739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mGridViewHolder = null;
300739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
301739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
302739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
303739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets the selected item position.
304739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
305739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setSelectedPosition(int position) {
306739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mSelectedPosition = position;
307739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if(mGridViewHolder != null && mGridViewHolder.getGridView().getAdapter() != null) {
308739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridViewHolder.getGridView().setSelectedPositionSmooth(position);
309739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
310739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
311739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
312739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private void updateAdapter() {
313739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mGridViewHolder != null) {
314739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridPresenter.onBindViewHolder(mGridViewHolder, mAdapter);
315739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            if (mSelectedPosition != -1) {
316739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                mGridViewHolder.getGridView().setSelectedPosition(mSelectedPosition);
317739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            }
318739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
319739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
320739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout}
321