BaseSupportFragment.java revision 572ed31d757c2635ea0a5cdd7ec8a33cd16f77b7
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.support.v4.app.Fragment;
193f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Guimport android.os.Bundle;
203f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Guimport android.support.v17.leanback.R;
213f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Guimport android.support.v17.leanback.transition.TransitionHelper;
223f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Guimport android.support.v17.leanback.transition.TransitionListener;
233f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Guimport android.view.View;
243f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Guimport android.view.ViewTreeObserver;
253f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
263f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu/**
273f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * @hide
283f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */
293f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Guclass BaseSupportFragment extends Fragment {
303f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
313f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    private boolean mEntranceTransitionEnabled = false;
323f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    private boolean mStartEntranceTransitionPending = 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);
403f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        if (mStartEntranceTransitionPending) {
413f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            mStartEntranceTransitionPending = false;
423f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            startEntranceTransition();
433f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        }
443f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
453f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
463f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    /**
473f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Enables entrance transition.<p>
483f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Entrance transition is the standard slide-in transition that shows rows of data in
493f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * browse screen and details screen.
503f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <p>
51572ed31d757c2635ea0a5cdd7ec8a33cd16f77b7Dake Gu     * The method is ignored before LOLLIPOP (API21).
52572ed31d757c2635ea0a5cdd7ec8a33cd16f77b7Dake Gu     * <p>
533f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * This method must be called in or
543f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * before onCreate().  Typically entrance transition should be enabled when savedInstance is
553f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * null so that fragment restored from instanceState does not run an extra entrance transition.
563f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * When the entrance transition is enabled, the fragment will make headers and content
573f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * hidden initially.
583f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * When data of rows are ready, app must call {@link #startEntranceTransition()} to kick off
593f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * the transition, otherwise the rows will be invisible forever.
603f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <p>
613f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * It is similar to android:windowsEnterTransition and can be considered a late-executed
623f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * android:windowsEnterTransition controlled by app.  There are two reasons that app needs it:
633f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <li> Workaround the problem that activity transition is not available between launcher and
643f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * app.  Browse activity must programmatically start the slide-in transition.</li>
653f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <li> Separates DetailsOverviewRow transition from other rows transition.  So that
663f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * the DetailsOverviewRow transition can be executed earlier without waiting for all rows
673f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * to be loaded.</li>
683f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <p>
693f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Transition object is returned by createEntranceTransition().  Typically the app does not need
703f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * override the default transition that browse and details provides.
713f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     */
723f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    public void prepareEntranceTransition() {
73572ed31d757c2635ea0a5cdd7ec8a33cd16f77b7Dake Gu        if (TransitionHelper.systemSupportsEntranceTransitions()) {
74572ed31d757c2635ea0a5cdd7ec8a33cd16f77b7Dake Gu            mEntranceTransitionEnabled = true;
75572ed31d757c2635ea0a5cdd7ec8a33cd16f77b7Dake Gu        }
763f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
773f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
783f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    /**
793f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Return true if entrance transition is enabled and not started yet.
803f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Entrance transition can only be executed once and isEntranceTransitionEnabled()
813f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * is reset to false after entrance transition is started.
823f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     */
833f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    boolean isEntranceTransitionEnabled() {
843f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        return mEntranceTransitionEnabled;
853f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
863f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
873f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    /**
883f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Create entrance transition.  Subclass can override to load transition from
893f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * resource or construct manually.  Typically app does not need to
903f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * override the default transition that browse and details provides.
913f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     */
923f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    protected Object createEntranceTransition() {
933f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        return null;
943f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
953f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
963f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    /**
973f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Run entrance transition.  Subclass may use TransitionManager to perform
983f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * go(Scene) or beginDelayedTransition().  App should not override the default
993f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * implementation of browse and details fragment.
1003f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     */
1013f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    protected void runEntranceTransition(Object entranceTransition) {
1023f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
1033f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
1043f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    /**
1053f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Callback when entrance transition is started.
1063f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     */
1073f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    protected void onEntranceTransitionStart() {
1083f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
1093f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
1103f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    /**
1113f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Callback when entrance transition is ended.
1123f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     */
1133f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    protected void onEntranceTransitionEnd() {
1143f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
1153f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
1163f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    /**
1173f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * When fragment finishes loading data, it should call startEntranceTransition()
1183f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * to execute the entrance transition.
1193f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * startEntranceTransition() will start transition only if both two conditions
1203f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * are satisfied:
1213f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <li> prepareEntranceTransition() was called.</li>
1223f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <li> has not executed entrance transition yet.</li>
1233f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <p>
1243f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * If startEntranceTransition() is called before onViewCreated(), it will be pending
1253f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * and executed when view is created.
1263f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     */
1273f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    public void startEntranceTransition() {
1283f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        if (!mEntranceTransitionEnabled || mEntranceTransition != null) {
1293f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            return;
1303f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        }
1313f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        // if view is not created yet, delay until onViewCreated()
1323f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        if (getView() == null) {
1333f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            mStartEntranceTransitionPending = true;
1343f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            return;
1353f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        }
1363f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        // wait till views get their initial position before start transition
1373f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        final View view = getView();
1383f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        view.getViewTreeObserver().addOnPreDrawListener(
1393f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                new ViewTreeObserver.OnPreDrawListener() {
1403f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            @Override
1413f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            public boolean onPreDraw() {
1423f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                view.getViewTreeObserver().removeOnPreDrawListener(this);
1433f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                internalCreateEntranceTransition();
1443f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                mEntranceTransitionEnabled = false;
1453f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                runEntranceTransition(mEntranceTransition);
1463f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                return false;
1473f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            }
1483f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        });
1493f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        view.invalidate();
1503f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
1513f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
1523f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    void internalCreateEntranceTransition() {
1533f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        mEntranceTransition = createEntranceTransition();
1543f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        if (mEntranceTransition == null) {
1553f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            return;
1563f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        }
1573f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        sTransitionHelper.setTransitionListener(mEntranceTransition, new TransitionListener() {
1583f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            @Override
1593f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            public void onTransitionStart(Object transition) {
1603f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                onEntranceTransitionStart();
1613f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            }
1623f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            @Override
1633f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            public void onTransitionEnd(Object transition) {
1643f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                mEntranceTransition = null;
1653f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                onEntranceTransitionEnd();
1663f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            }
1673f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        });
1683f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
1693f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu}
170