| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except |
| * in compliance with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software distributed under the License |
| * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
| * or implied. See the License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package android.support.v17.leanback.app; |
| |
| import android.os.Bundle; |
| import android.support.v17.leanback.R; |
| import android.support.v17.leanback.transition.TransitionHelper; |
| import android.support.v17.leanback.util.StateMachine.State; |
| import android.support.v17.leanback.widget.BrowseFrameLayout; |
| import android.support.v17.leanback.widget.ObjectAdapter; |
| import android.support.v17.leanback.widget.OnChildLaidOutListener; |
| import android.support.v17.leanback.widget.OnItemViewClickedListener; |
| import android.support.v17.leanback.widget.OnItemViewSelectedListener; |
| import android.support.v17.leanback.widget.Presenter; |
| import android.support.v17.leanback.widget.Row; |
| import android.support.v17.leanback.widget.RowPresenter; |
| import android.support.v17.leanback.widget.VerticalGridPresenter; |
| import android.util.Log; |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.view.ViewGroup; |
| |
| /** |
| * A fragment for creating leanback vertical grids. |
| * |
| * <p>Renders a vertical grid of objects given a {@link VerticalGridPresenter} and |
| * an {@link ObjectAdapter}. |
| */ |
| public class VerticalGridFragment extends BaseFragment { |
| static final String TAG = "VerticalGF"; |
| static boolean DEBUG = false; |
| |
| private ObjectAdapter mAdapter; |
| private VerticalGridPresenter mGridPresenter; |
| VerticalGridPresenter.ViewHolder mGridViewHolder; |
| OnItemViewSelectedListener mOnItemViewSelectedListener; |
| private OnItemViewClickedListener mOnItemViewClickedListener; |
| private Object mSceneAfterEntranceTransition; |
| private int mSelectedPosition = -1; |
| |
| /** |
| * State to setEntranceTransitionState(false) |
| */ |
| final State STATE_SET_ENTRANCE_START_STATE = new State("SET_ENTRANCE_START_STATE") { |
| @Override |
| public void run() { |
| setEntranceTransitionState(false); |
| } |
| }; |
| |
| @Override |
| void createStateMachineStates() { |
| super.createStateMachineStates(); |
| mStateMachine.addState(STATE_SET_ENTRANCE_START_STATE); |
| } |
| |
| @Override |
| void createStateMachineTransitions() { |
| super.createStateMachineTransitions(); |
| mStateMachine.addTransition(STATE_ENTRANCE_ON_PREPARED, |
| STATE_SET_ENTRANCE_START_STATE, EVT_ON_CREATEVIEW); |
| } |
| |
| /** |
| * Sets the grid presenter. |
| */ |
| public void setGridPresenter(VerticalGridPresenter gridPresenter) { |
| if (gridPresenter == null) { |
| throw new IllegalArgumentException("Grid presenter may not be null"); |
| } |
| mGridPresenter = gridPresenter; |
| mGridPresenter.setOnItemViewSelectedListener(mViewSelectedListener); |
| if (mOnItemViewClickedListener != null) { |
| mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener); |
| } |
| } |
| |
| /** |
| * Returns the grid presenter. |
| */ |
| public VerticalGridPresenter getGridPresenter() { |
| return mGridPresenter; |
| } |
| |
| /** |
| * Sets the object adapter for the fragment. |
| */ |
| public void setAdapter(ObjectAdapter adapter) { |
| mAdapter = adapter; |
| updateAdapter(); |
| } |
| |
| /** |
| * Returns the object adapter. |
| */ |
| public ObjectAdapter getAdapter() { |
| return mAdapter; |
| } |
| |
| final private OnItemViewSelectedListener mViewSelectedListener = |
| new OnItemViewSelectedListener() { |
| @Override |
| public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, |
| RowPresenter.ViewHolder rowViewHolder, Row row) { |
| int position = mGridViewHolder.getGridView().getSelectedPosition(); |
| if (DEBUG) Log.v(TAG, "grid selected position " + position); |
| gridOnItemSelected(position); |
| if (mOnItemViewSelectedListener != null) { |
| mOnItemViewSelectedListener.onItemSelected(itemViewHolder, item, |
| rowViewHolder, row); |
| } |
| } |
| }; |
| |
| final private OnChildLaidOutListener mChildLaidOutListener = |
| new OnChildLaidOutListener() { |
| @Override |
| public void onChildLaidOut(ViewGroup parent, View view, int position, long id) { |
| if (position == 0) { |
| showOrHideTitle(); |
| } |
| } |
| }; |
| |
| /** |
| * Sets an item selection listener. |
| */ |
| public void setOnItemViewSelectedListener(OnItemViewSelectedListener listener) { |
| mOnItemViewSelectedListener = listener; |
| } |
| |
| void gridOnItemSelected(int position) { |
| if (position != mSelectedPosition) { |
| mSelectedPosition = position; |
| showOrHideTitle(); |
| } |
| } |
| |
| void showOrHideTitle() { |
| if (mGridViewHolder.getGridView().findViewHolderForAdapterPosition(mSelectedPosition) |
| == null) { |
| return; |
| } |
| if (!mGridViewHolder.getGridView().hasPreviousViewInSameRow(mSelectedPosition)) { |
| showTitle(true); |
| } else { |
| showTitle(false); |
| } |
| } |
| |
| /** |
| * Sets an item clicked listener. |
| */ |
| public void setOnItemViewClickedListener(OnItemViewClickedListener listener) { |
| mOnItemViewClickedListener = listener; |
| if (mGridPresenter != null) { |
| mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener); |
| } |
| } |
| |
| /** |
| * Returns the item clicked listener. |
| */ |
| public OnItemViewClickedListener getOnItemViewClickedListener() { |
| return mOnItemViewClickedListener; |
| } |
| |
| @Override |
| public View onCreateView(LayoutInflater inflater, ViewGroup container, |
| Bundle savedInstanceState) { |
| ViewGroup root = (ViewGroup) inflater.inflate(R.layout.lb_vertical_grid_fragment, |
| container, false); |
| ViewGroup gridFrame = (ViewGroup) root.findViewById(R.id.grid_frame); |
| installTitleView(inflater, gridFrame, savedInstanceState); |
| getProgressBarManager().setRootView(root); |
| |
| ViewGroup gridDock = (ViewGroup) root.findViewById(R.id.browse_grid_dock); |
| mGridViewHolder = mGridPresenter.onCreateViewHolder(gridDock); |
| gridDock.addView(mGridViewHolder.view); |
| mGridViewHolder.getGridView().setOnChildLaidOutListener(mChildLaidOutListener); |
| |
| mSceneAfterEntranceTransition = TransitionHelper.createScene(gridDock, new Runnable() { |
| @Override |
| public void run() { |
| setEntranceTransitionState(true); |
| } |
| }); |
| |
| updateAdapter(); |
| return root; |
| } |
| |
| private void setupFocusSearchListener() { |
| BrowseFrameLayout browseFrameLayout = (BrowseFrameLayout) getView().findViewById( |
| R.id.grid_frame); |
| browseFrameLayout.setOnFocusSearchListener(getTitleHelper().getOnFocusSearchListener()); |
| } |
| |
| @Override |
| public void onStart() { |
| super.onStart(); |
| setupFocusSearchListener(); |
| } |
| |
| @Override |
| public void onDestroyView() { |
| super.onDestroyView(); |
| mGridViewHolder = null; |
| } |
| |
| /** |
| * Sets the selected item position. |
| */ |
| public void setSelectedPosition(int position) { |
| mSelectedPosition = position; |
| if(mGridViewHolder != null && mGridViewHolder.getGridView().getAdapter() != null) { |
| mGridViewHolder.getGridView().setSelectedPositionSmooth(position); |
| } |
| } |
| |
| private void updateAdapter() { |
| if (mGridViewHolder != null) { |
| mGridPresenter.onBindViewHolder(mGridViewHolder, mAdapter); |
| if (mSelectedPosition != -1) { |
| mGridViewHolder.getGridView().setSelectedPosition(mSelectedPosition); |
| } |
| } |
| } |
| |
| @Override |
| protected Object createEntranceTransition() { |
| return TransitionHelper.loadTransition(FragmentUtil.getContext(this), |
| R.transition.lb_vertical_grid_entrance_transition); |
| } |
| |
| @Override |
| protected void runEntranceTransition(Object entranceTransition) { |
| TransitionHelper.runTransition(mSceneAfterEntranceTransition, entranceTransition); |
| } |
| |
| void setEntranceTransitionState(boolean afterTransition) { |
| mGridPresenter.setEntranceTransitionState(mGridViewHolder, afterTransition); |
| } |
| } |