13f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu/* This file is auto-generated from BaseFragment.java. DO NOT MODIFY. */ 23f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 33f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu/* 43f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Copyright (C) 2014 The Android Open Source Project 53f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * 63f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 73f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * in compliance with the License. You may obtain a copy of the License at 83f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * 93f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * http://www.apache.org/licenses/LICENSE-2.0 103f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * 113f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Unless required by applicable law or agreed to in writing, software distributed under the License 123f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 133f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * or implied. See the License for the specific language governing permissions and limitations under 143f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * the License. 153f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 163f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gupackage android.support.v17.leanback.app; 173f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 183f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Guimport android.os.Bundle; 193f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Guimport android.support.v17.leanback.R; 203f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Guimport android.support.v17.leanback.transition.TransitionHelper; 213f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Guimport android.support.v17.leanback.transition.TransitionListener; 223f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Guimport android.view.View; 233f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Guimport android.view.ViewTreeObserver; 243f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 253f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu/** 263f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * @hide 273f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 28e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stoutclass BaseSupportFragment extends BrandedSupportFragment { 293f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 303f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu private boolean mEntranceTransitionEnabled = false; 313f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu private boolean mStartEntranceTransitionPending = false; 32902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu private boolean mEntranceTransitionPreparePending = false; 333f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu private Object mEntranceTransition; 343f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 353f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu static TransitionHelper sTransitionHelper = TransitionHelper.getInstance(); 363f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 373f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 383f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void onViewCreated(View view, Bundle savedInstanceState) { 393f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu super.onViewCreated(view, savedInstanceState); 40902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu if (mEntranceTransitionPreparePending) { 41902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu mEntranceTransitionPreparePending = false; 42902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu onEntranceTransitionPrepare(); 43902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu } 443f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu if (mStartEntranceTransitionPending) { 453f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mStartEntranceTransitionPending = false; 463f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu startEntranceTransition(); 473f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 483f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 493f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 503f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu /** 513f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Enables entrance transition.<p> 523f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Entrance transition is the standard slide-in transition that shows rows of data in 533f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * browse screen and details screen. 543f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * <p> 55572ed31d757c2635ea0a5cdd7ec8a33cd16f77b7Dake Gu * The method is ignored before LOLLIPOP (API21). 56572ed31d757c2635ea0a5cdd7ec8a33cd16f77b7Dake Gu * <p> 573f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * This method must be called in or 583f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * before onCreate(). Typically entrance transition should be enabled when savedInstance is 593f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * null so that fragment restored from instanceState does not run an extra entrance transition. 603f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * When the entrance transition is enabled, the fragment will make headers and content 613f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * hidden initially. 623f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * When data of rows are ready, app must call {@link #startEntranceTransition()} to kick off 633f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * the transition, otherwise the rows will be invisible forever. 643f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * <p> 653f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * It is similar to android:windowsEnterTransition and can be considered a late-executed 663f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * android:windowsEnterTransition controlled by app. There are two reasons that app needs it: 673f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * <li> Workaround the problem that activity transition is not available between launcher and 683f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * app. Browse activity must programmatically start the slide-in transition.</li> 693f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * <li> Separates DetailsOverviewRow transition from other rows transition. So that 703f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * the DetailsOverviewRow transition can be executed earlier without waiting for all rows 713f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * to be loaded.</li> 723f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * <p> 733f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Transition object is returned by createEntranceTransition(). Typically the app does not need 743f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * override the default transition that browse and details provides. 753f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 763f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void prepareEntranceTransition() { 77572ed31d757c2635ea0a5cdd7ec8a33cd16f77b7Dake Gu if (TransitionHelper.systemSupportsEntranceTransitions()) { 78572ed31d757c2635ea0a5cdd7ec8a33cd16f77b7Dake Gu mEntranceTransitionEnabled = true; 79902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu if (getView() == null) { 80902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu mEntranceTransitionPreparePending = true; 81902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu return; 82902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu } 83902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu onEntranceTransitionPrepare(); 84572ed31d757c2635ea0a5cdd7ec8a33cd16f77b7Dake Gu } 853f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 863f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 873f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu /** 883f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Return true if entrance transition is enabled and not started yet. 893f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Entrance transition can only be executed once and isEntranceTransitionEnabled() 903f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * is reset to false after entrance transition is started. 913f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 923f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu boolean isEntranceTransitionEnabled() { 933f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu return mEntranceTransitionEnabled; 943f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 953f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 963f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu /** 973f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Create entrance transition. Subclass can override to load transition from 983f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * resource or construct manually. Typically app does not need to 993f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * override the default transition that browse and details provides. 1003f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 1013f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu protected Object createEntranceTransition() { 1023f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu return null; 1033f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 1043f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 1053f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu /** 1063f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Run entrance transition. Subclass may use TransitionManager to perform 1073f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * go(Scene) or beginDelayedTransition(). App should not override the default 1083f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * implementation of browse and details fragment. 1093f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 1103f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu protected void runEntranceTransition(Object entranceTransition) { 1113f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 1123f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 1133f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu /** 114902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu * Callback when entrance transition is prepared. This is when fragment should 115902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu * stop user input and animations. 116902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu */ 117902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu protected void onEntranceTransitionPrepare() { 118902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu } 119902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu 120902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu /** 121902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu * Callback when entrance transition is started. This is when fragment should 122902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu * stop processing layout. 1233f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 1243f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu protected void onEntranceTransitionStart() { 1253f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 1263f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 1273f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu /** 1283f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * Callback when entrance transition is ended. 1293f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 1303f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu protected void onEntranceTransitionEnd() { 1313f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 1323f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 1333f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu /** 1343f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * When fragment finishes loading data, it should call startEntranceTransition() 1353f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * to execute the entrance transition. 1363f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * startEntranceTransition() will start transition only if both two conditions 1373f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * are satisfied: 1383f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * <li> prepareEntranceTransition() was called.</li> 1393f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * <li> has not executed entrance transition yet.</li> 1403f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * <p> 1413f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * If startEntranceTransition() is called before onViewCreated(), it will be pending 1423f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * and executed when view is created. 1433f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */ 1443f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void startEntranceTransition() { 1453f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu if (!mEntranceTransitionEnabled || mEntranceTransition != null) { 1463f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu return; 1473f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 1483f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu // if view is not created yet, delay until onViewCreated() 1493f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu if (getView() == null) { 1503f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mStartEntranceTransitionPending = true; 1513f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu return; 1523f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 153902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu if (mEntranceTransitionPreparePending) { 154902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu mEntranceTransitionPreparePending = false; 155902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu onEntranceTransitionPrepare(); 156902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu } 1573f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu // wait till views get their initial position before start transition 1583f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu final View view = getView(); 1593f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu view.getViewTreeObserver().addOnPreDrawListener( 1603f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu new ViewTreeObserver.OnPreDrawListener() { 1613f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 1623f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public boolean onPreDraw() { 1633f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu view.getViewTreeObserver().removeOnPreDrawListener(this); 1643f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu internalCreateEntranceTransition(); 1653f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mEntranceTransitionEnabled = false; 166902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu if (mEntranceTransition != null) { 167902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu onEntranceTransitionStart(); 168902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu runEntranceTransition(mEntranceTransition); 169902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu } 1703f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu return false; 1713f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 1723f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu }); 1733f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu view.invalidate(); 1743f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 1753f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu 1763f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu void internalCreateEntranceTransition() { 1773f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mEntranceTransition = createEntranceTransition(); 1783f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu if (mEntranceTransition == null) { 1793f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu return; 1803f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 1813f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu sTransitionHelper.setTransitionListener(mEntranceTransition, new TransitionListener() { 1823f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu @Override 1833f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu public void onTransitionEnd(Object transition) { 1843f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu mEntranceTransition = null; 1853f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu onEntranceTransitionEnd(); 1863f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 1873f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu }); 1883f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu } 1893f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu} 190