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}