VerticalGridFragment.java revision 95400e6d31a1ac09e48cb8944a79b7250484aa4c
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;
1795400e6d31a1ac09e48cb8944a79b7250484aa4cDake Guimport android.support.v17.leanback.transition.TransitionHelper;
18947dbf076cd019e3c26217fbc7aa21e860d68044Dake Guimport android.support.v17.leanback.widget.OnItemViewClickedListener;
19947dbf076cd019e3c26217fbc7aa21e860d68044Dake Guimport android.support.v17.leanback.widget.OnItemViewSelectedListener;
20947dbf076cd019e3c26217fbc7aa21e860d68044Dake Guimport android.support.v17.leanback.widget.Presenter;
21e34cae48707e70442aca13e1b4ab55757292828dDake Guimport android.support.v17.leanback.widget.Row;
22947dbf076cd019e3c26217fbc7aa21e860d68044Dake Guimport android.support.v17.leanback.widget.RowPresenter;
23731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stoutimport android.support.v17.leanback.widget.TitleView;
24739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.VerticalGridPresenter;
25739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.ObjectAdapter;
26739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.OnItemClickedListener;
27739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.OnItemSelectedListener;
28739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.SearchOrbView;
29739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.app.Fragment;
30739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.graphics.drawable.Drawable;
31739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.os.Bundle;
3225aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichetimport android.util.Log;
33739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.LayoutInflater;
34739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.View;
35739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.ViewGroup;
369020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stoutimport android.view.ViewGroup.MarginLayoutParams;
37739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.widget.ImageView;
38739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.widget.TextView;
39739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
40739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout/**
414c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn * A fragment for creating leanback vertical grids.
42739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout *
434c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn * <p>Renders a vertical grid of objects given a {@link VerticalGridPresenter} and
44739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * an {@link ObjectAdapter}.
45739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */
46739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutpublic class VerticalGridFragment extends Fragment {
47739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private static final String TAG = "VerticalGridFragment";
48739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private static boolean DEBUG = false;
49739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
509020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout    private BrowseFrameLayout mBrowseFrame;
51dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout    private String mTitle;
52dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout    private Drawable mBadgeDrawable;
53739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private ObjectAdapter mAdapter;
54739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private VerticalGridPresenter mGridPresenter;
55739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private VerticalGridPresenter.ViewHolder mGridViewHolder;
56739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private OnItemSelectedListener mOnItemSelectedListener;
57739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private OnItemClickedListener mOnItemClickedListener;
58947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    private OnItemViewSelectedListener mOnItemViewSelectedListener;
59947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    private OnItemViewClickedListener mOnItemViewClickedListener;
60a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn    private View.OnClickListener mExternalOnSearchClickedListener;
61739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private int mSelectedPosition = -1;
62739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
63731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout    private TitleView mTitleView;
644fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout    private SearchOrbView.Colors mSearchAffordanceColors;
65731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout    private boolean mSearchAffordanceColorSet;
66e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private boolean mShowingTitle = true;
67e34cae48707e70442aca13e1b4ab55757292828dDake Gu
68e34cae48707e70442aca13e1b4ab55757292828dDake Gu    // transition related
69e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private static TransitionHelper sTransitionHelper = TransitionHelper.getInstance();
70731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout    private Object mTitleUpTransition;
71731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout    private Object mTitleDownTransition;
72e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private Object mSceneWithTitle;
73e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private Object mSceneWithoutTitle;
74739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
75739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
76dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout     * Sets the badge drawable displayed in the title area.
77dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout     */
78dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout    public void setBadgeDrawable(Drawable drawable) {
79dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout        if (drawable != mBadgeDrawable) {
80dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout            mBadgeDrawable = drawable;
81731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout            if (mTitleView != null) {
82731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout                mTitleView.setBadgeDrawable(drawable);
83731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout            }
84dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout        }
85dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout    }
86dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout
87dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout    /**
88dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout     * Returns the badge drawable.
89dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout     */
90dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout    public Drawable getBadgeDrawable() {
91dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout        return mBadgeDrawable;
92dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout    }
93dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout
94dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout    /**
95dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout     * Sets a title for the fragment.
96dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout     */
97dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout    public void setTitle(String title) {
98dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout        mTitle = title;
99dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout        if (mTitleView != null) {
100731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout            mTitleView.setTitle(mTitle);
101dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout        }
102dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout    }
103dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout
104dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout    /**
105dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout     * Returns the title for the fragment.
106dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout     */
107dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout    public String getTitle() {
108dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout        return mTitle;
109dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout    }
110dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout
111dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout    /**
112dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout     * Sets the grid presenter.
113739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
114739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setGridPresenter(VerticalGridPresenter gridPresenter) {
115739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (gridPresenter == null) {
116739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            throw new IllegalArgumentException("Grid presenter may not be null");
117739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
118739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mGridPresenter = gridPresenter;
119947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        mGridPresenter.setOnItemViewSelectedListener(mRowSelectedListener);
120947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        if (mOnItemViewClickedListener != null) {
121947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener);
122947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        }
123739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mOnItemClickedListener != null) {
124739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridPresenter.setOnItemClickedListener(mOnItemClickedListener);
125739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
126739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
127739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
128739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
129739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the grid presenter.
130739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
131739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public VerticalGridPresenter getGridPresenter() {
132739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mGridPresenter;
133739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
134739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
135739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
136739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets the object adapter for the fragment.
137739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
138739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setAdapter(ObjectAdapter adapter) {
139739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mAdapter = adapter;
140739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        updateAdapter();
141739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
142739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
143739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
144739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the object adapter.
145739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
146739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public ObjectAdapter getAdapter() {
147739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mAdapter;
148739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
149739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
150947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    final private OnItemViewSelectedListener mRowSelectedListener =
151947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            new OnItemViewSelectedListener() {
152e34cae48707e70442aca13e1b4ab55757292828dDake Gu        @Override
153947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
154947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu                RowPresenter.ViewHolder rowViewHolder, Row row) {
155e34cae48707e70442aca13e1b4ab55757292828dDake Gu            int position = mGridViewHolder.getGridView().getSelectedPosition();
156e34cae48707e70442aca13e1b4ab55757292828dDake Gu            if (DEBUG) Log.v(TAG, "row selected position " + position);
157e34cae48707e70442aca13e1b4ab55757292828dDake Gu            onRowSelected(position);
158e34cae48707e70442aca13e1b4ab55757292828dDake Gu            if (mOnItemSelectedListener != null) {
159e34cae48707e70442aca13e1b4ab55757292828dDake Gu                mOnItemSelectedListener.onItemSelected(item, row);
160e34cae48707e70442aca13e1b4ab55757292828dDake Gu            }
161947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            if (mOnItemViewSelectedListener != null) {
162947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu                mOnItemViewSelectedListener.onItemSelected(itemViewHolder, item,
163947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu                        rowViewHolder, row);
164947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            }
165e34cae48707e70442aca13e1b4ab55757292828dDake Gu        }
166e34cae48707e70442aca13e1b4ab55757292828dDake Gu    };
167e34cae48707e70442aca13e1b4ab55757292828dDake Gu
168739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
169739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets an item selection listener.
170afe1da48b4673f64c67c130237dd485a34a69c1bDake Gu     * @deprecated Use {@link #setOnItemViewSelectedListener(OnItemViewSelectedListener)}
171739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
172739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setOnItemSelectedListener(OnItemSelectedListener listener) {
173739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mOnItemSelectedListener = listener;
174739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
175739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
176947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    /**
177947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     * Sets an item selection listener.
178947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     */
179947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    public void setOnItemViewSelectedListener(OnItemViewSelectedListener listener) {
180947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        mOnItemViewSelectedListener = listener;
181947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    }
182947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu
183e34cae48707e70442aca13e1b4ab55757292828dDake Gu    private void onRowSelected(int position) {
184e34cae48707e70442aca13e1b4ab55757292828dDake Gu        if (position != mSelectedPosition) {
185e34cae48707e70442aca13e1b4ab55757292828dDake Gu            if (!mGridViewHolder.getGridView().hasPreviousViewInSameRow(position)) {
186e34cae48707e70442aca13e1b4ab55757292828dDake Gu                // if has no sibling in front of it,  show title
187e34cae48707e70442aca13e1b4ab55757292828dDake Gu                if (!mShowingTitle) {
188731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout                    sTransitionHelper.runTransition(mSceneWithTitle, mTitleDownTransition);
189e34cae48707e70442aca13e1b4ab55757292828dDake Gu                    mShowingTitle = true;
190e34cae48707e70442aca13e1b4ab55757292828dDake Gu                }
191e34cae48707e70442aca13e1b4ab55757292828dDake Gu            } else if (mShowingTitle) {
192731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout                sTransitionHelper.runTransition(mSceneWithoutTitle, mTitleUpTransition);
193e34cae48707e70442aca13e1b4ab55757292828dDake Gu                mShowingTitle = false;
194e34cae48707e70442aca13e1b4ab55757292828dDake Gu            }
195e34cae48707e70442aca13e1b4ab55757292828dDake Gu            mSelectedPosition = position;
196e34cae48707e70442aca13e1b4ab55757292828dDake Gu        }
197e34cae48707e70442aca13e1b4ab55757292828dDake Gu    }
198739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
199739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
200739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets an item clicked listener.
201afe1da48b4673f64c67c130237dd485a34a69c1bDake Gu     * @deprecated Use {@link #setOnItemViewClickedListener(OnItemViewClickedListener)}
202739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
203739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setOnItemClickedListener(OnItemClickedListener listener) {
204739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mOnItemClickedListener = listener;
205739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mGridPresenter != null) {
206739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridPresenter.setOnItemClickedListener(mOnItemClickedListener);
207739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
208739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
209739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
210739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
211739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the item clicked listener.
212afe1da48b4673f64c67c130237dd485a34a69c1bDake Gu     * @deprecated Use {@link #getOnItemViewClickedListener()}
213739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
214739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public OnItemClickedListener getOnItemClickedListener() {
215739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mOnItemClickedListener;
216739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
217739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
218a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn    /**
219947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     * Sets an item clicked listener.
220947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     */
221947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    public void setOnItemViewClickedListener(OnItemViewClickedListener listener) {
222947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        mOnItemViewClickedListener = listener;
223947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        if (mGridPresenter != null) {
224947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener);
225947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        }
226947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    }
227947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu
228947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    /**
229947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     * Returns the item clicked listener.
230947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     */
231947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    public OnItemViewClickedListener getOnItemViewClickedListener() {
232947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        return mOnItemViewClickedListener;
233947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    }
234947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu
235947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    /**
236a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     * Sets a click listener for the search affordance.
237a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     *
2384c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn     * <p>The presence of a listener will change the visibility of the search
2394c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn     * affordance in the title area. When set to non-null, the title area will
2404c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn     * contain a call to search action.
241a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     *
2424c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn     * <p>The listener's onClick method will be invoked when the user clicks on
2434c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn     * the search action.
244a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     *
2454c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn     * @param listener The listener to invoke when the search affordance is
2464c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn     *        clicked, or null to hide the search affordance.
247a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn     */
248a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn    public void setOnSearchClickedListener(View.OnClickListener listener) {
249a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn        mExternalOnSearchClickedListener = listener;
250731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        if (mTitleView != null) {
251731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout            mTitleView.setOnSearchClickedListener(listener);
252731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        }
253731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout    }
254731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout
255731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout    /**
2564fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout     * Sets the {@link SearchOrbView.Colors} used to draw the search affordance.
257731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout     */
2584fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout    public void setSearchAffordanceColors(SearchOrbView.Colors colors) {
2594fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout        mSearchAffordanceColors = colors;
260731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        mSearchAffordanceColorSet = true;
261731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        if (mTitleView != null) {
2624fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout            mTitleView.setSearchAffordanceColors(mSearchAffordanceColors);
263a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn        }
264a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn    }
265a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn
266731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout    /**
2674fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout     * Returns the {@link SearchOrbView.Colors} used to draw the search affordance.
268731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout     */
2694fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout    public SearchOrbView.Colors getSearchAffordanceColors() {
270731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        if (mSearchAffordanceColorSet) {
2714fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout            return mSearchAffordanceColors;
272739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
273731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        if (mTitleView == null) {
274731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout            throw new IllegalStateException("Fragment views not yet created");
275739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
2764fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout        return mTitleView.getSearchAffordanceColors();
2774fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout    }
2784fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout
2794fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout    /**
2804fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout     * Sets the color used to draw the search affordance.
2814fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout     * A default brighter color will be set by the framework.
2824fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout     *
2834fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout     * @param color The color to use for the search affordance.
2844fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout     */
2854fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout    public void setSearchAffordanceColor(int color) {
2864fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout        setSearchAffordanceColors(new SearchOrbView.Colors(color));
287739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
288739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
2894fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout    /**
2904fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout     * Returns the color used to draw the search affordance.
2914fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout     */
2924fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout    public int getSearchAffordanceColor() {
2934fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout        return getSearchAffordanceColors().color;
2944fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout    }
295731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout
2969020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout    private final BrowseFrameLayout.OnFocusSearchListener mOnFocusSearchListener =
2979020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout            new BrowseFrameLayout.OnFocusSearchListener() {
2989020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout        @Override
2999020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout        public View onFocusSearch(View focused, int direction) {
3009020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout            if (DEBUG) Log.v(TAG, "onFocusSearch focused " + focused + " + direction " + direction);
3019020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout
302731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout            final View searchOrbView = mTitleView.getSearchAffordanceView();
303731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout            if (focused == searchOrbView && (
3049020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout                    direction == View.FOCUS_DOWN || direction == View.FOCUS_RIGHT)) {
3059020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout                return mGridViewHolder.view;
3069020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout
307731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout            } else if (focused != searchOrbView && searchOrbView.getVisibility() == View.VISIBLE
3089020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout                    && direction == View.FOCUS_UP) {
309731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout                return searchOrbView;
3109020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout
3119020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout            } else {
3129020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout                return null;
3139020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout            }
3149020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout        }
3159020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout    };
3169020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout
317739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
318739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public View onCreateView(LayoutInflater inflater, ViewGroup container,
319739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            Bundle savedInstanceState) {
320e34cae48707e70442aca13e1b4ab55757292828dDake Gu        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.lb_vertical_grid_fragment,
321e34cae48707e70442aca13e1b4ab55757292828dDake Gu                container, false);
322739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
3239020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout        mBrowseFrame = (BrowseFrameLayout) root.findViewById(R.id.browse_frame);
3249020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout        mBrowseFrame.setOnFocusSearchListener(mOnFocusSearchListener);
3259020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout
326731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        mTitleView = (TitleView) root.findViewById(R.id.browse_title_group);
327731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        mTitleView.setBadgeDrawable(mBadgeDrawable);
328731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        mTitleView.setTitle(mTitle);
329731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        if (mSearchAffordanceColorSet) {
3304fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout            mTitleView.setSearchAffordanceColors(mSearchAffordanceColors);
331731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        }
332a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn        if (mExternalOnSearchClickedListener != null) {
333731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout            mTitleView.setOnSearchClickedListener(mExternalOnSearchClickedListener);
334a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn        }
335739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
336e34cae48707e70442aca13e1b4ab55757292828dDake Gu        mSceneWithTitle = sTransitionHelper.createScene(root, new Runnable() {
337e34cae48707e70442aca13e1b4ab55757292828dDake Gu            @Override
338e34cae48707e70442aca13e1b4ab55757292828dDake Gu            public void run() {
339731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout                TitleTransitionHelper.showTitle(mTitleView, true);
340e34cae48707e70442aca13e1b4ab55757292828dDake Gu            }
341e34cae48707e70442aca13e1b4ab55757292828dDake Gu        });
342e34cae48707e70442aca13e1b4ab55757292828dDake Gu        mSceneWithoutTitle = sTransitionHelper.createScene(root, new Runnable() {
343e34cae48707e70442aca13e1b4ab55757292828dDake Gu            @Override
344e34cae48707e70442aca13e1b4ab55757292828dDake Gu            public void run() {
345731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout                TitleTransitionHelper.showTitle(mTitleView, false);
346e34cae48707e70442aca13e1b4ab55757292828dDake Gu            }
347e34cae48707e70442aca13e1b4ab55757292828dDake Gu        });
348731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        mTitleUpTransition = TitleTransitionHelper.createTransitionTitleUp(sTransitionHelper);
349731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        mTitleDownTransition = TitleTransitionHelper.createTransitionTitleDown(sTransitionHelper);
350731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        sTransitionHelper.excludeChildren(mTitleUpTransition, R.id.browse_grid_dock, true);
351731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        sTransitionHelper.excludeChildren(mTitleDownTransition, R.id.browse_grid_dock, true);
352739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
353731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout        return root;
3549020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout    }
3559020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout
356739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
357739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void onViewCreated(View view, Bundle savedInstanceState) {
358739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        ViewGroup gridDock = (ViewGroup) view.findViewById(R.id.browse_grid_dock);
359739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mGridViewHolder = mGridPresenter.onCreateViewHolder(gridDock);
360739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        gridDock.addView(mGridViewHolder.view);
361739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
362739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        updateAdapter();
363739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
364739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
365739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
366739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void onStart() {
367739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        super.onStart();
368739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mGridViewHolder.getGridView().requestFocus();
369739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
370739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
371739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
372739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void onDestroyView() {
373739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        super.onDestroyView();
374739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mGridViewHolder = null;
375739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
376739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
377739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
378739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets the selected item position.
379739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
380739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setSelectedPosition(int position) {
381739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mSelectedPosition = position;
382739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if(mGridViewHolder != null && mGridViewHolder.getGridView().getAdapter() != null) {
383739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridViewHolder.getGridView().setSelectedPositionSmooth(position);
384739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
385739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
386739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
387739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private void updateAdapter() {
388739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mGridViewHolder != null) {
389739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridPresenter.onBindViewHolder(mGridViewHolder, mAdapter);
390739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            if (mSelectedPosition != -1) {
391739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                mGridViewHolder.getGridView().setSelectedPosition(mSelectedPosition);
392739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            }
393739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
394739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
395739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout}
396