DetailsFragment.java revision 22eaa9441bf3a521bfafb160674ff2da421eded8
1c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn/* 2c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Copyright (C) 2014 The Android Open Source Project 3c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * 4c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * in compliance with the License. You may obtain a copy of the License at 6c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * 7c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * http://www.apache.org/licenses/LICENSE-2.0 8c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * 9c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Unless required by applicable law or agreed to in writing, software distributed under the License 10c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * or implied. See the License for the specific language governing permissions and limitations under 12c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * the License. 13c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 14c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournpackage android.support.v17.leanback.app; 15c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 16c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.R; 178403619efebe94666c0615c3fc85080a303acf80Dake Guimport android.support.v17.leanback.transition.TransitionHelper; 18e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stoutimport android.support.v17.leanback.widget.BrowseFrameLayout; 190246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v17.leanback.widget.DetailsOverviewRow; 200246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter; 210246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v17.leanback.widget.ItemAlignmentFacet; 220246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v17.leanback.widget.ItemBridgeAdapter; 23c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.ObjectAdapter; 2422eaa9441bf3a521bfafb160674ff2da421eded8Dake Guimport android.support.v17.leanback.widget.BaseOnItemViewClickedListener; 2522eaa9441bf3a521bfafb160674ff2da421eded8Dake Guimport android.support.v17.leanback.widget.BaseOnItemViewSelectedListener; 26dc9b5676ab337317154fa7702033ae174617525bDake Guimport android.support.v17.leanback.widget.Presenter; 270246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v17.leanback.widget.PresenterSelector; 28dc9b5676ab337317154fa7702033ae174617525bDake Guimport android.support.v17.leanback.widget.RowPresenter; 29e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stoutimport android.support.v17.leanback.widget.TitleHelper; 30e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stoutimport android.support.v17.leanback.widget.TitleView; 31c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.VerticalGridView; 32c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.os.Bundle; 33e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stoutimport android.util.Log; 34c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.LayoutInflater; 35c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.View; 36c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.ViewGroup; 37c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 38c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn/** 39a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * A fragment for creating Leanback details screens. 40a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * 41a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * <p> 42a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * A DetailsFragment renders the elements of its {@link ObjectAdapter} as a set 4322eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu * of rows in a vertical list.The Adapter's {@link PresenterSelector} must maintain subclasses 440246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * of {@link RowPresenter}. 45a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * </p> 46a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * 470246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * When {@link FullWidthDetailsOverviewRowPresenter} is found in adapter, DetailsFragment will 480246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * setup default behavior of the DetailsOverviewRow: 490246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * <li> 500246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * The alignment of FullWidthDetailsOverviewRowPresenter is setup in 510246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link #setupDetailsOverviewRowPresenter(FullWidthDetailsOverviewRowPresenter)}. 520246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * </li> 530246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * <li> 540246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * The view status switching of FullWidthDetailsOverviewRowPresenter is done in 550246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link #onSetDetailsOverviewRowStatus(FullWidthDetailsOverviewRowPresenter, 560246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int)}. 570246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * </li> 580246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * 59a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * <p> 600246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * The recommended activity themes to use with a DetailsFragment are 610246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * <li> 620246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link android.support.v17.leanback.R.style#Theme_Leanback_Details} with activity 630246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * shared element transition for {@link FullWidthDetailsOverviewRowPresenter}. 640246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * </li> 650246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * <li> 660246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link android.support.v17.leanback.R.style#Theme_Leanback_Details_NoSharedElementTransition} 670246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * if shared element transition is not needed, for example if first row is not rendered by 680246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link FullWidthDetailsOverviewRowPresenter}. 690246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * </li> 70a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * </p> 71c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 723f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gupublic class DetailsFragment extends BaseFragment { 73c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private static final String TAG = "DetailsFragment"; 74c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private static boolean DEBUG = false; 75c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 763f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu private class SetSelectionRunnable implements Runnable { 773f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu int mPosition; 783f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu boolean mSmooth = true; 79e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout 803f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 813f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void run() { 8260f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu if (mRowsFragment == null) { 8360f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu return; 8460f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu } 853f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mRowsFragment.setSelectedPosition(mPosition, mSmooth); 863f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 873f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 883f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 89b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu private RowsFragment mRowsFragment; 90c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 91b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu private ObjectAdapter mAdapter; 92c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private int mContainerListAlignTop; 9322eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu private BaseOnItemViewSelectedListener mExternalOnItemViewSelectedListener; 9422eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu private BaseOnItemViewClickedListener mOnItemViewClickedListener; 95c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 963f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu private Object mSceneAfterEntranceTransition; 973f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 983f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu private final SetSelectionRunnable mSetSelectionRunnable = new SetSelectionRunnable(); 993f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 10022eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu private final BaseOnItemViewSelectedListener<Object> mOnItemViewSelectedListener = 10122eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu new BaseOnItemViewSelectedListener<Object>() { 102e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout @Override 103e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, 10422eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu RowPresenter.ViewHolder rowViewHolder, Object row) { 105e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout int position = mRowsFragment.getVerticalGridView().getSelectedPosition(); 1060246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu int subposition = mRowsFragment.getVerticalGridView().getSelectedSubPosition(); 1070246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (DEBUG) Log.v(TAG, "row selected position " + position 1080246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu + " subposition " + subposition); 1090246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu onRowSelected(position, subposition); 110e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout if (mExternalOnItemViewSelectedListener != null) { 111e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout mExternalOnItemViewSelectedListener.onItemSelected(itemViewHolder, item, 112e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout rowViewHolder, row); 113e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } 114e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } 115e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout }; 116e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout 117c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 118c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Sets the list of rows for the fragment. 119c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 120c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void setAdapter(ObjectAdapter adapter) { 121b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mAdapter = adapter; 1220246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu Presenter[] presenters = adapter.getPresenterSelector().getPresenters(); 1230246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (presenters != null) { 1240246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu for (int i = 0; i < presenters.length; i++) { 1250246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu setupPresenter(presenters[i]); 1260246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 1270246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } else { 1280246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu Log.e(TAG, "PresenterSelector.getPresenters() not implemented"); 1290246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 130b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu if (mRowsFragment != null) { 131b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mRowsFragment.setAdapter(adapter); 132b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu } 133c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 134c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 135c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 136c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Returns the list of rows. 137c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 138c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public ObjectAdapter getAdapter() { 139b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu return mAdapter; 140c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 141c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 142c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 143c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Sets an item selection listener. 144dc9b5676ab337317154fa7702033ae174617525bDake Gu */ 14522eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu public void setOnItemViewSelectedListener(BaseOnItemViewSelectedListener listener) { 146e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout mExternalOnItemViewSelectedListener = listener; 147dc9b5676ab337317154fa7702033ae174617525bDake Gu } 148dc9b5676ab337317154fa7702033ae174617525bDake Gu 149dc9b5676ab337317154fa7702033ae174617525bDake Gu /** 150a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Sets an item clicked listener. 151dc9b5676ab337317154fa7702033ae174617525bDake Gu */ 15222eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu public void setOnItemViewClickedListener(BaseOnItemViewClickedListener listener) { 15376b3441abcfcf1291d865fd4a204c103b637027cDake Gu if (mOnItemViewClickedListener != listener) { 15476b3441abcfcf1291d865fd4a204c103b637027cDake Gu mOnItemViewClickedListener = listener; 15576b3441abcfcf1291d865fd4a204c103b637027cDake Gu if (mRowsFragment != null) { 15676b3441abcfcf1291d865fd4a204c103b637027cDake Gu mRowsFragment.setOnItemViewClickedListener(listener); 15776b3441abcfcf1291d865fd4a204c103b637027cDake Gu } 158dc9b5676ab337317154fa7702033ae174617525bDake Gu } 159dc9b5676ab337317154fa7702033ae174617525bDake Gu } 160dc9b5676ab337317154fa7702033ae174617525bDake Gu 161dc9b5676ab337317154fa7702033ae174617525bDake Gu /** 162a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Returns the item clicked listener. 163dc9b5676ab337317154fa7702033ae174617525bDake Gu */ 16422eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu public BaseOnItemViewClickedListener getOnItemViewClickedListener() { 165dc9b5676ab337317154fa7702033ae174617525bDake Gu return mOnItemViewClickedListener; 166dc9b5676ab337317154fa7702033ae174617525bDake Gu } 167dc9b5676ab337317154fa7702033ae174617525bDake Gu 168c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 169c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void onCreate(Bundle savedInstanceState) { 170c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn super.onCreate(savedInstanceState); 171c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 172c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mContainerListAlignTop = 173c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn getResources().getDimensionPixelSize(R.dimen.lb_details_rows_align_top); 174c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 175c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 176c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 177c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public View onCreateView(LayoutInflater inflater, ViewGroup container, 178c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn Bundle savedInstanceState) { 179b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu View view = inflater.inflate(R.layout.lb_details_fragment, container, false); 1800246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ViewGroup fragment_root = (ViewGroup) view.findViewById(R.id.details_fragment_root); 1810246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu View titleView = inflateTitle(inflater, fragment_root, savedInstanceState); 1820246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (titleView != null) { 1830246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu fragment_root.addView(titleView); 1840246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 1851caf420879768ae8aebe8c27546707a28f3bb659Craig Stout mRowsFragment = (RowsFragment) getChildFragmentManager().findFragmentById( 186e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout R.id.details_rows_dock); 1871caf420879768ae8aebe8c27546707a28f3bb659Craig Stout if (mRowsFragment == null) { 188b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mRowsFragment = new RowsFragment(); 189b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu getChildFragmentManager().beginTransaction() 190e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout .replace(R.id.details_rows_dock, mRowsFragment).commit(); 191b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu } 1926c3b0b3d19683ea8c4069ec761f14dc2c7b8c5dcCraig Stout mRowsFragment.setAdapter(mAdapter); 19376b3441abcfcf1291d865fd4a204c103b637027cDake Gu mRowsFragment.setOnItemViewSelectedListener(mOnItemViewSelectedListener); 194dc9b5676ab337317154fa7702033ae174617525bDake Gu mRowsFragment.setOnItemViewClickedListener(mOnItemViewClickedListener); 195e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout 1960246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (titleView != null) { 1970246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu View titleGroup = titleView.findViewById(R.id.browse_title_group); 1980246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (titleGroup instanceof TitleView) { 1990246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu setTitleView((TitleView) titleGroup); 2000246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } else { 2010246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu setTitleView(null); 2020246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 2030246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 204e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout 2058403619efebe94666c0615c3fc85080a303acf80Dake Gu mSceneAfterEntranceTransition = TransitionHelper.createScene( 206e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout (ViewGroup) view, new Runnable() { 2073f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 2083f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void run() { 2093f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mRowsFragment.setEntranceTransitionState(true); 2103f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 2113f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu }); 212b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu return view; 213c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 214c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 2150246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu /** 2160246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * Called by {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} to inflate 2170246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * TitleView. Default implementation uses layout file lb_browse_title. 2180246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * Subclass may override and use its own layout or return null if no title is needed. 2190246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu */ 2200246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu protected View inflateTitle(LayoutInflater inflater, ViewGroup parent, 2210246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu Bundle savedInstanceState) { 2220246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu return inflater.inflate(R.layout.lb_browse_title, parent, false); 2230246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 2240246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 2257ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout void setVerticalGridViewLayout(VerticalGridView listview) { 226c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn // align the top edge of item to a fixed position 2270246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu listview.setItemAlignmentOffset(-mContainerListAlignTop); 228c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setItemAlignmentOffsetPercent(VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED); 2290246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu listview.setWindowAlignmentOffset(0); 230c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setWindowAlignmentOffsetPercent(VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED); 231c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE); 232c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 233c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 2340246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu /** 2350246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * Called to setup each Presenter of Adapter passed in {@link #setAdapter(ObjectAdapter)}. Note 2360246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * that setup should only change the Presenter behavior that is meaningful in DetailsFragment. For 2370246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * example how a row is aligned in details Fragment. The default implementation invokes 2380246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link #setupDetailsOverviewRowPresenter(FullWidthDetailsOverviewRowPresenter)} 2390246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * 2400246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu */ 2410246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu protected void setupPresenter(Presenter rowPresenter) { 2420246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (rowPresenter instanceof FullWidthDetailsOverviewRowPresenter) { 2430246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu setupDetailsOverviewRowPresenter((FullWidthDetailsOverviewRowPresenter) rowPresenter); 2440246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 2450246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 2460246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 2470246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu /** 2480246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * Called to setup {@link FullWidthDetailsOverviewRowPresenter}. The default implementation 2490246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * adds two aligment positions({@link ItemAlignmentFacet}) for ViewHolder of 2500246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * FullWidthDetailsOverviewRowPresenter to align in fragment. 2510246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu */ 2520246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu protected void setupDetailsOverviewRowPresenter(FullWidthDetailsOverviewRowPresenter presenter) { 2530246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ItemAlignmentFacet facet = new ItemAlignmentFacet(); 2540246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu // by default align details_frame to half window height 2550246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ItemAlignmentFacet.ItemAlignmentDef alignDef1 = new ItemAlignmentFacet.ItemAlignmentDef(); 2560246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef1.setItemAlignmentViewId(R.id.details_frame); 2570246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef1.setItemAlignmentOffset(- getResources() 2580246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu .getDimensionPixelSize(R.dimen.lb_details_v2_align_pos_for_actions)); 2590246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef1.setItemAlignmentOffsetPercent(0); 2600246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu // when description is selected, align details_frame to top edge 2610246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ItemAlignmentFacet.ItemAlignmentDef alignDef2 = new ItemAlignmentFacet.ItemAlignmentDef(); 2620246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef2.setItemAlignmentViewId(R.id.details_frame); 2630246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef2.setItemAlignmentFocusViewId(R.id.details_overview_description); 2640246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef2.setItemAlignmentOffset(- getResources() 2650246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu .getDimensionPixelSize(R.dimen.lb_details_v2_align_pos_for_description)); 2660246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef2.setItemAlignmentOffsetPercent(0); 2670246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ItemAlignmentFacet.ItemAlignmentDef[] defs = 2680246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu new ItemAlignmentFacet.ItemAlignmentDef[] {alignDef1, alignDef2}; 2690246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu facet.setAlignmentDefs(defs); 2700246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu presenter.setFacet(ItemAlignmentFacet.class, facet); 2710246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 2720246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 2737ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout VerticalGridView getVerticalGridView() { 2747ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout return mRowsFragment == null ? null : mRowsFragment.getVerticalGridView(); 2757ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout } 2767ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout 27760f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu /** 27860f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu * Gets embedded RowsFragment showing multiple rows for DetailsFragment. If view of 27960f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu * DetailsFragment is not created, the method returns null. 28060f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu * @return Embedded RowsFragment showing multiple rows for DetailsFragment. 28160f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu */ 28260f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu public RowsFragment getRowsFragment() { 283d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout return mRowsFragment; 284d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 285d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 286c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 287c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Setup dimensions that are only meaningful when the child Fragments are inside 288c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * DetailsFragment. 289c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 290c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private void setupChildFragmentLayout() { 2917ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout setVerticalGridViewLayout(mRowsFragment.getVerticalGridView()); 292c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 293c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 294e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout private void setupFocusSearchListener() { 2950246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu TitleHelper titleHelper = getTitleHelper(); 2960246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (titleHelper != null) { 2970246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu BrowseFrameLayout browseFrameLayout = (BrowseFrameLayout) getView().findViewById( 2980246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu R.id.details_fragment_root); 2990246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu browseFrameLayout.setOnFocusSearchListener(titleHelper.getOnFocusSearchListener()); 3000246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 301e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } 302e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout 3033f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu /** 3043f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Sets the selected row position with smooth animation. 3053f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 3063f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void setSelectedPosition(int position) { 3073f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu setSelectedPosition(position, true); 3083f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 3093f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 3103f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu /** 3113f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Sets the selected row position. 3123f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 3133f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void setSelectedPosition(int position, boolean smooth) { 3143f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mSetSelectionRunnable.mPosition = position; 3153f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mSetSelectionRunnable.mSmooth = smooth; 3163f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu if (getView() != null && getView().getHandler() != null) { 3173f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu getView().getHandler().post(mSetSelectionRunnable); 3183f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 3193f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 3203f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 3210246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu private void onRowSelected(int selectedPosition, int selectedSubPosition) { 3220246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ObjectAdapter adapter = getAdapter(); 3230246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (adapter == null || adapter.size() == 0 || 3240246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu (selectedPosition == 0 && selectedSubPosition == 0)) { 325e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout showTitle(true); 326e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } else { 327e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout showTitle(false); 328e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } 3290246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (adapter != null && adapter.size() > selectedPosition) { 3300246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu final VerticalGridView gridView = getVerticalGridView(); 3310246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu final int count = gridView.getChildCount(); 3320246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu for (int i = 0; i < count; i++) { 3330246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ItemBridgeAdapter.ViewHolder bridgeViewHolder = (ItemBridgeAdapter.ViewHolder) 3340246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu gridView.getChildViewHolder(gridView.getChildAt(i)); 3350246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu RowPresenter rowPresenter = (RowPresenter) bridgeViewHolder.getPresenter(); 3360246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu onSetRowStatus(rowPresenter, 3370246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu rowPresenter.getRowViewHolder(bridgeViewHolder.getViewHolder()), 3380246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu bridgeViewHolder.getAdapterPosition(), 3390246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu selectedPosition, selectedSubPosition); 3400246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 3410246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 3420246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 3430246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 3440246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu /** 3450246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * Called on every visible row to change view status when current selected row position 3460246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * or selected sub position changed. Subclass may override. The default 3470246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * implementation calls {@link #onSetDetailsOverviewRowStatus(FullWidthDetailsOverviewRowPresenter, 3480246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int)} if presenter is 3490246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * instance of {@link FullWidthDetailsOverviewRowPresenter}. 3500246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * 3510246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param presenter The presenter used to create row ViewHolder. 3520246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param viewHolder The visible (attached) row ViewHolder, note that it may or may not 3530246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * be selected. 3540246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param adapterPosition The adapter position of viewHolder inside adapter. 3550246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param selectedPosition The adapter position of currently selected row. 3560246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param selectedSubPosition The sub position within currently selected row. This is used 3570246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * When a row has multiple alignment positions. 3580246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu */ 3590246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu protected void onSetRowStatus(RowPresenter presenter, RowPresenter.ViewHolder viewHolder, int 3600246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu adapterPosition, int selectedPosition, int selectedSubPosition) { 3610246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (presenter instanceof FullWidthDetailsOverviewRowPresenter) { 3620246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu onSetDetailsOverviewRowStatus((FullWidthDetailsOverviewRowPresenter) presenter, 3630246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu (FullWidthDetailsOverviewRowPresenter.ViewHolder) viewHolder, 3640246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu adapterPosition, selectedPosition, selectedSubPosition); 3650246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 3660246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 3670246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 3680246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu /** 3690246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * Called to change DetailsOverviewRow view status when current selected row position 3700246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * or selected sub position changed. Subclass may override. The default 3710246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * implementation switches between three states based on the positions: 3720246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link FullWidthDetailsOverviewRowPresenter#STATE_HALF}, 3730246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link FullWidthDetailsOverviewRowPresenter#STATE_FULL} and 3740246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link FullWidthDetailsOverviewRowPresenter#STATE_SMALL}. 3750246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * 3760246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param presenter The presenter used to create row ViewHolder. 3770246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param viewHolder The visible (attached) row ViewHolder, note that it may or may not 3780246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * be selected. 3790246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param adapterPosition The adapter position of viewHolder inside adapter. 3800246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param selectedPosition The adapter position of currently selected row. 3810246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param selectedSubPosition The sub position within currently selected row. This is used 3820246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * When a row has multiple alignment positions. 3830246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu */ 3840246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu protected void onSetDetailsOverviewRowStatus(FullWidthDetailsOverviewRowPresenter presenter, 3850246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu FullWidthDetailsOverviewRowPresenter.ViewHolder viewHolder, int adapterPosition, 3860246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu int selectedPosition, int selectedSubPosition) { 3870246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (selectedPosition > adapterPosition) { 3880246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu presenter.setState(viewHolder, FullWidthDetailsOverviewRowPresenter.STATE_HALF); 3890246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } else if (selectedPosition == adapterPosition && selectedSubPosition == 1) { 3900246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu presenter.setState(viewHolder, FullWidthDetailsOverviewRowPresenter.STATE_HALF); 3910246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } else if (selectedPosition == adapterPosition && selectedSubPosition == 0){ 3920246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu presenter.setState(viewHolder, FullWidthDetailsOverviewRowPresenter.STATE_FULL); 3930246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } else { 3940246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu presenter.setState(viewHolder, 3950246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu FullWidthDetailsOverviewRowPresenter.STATE_SMALL); 3960246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 397e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } 398e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout 399c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 400c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void onStart() { 401c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn super.onStart(); 402c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn setupChildFragmentLayout(); 403e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout setupFocusSearchListener(); 4043f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu if (isEntranceTransitionEnabled()) { 4053f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mRowsFragment.setEntranceTransitionState(false); 4063f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 4073f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 4083f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 4093f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 4103f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu protected Object createEntranceTransition() { 4118403619efebe94666c0615c3fc85080a303acf80Dake Gu return TransitionHelper.loadTransition(getActivity(), 4123f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu R.transition.lb_details_enter_transition); 4133f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 4143f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 4153f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 4163f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu protected void runEntranceTransition(Object entranceTransition) { 4178403619efebe94666c0615c3fc85080a303acf80Dake Gu TransitionHelper.runTransition(mSceneAfterEntranceTransition, entranceTransition); 4183f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 4193f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 4203f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 4213f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu protected void onEntranceTransitionEnd() { 4223f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mRowsFragment.onTransitionEnd(); 423c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 4240246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 42560751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu @Override 42660751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu protected void onEntranceTransitionPrepare() { 42760751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu mRowsFragment.onTransitionPrepare(); 42860751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu } 42960751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu 43060751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu @Override 43160751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu protected void onEntranceTransitionStart() { 43260751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu mRowsFragment.onTransitionStart(); 43360751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu } 434c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn} 435