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
25a5a85434f936023043f074fb86eaa6d48f7f6411Dake Guimport android.support.v17.leanback.util.StateMachine;
26a5a85434f936023043f074fb86eaa6d48f7f6411Dake Guimport android.support.v17.leanback.util.StateMachine.State;
27a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu
28a5a85434f936023043f074fb86eaa6d48f7f6411Dake Guimport static android.support.v17.leanback.util.StateMachine.*;
29a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu
303f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu/**
313f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu * @hide
323f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu */
33e7246ef136ed686d8caf339d4d1fd8e37b499c6aCraig Stoutclass BaseSupportFragment extends BrandedSupportFragment {
343f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
35a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    /**
36a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     * Condition: {@link TransitionHelper#systemSupportsEntranceTransitions()} is true
37a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     * Action: none
38a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     */
39684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    private final State STATE_ALLOWED = new State() {
40a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        @Override
41a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        public boolean canRun() {
42a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu            return TransitionHelper.systemSupportsEntranceTransitions();
43a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        }
44684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
45684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        @Override
46684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        public void run() {
47684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata            mProgressBarManager.show();
48684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        }
49a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    };
50a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu
51a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    /**
52a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     * Condition: {@link #isReadyForPrepareEntranceTransition()} is true
53a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     * Action: {@link #onEntranceTransitionPrepare()} }
54a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     */
55a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    private final State STATE_PREPARE = new State() {
56a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        @Override
57a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        public boolean canRun() {
58a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu            return isReadyForPrepareEntranceTransition();
59a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        }
60a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu
61a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        @Override
62a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        public void run() {
63a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu            onEntranceTransitionPrepare();
64a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        }
65a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    };
66a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu
67a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    /**
68a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     * Condition: {@link #isReadyForStartEntranceTransition()} is true
69a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     * Action: {@link #onExecuteEntranceTransition()} }
70a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     */
71a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    private final State STATE_START = new State() {
72a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        @Override
73a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        public boolean canRun() {
74a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu            return isReadyForStartEntranceTransition();
75a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        }
76a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu
77a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        @Override
78a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        public void run() {
79684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata            mProgressBarManager.hide();
80a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu            onExecuteEntranceTransition();
81a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        }
82a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    };
83a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu
84a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    final StateMachine mEnterTransitionStates;
85a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu
863f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    private Object mEntranceTransition;
87684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    private final ProgressBarManager mProgressBarManager = new ProgressBarManager();
883f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
89a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    BaseSupportFragment() {
90a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        mEnterTransitionStates = new StateMachine();
91a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        mEnterTransitionStates.addState(STATE_ALLOWED);
92a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        mEnterTransitionStates.addState(STATE_PREPARE);
93a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        mEnterTransitionStates.addState(STATE_START);
94a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    }
95a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu
963f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    @Override
973f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    public void onViewCreated(View view, Bundle savedInstanceState) {
983f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        super.onViewCreated(view, savedInstanceState);
99a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        performPendingStates();
100a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    }
101a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu
102a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    final void performPendingStates() {
103a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        mEnterTransitionStates.runPendingStates();
1043f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
1053f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
1063f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    /**
1073f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Enables entrance transition.<p>
1083f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Entrance transition is the standard slide-in transition that shows rows of data in
1093f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * browse screen and details screen.
1103f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <p>
111572ed31d757c2635ea0a5cdd7ec8a33cd16f77b7Dake Gu     * The method is ignored before LOLLIPOP (API21).
112572ed31d757c2635ea0a5cdd7ec8a33cd16f77b7Dake Gu     * <p>
1133f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * This method must be called in or
1143f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * before onCreate().  Typically entrance transition should be enabled when savedInstance is
1153f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * null so that fragment restored from instanceState does not run an extra entrance transition.
1163f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * When the entrance transition is enabled, the fragment will make headers and content
1173f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * hidden initially.
1183f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * When data of rows are ready, app must call {@link #startEntranceTransition()} to kick off
1193f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * the transition, otherwise the rows will be invisible forever.
1203f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <p>
1213f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * It is similar to android:windowsEnterTransition and can be considered a late-executed
1223f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * android:windowsEnterTransition controlled by app.  There are two reasons that app needs it:
1233f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <li> Workaround the problem that activity transition is not available between launcher and
1243f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * app.  Browse activity must programmatically start the slide-in transition.</li>
1253f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <li> Separates DetailsOverviewRow transition from other rows transition.  So that
1263f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * the DetailsOverviewRow transition can be executed earlier without waiting for all rows
1273f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * to be loaded.</li>
1283f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <p>
1293f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Transition object is returned by createEntranceTransition().  Typically the app does not need
1303f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * override the default transition that browse and details provides.
1313f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     */
1323f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    public void prepareEntranceTransition() {
133a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        mEnterTransitionStates.runState(STATE_ALLOWED);
134a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        mEnterTransitionStates.runState(STATE_PREPARE);
1353f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
1363f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
1373f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    /**
1383f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Return true if entrance transition is enabled and not started yet.
1393f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Entrance transition can only be executed once and isEntranceTransitionEnabled()
1403f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * is reset to false after entrance transition is started.
1413f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     */
1423f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    boolean isEntranceTransitionEnabled() {
143a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        // Enabled when passed STATE_ALLOWED in prepareEntranceTransition call.
144a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        return STATE_ALLOWED.getStatus() == STATUS_EXECUTED;
1453f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
1463f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
1473f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    /**
1483f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Create entrance transition.  Subclass can override to load transition from
1493f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * resource or construct manually.  Typically app does not need to
1503f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * override the default transition that browse and details provides.
1513f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     */
1523f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    protected Object createEntranceTransition() {
1533f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        return null;
1543f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
1553f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
1563f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    /**
1573f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Run entrance transition.  Subclass may use TransitionManager to perform
1583f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * go(Scene) or beginDelayedTransition().  App should not override the default
1593f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * implementation of browse and details fragment.
1603f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     */
1613f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    protected void runEntranceTransition(Object entranceTransition) {
1623f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
1633f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
1643f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    /**
165902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu     * Callback when entrance transition is prepared.  This is when fragment should
166902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu     * stop user input and animations.
167902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu     */
168902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu    protected void onEntranceTransitionPrepare() {
169902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu    }
170902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu
171902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu    /**
172902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu     * Callback when entrance transition is started.  This is when fragment should
173902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu     * stop processing layout.
1743f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     */
1753f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    protected void onEntranceTransitionStart() {
1763f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
1773f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
1783f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    /**
1793f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Callback when entrance transition is ended.
1803f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     */
1813f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    protected void onEntranceTransitionEnd() {
1823f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
1833f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
1843f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    /**
185a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     * Returns true if it is ready to perform {@link #prepareEntranceTransition()}, false otherwise.
186a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     * Subclass may override and add additional conditions.
187a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     * @return True if it is ready to perform {@link #prepareEntranceTransition()}, false otherwise.
188a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     * Subclass may override and add additional conditions.
189a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     */
190a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    boolean isReadyForPrepareEntranceTransition() {
191a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        return getView() != null;
192a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    }
193a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu
194a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    /**
195a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     * Returns true if it is ready to perform {@link #startEntranceTransition()}, false otherwise.
196a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     * Subclass may override and add additional conditions.
197a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     * @return True if it is ready to perform {@link #startEntranceTransition()}, false otherwise.
198a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     * Subclass may override and add additional conditions.
199a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu     */
200a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    boolean isReadyForStartEntranceTransition() {
201a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        return getView() != null;
202a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    }
203a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu
204a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    /**
2053f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * When fragment finishes loading data, it should call startEntranceTransition()
2063f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * to execute the entrance transition.
2073f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * startEntranceTransition() will start transition only if both two conditions
2083f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * are satisfied:
2093f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <li> prepareEntranceTransition() was called.</li>
2103f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <li> has not executed entrance transition yet.</li>
2113f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * <p>
2123f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * If startEntranceTransition() is called before onViewCreated(), it will be pending
2133f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * and executed when view is created.
2143f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     */
2153f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    public void startEntranceTransition() {
216a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu        mEnterTransitionStates.runState(STATE_START);
217a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    }
218a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu
219a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu    void onExecuteEntranceTransition() {
2203f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        // wait till views get their initial position before start transition
2213f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        final View view = getView();
2223f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        view.getViewTreeObserver().addOnPreDrawListener(
2233f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                new ViewTreeObserver.OnPreDrawListener() {
2243f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            @Override
2253f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            public boolean onPreDraw() {
2263f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                view.getViewTreeObserver().removeOnPreDrawListener(this);
2273f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                internalCreateEntranceTransition();
228902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu                if (mEntranceTransition != null) {
229902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu                    onEntranceTransitionStart();
230902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu                    runEntranceTransition(mEntranceTransition);
231902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu                }
2323f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                return false;
2333f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            }
2343f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        });
2353f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        view.invalidate();
2363f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
2373f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
2383f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    void internalCreateEntranceTransition() {
2393f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        mEntranceTransition = createEntranceTransition();
2403f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        if (mEntranceTransition == null) {
2413f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            return;
2423f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        }
2438403619efebe94666c0615c3fc85080a303acf80Dake Gu        TransitionHelper.addTransitionListener(mEntranceTransition, new TransitionListener() {
2443f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            @Override
2453f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            public void onTransitionEnd(Object transition) {
2463f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                mEntranceTransition = null;
2473f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                onEntranceTransitionEnd();
248a5a85434f936023043f074fb86eaa6d48f7f6411Dake Gu                mEnterTransitionStates.resetStatus();
2493f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            }
2503f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        });
2513f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
252684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
253684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    /**
254684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     * Returns the {@link ProgressBarManager}.
255684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     */
256684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    public final ProgressBarManager getProgressBarManager() {
257684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        return mProgressBarManager;
258684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    }
2593f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu}
260