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