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