1cc671dd3caac1d0cbf3f6999ab063c9ff1f297b2Dake Gu// CHECKSTYLE:OFF Generated code 26193c12a1897723c87b41f4e304a8cd04deef2dcDake Gu/* This file is auto-generated from DetailsFragment.java. DO NOT MODIFY. */ 36193c12a1897723c87b41f4e304a8cd04deef2dcDake Gu 461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu/* 561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Copyright (C) 2014 The Android Open Source Project 661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * 761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * in compliance with the License. You may obtain a copy of the License at 961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * 1061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * http://www.apache.org/licenses/LICENSE-2.0 1161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * 1261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Unless required by applicable law or agreed to in writing, software distributed under the License 1361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 1461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * or implied. See the License for the specific language governing permissions and limitations under 1561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * the License. 1661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 1761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gupackage android.support.v17.leanback.app; 1861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 1901f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Guimport android.support.v4.app.FragmentActivity; 204702556bfd15c9819a7b2af759aee0f719cd631fsusnataimport android.support.v4.app.Fragment; 214702556bfd15c9819a7b2af759aee0f719cd631fsusnataimport android.support.v4.app.FragmentTransaction; 229869eb38607552105baa88a0fcba610461045eb5Dake Guimport android.graphics.Rect; 23e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Guimport android.graphics.drawable.Drawable; 2434b46f02a89224481777e7de93d6e22e45e41e96Dake Guimport android.os.Build; 25180dc4030628425a8081fe058bdc1d529c505ae8susnataimport android.os.Bundle; 2601f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Guimport android.support.annotation.CallSuper; 2761905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.support.v17.leanback.R; 288403619efebe94666c0615c3fc85080a303acf80Dake Guimport android.support.v17.leanback.transition.TransitionHelper; 2901f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Guimport android.support.v17.leanback.transition.TransitionListener; 3089097f67f988ebba714a95e10369665280db0c27Dake Guimport android.support.v17.leanback.util.StateMachine.Event; 3189097f67f988ebba714a95e10369665280db0c27Dake Guimport android.support.v17.leanback.util.StateMachine.State; 32180dc4030628425a8081fe058bdc1d529c505ae8susnataimport android.support.v17.leanback.widget.BaseOnItemViewClickedListener; 33180dc4030628425a8081fe058bdc1d529c505ae8susnataimport android.support.v17.leanback.widget.BaseOnItemViewSelectedListener; 34e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stoutimport android.support.v17.leanback.widget.BrowseFrameLayout; 35e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Guimport android.support.v17.leanback.widget.DetailsParallax; 360246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter; 370246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v17.leanback.widget.ItemAlignmentFacet; 380246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v17.leanback.widget.ItemBridgeAdapter; 3961905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.support.v17.leanback.widget.ObjectAdapter; 4061905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.support.v17.leanback.widget.Presenter; 410246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v17.leanback.widget.PresenterSelector; 4261905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.support.v17.leanback.widget.RowPresenter; 4361905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.support.v17.leanback.widget.VerticalGridView; 44e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stoutimport android.util.Log; 454702556bfd15c9819a7b2af759aee0f719cd631fsusnataimport android.view.KeyEvent; 4661905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.view.LayoutInflater; 4761905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.view.View; 4861905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.view.ViewGroup; 4989097f67f988ebba714a95e10369665280db0c27Dake Guimport android.view.Window; 5061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 5101f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Guimport java.lang.ref.WeakReference; 5201f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 5361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu/** 54a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * A fragment for creating Leanback details screens. 55a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * 56a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * <p> 57a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * A DetailsSupportFragment renders the elements of its {@link ObjectAdapter} as a set 5822eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu * of rows in a vertical list.The Adapter's {@link PresenterSelector} must maintain subclasses 590246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * of {@link RowPresenter}. 60a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * </p> 61a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * 620246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * When {@link FullWidthDetailsOverviewRowPresenter} is found in adapter, DetailsSupportFragment will 630246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * setup default behavior of the DetailsOverviewRow: 640246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * <li> 650246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * The alignment of FullWidthDetailsOverviewRowPresenter is setup in 660246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link #setupDetailsOverviewRowPresenter(FullWidthDetailsOverviewRowPresenter)}. 670246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * </li> 680246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * <li> 690246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * The view status switching of FullWidthDetailsOverviewRowPresenter is done in 700246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link #onSetDetailsOverviewRowStatus(FullWidthDetailsOverviewRowPresenter, 710246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int)}. 720246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * </li> 730246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * 74a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * <p> 750246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * The recommended activity themes to use with a DetailsSupportFragment are 760246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * <li> 770246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link android.support.v17.leanback.R.style#Theme_Leanback_Details} with activity 780246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * shared element transition for {@link FullWidthDetailsOverviewRowPresenter}. 790246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * </li> 800246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * <li> 810246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link android.support.v17.leanback.R.style#Theme_Leanback_Details_NoSharedElementTransition} 820246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * if shared element transition is not needed, for example if first row is not rendered by 830246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link FullWidthDetailsOverviewRowPresenter}. 840246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * </li> 85a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * </p> 86f87eb1d84dfee2f1be9ea326754829b1eff4967fDake Gu * 87f87eb1d84dfee2f1be9ea326754829b1eff4967fDake Gu * <p> 88f87eb1d84dfee2f1be9ea326754829b1eff4967fDake Gu * DetailsSupportFragment can use {@link DetailsSupportFragmentBackgroundController} to add a parallax drawable 89f87eb1d84dfee2f1be9ea326754829b1eff4967fDake Gu * background and embedded video playing fragment. 90f87eb1d84dfee2f1be9ea326754829b1eff4967fDake Gu * </p> 9161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 923f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gupublic class DetailsSupportFragment extends BaseSupportFragment { 9399ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas static final String TAG = "DetailsSupportFragment"; 9499ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas static boolean DEBUG = false; 9561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 9689097f67f988ebba714a95e10369665280db0c27Dake Gu final State STATE_SET_ENTRANCE_START_STATE = new State("STATE_SET_ENTRANCE_START_STATE") { 9789097f67f988ebba714a95e10369665280db0c27Dake Gu @Override 9889097f67f988ebba714a95e10369665280db0c27Dake Gu public void run() { 9989097f67f988ebba714a95e10369665280db0c27Dake Gu mRowsSupportFragment.setEntranceTransitionState(false); 10089097f67f988ebba714a95e10369665280db0c27Dake Gu } 10189097f67f988ebba714a95e10369665280db0c27Dake Gu }; 10201f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 10389097f67f988ebba714a95e10369665280db0c27Dake Gu final State STATE_ENTER_TRANSITION_INIT = new State("STATE_ENTER_TRANSIITON_INIT"); 104e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout 10589097f67f988ebba714a95e10369665280db0c27Dake Gu void switchToVideoBeforeVideoSupportFragmentCreated() { 10689097f67f988ebba714a95e10369665280db0c27Dake Gu // if the video fragment is not ready: immediately fade out covering drawable, 10789097f67f988ebba714a95e10369665280db0c27Dake Gu // hide title and mark mPendingFocusOnVideo and set focus on it later. 1083bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mDetailsBackgroundController.switchToVideoBeforeCreate(); 10989097f67f988ebba714a95e10369665280db0c27Dake Gu showTitle(false); 11089097f67f988ebba714a95e10369665280db0c27Dake Gu mPendingFocusOnVideo = true; 11189097f67f988ebba714a95e10369665280db0c27Dake Gu slideOutGridView(); 11289097f67f988ebba714a95e10369665280db0c27Dake Gu } 11389097f67f988ebba714a95e10369665280db0c27Dake Gu 11489097f67f988ebba714a95e10369665280db0c27Dake Gu final State STATE_SWITCH_TO_VIDEO_IN_ON_CREATE = new State("STATE_SWITCH_TO_VIDEO_IN_ON_CREATE", 11589097f67f988ebba714a95e10369665280db0c27Dake Gu false, false) { 11689097f67f988ebba714a95e10369665280db0c27Dake Gu @Override 11789097f67f988ebba714a95e10369665280db0c27Dake Gu public void run() { 11889097f67f988ebba714a95e10369665280db0c27Dake Gu switchToVideoBeforeVideoSupportFragmentCreated(); 11999ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas } 12089097f67f988ebba714a95e10369665280db0c27Dake Gu }; 12199ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas 12289097f67f988ebba714a95e10369665280db0c27Dake Gu final State STATE_ENTER_TRANSITION_CANCEL = new State("STATE_ENTER_TRANSITION_CANCEL", 12389097f67f988ebba714a95e10369665280db0c27Dake Gu false, false) { 1243f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 1253f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void run() { 12689097f67f988ebba714a95e10369665280db0c27Dake Gu if (mWaitEnterTransitionTimeout != null) { 12789097f67f988ebba714a95e10369665280db0c27Dake Gu mWaitEnterTransitionTimeout.mRef.clear(); 12889097f67f988ebba714a95e10369665280db0c27Dake Gu } 12989097f67f988ebba714a95e10369665280db0c27Dake Gu // clear the activity enter/sharedElement transition, return transitions are kept. 13089097f67f988ebba714a95e10369665280db0c27Dake Gu // keep the return transitions and clear enter transition 13189097f67f988ebba714a95e10369665280db0c27Dake Gu if (getActivity() != null) { 13289097f67f988ebba714a95e10369665280db0c27Dake Gu Window window = getActivity().getWindow(); 13389097f67f988ebba714a95e10369665280db0c27Dake Gu Object returnTransition = TransitionHelper.getReturnTransition(window); 13489097f67f988ebba714a95e10369665280db0c27Dake Gu Object sharedReturnTransition = TransitionHelper 13589097f67f988ebba714a95e10369665280db0c27Dake Gu .getSharedElementReturnTransition(window); 13689097f67f988ebba714a95e10369665280db0c27Dake Gu TransitionHelper.setEnterTransition(window, null); 13789097f67f988ebba714a95e10369665280db0c27Dake Gu TransitionHelper.setSharedElementEnterTransition(window, null); 13889097f67f988ebba714a95e10369665280db0c27Dake Gu TransitionHelper.setReturnTransition(window, returnTransition); 13989097f67f988ebba714a95e10369665280db0c27Dake Gu TransitionHelper.setSharedElementReturnTransition(window, sharedReturnTransition); 14060f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu } 1413f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 14289097f67f988ebba714a95e10369665280db0c27Dake Gu }; 14389097f67f988ebba714a95e10369665280db0c27Dake Gu 14489097f67f988ebba714a95e10369665280db0c27Dake Gu final State STATE_ENTER_TRANSITION_COMPLETE = new State("STATE_ENTER_TRANSIITON_COMPLETE", 14589097f67f988ebba714a95e10369665280db0c27Dake Gu true, false); 14689097f67f988ebba714a95e10369665280db0c27Dake Gu 14789097f67f988ebba714a95e10369665280db0c27Dake Gu final State STATE_ENTER_TRANSITION_ADDLISTENER = new State("STATE_ENTER_TRANSITION_PENDING") { 14889097f67f988ebba714a95e10369665280db0c27Dake Gu @Override 14989097f67f988ebba714a95e10369665280db0c27Dake Gu public void run() { 15089097f67f988ebba714a95e10369665280db0c27Dake Gu Object transition = TransitionHelper.getEnterTransition(getActivity().getWindow()); 15189097f67f988ebba714a95e10369665280db0c27Dake Gu TransitionHelper.addTransitionListener(transition, mEnterTransitionListener); 15289097f67f988ebba714a95e10369665280db0c27Dake Gu } 15389097f67f988ebba714a95e10369665280db0c27Dake Gu }; 15489097f67f988ebba714a95e10369665280db0c27Dake Gu 15589097f67f988ebba714a95e10369665280db0c27Dake Gu final State STATE_ENTER_TRANSITION_PENDING = new State("STATE_ENTER_TRANSITION_PENDING") { 15689097f67f988ebba714a95e10369665280db0c27Dake Gu @Override 15789097f67f988ebba714a95e10369665280db0c27Dake Gu public void run() { 15889097f67f988ebba714a95e10369665280db0c27Dake Gu if (mWaitEnterTransitionTimeout == null) { 15989097f67f988ebba714a95e10369665280db0c27Dake Gu new WaitEnterTransitionTimeout(DetailsSupportFragment.this); 16089097f67f988ebba714a95e10369665280db0c27Dake Gu } 16189097f67f988ebba714a95e10369665280db0c27Dake Gu } 16289097f67f988ebba714a95e10369665280db0c27Dake Gu }; 1633f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 16401f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu /** 16501f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu * Start this task when first DetailsOverviewRow is created, if there is no entrance transition 16601f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu * started, it will clear PF_ENTRANCE_TRANSITION_PENDING. 16701f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu */ 16801f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu static class WaitEnterTransitionTimeout implements Runnable { 16901f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu static final long WAIT_ENTERTRANSITION_START = 200; 17001f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 17101f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu final WeakReference<DetailsSupportFragment> mRef; 17201f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 17301f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu WaitEnterTransitionTimeout(DetailsSupportFragment f) { 174abc73958d264e1eed7fd401a18be1d9ede8304ebAurimas Liutikas mRef = new WeakReference<>(f); 17501f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu f.getView().postDelayed(this, WAIT_ENTERTRANSITION_START); 17601f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 17701f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 17801f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu @Override 17901f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu public void run() { 18001f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu DetailsSupportFragment f = mRef.get(); 18101f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu if (f != null) { 18289097f67f988ebba714a95e10369665280db0c27Dake Gu f.mStateMachine.fireEvent(f.EVT_ENTER_TRANSIITON_DONE); 18301f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 18401f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 18501f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 18601f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 18789097f67f988ebba714a95e10369665280db0c27Dake Gu final State STATE_ON_SAFE_START = new State("STATE_ON_SAFE_START") { 18889097f67f988ebba714a95e10369665280db0c27Dake Gu @Override 18989097f67f988ebba714a95e10369665280db0c27Dake Gu public void run() { 19089097f67f988ebba714a95e10369665280db0c27Dake Gu onSafeStart(); 19189097f67f988ebba714a95e10369665280db0c27Dake Gu } 19289097f67f988ebba714a95e10369665280db0c27Dake Gu }; 19389097f67f988ebba714a95e10369665280db0c27Dake Gu 19489097f67f988ebba714a95e10369665280db0c27Dake Gu final Event EVT_ONSTART = new Event("onStart"); 19589097f67f988ebba714a95e10369665280db0c27Dake Gu 19689097f67f988ebba714a95e10369665280db0c27Dake Gu final Event EVT_NO_ENTER_TRANSITION = new Event("EVT_NO_ENTER_TRANSITION"); 19789097f67f988ebba714a95e10369665280db0c27Dake Gu 19889097f67f988ebba714a95e10369665280db0c27Dake Gu final Event EVT_DETAILS_ROW_LOADED = new Event("onFirstRowLoaded"); 19989097f67f988ebba714a95e10369665280db0c27Dake Gu 20089097f67f988ebba714a95e10369665280db0c27Dake Gu final Event EVT_ENTER_TRANSIITON_DONE = new Event("onEnterTransitionDone"); 20189097f67f988ebba714a95e10369665280db0c27Dake Gu 20289097f67f988ebba714a95e10369665280db0c27Dake Gu final Event EVT_SWITCH_TO_VIDEO = new Event("switchToVideo"); 20389097f67f988ebba714a95e10369665280db0c27Dake Gu 20489097f67f988ebba714a95e10369665280db0c27Dake Gu @Override 20589097f67f988ebba714a95e10369665280db0c27Dake Gu void createStateMachineStates() { 20689097f67f988ebba714a95e10369665280db0c27Dake Gu super.createStateMachineStates(); 20789097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addState(STATE_SET_ENTRANCE_START_STATE); 20889097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addState(STATE_ON_SAFE_START); 20989097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addState(STATE_SWITCH_TO_VIDEO_IN_ON_CREATE); 21089097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addState(STATE_ENTER_TRANSITION_INIT); 21189097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addState(STATE_ENTER_TRANSITION_ADDLISTENER); 21289097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addState(STATE_ENTER_TRANSITION_CANCEL); 21389097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addState(STATE_ENTER_TRANSITION_PENDING); 21489097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addState(STATE_ENTER_TRANSITION_COMPLETE); 21589097f67f988ebba714a95e10369665280db0c27Dake Gu } 21689097f67f988ebba714a95e10369665280db0c27Dake Gu 21789097f67f988ebba714a95e10369665280db0c27Dake Gu @Override 21889097f67f988ebba714a95e10369665280db0c27Dake Gu void createStateMachineTransitions() { 21989097f67f988ebba714a95e10369665280db0c27Dake Gu super.createStateMachineTransitions(); 22089097f67f988ebba714a95e10369665280db0c27Dake Gu /** 22189097f67f988ebba714a95e10369665280db0c27Dake Gu * Part 1: Processing enter transitions after fragment.onCreate 22289097f67f988ebba714a95e10369665280db0c27Dake Gu */ 22389097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_START, STATE_ENTER_TRANSITION_INIT, EVT_ON_CREATE); 22489097f67f988ebba714a95e10369665280db0c27Dake Gu // if transition is not supported, skip to complete 22589097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_ENTER_TRANSITION_INIT, STATE_ENTER_TRANSITION_COMPLETE, 22689097f67f988ebba714a95e10369665280db0c27Dake Gu COND_TRANSITION_NOT_SUPPORTED); 22789097f67f988ebba714a95e10369665280db0c27Dake Gu // if transition is not set on Activity, skip to complete 22889097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_ENTER_TRANSITION_INIT, STATE_ENTER_TRANSITION_COMPLETE, 22989097f67f988ebba714a95e10369665280db0c27Dake Gu EVT_NO_ENTER_TRANSITION); 23089097f67f988ebba714a95e10369665280db0c27Dake Gu // if switchToVideo is called before EVT_ON_CREATEVIEW, clear enter transition and skip to 23189097f67f988ebba714a95e10369665280db0c27Dake Gu // complete. 23289097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_ENTER_TRANSITION_INIT, STATE_ENTER_TRANSITION_CANCEL, 23389097f67f988ebba714a95e10369665280db0c27Dake Gu EVT_SWITCH_TO_VIDEO); 23489097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_ENTER_TRANSITION_CANCEL, STATE_ENTER_TRANSITION_COMPLETE); 23589097f67f988ebba714a95e10369665280db0c27Dake Gu // once after onCreateView, we cannot skip the enter transition, add a listener and wait 23689097f67f988ebba714a95e10369665280db0c27Dake Gu // it to finish 23789097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_ENTER_TRANSITION_INIT, STATE_ENTER_TRANSITION_ADDLISTENER, 23889097f67f988ebba714a95e10369665280db0c27Dake Gu EVT_ON_CREATEVIEW); 23989097f67f988ebba714a95e10369665280db0c27Dake Gu // when enter transition finishes, go to complete, however this might never happen if 24089097f67f988ebba714a95e10369665280db0c27Dake Gu // the activity is not giving transition options in startActivity, there is no API to query 24189097f67f988ebba714a95e10369665280db0c27Dake Gu // if this activity is started in a enter transition mode. So we rely on a timer below: 24289097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_ENTER_TRANSITION_ADDLISTENER, 24389097f67f988ebba714a95e10369665280db0c27Dake Gu STATE_ENTER_TRANSITION_COMPLETE, EVT_ENTER_TRANSIITON_DONE); 24489097f67f988ebba714a95e10369665280db0c27Dake Gu // we are expecting app to start delayed enter transition shortly after details row is 24589097f67f988ebba714a95e10369665280db0c27Dake Gu // loaded, so create a timer and wait for enter transition start. 24689097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_ENTER_TRANSITION_ADDLISTENER, 24789097f67f988ebba714a95e10369665280db0c27Dake Gu STATE_ENTER_TRANSITION_PENDING, EVT_DETAILS_ROW_LOADED); 24889097f67f988ebba714a95e10369665280db0c27Dake Gu // if enter transition not started in the timer, skip to DONE, this can be also true when 24989097f67f988ebba714a95e10369665280db0c27Dake Gu // startActivity is not giving transition option. 25089097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_ENTER_TRANSITION_PENDING, STATE_ENTER_TRANSITION_COMPLETE, 25189097f67f988ebba714a95e10369665280db0c27Dake Gu EVT_ENTER_TRANSIITON_DONE); 25289097f67f988ebba714a95e10369665280db0c27Dake Gu 25389097f67f988ebba714a95e10369665280db0c27Dake Gu /** 25489097f67f988ebba714a95e10369665280db0c27Dake Gu * Part 2: modification to the entrance transition defined in BaseSupportFragment 25589097f67f988ebba714a95e10369665280db0c27Dake Gu */ 25689097f67f988ebba714a95e10369665280db0c27Dake Gu // Must finish enter transition before perform entrance transition. 25789097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_ENTER_TRANSITION_COMPLETE, STATE_ENTRANCE_PERFORM); 25889097f67f988ebba714a95e10369665280db0c27Dake Gu // Calling switch to video would hide immediately and skip entrance transition 25989097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_ENTRANCE_INIT, STATE_SWITCH_TO_VIDEO_IN_ON_CREATE, 26089097f67f988ebba714a95e10369665280db0c27Dake Gu EVT_SWITCH_TO_VIDEO); 26189097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_SWITCH_TO_VIDEO_IN_ON_CREATE, STATE_ENTRANCE_COMPLETE); 26289097f67f988ebba714a95e10369665280db0c27Dake Gu // if the entrance transition is skipped to complete by COND_TRANSITION_NOT_SUPPORTED, we 26389097f67f988ebba714a95e10369665280db0c27Dake Gu // still need to do the switchToVideo. 26489097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_ENTRANCE_COMPLETE, STATE_SWITCH_TO_VIDEO_IN_ON_CREATE, 26589097f67f988ebba714a95e10369665280db0c27Dake Gu EVT_SWITCH_TO_VIDEO); 26689097f67f988ebba714a95e10369665280db0c27Dake Gu 26789097f67f988ebba714a95e10369665280db0c27Dake Gu // for once the view is created in onStart and prepareEntranceTransition was called, we 26889097f67f988ebba714a95e10369665280db0c27Dake Gu // could setEntranceStartState: 26989097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_ENTRANCE_ON_PREPARED, 27089097f67f988ebba714a95e10369665280db0c27Dake Gu STATE_SET_ENTRANCE_START_STATE, EVT_ONSTART); 27189097f67f988ebba714a95e10369665280db0c27Dake Gu 27289097f67f988ebba714a95e10369665280db0c27Dake Gu /** 27389097f67f988ebba714a95e10369665280db0c27Dake Gu * Part 3: onSafeStart() 27489097f67f988ebba714a95e10369665280db0c27Dake Gu */ 27589097f67f988ebba714a95e10369665280db0c27Dake Gu // for onSafeStart: the condition is onStart called, entrance transition complete 27689097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_START, STATE_ON_SAFE_START, EVT_ONSTART); 27789097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_ENTRANCE_COMPLETE, STATE_ON_SAFE_START); 27889097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.addTransition(STATE_ENTER_TRANSITION_COMPLETE, STATE_ON_SAFE_START); 27989097f67f988ebba714a95e10369665280db0c27Dake Gu } 28089097f67f988ebba714a95e10369665280db0c27Dake Gu 28189097f67f988ebba714a95e10369665280db0c27Dake Gu private class SetSelectionRunnable implements Runnable { 28289097f67f988ebba714a95e10369665280db0c27Dake Gu int mPosition; 28389097f67f988ebba714a95e10369665280db0c27Dake Gu boolean mSmooth = true; 28489097f67f988ebba714a95e10369665280db0c27Dake Gu 28589097f67f988ebba714a95e10369665280db0c27Dake Gu SetSelectionRunnable() { 28689097f67f988ebba714a95e10369665280db0c27Dake Gu } 28789097f67f988ebba714a95e10369665280db0c27Dake Gu 28889097f67f988ebba714a95e10369665280db0c27Dake Gu @Override 28989097f67f988ebba714a95e10369665280db0c27Dake Gu public void run() { 29089097f67f988ebba714a95e10369665280db0c27Dake Gu if (mRowsSupportFragment == null) { 29189097f67f988ebba714a95e10369665280db0c27Dake Gu return; 29289097f67f988ebba714a95e10369665280db0c27Dake Gu } 29389097f67f988ebba714a95e10369665280db0c27Dake Gu mRowsSupportFragment.setSelectedPosition(mPosition, mSmooth); 29489097f67f988ebba714a95e10369665280db0c27Dake Gu } 29589097f67f988ebba714a95e10369665280db0c27Dake Gu } 29689097f67f988ebba714a95e10369665280db0c27Dake Gu 29701f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu TransitionListener mEnterTransitionListener = new TransitionListener() { 29801f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu @Override 29901f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu public void onTransitionStart(Object transition) { 30001f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu if (mWaitEnterTransitionTimeout != null) { 30101f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu // cancel task of WaitEnterTransitionTimeout, we will clearPendingEnterTransition 30201f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu // when transition finishes. 30301f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu mWaitEnterTransitionTimeout.mRef.clear(); 30401f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 30501f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 30601f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 30701f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu @Override 30801f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu public void onTransitionCancel(Object transition) { 30989097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.fireEvent(EVT_ENTER_TRANSIITON_DONE); 31001f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 31101f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 31201f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu @Override 31301f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu public void onTransitionEnd(Object transition) { 31489097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.fireEvent(EVT_ENTER_TRANSIITON_DONE); 31501f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 31601f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu }; 31701f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 31801f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu TransitionListener mReturnTransitionListener = new TransitionListener() { 31901f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu @Override 32001f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu public void onTransitionStart(Object transition) { 32101f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu onReturnTransitionStart(); 32201f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 32301f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu }; 32401f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 3254702556bfd15c9819a7b2af759aee0f719cd631fsusnata BrowseFrameLayout mRootView; 326e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu View mBackgroundView; 327e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu Drawable mBackgroundDrawable; 3284702556bfd15c9819a7b2af759aee0f719cd631fsusnata Fragment mVideoSupportFragment; 329e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu DetailsParallax mDetailsParallax; 33099ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas RowsSupportFragment mRowsSupportFragment; 3314702556bfd15c9819a7b2af759aee0f719cd631fsusnata ObjectAdapter mAdapter; 3324702556bfd15c9819a7b2af759aee0f719cd631fsusnata int mContainerListAlignTop; 33399ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas BaseOnItemViewSelectedListener mExternalOnItemViewSelectedListener; 3344702556bfd15c9819a7b2af759aee0f719cd631fsusnata BaseOnItemViewClickedListener mOnItemViewClickedListener; 335e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu DetailsSupportFragmentBackgroundController mDetailsBackgroundController; 33661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 33789097f67f988ebba714a95e10369665280db0c27Dake Gu // A temporarily flag when switchToVideo() is called in onCreate(), if mPendingFocusOnVideo is 33889097f67f988ebba714a95e10369665280db0c27Dake Gu // true, we will focus to VideoSupportFragment immediately after video fragment's view is created. 33989097f67f988ebba714a95e10369665280db0c27Dake Gu boolean mPendingFocusOnVideo = false; 34001f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 34101f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu WaitEnterTransitionTimeout mWaitEnterTransitionTimeout; 34201f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 3434702556bfd15c9819a7b2af759aee0f719cd631fsusnata Object mSceneAfterEntranceTransition; 3443f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 3454702556bfd15c9819a7b2af759aee0f719cd631fsusnata final SetSelectionRunnable mSetSelectionRunnable = new SetSelectionRunnable(); 3463f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 3474702556bfd15c9819a7b2af759aee0f719cd631fsusnata final BaseOnItemViewSelectedListener<Object> mOnItemViewSelectedListener = 34822eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu new BaseOnItemViewSelectedListener<Object>() { 349e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout @Override 350e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, 35122eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu RowPresenter.ViewHolder rowViewHolder, Object row) { 352e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout int position = mRowsSupportFragment.getVerticalGridView().getSelectedPosition(); 3530246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu int subposition = mRowsSupportFragment.getVerticalGridView().getSelectedSubPosition(); 3540246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (DEBUG) Log.v(TAG, "row selected position " + position 3550246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu + " subposition " + subposition); 3560246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu onRowSelected(position, subposition); 357e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout if (mExternalOnItemViewSelectedListener != null) { 358e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout mExternalOnItemViewSelectedListener.onItemSelected(itemViewHolder, item, 359e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout rowViewHolder, row); 360e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } 361e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } 362e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout }; 363e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout 36461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 36561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Sets the list of rows for the fragment. 36661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 36761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void setAdapter(ObjectAdapter adapter) { 36861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mAdapter = adapter; 3690246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu Presenter[] presenters = adapter.getPresenterSelector().getPresenters(); 3700246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (presenters != null) { 3710246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu for (int i = 0; i < presenters.length; i++) { 3720246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu setupPresenter(presenters[i]); 3730246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 3740246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } else { 3750246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu Log.e(TAG, "PresenterSelector.getPresenters() not implemented"); 3760246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 37761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mRowsSupportFragment != null) { 37861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRowsSupportFragment.setAdapter(adapter); 37961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 38061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 38161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 38261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 38361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Returns the list of rows. 38461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 38561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public ObjectAdapter getAdapter() { 38661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mAdapter; 38761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 38861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 38961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 39061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Sets an item selection listener. 39161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 39222eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu public void setOnItemViewSelectedListener(BaseOnItemViewSelectedListener listener) { 393e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout mExternalOnItemViewSelectedListener = listener; 39461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 39561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 39661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 397a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Sets an item clicked listener. 39861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 39922eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu public void setOnItemViewClickedListener(BaseOnItemViewClickedListener listener) { 40076b3441abcfcf1291d865fd4a204c103b637027cDake Gu if (mOnItemViewClickedListener != listener) { 40176b3441abcfcf1291d865fd4a204c103b637027cDake Gu mOnItemViewClickedListener = listener; 40276b3441abcfcf1291d865fd4a204c103b637027cDake Gu if (mRowsSupportFragment != null) { 40376b3441abcfcf1291d865fd4a204c103b637027cDake Gu mRowsSupportFragment.setOnItemViewClickedListener(listener); 40476b3441abcfcf1291d865fd4a204c103b637027cDake Gu } 40561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 40661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 40761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 40861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 409a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Returns the item clicked listener. 41061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 41122eaa9441bf3a521bfafb160674ff2da421eded8Dake Gu public BaseOnItemViewClickedListener getOnItemViewClickedListener() { 41261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mOnItemViewClickedListener; 41361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 41461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 41561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 41661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onCreate(Bundle savedInstanceState) { 41761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu super.onCreate(savedInstanceState); 41861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mContainerListAlignTop = 41961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getDimensionPixelSize(R.dimen.lb_details_rows_align_top); 42001f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 42101f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu FragmentActivity activity = getActivity(); 42201f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu if (activity != null) { 42301f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu Object transition = TransitionHelper.getEnterTransition(activity.getWindow()); 42489097f67f988ebba714a95e10369665280db0c27Dake Gu if (transition == null) { 42589097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.fireEvent(EVT_NO_ENTER_TRANSITION); 42601f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 42701f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu transition = TransitionHelper.getReturnTransition(activity.getWindow()); 42801f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu if (transition != null) { 42901f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu TransitionHelper.addTransitionListener(transition, mReturnTransitionListener); 43001f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 43189097f67f988ebba714a95e10369665280db0c27Dake Gu } else { 43289097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.fireEvent(EVT_NO_ENTER_TRANSITION); 43301f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 43461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 43561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 43661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 43761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public View onCreateView(LayoutInflater inflater, ViewGroup container, 43861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu Bundle savedInstanceState) { 4394702556bfd15c9819a7b2af759aee0f719cd631fsusnata mRootView = (BrowseFrameLayout) inflater.inflate( 4404702556bfd15c9819a7b2af759aee0f719cd631fsusnata R.layout.lb_details_fragment, container, false); 441e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu mBackgroundView = mRootView.findViewById(R.id.details_background_view); 442e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu if (mBackgroundView != null) { 443e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu mBackgroundView.setBackground(mBackgroundDrawable); 444e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu } 44561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRowsSupportFragment = (RowsSupportFragment) getChildFragmentManager().findFragmentById( 446e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout R.id.details_rows_dock); 44761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mRowsSupportFragment == null) { 44861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRowsSupportFragment = new RowsSupportFragment(); 44961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getChildFragmentManager().beginTransaction() 450e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout .replace(R.id.details_rows_dock, mRowsSupportFragment).commit(); 45161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 4525bcc058bb1aed2e88b38009e83084554cf2cd86bDake Gu installTitleView(inflater, mRootView, savedInstanceState); 45361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRowsSupportFragment.setAdapter(mAdapter); 45476b3441abcfcf1291d865fd4a204c103b637027cDake Gu mRowsSupportFragment.setOnItemViewSelectedListener(mOnItemViewSelectedListener); 45561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRowsSupportFragment.setOnItemViewClickedListener(mOnItemViewClickedListener); 456e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout 4574702556bfd15c9819a7b2af759aee0f719cd631fsusnata mSceneAfterEntranceTransition = TransitionHelper.createScene(mRootView, new Runnable() { 4583f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 4593f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void run() { 4603f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mRowsSupportFragment.setEntranceTransitionState(true); 4613f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 4623f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu }); 4634702556bfd15c9819a7b2af759aee0f719cd631fsusnata 46434b46f02a89224481777e7de93d6e22e45e41e96Dake Gu setupDpadNavigation(); 46534b46f02a89224481777e7de93d6e22e45e41e96Dake Gu 46634b46f02a89224481777e7de93d6e22e45e41e96Dake Gu if (Build.VERSION.SDK_INT >= 21) { 46734b46f02a89224481777e7de93d6e22e45e41e96Dake Gu // Setup adapter listener to work with ParallaxTransition (>= API 21). 46834b46f02a89224481777e7de93d6e22e45e41e96Dake Gu mRowsSupportFragment.setExternalAdapterListener(new ItemBridgeAdapter.AdapterListener() { 46934b46f02a89224481777e7de93d6e22e45e41e96Dake Gu @Override 47034b46f02a89224481777e7de93d6e22e45e41e96Dake Gu public void onCreate(ItemBridgeAdapter.ViewHolder vh) { 471e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu if (mDetailsParallax != null && vh.getViewHolder() 47234b46f02a89224481777e7de93d6e22e45e41e96Dake Gu instanceof FullWidthDetailsOverviewRowPresenter.ViewHolder) { 47334b46f02a89224481777e7de93d6e22e45e41e96Dake Gu FullWidthDetailsOverviewRowPresenter.ViewHolder rowVh = 47434b46f02a89224481777e7de93d6e22e45e41e96Dake Gu (FullWidthDetailsOverviewRowPresenter.ViewHolder) 47534b46f02a89224481777e7de93d6e22e45e41e96Dake Gu vh.getViewHolder(); 47634b46f02a89224481777e7de93d6e22e45e41e96Dake Gu rowVh.getOverviewView().setTag(R.id.lb_parallax_source, 477e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu mDetailsParallax); 47834b46f02a89224481777e7de93d6e22e45e41e96Dake Gu } 47934b46f02a89224481777e7de93d6e22e45e41e96Dake Gu } 48034b46f02a89224481777e7de93d6e22e45e41e96Dake Gu }); 48134b46f02a89224481777e7de93d6e22e45e41e96Dake Gu } 4824702556bfd15c9819a7b2af759aee0f719cd631fsusnata return mRootView; 48361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 48461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 4850246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu /** 486a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu * @deprecated override {@link #onInflateTitleView(LayoutInflater,ViewGroup,Bundle)} instead. 4870246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu */ 488a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu @Deprecated 4890246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu protected View inflateTitle(LayoutInflater inflater, ViewGroup parent, 4900246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu Bundle savedInstanceState) { 491a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu return super.onInflateTitleView(inflater, parent, savedInstanceState); 492a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu } 493a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu 494a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu @Override 495a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu public View onInflateTitleView(LayoutInflater inflater, ViewGroup parent, 496a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu Bundle savedInstanceState) { 497a373804d10f93a9488adc35cf6ce44dce09b3778Dake Gu return inflateTitle(inflater, parent, savedInstanceState); 4980246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 4990246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 50061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu void setVerticalGridViewLayout(VerticalGridView listview) { 50161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // align the top edge of item to a fixed position 5020246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu listview.setItemAlignmentOffset(-mContainerListAlignTop); 50361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setItemAlignmentOffsetPercent(VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED); 5040246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu listview.setWindowAlignmentOffset(0); 50561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setWindowAlignmentOffsetPercent(VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED); 50661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE); 50761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 50861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 5090246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu /** 5104702556bfd15c9819a7b2af759aee0f719cd631fsusnata * Called to setup each Presenter of Adapter passed in {@link #setAdapter(ObjectAdapter)}.Note 5114702556bfd15c9819a7b2af759aee0f719cd631fsusnata * that setup should only change the Presenter behavior that is meaningful in DetailsSupportFragment. 5124702556bfd15c9819a7b2af759aee0f719cd631fsusnata * For example how a row is aligned in details Fragment. The default implementation invokes 5130246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link #setupDetailsOverviewRowPresenter(FullWidthDetailsOverviewRowPresenter)} 51499ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas * 5150246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu */ 5160246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu protected void setupPresenter(Presenter rowPresenter) { 5170246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (rowPresenter instanceof FullWidthDetailsOverviewRowPresenter) { 5180246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu setupDetailsOverviewRowPresenter((FullWidthDetailsOverviewRowPresenter) rowPresenter); 5190246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 5200246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 5210246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 5220246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu /** 5230246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * Called to setup {@link FullWidthDetailsOverviewRowPresenter}. The default implementation 524c9a859537b0871f84afeeb706a5b425fe3f2b4ddAurimas Liutikas * adds two alignment positions({@link ItemAlignmentFacet}) for ViewHolder of 5250246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * FullWidthDetailsOverviewRowPresenter to align in fragment. 5260246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu */ 5270246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu protected void setupDetailsOverviewRowPresenter(FullWidthDetailsOverviewRowPresenter presenter) { 5280246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ItemAlignmentFacet facet = new ItemAlignmentFacet(); 5290246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu // by default align details_frame to half window height 5300246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ItemAlignmentFacet.ItemAlignmentDef alignDef1 = new ItemAlignmentFacet.ItemAlignmentDef(); 5310246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef1.setItemAlignmentViewId(R.id.details_frame); 5320246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef1.setItemAlignmentOffset(- getResources() 5330246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu .getDimensionPixelSize(R.dimen.lb_details_v2_align_pos_for_actions)); 5340246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef1.setItemAlignmentOffsetPercent(0); 5350246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu // when description is selected, align details_frame to top edge 5360246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ItemAlignmentFacet.ItemAlignmentDef alignDef2 = new ItemAlignmentFacet.ItemAlignmentDef(); 5370246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef2.setItemAlignmentViewId(R.id.details_frame); 5380246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef2.setItemAlignmentFocusViewId(R.id.details_overview_description); 5390246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef2.setItemAlignmentOffset(- getResources() 5400246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu .getDimensionPixelSize(R.dimen.lb_details_v2_align_pos_for_description)); 5410246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu alignDef2.setItemAlignmentOffsetPercent(0); 5420246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ItemAlignmentFacet.ItemAlignmentDef[] defs = 5430246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu new ItemAlignmentFacet.ItemAlignmentDef[] {alignDef1, alignDef2}; 5440246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu facet.setAlignmentDefs(defs); 5450246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu presenter.setFacet(ItemAlignmentFacet.class, facet); 5460246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 5470246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 54861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu VerticalGridView getVerticalGridView() { 54961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mRowsSupportFragment == null ? null : mRowsSupportFragment.getVerticalGridView(); 55061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 55161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 55260f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu /** 55360f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu * Gets embedded RowsSupportFragment showing multiple rows for DetailsSupportFragment. If view of 55460f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu * DetailsSupportFragment is not created, the method returns null. 55560f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu * @return Embedded RowsSupportFragment showing multiple rows for DetailsSupportFragment. 55660f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu */ 55760f531e3d9667db9afe091f5a7979410eb7a0b48Dake Gu public RowsSupportFragment getRowsSupportFragment() { 55861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mRowsSupportFragment; 55961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 56061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 56161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 56261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Setup dimensions that are only meaningful when the child Fragments are inside 56361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * DetailsSupportFragment. 56461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 56561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void setupChildFragmentLayout() { 56661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu setVerticalGridViewLayout(mRowsSupportFragment.getVerticalGridView()); 56761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 56861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 5693f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu /** 5703f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Sets the selected row position with smooth animation. 5713f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 5723f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void setSelectedPosition(int position) { 5733f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu setSelectedPosition(position, true); 5743f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 5753f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 5763f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu /** 5773f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Sets the selected row position. 5783f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 5793f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void setSelectedPosition(int position, boolean smooth) { 5803f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mSetSelectionRunnable.mPosition = position; 5813f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mSetSelectionRunnable.mSmooth = smooth; 5823f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu if (getView() != null && getView().getHandler() != null) { 5833f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu getView().getHandler().post(mSetSelectionRunnable); 5843f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 5853f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 5863f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 58789097f67f988ebba714a95e10369665280db0c27Dake Gu void switchToVideo() { 58889097f67f988ebba714a95e10369665280db0c27Dake Gu if (mVideoSupportFragment != null && mVideoSupportFragment.getView() != null) { 58989097f67f988ebba714a95e10369665280db0c27Dake Gu mVideoSupportFragment.getView().requestFocus(); 59089097f67f988ebba714a95e10369665280db0c27Dake Gu } else { 59189097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.fireEvent(EVT_SWITCH_TO_VIDEO); 59289097f67f988ebba714a95e10369665280db0c27Dake Gu } 59389097f67f988ebba714a95e10369665280db0c27Dake Gu } 59489097f67f988ebba714a95e10369665280db0c27Dake Gu 59589097f67f988ebba714a95e10369665280db0c27Dake Gu void switchToRows() { 59689097f67f988ebba714a95e10369665280db0c27Dake Gu mPendingFocusOnVideo = false; 59789097f67f988ebba714a95e10369665280db0c27Dake Gu VerticalGridView verticalGridView = getVerticalGridView(); 59889097f67f988ebba714a95e10369665280db0c27Dake Gu if (verticalGridView != null && verticalGridView.getChildCount() > 0) { 59989097f67f988ebba714a95e10369665280db0c27Dake Gu verticalGridView.requestFocus(); 60089097f67f988ebba714a95e10369665280db0c27Dake Gu } 60189097f67f988ebba714a95e10369665280db0c27Dake Gu } 60289097f67f988ebba714a95e10369665280db0c27Dake Gu 6034702556bfd15c9819a7b2af759aee0f719cd631fsusnata /** 604e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * This method asks DetailsSupportFragmentBackgroundController to add a fragment for rendering video. 605e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * In case the fragment is already there, it will return the existing one. The method must be 606e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * called after calling super.onCreate(). App usually does not call this method directly. 6074702556bfd15c9819a7b2af759aee0f719cd631fsusnata * 6084702556bfd15c9819a7b2af759aee0f719cd631fsusnata * @return Fragment the added or restored fragment responsible for rendering video. 609e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * @see DetailsSupportFragmentBackgroundController#onCreateVideoSupportFragment() 6104702556bfd15c9819a7b2af759aee0f719cd631fsusnata */ 611e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu final Fragment findOrCreateVideoSupportFragment() { 6123bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu if (mVideoSupportFragment != null) { 6133bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu return mVideoSupportFragment; 6143bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 615e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu Fragment fragment = getChildFragmentManager() 616e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu .findFragmentById(R.id.video_surface_container); 617e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu if (fragment == null && mDetailsBackgroundController != null) { 618e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu FragmentTransaction ft2 = getChildFragmentManager().beginTransaction(); 6194702556bfd15c9819a7b2af759aee0f719cd631fsusnata ft2.add(android.support.v17.leanback.R.id.video_surface_container, 620e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu fragment = mDetailsBackgroundController.onCreateVideoSupportFragment()); 6214702556bfd15c9819a7b2af759aee0f719cd631fsusnata ft2.commit(); 62289097f67f988ebba714a95e10369665280db0c27Dake Gu if (mPendingFocusOnVideo) { 62389097f67f988ebba714a95e10369665280db0c27Dake Gu // wait next cycle for Fragment view created so we can focus on it. 62489097f67f988ebba714a95e10369665280db0c27Dake Gu // This is a bit hack eventually we will do commitNow() which get view immediately. 62589097f67f988ebba714a95e10369665280db0c27Dake Gu getView().post(new Runnable() { 626905bcd294a7351749c60382eab03aa0c679e08bbAlan Viverette @Override 62789097f67f988ebba714a95e10369665280db0c27Dake Gu public void run() { 62889097f67f988ebba714a95e10369665280db0c27Dake Gu if (getView() != null) { 62989097f67f988ebba714a95e10369665280db0c27Dake Gu switchToVideo(); 63089097f67f988ebba714a95e10369665280db0c27Dake Gu } 63189097f67f988ebba714a95e10369665280db0c27Dake Gu mPendingFocusOnVideo = false; 63289097f67f988ebba714a95e10369665280db0c27Dake Gu } 63389097f67f988ebba714a95e10369665280db0c27Dake Gu }); 63489097f67f988ebba714a95e10369665280db0c27Dake Gu } 6354702556bfd15c9819a7b2af759aee0f719cd631fsusnata } 6364702556bfd15c9819a7b2af759aee0f719cd631fsusnata mVideoSupportFragment = fragment; 6374702556bfd15c9819a7b2af759aee0f719cd631fsusnata return mVideoSupportFragment; 6384702556bfd15c9819a7b2af759aee0f719cd631fsusnata } 6394702556bfd15c9819a7b2af759aee0f719cd631fsusnata 64099ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas void onRowSelected(int selectedPosition, int selectedSubPosition) { 6410246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ObjectAdapter adapter = getAdapter(); 6425bcc058bb1aed2e88b38009e83084554cf2cd86bDake Gu if (( mRowsSupportFragment != null && mRowsSupportFragment.getView() != null 64389097f67f988ebba714a95e10369665280db0c27Dake Gu && mRowsSupportFragment.getView().hasFocus() && !mPendingFocusOnVideo) 6445bcc058bb1aed2e88b38009e83084554cf2cd86bDake Gu && (adapter == null || adapter.size() == 0 6455bcc058bb1aed2e88b38009e83084554cf2cd86bDake Gu || (getVerticalGridView().getSelectedPosition() == 0 6465bcc058bb1aed2e88b38009e83084554cf2cd86bDake Gu && getVerticalGridView().getSelectedSubPosition() == 0))) { 647e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout showTitle(true); 648e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } else { 649e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout showTitle(false); 650e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } 6510246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (adapter != null && adapter.size() > selectedPosition) { 6520246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu final VerticalGridView gridView = getVerticalGridView(); 6530246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu final int count = gridView.getChildCount(); 65489097f67f988ebba714a95e10369665280db0c27Dake Gu if (count > 0) { 65589097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.fireEvent(EVT_DETAILS_ROW_LOADED); 65601f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 6570246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu for (int i = 0; i < count; i++) { 6580246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu ItemBridgeAdapter.ViewHolder bridgeViewHolder = (ItemBridgeAdapter.ViewHolder) 6590246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu gridView.getChildViewHolder(gridView.getChildAt(i)); 6600246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu RowPresenter rowPresenter = (RowPresenter) bridgeViewHolder.getPresenter(); 6610246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu onSetRowStatus(rowPresenter, 6620246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu rowPresenter.getRowViewHolder(bridgeViewHolder.getViewHolder()), 6630246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu bridgeViewHolder.getAdapterPosition(), 6640246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu selectedPosition, selectedSubPosition); 6650246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 6660246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 6670246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 6680246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 66901f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu /** 67001f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu * Called when onStart and enter transition (postponed/none postponed) and entrance transition 67101f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu * are all finished. 67201f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu */ 67301f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu @CallSuper 67401f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu void onSafeStart() { 67501f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu if (mDetailsBackgroundController != null) { 676f37579e64940bfdd642cc315f6347d60b5addd69Dake Gu mDetailsBackgroundController.onStart(); 67701f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 67801f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 67901f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 68001f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu @CallSuper 68101f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu void onReturnTransitionStart() { 68201f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu if (mDetailsBackgroundController != null) { 68301f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu // first disable parallax effect that auto-start PlaybackGlue. 68401f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu boolean isVideoVisible = mDetailsBackgroundController.disableVideoParallax(); 68501f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu // if video is not visible we can safely remove VideoSupportFragment, 68601f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu // otherwise let video playing during return transition. 68701f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu if (!isVideoVisible && mVideoSupportFragment != null) { 68801f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu FragmentTransaction ft2 = getChildFragmentManager().beginTransaction(); 68901f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu ft2.remove(mVideoSupportFragment); 69001f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu ft2.commit(); 69101f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu mVideoSupportFragment = null; 69201f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 69301f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 69401f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu } 69501f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 6963961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu @Override 6973961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu public void onStop() { 6983961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu if (mDetailsBackgroundController != null) { 6993961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu mDetailsBackgroundController.onStop(); 7003961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu } 7013961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu super.onStop(); 7023961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu } 7033961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 7040246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu /** 7050246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * Called on every visible row to change view status when current selected row position 7060246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * or selected sub position changed. Subclass may override. The default 7070246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * implementation calls {@link #onSetDetailsOverviewRowStatus(FullWidthDetailsOverviewRowPresenter, 7080246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int)} if presenter is 7090246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * instance of {@link FullWidthDetailsOverviewRowPresenter}. 7100246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * 7110246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param presenter The presenter used to create row ViewHolder. 7120246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param viewHolder The visible (attached) row ViewHolder, note that it may or may not 7130246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * be selected. 7140246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param adapterPosition The adapter position of viewHolder inside adapter. 7150246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param selectedPosition The adapter position of currently selected row. 7160246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param selectedSubPosition The sub position within currently selected row. This is used 7170246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * When a row has multiple alignment positions. 7180246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu */ 7190246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu protected void onSetRowStatus(RowPresenter presenter, RowPresenter.ViewHolder viewHolder, int 7200246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu adapterPosition, int selectedPosition, int selectedSubPosition) { 7210246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (presenter instanceof FullWidthDetailsOverviewRowPresenter) { 7220246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu onSetDetailsOverviewRowStatus((FullWidthDetailsOverviewRowPresenter) presenter, 7230246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu (FullWidthDetailsOverviewRowPresenter.ViewHolder) viewHolder, 7240246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu adapterPosition, selectedPosition, selectedSubPosition); 7250246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 7260246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 7270246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 7280246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu /** 7290246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * Called to change DetailsOverviewRow view status when current selected row position 7300246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * or selected sub position changed. Subclass may override. The default 7310246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * implementation switches between three states based on the positions: 7320246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link FullWidthDetailsOverviewRowPresenter#STATE_HALF}, 7330246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link FullWidthDetailsOverviewRowPresenter#STATE_FULL} and 7340246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * {@link FullWidthDetailsOverviewRowPresenter#STATE_SMALL}. 7350246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * 7360246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param presenter The presenter used to create row ViewHolder. 7370246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param viewHolder The visible (attached) row ViewHolder, note that it may or may not 7380246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * be selected. 7390246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param adapterPosition The adapter position of viewHolder inside adapter. 7400246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param selectedPosition The adapter position of currently selected row. 7410246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * @param selectedSubPosition The sub position within currently selected row. This is used 7420246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu * When a row has multiple alignment positions. 7430246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu */ 7440246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu protected void onSetDetailsOverviewRowStatus(FullWidthDetailsOverviewRowPresenter presenter, 7450246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu FullWidthDetailsOverviewRowPresenter.ViewHolder viewHolder, int adapterPosition, 7460246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu int selectedPosition, int selectedSubPosition) { 7470246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu if (selectedPosition > adapterPosition) { 7480246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu presenter.setState(viewHolder, FullWidthDetailsOverviewRowPresenter.STATE_HALF); 7490246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } else if (selectedPosition == adapterPosition && selectedSubPosition == 1) { 7500246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu presenter.setState(viewHolder, FullWidthDetailsOverviewRowPresenter.STATE_HALF); 7510246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } else if (selectedPosition == adapterPosition && selectedSubPosition == 0){ 7520246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu presenter.setState(viewHolder, FullWidthDetailsOverviewRowPresenter.STATE_FULL); 7530246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } else { 7540246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu presenter.setState(viewHolder, 7550246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu FullWidthDetailsOverviewRowPresenter.STATE_SMALL); 7560246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu } 757e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout } 758e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stout 75961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 76061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onStart() { 76161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu super.onStart(); 76201f4dd4a9bc3b80d3ddecc0264facbf6abfc1cc3Dake Gu 76361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu setupChildFragmentLayout(); 76489097f67f988ebba714a95e10369665280db0c27Dake Gu mStateMachine.fireEvent(EVT_ONSTART); 765e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu if (mDetailsParallax != null) { 766e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu mDetailsParallax.setRecyclerView(mRowsSupportFragment.getVerticalGridView()); 7670908efd712e79f77e0cf9307bd5c32753c855561Dake Gu } 76889097f67f988ebba714a95e10369665280db0c27Dake Gu if (mPendingFocusOnVideo) { 76989097f67f988ebba714a95e10369665280db0c27Dake Gu slideOutGridView(); 77089097f67f988ebba714a95e10369665280db0c27Dake Gu } else if (!getView().hasFocus()) { 7716525e063fbbd691a8553f4fc77f3960f93bea34dDake Gu mRowsSupportFragment.getVerticalGridView().requestFocus(); 7726525e063fbbd691a8553f4fc77f3960f93bea34dDake Gu } 7733f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 7743f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 7753f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 7763f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu protected Object createEntranceTransition() { 7772452cde3b8d7cbe62f6eb2fbcbcf9a02448d6891Dake Gu return TransitionHelper.loadTransition(getContext(), 7783f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu R.transition.lb_details_enter_transition); 7793f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 7803f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 7813f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 7823f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu protected void runEntranceTransition(Object entranceTransition) { 7838403619efebe94666c0615c3fc85080a303acf80Dake Gu TransitionHelper.runTransition(mSceneAfterEntranceTransition, entranceTransition); 7843f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 7853f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 7863f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 7873f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu protected void onEntranceTransitionEnd() { 7883f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mRowsSupportFragment.onTransitionEnd(); 78961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 7900246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu 79160751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu @Override 79260751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu protected void onEntranceTransitionPrepare() { 79360751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu mRowsSupportFragment.onTransitionPrepare(); 79460751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu } 79560751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu 79660751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu @Override 79760751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu protected void onEntranceTransitionStart() { 79860751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu mRowsSupportFragment.onTransitionStart(); 79960751b437df43b5c6b72dd3fc9f4c341a707c8d4Dake Gu } 800180dc4030628425a8081fe058bdc1d529c505ae8susnata 801180dc4030628425a8081fe058bdc1d529c505ae8susnata /** 802e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * Returns the {@link DetailsParallax} instance used by 803e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * {@link DetailsSupportFragmentBackgroundController} to configure parallax effect of background and 804e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * control embedded video playback. App usually does not use this method directly. 805e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * App may use this method for other custom parallax tasks. 8060908efd712e79f77e0cf9307bd5c32753c855561Dake Gu * 807e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * @return The DetailsParallax instance attached to the DetailsSupportFragment. 8080908efd712e79f77e0cf9307bd5c32753c855561Dake Gu */ 809e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu public DetailsParallax getParallax() { 810e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu if (mDetailsParallax == null) { 811e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu mDetailsParallax = new DetailsParallax(); 81234b46f02a89224481777e7de93d6e22e45e41e96Dake Gu if (mRowsSupportFragment != null && mRowsSupportFragment.getView() != null) { 813e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu mDetailsParallax.setRecyclerView(mRowsSupportFragment.getVerticalGridView()); 8140908efd712e79f77e0cf9307bd5c32753c855561Dake Gu } 815180dc4030628425a8081fe058bdc1d529c505ae8susnata } 816e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu return mDetailsParallax; 817180dc4030628425a8081fe058bdc1d529c505ae8susnata } 8184702556bfd15c9819a7b2af759aee0f719cd631fsusnata 8194702556bfd15c9819a7b2af759aee0f719cd631fsusnata /** 820e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * Set background drawable shown below foreground rows UI and above 821e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * {@link #findOrCreateVideoSupportFragment()}. 8220908efd712e79f77e0cf9307bd5c32753c855561Dake Gu * 823e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * @see DetailsSupportFragmentBackgroundController 8240908efd712e79f77e0cf9307bd5c32753c855561Dake Gu */ 825e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu void setBackgroundDrawable(Drawable drawable) { 826e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu if (mBackgroundView != null) { 827e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu mBackgroundView.setBackground(drawable); 828e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu } 829e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu mBackgroundDrawable = drawable; 8300908efd712e79f77e0cf9307bd5c32753c855561Dake Gu } 8310908efd712e79f77e0cf9307bd5c32753c855561Dake Gu 8320908efd712e79f77e0cf9307bd5c32753c855561Dake Gu /** 8334702556bfd15c9819a7b2af759aee0f719cd631fsusnata * This method does the following 8344702556bfd15c9819a7b2af759aee0f719cd631fsusnata * <ul> 8354702556bfd15c9819a7b2af759aee0f719cd631fsusnata * <li>sets up focus search handling logic in the root view to enable transitioning between 8364702556bfd15c9819a7b2af759aee0f719cd631fsusnata * half screen/full screen/no video mode.</li> 8374702556bfd15c9819a7b2af759aee0f719cd631fsusnata * 8384702556bfd15c9819a7b2af759aee0f719cd631fsusnata * <li>Sets up the key listener in the root view to intercept events like UP/DOWN and 8394702556bfd15c9819a7b2af759aee0f719cd631fsusnata * transition to appropriate mode like half/full screen video.</li> 8404702556bfd15c9819a7b2af759aee0f719cd631fsusnata * </ul> 8414702556bfd15c9819a7b2af759aee0f719cd631fsusnata */ 84234b46f02a89224481777e7de93d6e22e45e41e96Dake Gu void setupDpadNavigation() { 8439869eb38607552105baa88a0fcba610461045eb5Dake Gu mRootView.setOnChildFocusListener(new BrowseFrameLayout.OnChildFocusListener() { 8449869eb38607552105baa88a0fcba610461045eb5Dake Gu 8459869eb38607552105baa88a0fcba610461045eb5Dake Gu @Override 8469869eb38607552105baa88a0fcba610461045eb5Dake Gu public boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) { 8479869eb38607552105baa88a0fcba610461045eb5Dake Gu return false; 8489869eb38607552105baa88a0fcba610461045eb5Dake Gu } 8499869eb38607552105baa88a0fcba610461045eb5Dake Gu 8509869eb38607552105baa88a0fcba610461045eb5Dake Gu @Override 8519869eb38607552105baa88a0fcba610461045eb5Dake Gu public void onRequestChildFocus(View child, View focused) { 8529869eb38607552105baa88a0fcba610461045eb5Dake Gu if (child != mRootView.getFocusedChild()) { 8539869eb38607552105baa88a0fcba610461045eb5Dake Gu if (child.getId() == R.id.details_fragment_root) { 85489097f67f988ebba714a95e10369665280db0c27Dake Gu if (!mPendingFocusOnVideo) { 85589097f67f988ebba714a95e10369665280db0c27Dake Gu slideInGridView(); 85689097f67f988ebba714a95e10369665280db0c27Dake Gu showTitle(true); 85789097f67f988ebba714a95e10369665280db0c27Dake Gu } 8589869eb38607552105baa88a0fcba610461045eb5Dake Gu } else if (child.getId() == R.id.video_surface_container) { 8599869eb38607552105baa88a0fcba610461045eb5Dake Gu slideOutGridView(); 8609869eb38607552105baa88a0fcba610461045eb5Dake Gu showTitle(false); 8619869eb38607552105baa88a0fcba610461045eb5Dake Gu } else { 8629869eb38607552105baa88a0fcba610461045eb5Dake Gu showTitle(true); 8639869eb38607552105baa88a0fcba610461045eb5Dake Gu } 8649869eb38607552105baa88a0fcba610461045eb5Dake Gu } 8659869eb38607552105baa88a0fcba610461045eb5Dake Gu } 8669869eb38607552105baa88a0fcba610461045eb5Dake Gu }); 8674702556bfd15c9819a7b2af759aee0f719cd631fsusnata mRootView.setOnFocusSearchListener(new BrowseFrameLayout.OnFocusSearchListener() { 8684702556bfd15c9819a7b2af759aee0f719cd631fsusnata @Override 8694702556bfd15c9819a7b2af759aee0f719cd631fsusnata public View onFocusSearch(View focused, int direction) { 8704702556bfd15c9819a7b2af759aee0f719cd631fsusnata if (mRowsSupportFragment.getVerticalGridView() != null 8714702556bfd15c9819a7b2af759aee0f719cd631fsusnata && mRowsSupportFragment.getVerticalGridView().hasFocus()) { 8724702556bfd15c9819a7b2af759aee0f719cd631fsusnata if (direction == View.FOCUS_UP) { 873f87eb1d84dfee2f1be9ea326754829b1eff4967fDake Gu if (mDetailsBackgroundController != null 874f87eb1d84dfee2f1be9ea326754829b1eff4967fDake Gu && mDetailsBackgroundController.canNavigateToVideoSupportFragment() 875f87eb1d84dfee2f1be9ea326754829b1eff4967fDake Gu && mVideoSupportFragment != null && mVideoSupportFragment.getView() != null) { 8765bcc058bb1aed2e88b38009e83084554cf2cd86bDake Gu return mVideoSupportFragment.getView(); 8779869eb38607552105baa88a0fcba610461045eb5Dake Gu } else if (getTitleView() != null && getTitleView().hasFocusable()) { 8785bcc058bb1aed2e88b38009e83084554cf2cd86bDake Gu return getTitleView(); 8795bcc058bb1aed2e88b38009e83084554cf2cd86bDake Gu } 8804702556bfd15c9819a7b2af759aee0f719cd631fsusnata } 8815bcc058bb1aed2e88b38009e83084554cf2cd86bDake Gu } else if (getTitleView() != null && getTitleView().hasFocus()) { 8825bcc058bb1aed2e88b38009e83084554cf2cd86bDake Gu if (direction == View.FOCUS_DOWN) { 8835bcc058bb1aed2e88b38009e83084554cf2cd86bDake Gu if (mRowsSupportFragment.getVerticalGridView() != null) { 8845bcc058bb1aed2e88b38009e83084554cf2cd86bDake Gu return mRowsSupportFragment.getVerticalGridView(); 8855bcc058bb1aed2e88b38009e83084554cf2cd86bDake Gu } 8864702556bfd15c9819a7b2af759aee0f719cd631fsusnata } 8874702556bfd15c9819a7b2af759aee0f719cd631fsusnata } 8884702556bfd15c9819a7b2af759aee0f719cd631fsusnata return focused; 8894702556bfd15c9819a7b2af759aee0f719cd631fsusnata } 8904702556bfd15c9819a7b2af759aee0f719cd631fsusnata }); 8914702556bfd15c9819a7b2af759aee0f719cd631fsusnata 8929869eb38607552105baa88a0fcba610461045eb5Dake Gu // If we press BACK on remote while in full screen video mode, we should 8934702556bfd15c9819a7b2af759aee0f719cd631fsusnata // transition back to half screen video playback mode. 8944702556bfd15c9819a7b2af759aee0f719cd631fsusnata mRootView.setOnDispatchKeyListener(new View.OnKeyListener() { 8954702556bfd15c9819a7b2af759aee0f719cd631fsusnata @Override 8964702556bfd15c9819a7b2af759aee0f719cd631fsusnata public boolean onKey(View v, int keyCode, KeyEvent event) { 8974702556bfd15c9819a7b2af759aee0f719cd631fsusnata // This is used to check if we are in full screen video mode. This is somewhat 8984702556bfd15c9819a7b2af759aee0f719cd631fsusnata // hacky and relies on the behavior of the video helper class to update the 8994702556bfd15c9819a7b2af759aee0f719cd631fsusnata // focusability of the video surface view. 9000908efd712e79f77e0cf9307bd5c32753c855561Dake Gu if (mVideoSupportFragment != null && mVideoSupportFragment.getView() != null 9010908efd712e79f77e0cf9307bd5c32753c855561Dake Gu && mVideoSupportFragment.getView().hasFocus()) { 9029869eb38607552105baa88a0fcba610461045eb5Dake Gu if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_ESCAPE) { 90389097f67f988ebba714a95e10369665280db0c27Dake Gu if (getVerticalGridView().getChildCount() > 0) { 90489097f67f988ebba714a95e10369665280db0c27Dake Gu getVerticalGridView().requestFocus(); 90589097f67f988ebba714a95e10369665280db0c27Dake Gu return true; 90689097f67f988ebba714a95e10369665280db0c27Dake Gu } 9074702556bfd15c9819a7b2af759aee0f719cd631fsusnata } 9084702556bfd15c9819a7b2af759aee0f719cd631fsusnata } 9094702556bfd15c9819a7b2af759aee0f719cd631fsusnata 9104702556bfd15c9819a7b2af759aee0f719cd631fsusnata return false; 9114702556bfd15c9819a7b2af759aee0f719cd631fsusnata } 9124702556bfd15c9819a7b2af759aee0f719cd631fsusnata }); 9134702556bfd15c9819a7b2af759aee0f719cd631fsusnata } 9144702556bfd15c9819a7b2af759aee0f719cd631fsusnata 9154702556bfd15c9819a7b2af759aee0f719cd631fsusnata /** 9164702556bfd15c9819a7b2af759aee0f719cd631fsusnata * Slides vertical grid view (displaying media item details) out of the screen from below. 9174702556bfd15c9819a7b2af759aee0f719cd631fsusnata */ 9184702556bfd15c9819a7b2af759aee0f719cd631fsusnata void slideOutGridView() { 9199869eb38607552105baa88a0fcba610461045eb5Dake Gu if (getVerticalGridView() != null) { 9209869eb38607552105baa88a0fcba610461045eb5Dake Gu getVerticalGridView().animateOut(); 9219869eb38607552105baa88a0fcba610461045eb5Dake Gu } 9224702556bfd15c9819a7b2af759aee0f719cd631fsusnata } 9234702556bfd15c9819a7b2af759aee0f719cd631fsusnata 9245c05fc026b77c6387917560f8dbbbd4bff13bbf9Dake Gu void slideInGridView() { 9255c05fc026b77c6387917560f8dbbbd4bff13bbf9Dake Gu if (getVerticalGridView() != null) { 9265c05fc026b77c6387917560f8dbbbd4bff13bbf9Dake Gu getVerticalGridView().animateIn(); 9275c05fc026b77c6387917560f8dbbbd4bff13bbf9Dake Gu } 9285c05fc026b77c6387917560f8dbbbd4bff13bbf9Dake Gu } 92961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu} 930