1c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki/*
2c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Copyright (C) 2016 The Android Open Source Project
3c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
4c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Licensed under the Apache License, Version 2.0 (the "License");
5c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * you may not use this file except in compliance with the License.
6c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * You may obtain a copy of the License at
7c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
8c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *      http://www.apache.org/licenses/LICENSE-2.0
9c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
10c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Unless required by applicable law or agreed to in writing, software
11c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * distributed under the License is distributed on an "AS IS" BASIS,
12c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * See the License for the specific language governing permissions and
14c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * limitations under the License.
15c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */
16c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
17c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakipackage android.support.transition;
18c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
19c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.content.Context;
20c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.view.LayoutInflater;
21c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.view.View;
22c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.view.ViewGroup;
23c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
24c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki/**
25c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * A scene represents the collection of values that various properties in the
26c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * View hierarchy will have when the scene is applied. A Scene can be
27c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * configured to automatically run a Transition when it is applied, which will
28c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * animate the various property changes that take place during the
29c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * scene change.
30c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */
31c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakifinal class ScenePort {
32c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
33c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    Runnable mEnterAction, mExitAction;
34c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
35c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    private Context mContext;
36c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
37c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    private int mLayoutId = -1;
38c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
39c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    private ViewGroup mSceneRoot;
40c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
41c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    private View mLayout; // alternative to layoutId
42c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
43c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
44c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Constructs a Scene with no information about how values will change
45c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * when this scene is applied. This constructor might be used when
46c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * a Scene is created with the intention of being dynamically configured,
47c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * through setting {@link #setEnterAction(Runnable)} and possibly
48c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * {@link #setExitAction(Runnable)}.
49c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
50c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param sceneRoot The root of the hierarchy in which scene changes
51c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *                  and transitions will take place.
52c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
53c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public ScenePort(ViewGroup sceneRoot) {
54c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mSceneRoot = sceneRoot;
55c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
56c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
57c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
58c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Constructs a Scene which, when entered, will remove any
59c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * children from the sceneRoot container and will inflate and add
60c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * the hierarchy specified by the layoutId resource file.
61c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
62c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * <p>This method is hidden because layoutId-based scenes should be
63c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * created by the caching factory method {@link ScenePort#getCurrentScene(View)}.</p>
64c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
65c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param sceneRoot The root of the hierarchy in which scene changes
66c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *                  and transitions will take place.
67c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param layoutId  The id of a resource file that defines the view
68c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *                  hierarchy of this scene.
69c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param context   The context used in the process of inflating
70c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *                  the layout resource.
71c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
72c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    private ScenePort(ViewGroup sceneRoot, int layoutId, Context context) {
73c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mContext = context;
74c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mSceneRoot = sceneRoot;
75c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mLayoutId = layoutId;
76c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
77c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
78c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
79c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Constructs a Scene which, when entered, will remove any
80c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * children from the sceneRoot container and add the layout
81c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * object as a new child of that container.
82c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
83c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param sceneRoot The root of the hierarchy in which scene changes
84c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *                  and transitions will take place.
85c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param layout    The view hierarchy of this scene, added as a child
86c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *                  of sceneRoot when this scene is entered.
87c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
88c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public ScenePort(ViewGroup sceneRoot, View layout) {
89c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mSceneRoot = sceneRoot;
90c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mLayout = layout;
91c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
92c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
93c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
94c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Returns a Scene described by the resource file associated with the given
95c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * <code>layoutId</code> parameter.
96c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
97c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param sceneRoot The root of the hierarchy in which scene changes
98c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *                  and transitions will take place.
99c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param layoutId  The id of a standard layout resource file.
100c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param context   The context used in the process of inflating
101c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *                  the layout resource.
102c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @return The scene for the given root and layout id
103c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
104c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public static ScenePort getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context) {
105c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        // We don't cache ScenePort, but android.support.transition.Scene.
106c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        return new ScenePort(sceneRoot, layoutId, context);
107c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
108c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
109c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
110c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Set the scene that the given view is in. The current scene is set only
111c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * on the root view of a scene, not for every view in that hierarchy. This
112c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * information is used by Scene to determine whether there is a previous
113c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * scene which should be exited before the new scene is entered.
114c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
115c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param view The view on which the current scene is being set
116c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
117c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    static void setCurrentScene(View view, ScenePort scene) {
118c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        view.setTag(R.id.transition_current_scene, scene);
119c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
120c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
121c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
122c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Gets the current {@link ScenePort} set on the given view. A scene is set on a view
123c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * only if that view is the scene root.
124c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
125c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @return The current Scene set on this view. A value of null indicates that
126c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * no Scene is currently set.
127c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
128c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    static ScenePort getCurrentScene(View view) {
129c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        return (ScenePort) view.getTag(R.id.transition_current_scene);
130c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
131c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
132c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
133c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Gets the root of the scene, which is the root of the view hierarchy
134c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * affected by changes due to this scene, and which will be animated
135c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * when this scene is entered.
136c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
137c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @return The root of the view hierarchy affected by this scene.
138c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
139c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public ViewGroup getSceneRoot() {
140c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        return mSceneRoot;
141c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
142c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
143c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
144c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Exits this scene, if it is the current scene
145c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * on the scene's {@link #getSceneRoot() scene root}. The current scene is
146c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * set when {@link #enter() entering} a scene.
147c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Exiting a scene runs the {@link #setExitAction(Runnable) exit action}
148c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * if there is one.
149c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
150c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public void exit() {
151c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        if (getCurrentScene(mSceneRoot) == this) {
152c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            if (mExitAction != null) {
153c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                mExitAction.run();
154c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            }
155c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        }
156c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
157c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
158c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
159c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Enters this scene, which entails changing all values that
160c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * are specified by this scene. These may be values associated
161c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * with a layout view group or layout resource file which will
162c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * now be added to the scene root, or it may be values changed by
163c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * an {@link #setEnterAction(Runnable)} enter action}, or a
164c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * combination of the these. No transition will be run when the
165c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * scene is entered. To get transition behavior in scene changes,
166c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * use one of the methods in {@link TransitionManagerPort} instead.
167c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
168c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public void enter() {
169c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
170c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        // Apply layout change, if any
171c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        if (mLayoutId > 0 || mLayout != null) {
172c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            // empty out parent container before adding to it
173c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            getSceneRoot().removeAllViews();
174c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
175c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            if (mLayoutId > 0) {
176c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                LayoutInflater.from(mContext).inflate(mLayoutId, mSceneRoot);
177c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            } else {
178c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                mSceneRoot.addView(mLayout);
179c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            }
180c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        }
181c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
182c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        // Notify next scene that it is entering. Subclasses may override to configure scene.
183c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        if (mEnterAction != null) {
184c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            mEnterAction.run();
185c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        }
186c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
187c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        setCurrentScene(mSceneRoot, this);
188c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
189c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
190c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
191c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Scenes that are not defined with layout resources or
192c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * hierarchies, or which need to perform additional steps
193c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * after those hierarchies are changed to, should set an enter
194c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * action, and possibly an exit action as well. An enter action
195c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * will cause Scene to call back into application code to do
196c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * anything else the application needs after transitions have
197c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * captured pre-change values and after any other scene changes
198c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * have been applied, such as the layout (if any) being added to
199c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * the view hierarchy. After this method is called, Transitions will
200c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * be played.
201c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
202c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @param action The runnable whose {@link Runnable#run() run()} method will
203c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *               be called when this scene is entered
204c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @see #setExitAction(Runnable)
205c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @see ScenePort#ScenePort(ViewGroup, int, Context)
206c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @see ScenePort#ScenePort(ViewGroup, ViewGroup)
207c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
208c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public void setEnterAction(Runnable action) {
209c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mEnterAction = action;
210c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
211c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
212c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
213c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Scenes that are not defined with layout resources or
214c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * hierarchies, or which need to perform additional steps
215c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * after those hierarchies are changed to, should set an enter
216c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * action, and possibly an exit action as well. An exit action
217c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * will cause Scene to call back into application code to do
218c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * anything the application needs to do after applicable transitions have
219c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * captured pre-change values, but before any other scene changes
220c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * have been applied, such as the new layout (if any) being added to
221c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * the view hierarchy. After this method is called, the next scene
222c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * will be entered, including a call to {@link #setEnterAction(Runnable)}
223c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * if an enter action is set.
224c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     *
225c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @see #setEnterAction(Runnable)
226c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @see ScenePort#ScenePort(ViewGroup, int, Context)
227c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * @see ScenePort#ScenePort(ViewGroup, ViewGroup)
228c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
229c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public void setExitAction(Runnable action) {
230c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mExitAction = action;
231c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
232c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
233c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
234c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    /**
235c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * Returns whether this Scene was created by a layout resource file, determined
236c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * by the layoutId passed into
237c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     * {@link #getSceneForLayout(ViewGroup, int, Context)}.
238c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki     */
239c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    boolean isCreatedFromLayoutResource() {
240c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        return (mLayoutId > 0);
241c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
242c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki}