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.FullWidthDetailsOverviewRowPresenter; 200246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v17.leanback.widget.ItemAlignmentFacet; 210246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v17.leanback.widget.ItemBridgeAdapter; 22c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.ObjectAdapter; 2322eaa9441bf3a521bfafb160674ff2da421eded8Dake Guimport android.support.v17.leanback.widget.BaseOnItemViewClickedListener; 2422eaa9441bf3a521bfafb160674ff2da421eded8Dake Guimport android.support.v17.leanback.widget.BaseOnItemViewSelectedListener; 25dc9b5676ab337317154fa7702033ae174617525bDake Guimport android.support.v17.leanback.widget.Presenter; 260246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v17.leanback.widget.PresenterSelector; 27dc9b5676ab337317154fa7702033ae174617525bDake Guimport android.support.v17.leanback.widget.RowPresenter; 28e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stoutimport android.support.v17.leanback.widget.TitleHelper; 29c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.VerticalGridView; 30c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.os.Bundle; 31e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stoutimport android.util.Log; 32a373804d10f93a9488adc35cf6ce44dce09b3778Dake Guimport android.util.TypedValue; 33c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.LayoutInflater; 34c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.View; 35c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.ViewGroup; 36c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 37c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn/** 38a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * A fragment for creating Leanback details screens. 39a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * 40a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * <p> 41a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * A DetailsFragment renders the elements of its {@link ObjectAdapter} as a set 4222eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu * of rows in a vertical list.The Adapter's {@link PresenterSelector} must maintain subclasses 430246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * of {@link RowPresenter}. 44a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * </p> 45a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * 460246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * When {@link FullWidthDetailsOverviewRowPresenter} is found in adapter, DetailsFragment will 470246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * setup default behavior of the DetailsOverviewRow: 480246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * <li> 490246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * The alignment of FullWidthDetailsOverviewRowPresenter is setup in 500246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link #setupDetailsOverviewRowPresenter(FullWidthDetailsOverviewRowPresenter)}. 510246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * </li> 520246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * <li> 530246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * The view status switching of FullWidthDetailsOverviewRowPresenter is done in 540246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link #onSetDetailsOverviewRowStatus(FullWidthDetailsOverviewRowPresenter, 550246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int)}. 560246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * </li> 570246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * 58a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * <p> 590246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * The recommended activity themes to use with a DetailsFragment are 600246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * <li> 610246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link android.support.v17.leanback.R.style#Theme_Leanback_Details} with activity 620246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * shared element transition for {@link FullWidthDetailsOverviewRowPresenter}. 630246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * </li> 640246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * <li> 650246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link android.support.v17.leanback.R.style#Theme_Leanback_Details_NoSharedElementTransition} 660246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * if shared element transition is not needed, for example if first row is not rendered by 670246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link FullWidthDetailsOverviewRowPresenter}. 680246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * </li> 69a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * </p> 70c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 713f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gupublic class DetailsFragment extends BaseFragment { 72c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private static final String TAG = "DetailsFragment"; 73c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private static boolean DEBUG = false; 74c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 753f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu private class SetSelectionRunnable implements Runnable { 763f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu int mPosition; 773f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu boolean mSmooth = true; 78e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout 793f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 803f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void run() { 8160f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu if (mRowsFragment == null) { 8260f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu return; 8360f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu } 843f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mRowsFragment.setSelectedPosition(mPosition, mSmooth); 853f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 863f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 873f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 88b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu private RowsFragment mRowsFragment; 89c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 90b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu private ObjectAdapter mAdapter; 91c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private int mContainerListAlignTop; 9222eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu private BaseOnItemViewSelectedListener mExternalOnItemViewSelectedListener; 9322eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu private BaseOnItemViewClickedListener mOnItemViewClickedListener; 94c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 953f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu private Object mSceneAfterEntranceTransition; 963f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 973f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu private final SetSelectionRunnable mSetSelectionRunnable = new SetSelectionRunnable(); 983f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 9922eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu private final BaseOnItemViewSelectedListener<Object> mOnItemViewSelectedListener = 10022eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu new BaseOnItemViewSelectedListener<Object>() { 101e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout @Override 102e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, 10322eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu RowPresenter.ViewHolder rowViewHolder, Object row) { 104e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout int position = mRowsFragment.getVerticalGridView().getSelectedPosition(); 1050246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu int subposition = mRowsFragment.getVerticalGridView().getSelectedSubPosition(); 1060246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (DEBUG) Log.v(TAG, "row selected position " + position 1070246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu + " subposition " + subposition); 1080246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu onRowSelected(position, subposition); 109e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout if (mExternalOnItemViewSelectedListener != null) { 110e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout mExternalOnItemViewSelectedListener.onItemSelected(itemViewHolder, item, 111e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout rowViewHolder, row); 112e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } 113e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } 114e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout }; 115e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout 116c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 117c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Sets the list of rows for the fragment. 118c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 119c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void setAdapter(ObjectAdapter adapter) { 120b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mAdapter = adapter; 1210246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu Presenter[] presenters = adapter.getPresenterSelector().getPresenters(); 1220246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (presenters != null) { 1230246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu for (int i = 0; i < presenters.length; i++) { 1240246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu setupPresenter(presenters[i]); 1250246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 1260246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } else { 1270246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu Log.e(TAG, "PresenterSelector.getPresenters() not implemented"); 1280246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 129b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu if (mRowsFragment != null) { 130b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mRowsFragment.setAdapter(adapter); 131b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu } 132c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 133c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 134c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 135c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Returns the list of rows. 136c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 137c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public ObjectAdapter getAdapter() { 138b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu return mAdapter; 139c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 140c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 141c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 142c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Sets an item selection listener. 143dc9b5676ab337317154fa7702033ae174617525bDake Gu */ 14422eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu public void setOnItemViewSelectedListener(BaseOnItemViewSelectedListener listener) { 145e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout mExternalOnItemViewSelectedListener = listener; 146dc9b5676ab337317154fa7702033ae174617525bDake Gu } 147dc9b5676ab337317154fa7702033ae174617525bDake Gu 148dc9b5676ab337317154fa7702033ae174617525bDake Gu /** 149a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Sets an item clicked listener. 150dc9b5676ab337317154fa7702033ae174617525bDake Gu */ 15122eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu public void setOnItemViewClickedListener(BaseOnItemViewClickedListener listener) { 15276b3441abcfcf1291d865fd4a204c103b637027cDake Gu if (mOnItemViewClickedListener != listener) { 15376b3441abcfcf1291d865fd4a204c103b637027cDake Gu mOnItemViewClickedListener = listener; 15476b3441abcfcf1291d865fd4a204c103b637027cDake Gu if (mRowsFragment != null) { 15576b3441abcfcf1291d865fd4a204c103b637027cDake Gu mRowsFragment.setOnItemViewClickedListener(listener); 15676b3441abcfcf1291d865fd4a204c103b637027cDake Gu } 157dc9b5676ab337317154fa7702033ae174617525bDake Gu } 158dc9b5676ab337317154fa7702033ae174617525bDake Gu } 159dc9b5676ab337317154fa7702033ae174617525bDake Gu 160dc9b5676ab337317154fa7702033ae174617525bDake Gu /** 161a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Returns the item clicked listener. 162dc9b5676ab337317154fa7702033ae174617525bDake Gu */ 16322eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu public BaseOnItemViewClickedListener getOnItemViewClickedListener() { 164dc9b5676ab337317154fa7702033ae174617525bDake Gu return mOnItemViewClickedListener; 165dc9b5676ab337317154fa7702033ae174617525bDake Gu } 166dc9b5676ab337317154fa7702033ae174617525bDake Gu 167c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 168c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void onCreate(Bundle savedInstanceState) { 169c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn super.onCreate(savedInstanceState); 170c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 171c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mContainerListAlignTop = 172c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn getResources().getDimensionPixelSize(R.dimen.lb_details_rows_align_top); 173c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 174c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 175c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 176c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public View onCreateView(LayoutInflater inflater, ViewGroup container, 177c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn Bundle savedInstanceState) { 178b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu View view = inflater.inflate(R.layout.lb_details_fragment, container, false); 1790246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ViewGroup fragment_root = (ViewGroup) view.findViewById(R.id.details_fragment_root); 180a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu installTitleView(inflater, fragment_root, savedInstanceState); 1811caf420879768ae8aebe8c27546707a28f3bb659Craig Stout mRowsFragment = (RowsFragment) getChildFragmentManager().findFragmentById( 182e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout R.id.details_rows_dock); 1831caf420879768ae8aebe8c27546707a28f3bb659Craig Stout if (mRowsFragment == null) { 184b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mRowsFragment = new RowsFragment(); 185b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu getChildFragmentManager().beginTransaction() 186e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout .replace(R.id.details_rows_dock, mRowsFragment).commit(); 187b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu } 1886c3b0b3d19683ea8c4069ec761f14dc2c7b8c5dcCraig Stout mRowsFragment.setAdapter(mAdapter); 18976b3441abcfcf1291d865fd4a204c103b637027cDake Gu mRowsFragment.setOnItemViewSelectedListener(mOnItemViewSelectedListener); 190dc9b5676ab337317154fa7702033ae174617525bDake Gu mRowsFragment.setOnItemViewClickedListener(mOnItemViewClickedListener); 191e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout 1928403619efebe94666c0615c3fc85080a303acf80Dake Gu mSceneAfterEntranceTransition = TransitionHelper.createScene( 193e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout (ViewGroup) view, new Runnable() { 1943f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 1953f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void run() { 1963f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mRowsFragment.setEntranceTransitionState(true); 1973f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 1983f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu }); 199b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu return view; 200c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 201c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 2020246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu /** 203a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu * @deprecated override {@link #onInflateTitleView(LayoutInflater,ViewGroup,Bundle)} instead. 2040246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu */ 205a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu @Deprecated 2060246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu protected View inflateTitle(LayoutInflater inflater, ViewGroup parent, 2070246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu Bundle savedInstanceState) { 208a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu return super.onInflateTitleView(inflater, parent, savedInstanceState); 209a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu } 210a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu 211a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu @Override 212a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu public View onInflateTitleView(LayoutInflater inflater, ViewGroup parent, 213a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu Bundle savedInstanceState) { 214a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu return inflateTitle(inflater, parent, savedInstanceState); 2150246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 2160246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 2177ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout void setVerticalGridViewLayout(VerticalGridView listview) { 218c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn // align the top edge of item to a fixed position 2190246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu listview.setItemAlignmentOffset(-mContainerListAlignTop); 220c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setItemAlignmentOffsetPercent(VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED); 2210246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu listview.setWindowAlignmentOffset(0); 222c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setWindowAlignmentOffsetPercent(VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED); 223c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE); 224c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 225c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 2260246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu /** 2270246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * Called to setup each Presenter of Adapter passed in {@link #setAdapter(ObjectAdapter)}. Note 2280246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * that setup should only change the Presenter behavior that is meaningful in DetailsFragment. For 2290246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * example how a row is aligned in details Fragment. The default implementation invokes 2300246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link #setupDetailsOverviewRowPresenter(FullWidthDetailsOverviewRowPresenter)} 2310246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * 2320246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu */ 2330246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu protected void setupPresenter(Presenter rowPresenter) { 2340246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (rowPresenter instanceof FullWidthDetailsOverviewRowPresenter) { 2350246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu setupDetailsOverviewRowPresenter((FullWidthDetailsOverviewRowPresenter) rowPresenter); 2360246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 2370246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 2380246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 2390246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu /** 2400246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * Called to setup {@link FullWidthDetailsOverviewRowPresenter}. The default implementation 2410246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * adds two aligment positions({@link ItemAlignmentFacet}) for ViewHolder of 2420246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * FullWidthDetailsOverviewRowPresenter to align in fragment. 2430246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu */ 2440246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu protected void setupDetailsOverviewRowPresenter(FullWidthDetailsOverviewRowPresenter presenter) { 2450246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ItemAlignmentFacet facet = new ItemAlignmentFacet(); 2460246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu // by default align details_frame to half window height 2470246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ItemAlignmentFacet.ItemAlignmentDef alignDef1 = new ItemAlignmentFacet.ItemAlignmentDef(); 2480246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef1.setItemAlignmentViewId(R.id.details_frame); 2490246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef1.setItemAlignmentOffset(- getResources() 2500246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu .getDimensionPixelSize(R.dimen.lb_details_v2_align_pos_for_actions)); 2510246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef1.setItemAlignmentOffsetPercent(0); 2520246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu // when description is selected, align details_frame to top edge 2530246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ItemAlignmentFacet.ItemAlignmentDef alignDef2 = new ItemAlignmentFacet.ItemAlignmentDef(); 2540246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef2.setItemAlignmentViewId(R.id.details_frame); 2550246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef2.setItemAlignmentFocusViewId(R.id.details_overview_description); 2560246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef2.setItemAlignmentOffset(- getResources() 2570246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu .getDimensionPixelSize(R.dimen.lb_details_v2_align_pos_for_description)); 2580246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef2.setItemAlignmentOffsetPercent(0); 2590246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ItemAlignmentFacet.ItemAlignmentDef[] defs = 2600246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu new ItemAlignmentFacet.ItemAlignmentDef[] {alignDef1, alignDef2}; 2610246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu facet.setAlignmentDefs(defs); 2620246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu presenter.setFacet(ItemAlignmentFacet.class, facet); 2630246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 2640246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 2657ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout VerticalGridView getVerticalGridView() { 2667ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout return mRowsFragment == null ? null : mRowsFragment.getVerticalGridView(); 2677ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout } 2687ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout 26960f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu /** 27060f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu * Gets embedded RowsFragment showing multiple rows for DetailsFragment. If view of 27160f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu * DetailsFragment is not created, the method returns null. 27260f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu * @return Embedded RowsFragment showing multiple rows for DetailsFragment. 27360f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu */ 27460f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu public RowsFragment getRowsFragment() { 275d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout return mRowsFragment; 276d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 277d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 278c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 279c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Setup dimensions that are only meaningful when the child Fragments are inside 280c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * DetailsFragment. 281c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 282c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private void setupChildFragmentLayout() { 2837ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout setVerticalGridViewLayout(mRowsFragment.getVerticalGridView()); 284c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 285c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 286e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout private void setupFocusSearchListener() { 2870246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu TitleHelper titleHelper = getTitleHelper(); 2880246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (titleHelper != null) { 2890246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu BrowseFrameLayout browseFrameLayout = (BrowseFrameLayout) getView().findViewById( 2900246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu R.id.details_fragment_root); 2910246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu browseFrameLayout.setOnFocusSearchListener(titleHelper.getOnFocusSearchListener()); 2920246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 293e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } 294e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout 2953f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu /** 2963f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Sets the selected row position with smooth animation. 2973f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 2983f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void setSelectedPosition(int position) { 2993f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu setSelectedPosition(position, true); 3003f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 3013f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 3023f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu /** 3033f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Sets the selected row position. 3043f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 3053f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void setSelectedPosition(int position, boolean smooth) { 3063f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mSetSelectionRunnable.mPosition = position; 3073f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mSetSelectionRunnable.mSmooth = smooth; 3083f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu if (getView() != null && getView().getHandler() != null) { 3093f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu getView().getHandler().post(mSetSelectionRunnable); 3103f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 3113f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 3123f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 3130246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu private void onRowSelected(int selectedPosition, int selectedSubPosition) { 3140246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ObjectAdapter adapter = getAdapter(); 3150246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (adapter == null || adapter.size() == 0 || 3160246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu (selectedPosition == 0 && selectedSubPosition == 0)) { 317e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout showTitle(true); 318e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } else { 319e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout showTitle(false); 320e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } 3210246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (adapter != null && adapter.size() > selectedPosition) { 3220246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu final VerticalGridView gridView = getVerticalGridView(); 3230246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu final int count = gridView.getChildCount(); 3240246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu for (int i = 0; i < count; i++) { 3250246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ItemBridgeAdapter.ViewHolder bridgeViewHolder = (ItemBridgeAdapter.ViewHolder) 3260246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu gridView.getChildViewHolder(gridView.getChildAt(i)); 3270246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu RowPresenter rowPresenter = (RowPresenter) bridgeViewHolder.getPresenter(); 3280246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu onSetRowStatus(rowPresenter, 3290246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu rowPresenter.getRowViewHolder(bridgeViewHolder.getViewHolder()), 3300246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu bridgeViewHolder.getAdapterPosition(), 3310246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu selectedPosition, selectedSubPosition); 3320246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 3330246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 3340246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 3350246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 3360246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu /** 3370246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * Called on every visible row to change view status when current selected row position 3380246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * or selected sub position changed. Subclass may override. The default 3390246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * implementation calls {@link #onSetDetailsOverviewRowStatus(FullWidthDetailsOverviewRowPresenter, 3400246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int)} if presenter is 3410246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * instance of {@link FullWidthDetailsOverviewRowPresenter}. 3420246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * 3430246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param presenter The presenter used to create row ViewHolder. 3440246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param viewHolder The visible (attached) row ViewHolder, note that it may or may not 3450246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * be selected. 3460246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param adapterPosition The adapter position of viewHolder inside adapter. 3470246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param selectedPosition The adapter position of currently selected row. 3480246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param selectedSubPosition The sub position within currently selected row. This is used 3490246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * When a row has multiple alignment positions. 3500246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu */ 3510246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu protected void onSetRowStatus(RowPresenter presenter, RowPresenter.ViewHolder viewHolder, int 3520246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu adapterPosition, int selectedPosition, int selectedSubPosition) { 3530246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (presenter instanceof FullWidthDetailsOverviewRowPresenter) { 3540246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu onSetDetailsOverviewRowStatus((FullWidthDetailsOverviewRowPresenter) presenter, 3550246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu (FullWidthDetailsOverviewRowPresenter.ViewHolder) viewHolder, 3560246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu adapterPosition, selectedPosition, selectedSubPosition); 3570246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 3580246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 3590246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 3600246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu /** 3610246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * Called to change DetailsOverviewRow view status when current selected row position 3620246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * or selected sub position changed. Subclass may override. The default 3630246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * implementation switches between three states based on the positions: 3640246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link FullWidthDetailsOverviewRowPresenter#STATE_HALF}, 3650246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link FullWidthDetailsOverviewRowPresenter#STATE_FULL} and 3660246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link FullWidthDetailsOverviewRowPresenter#STATE_SMALL}. 3670246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * 3680246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param presenter The presenter used to create row ViewHolder. 3690246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param viewHolder The visible (attached) row ViewHolder, note that it may or may not 3700246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * be selected. 3710246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param adapterPosition The adapter position of viewHolder inside adapter. 3720246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param selectedPosition The adapter position of currently selected row. 3730246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param selectedSubPosition The sub position within currently selected row. This is used 3740246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * When a row has multiple alignment positions. 3750246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu */ 3760246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu protected void onSetDetailsOverviewRowStatus(FullWidthDetailsOverviewRowPresenter presenter, 3770246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu FullWidthDetailsOverviewRowPresenter.ViewHolder viewHolder, int adapterPosition, 3780246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu int selectedPosition, int selectedSubPosition) { 3790246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (selectedPosition > adapterPosition) { 3800246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu presenter.setState(viewHolder, FullWidthDetailsOverviewRowPresenter.STATE_HALF); 3810246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } else if (selectedPosition == adapterPosition && selectedSubPosition == 1) { 3820246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu presenter.setState(viewHolder, FullWidthDetailsOverviewRowPresenter.STATE_HALF); 3830246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } else if (selectedPosition == adapterPosition && selectedSubPosition == 0){ 3840246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu presenter.setState(viewHolder, FullWidthDetailsOverviewRowPresenter.STATE_FULL); 3850246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } else { 3860246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu presenter.setState(viewHolder, 3870246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu FullWidthDetailsOverviewRowPresenter.STATE_SMALL); 3880246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 389e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } 390e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout 391c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 392c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void onStart() { 393c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn super.onStart(); 394c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn setupChildFragmentLayout(); 395e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout setupFocusSearchListener(); 3963f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu if (isEntranceTransitionEnabled()) { 3973f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mRowsFragment.setEntranceTransitionState(false); 3983f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 3993f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 4003f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 4013f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 4023f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu protected Object createEntranceTransition() { 4038403619efebe94666c0615c3fc85080a303acf80Dake Gu return TransitionHelper.loadTransition(getActivity(), 4043f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu R.transition.lb_details_enter_transition); 4053f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 4063f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 4073f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 4083f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu protected void runEntranceTransition(Object entranceTransition) { 4098403619efebe94666c0615c3fc85080a303acf80Dake Gu TransitionHelper.runTransition(mSceneAfterEntranceTransition, entranceTransition); 4103f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 4113f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 4123f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 4133f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu protected void onEntranceTransitionEnd() { 4143f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mRowsFragment.onTransitionEnd(); 415c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 4160246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 41760751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu @Override 41860751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu protected void onEntranceTransitionPrepare() { 41960751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu mRowsFragment.onTransitionPrepare(); 42060751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu } 42160751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu 42260751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu @Override 42360751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu protected void onEntranceTransitionStart() { 42460751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu mRowsFragment.onTransitionStart(); 42560751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu } 426c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn} 427