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; 185d00775a5d3ce3c1fc06c4de0945d1b8f03aadc4Dake Guimport android.support.v17.leanback.widget.BrowseFrameLayout; 19947dbf076cd019e3c26217fbc7aa21e860d68044Dake Guimport android.support.v17.leanback.widget.OnItemViewClickedListener; 20947dbf076cd019e3c26217fbc7aa21e860d68044Dake Guimport android.support.v17.leanback.widget.OnItemViewSelectedListener; 21947dbf076cd019e3c26217fbc7aa21e860d68044Dake Guimport android.support.v17.leanback.widget.Presenter; 22e34cae48707e70442aca13e1b4ab55757292828dDake Guimport android.support.v17.leanback.widget.Row; 23947dbf076cd019e3c26217fbc7aa21e860d68044Dake Guimport android.support.v17.leanback.widget.RowPresenter; 24731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stoutimport android.support.v17.leanback.widget.TitleView; 25739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.VerticalGridPresenter; 26739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.ObjectAdapter; 27739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.OnItemClickedListener; 28739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.OnItemSelectedListener; 29739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.widget.SearchOrbView; 304a10f1eb5c4283cfeef34cd71b84173f5ab3eefbKris Giesingimport android.support.v4.view.ViewCompat; 31739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.app.Fragment; 324735bfcd924fec2d694523f34fac5f8151257dc7Dake Guimport android.content.Context; 33739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.graphics.drawable.Drawable; 34739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.os.Bundle; 3525aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichetimport android.util.Log; 36739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.LayoutInflater; 37739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.View; 38739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.ViewGroup; 399020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stoutimport android.view.ViewGroup.MarginLayoutParams; 40739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.widget.ImageView; 41739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.widget.TextView; 42739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 43739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout/** 444c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn * A fragment for creating leanback vertical grids. 45739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * 464c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn * <p>Renders a vertical grid of objects given a {@link VerticalGridPresenter} and 47739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * an {@link ObjectAdapter}. 48739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */ 49739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutpublic class VerticalGridFragment extends Fragment { 50739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout private static final String TAG = "VerticalGridFragment"; 51739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout private static boolean DEBUG = false; 52739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 539020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout private BrowseFrameLayout mBrowseFrame; 54dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout private String mTitle; 55dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout private Drawable mBadgeDrawable; 56739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout private ObjectAdapter mAdapter; 57739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout private VerticalGridPresenter mGridPresenter; 58739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout private VerticalGridPresenter.ViewHolder mGridViewHolder; 59739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout private OnItemSelectedListener mOnItemSelectedListener; 60739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout private OnItemClickedListener mOnItemClickedListener; 61947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu private OnItemViewSelectedListener mOnItemViewSelectedListener; 62947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu private OnItemViewClickedListener mOnItemViewClickedListener; 63a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn private View.OnClickListener mExternalOnSearchClickedListener; 64739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout private int mSelectedPosition = -1; 65739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 66731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout private TitleView mTitleView; 674fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout private SearchOrbView.Colors mSearchAffordanceColors; 68731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout private boolean mSearchAffordanceColorSet; 69e34cae48707e70442aca13e1b4ab55757292828dDake Gu private boolean mShowingTitle = true; 70e34cae48707e70442aca13e1b4ab55757292828dDake Gu 71e34cae48707e70442aca13e1b4ab55757292828dDake Gu // transition related 72e34cae48707e70442aca13e1b4ab55757292828dDake Gu private static TransitionHelper sTransitionHelper = TransitionHelper.getInstance(); 73731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout private Object mTitleUpTransition; 74731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout private Object mTitleDownTransition; 75e34cae48707e70442aca13e1b4ab55757292828dDake Gu private Object mSceneWithTitle; 76e34cae48707e70442aca13e1b4ab55757292828dDake Gu private Object mSceneWithoutTitle; 77739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 78739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout /** 79dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout * Sets the badge drawable displayed in the title area. 80dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout */ 81dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout public void setBadgeDrawable(Drawable drawable) { 82dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout if (drawable != mBadgeDrawable) { 83dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout mBadgeDrawable = drawable; 84731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout if (mTitleView != null) { 85731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout mTitleView.setBadgeDrawable(drawable); 86731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout } 87dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout } 88dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout } 89dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout 90dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout /** 91dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout * Returns the badge drawable. 92dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout */ 93dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout public Drawable getBadgeDrawable() { 94dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout return mBadgeDrawable; 95dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout } 96dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout 97dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout /** 98dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout * Sets a title for the fragment. 99dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout */ 100dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout public void setTitle(String title) { 101dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout mTitle = title; 102dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout if (mTitleView != null) { 103731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout mTitleView.setTitle(mTitle); 104dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout } 105dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout } 106dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout 107dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout /** 108dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout * Returns the title for the fragment. 109dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout */ 110dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout public String getTitle() { 111dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout return mTitle; 112dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout } 113dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout 114dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout /** 115dfb60d0af5d49da05c584d74245c616263f26b65Craig Stout * Sets the grid presenter. 116739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */ 117739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public void setGridPresenter(VerticalGridPresenter gridPresenter) { 118739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout if (gridPresenter == null) { 119739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout throw new IllegalArgumentException("Grid presenter may not be null"); 120739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 121739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mGridPresenter = gridPresenter; 122947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu mGridPresenter.setOnItemViewSelectedListener(mRowSelectedListener); 123947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu if (mOnItemViewClickedListener != null) { 124947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener); 125947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } 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 153947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu final private OnItemViewSelectedListener mRowSelectedListener = 154947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu new OnItemViewSelectedListener() { 155e34cae48707e70442aca13e1b4ab55757292828dDake Gu @Override 156947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, 157947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu RowPresenter.ViewHolder rowViewHolder, Row row) { 158e34cae48707e70442aca13e1b4ab55757292828dDake Gu int position = mGridViewHolder.getGridView().getSelectedPosition(); 159e34cae48707e70442aca13e1b4ab55757292828dDake Gu if (DEBUG) Log.v(TAG, "row selected position " + position); 160e34cae48707e70442aca13e1b4ab55757292828dDake Gu onRowSelected(position); 161e34cae48707e70442aca13e1b4ab55757292828dDake Gu if (mOnItemSelectedListener != null) { 162e34cae48707e70442aca13e1b4ab55757292828dDake Gu mOnItemSelectedListener.onItemSelected(item, row); 163e34cae48707e70442aca13e1b4ab55757292828dDake Gu } 164947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu if (mOnItemViewSelectedListener != null) { 165947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu mOnItemViewSelectedListener.onItemSelected(itemViewHolder, item, 166947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu rowViewHolder, row); 167947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } 168e34cae48707e70442aca13e1b4ab55757292828dDake Gu } 169e34cae48707e70442aca13e1b4ab55757292828dDake Gu }; 170e34cae48707e70442aca13e1b4ab55757292828dDake Gu 171739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout /** 172739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Sets an item selection listener. 173afe1da48b4673f64c67c130237dd485a34a69c1bDake Gu * @deprecated Use {@link #setOnItemViewSelectedListener(OnItemViewSelectedListener)} 174739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */ 175739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public void setOnItemSelectedListener(OnItemSelectedListener listener) { 176739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mOnItemSelectedListener = listener; 177739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 178739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 179947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu /** 180947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu * Sets an item selection listener. 181947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu */ 182947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu public void setOnItemViewSelectedListener(OnItemViewSelectedListener listener) { 183947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu mOnItemViewSelectedListener = listener; 184947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } 185947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu 186e34cae48707e70442aca13e1b4ab55757292828dDake Gu private void onRowSelected(int position) { 187e34cae48707e70442aca13e1b4ab55757292828dDake Gu if (position != mSelectedPosition) { 188e34cae48707e70442aca13e1b4ab55757292828dDake Gu if (!mGridViewHolder.getGridView().hasPreviousViewInSameRow(position)) { 189e34cae48707e70442aca13e1b4ab55757292828dDake Gu // if has no sibling in front of it, show title 190e34cae48707e70442aca13e1b4ab55757292828dDake Gu if (!mShowingTitle) { 191731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout sTransitionHelper.runTransition(mSceneWithTitle, mTitleDownTransition); 192e34cae48707e70442aca13e1b4ab55757292828dDake Gu mShowingTitle = true; 193e34cae48707e70442aca13e1b4ab55757292828dDake Gu } 194e34cae48707e70442aca13e1b4ab55757292828dDake Gu } else if (mShowingTitle) { 195731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout sTransitionHelper.runTransition(mSceneWithoutTitle, mTitleUpTransition); 196e34cae48707e70442aca13e1b4ab55757292828dDake Gu mShowingTitle = false; 197e34cae48707e70442aca13e1b4ab55757292828dDake Gu } 198e34cae48707e70442aca13e1b4ab55757292828dDake Gu mSelectedPosition = position; 199e34cae48707e70442aca13e1b4ab55757292828dDake Gu } 200e34cae48707e70442aca13e1b4ab55757292828dDake Gu } 201739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 202739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout /** 203739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Sets an item clicked listener. 204afe1da48b4673f64c67c130237dd485a34a69c1bDake Gu * @deprecated Use {@link #setOnItemViewClickedListener(OnItemViewClickedListener)} 205739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */ 206739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public void setOnItemClickedListener(OnItemClickedListener listener) { 207739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mOnItemClickedListener = listener; 208739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout if (mGridPresenter != null) { 209739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mGridPresenter.setOnItemClickedListener(mOnItemClickedListener); 210739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 211739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 212739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 213739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout /** 214739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Returns the item clicked listener. 215afe1da48b4673f64c67c130237dd485a34a69c1bDake Gu * @deprecated Use {@link #getOnItemViewClickedListener()} 216739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */ 217739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public OnItemClickedListener getOnItemClickedListener() { 218739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout return mOnItemClickedListener; 219739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 220739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 221a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn /** 222947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu * Sets an item clicked listener. 223947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu */ 224947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu public void setOnItemViewClickedListener(OnItemViewClickedListener listener) { 225947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu mOnItemViewClickedListener = listener; 226947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu if (mGridPresenter != null) { 227947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener); 228947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } 229947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } 230947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu 231947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu /** 232947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu * Returns the item clicked listener. 233947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu */ 234947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu public OnItemViewClickedListener getOnItemViewClickedListener() { 235947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu return mOnItemViewClickedListener; 236947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu } 237947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu 238947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu /** 239a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn * Sets a click listener for the search affordance. 240a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn * 2414c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn * <p>The presence of a listener will change the visibility of the search 2424c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn * affordance in the title area. When set to non-null, the title area will 2434c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn * contain a call to search action. 244a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn * 2454c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn * <p>The listener's onClick method will be invoked when the user clicks on 2464c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn * the search action. 247a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn * 2484c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn * @param listener The listener to invoke when the search affordance is 2494c0f3062b5edd9750351068f46e5270bb220091dTim Kilbourn * clicked, or null to hide the search affordance. 250a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn */ 251a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn public void setOnSearchClickedListener(View.OnClickListener listener) { 252a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn mExternalOnSearchClickedListener = listener; 253731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout if (mTitleView != null) { 254731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout mTitleView.setOnSearchClickedListener(listener); 255731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout } 256731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout } 257731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout 258731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout /** 2594fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout * Sets the {@link SearchOrbView.Colors} used to draw the search affordance. 260731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout */ 2614fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout public void setSearchAffordanceColors(SearchOrbView.Colors colors) { 2624fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout mSearchAffordanceColors = colors; 263731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout mSearchAffordanceColorSet = true; 264731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout if (mTitleView != null) { 2654fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout mTitleView.setSearchAffordanceColors(mSearchAffordanceColors); 266a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn } 267a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn } 268a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn 269731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout /** 2704fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout * Returns the {@link SearchOrbView.Colors} used to draw the search affordance. 271731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout */ 2724fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout public SearchOrbView.Colors getSearchAffordanceColors() { 273731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout if (mSearchAffordanceColorSet) { 2744fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout return mSearchAffordanceColors; 275739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 276731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout if (mTitleView == null) { 277731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout throw new IllegalStateException("Fragment views not yet created"); 278739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 2794fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout return mTitleView.getSearchAffordanceColors(); 2804fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout } 2814fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout 2824fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout /** 2834fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout * Sets the color used to draw the search affordance. 2844fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout * A default brighter color will be set by the framework. 2854fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout * 2864fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout * @param color The color to use for the search affordance. 2874fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout */ 2884fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout public void setSearchAffordanceColor(int color) { 2894fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout setSearchAffordanceColors(new SearchOrbView.Colors(color)); 290739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 291739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 2924fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout /** 2934fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout * Returns the color used to draw the search affordance. 2944fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout */ 2954fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout public int getSearchAffordanceColor() { 2964fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout return getSearchAffordanceColors().color; 2974fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout } 298731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout 2999020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout private final BrowseFrameLayout.OnFocusSearchListener mOnFocusSearchListener = 3009020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout new BrowseFrameLayout.OnFocusSearchListener() { 3019020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout @Override 3029020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout public View onFocusSearch(View focused, int direction) { 3039020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout if (DEBUG) Log.v(TAG, "onFocusSearch focused " + focused + " + direction " + direction); 3049020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout 305731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout final View searchOrbView = mTitleView.getSearchAffordanceView(); 3064a10f1eb5c4283cfeef34cd71b84173f5ab3eefbKris Giesing final boolean isRtl = ViewCompat.getLayoutDirection(focused) == 3074a10f1eb5c4283cfeef34cd71b84173f5ab3eefbKris Giesing View.LAYOUT_DIRECTION_RTL; 3084a10f1eb5c4283cfeef34cd71b84173f5ab3eefbKris Giesing final int forward = isRtl ? View.FOCUS_LEFT : View.FOCUS_RIGHT; 309731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout if (focused == searchOrbView && ( 3104a10f1eb5c4283cfeef34cd71b84173f5ab3eefbKris Giesing direction == View.FOCUS_DOWN || direction == forward)) { 3119020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout return mGridViewHolder.view; 3129020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout 313731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout } else if (focused != searchOrbView && searchOrbView.getVisibility() == View.VISIBLE 3149020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout && direction == View.FOCUS_UP) { 315731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout return searchOrbView; 3169020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout 3179020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout } else { 3189020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout return null; 3199020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout } 3209020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout } 3219020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout }; 3229020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout 323739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout @Override 324739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public View onCreateView(LayoutInflater inflater, ViewGroup container, 325739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout Bundle savedInstanceState) { 326e34cae48707e70442aca13e1b4ab55757292828dDake Gu ViewGroup root = (ViewGroup) inflater.inflate(R.layout.lb_vertical_grid_fragment, 327e34cae48707e70442aca13e1b4ab55757292828dDake Gu container, false); 328739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 3299020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout mBrowseFrame = (BrowseFrameLayout) root.findViewById(R.id.browse_frame); 3309020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout mBrowseFrame.setOnFocusSearchListener(mOnFocusSearchListener); 3319020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout 332731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout mTitleView = (TitleView) root.findViewById(R.id.browse_title_group); 333731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout mTitleView.setBadgeDrawable(mBadgeDrawable); 334731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout mTitleView.setTitle(mTitle); 335731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout if (mSearchAffordanceColorSet) { 3364fdd3589c982860b831c0fad63c0082cb9079f47Craig Stout mTitleView.setSearchAffordanceColors(mSearchAffordanceColors); 337731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout } 338a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn if (mExternalOnSearchClickedListener != null) { 339731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout mTitleView.setOnSearchClickedListener(mExternalOnSearchClickedListener); 340a8d3588c80a232042474aca55a69df78c8ac8cb3Tim Kilbourn } 341739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 342e34cae48707e70442aca13e1b4ab55757292828dDake Gu mSceneWithTitle = sTransitionHelper.createScene(root, new Runnable() { 343e34cae48707e70442aca13e1b4ab55757292828dDake Gu @Override 344e34cae48707e70442aca13e1b4ab55757292828dDake Gu public void run() { 34533f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu mTitleView.setVisibility(View.VISIBLE); 346e34cae48707e70442aca13e1b4ab55757292828dDake Gu } 347e34cae48707e70442aca13e1b4ab55757292828dDake Gu }); 348e34cae48707e70442aca13e1b4ab55757292828dDake Gu mSceneWithoutTitle = sTransitionHelper.createScene(root, new Runnable() { 349e34cae48707e70442aca13e1b4ab55757292828dDake Gu @Override 350e34cae48707e70442aca13e1b4ab55757292828dDake Gu public void run() { 35133f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu mTitleView.setVisibility(View.INVISIBLE); 352e34cae48707e70442aca13e1b4ab55757292828dDake Gu } 353e34cae48707e70442aca13e1b4ab55757292828dDake Gu }); 3544735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu Context context = getActivity(); 3554735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu mTitleUpTransition = sTransitionHelper.loadTransition(context, R.transition.lb_title_out); 3564735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu mTitleDownTransition = sTransitionHelper.loadTransition(context, R.transition.lb_title_in); 357739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 358731066a59e10ddc7bb6c95d0b91b3e0e11e10396Craig Stout return root; 3599020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout } 3609020c0aec57b4e8994d66b7cd1a89c225e9bfa11Craig Stout 361739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout @Override 362739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public void onViewCreated(View view, Bundle savedInstanceState) { 363739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout ViewGroup gridDock = (ViewGroup) view.findViewById(R.id.browse_grid_dock); 364739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mGridViewHolder = mGridPresenter.onCreateViewHolder(gridDock); 365739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout gridDock.addView(mGridViewHolder.view); 366739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 367739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout updateAdapter(); 368739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 369739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 370739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout @Override 371739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public void onStart() { 372739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout super.onStart(); 373739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mGridViewHolder.getGridView().requestFocus(); 374739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 375739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 376739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout @Override 377447860fd5c105dd0ccd227237ac5f18fdc4c26dcCraig Stout public void onPause() { 378447860fd5c105dd0ccd227237ac5f18fdc4c26dcCraig Stout mTitleView.enableAnimation(false); 379447860fd5c105dd0ccd227237ac5f18fdc4c26dcCraig Stout super.onPause(); 380447860fd5c105dd0ccd227237ac5f18fdc4c26dcCraig Stout } 381447860fd5c105dd0ccd227237ac5f18fdc4c26dcCraig Stout 382447860fd5c105dd0ccd227237ac5f18fdc4c26dcCraig Stout @Override 383447860fd5c105dd0ccd227237ac5f18fdc4c26dcCraig Stout public void onResume() { 384447860fd5c105dd0ccd227237ac5f18fdc4c26dcCraig Stout super.onResume(); 385447860fd5c105dd0ccd227237ac5f18fdc4c26dcCraig Stout mTitleView.enableAnimation(true); 386447860fd5c105dd0ccd227237ac5f18fdc4c26dcCraig Stout } 387447860fd5c105dd0ccd227237ac5f18fdc4c26dcCraig Stout 388447860fd5c105dd0ccd227237ac5f18fdc4c26dcCraig Stout @Override 389739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public void onDestroyView() { 390739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout super.onDestroyView(); 391739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mGridViewHolder = null; 392739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 393739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 394739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout /** 395739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Sets the selected item position. 396739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */ 397739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout public void setSelectedPosition(int position) { 398739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mSelectedPosition = position; 399739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout if(mGridViewHolder != null && mGridViewHolder.getGridView().getAdapter() != null) { 400739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mGridViewHolder.getGridView().setSelectedPositionSmooth(position); 401739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 402739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 403739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout 404739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout private void updateAdapter() { 405739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout if (mGridViewHolder != null) { 406739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mGridPresenter.onBindViewHolder(mGridViewHolder, mAdapter); 407739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout if (mSelectedPosition != -1) { 408739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout mGridViewHolder.getGridView().setSelectedPosition(mSelectedPosition); 409739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 410739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 411739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout } 412739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout} 413