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