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