Cache Scene objects by layout ID on the scene root
The current tracking of scene objects in a static ThreadLocal is problematic as it leaks the Context associated with the SceneRoot and returns the wrong Scene object if the same layout ID is used across different scene roots. Track Scene objects on the scene root view instead to avoid these issues. Change-Id: I891986897f757f2666897c937b5ebb0ed1d531c1
This commit is contained in:
@@ -36,27 +36,28 @@ public final class Scene {
|
||||
private ViewGroup mSceneRoot;
|
||||
private ViewGroup mLayout; // alternative to layoutId
|
||||
Runnable mEnterAction, mExitAction;
|
||||
private static ThreadLocal<SparseArray<Scene>> sScenes = new ThreadLocal<SparseArray<Scene>>();
|
||||
|
||||
/**
|
||||
* Returns a Scene described by the resource file associated with the given
|
||||
* <code>layoutId</code> parameter. If such a Scene has already been created,
|
||||
* that same Scene will be returned. This caching of layoutId-based scenes enables
|
||||
* sharing of common scenes between those created in code and those referenced
|
||||
* by {@link TransitionManager} XML resource files.
|
||||
* <code>layoutId</code> parameter. If such a Scene has already been created for
|
||||
* the given <code>sceneRoot</code>, that same Scene will be returned.
|
||||
* This caching of layoutId-based scenes enables sharing of common scenes
|
||||
* between those created in code and those referenced by {@link TransitionManager}
|
||||
* XML resource files.
|
||||
*
|
||||
* @param sceneRoot The root of the hierarchy in which scene changes
|
||||
* and transitions will take place.
|
||||
* @param layoutId The id of a standard layout resource file.
|
||||
* @param context The context used in the process of inflating
|
||||
* the layout resource.
|
||||
* @return
|
||||
* @return The scene for the given root and layout id
|
||||
*/
|
||||
public static Scene getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context) {
|
||||
SparseArray<Scene> scenes = sScenes.get();
|
||||
SparseArray<Scene> scenes = (SparseArray<Scene>) sceneRoot.getTag(
|
||||
com.android.internal.R.id.scene_layoutid_cache);
|
||||
if (scenes == null) {
|
||||
scenes = new SparseArray<Scene>();
|
||||
sScenes.set(scenes);
|
||||
sceneRoot.setTag(com.android.internal.R.id.scene_layoutid_cache, scenes);
|
||||
}
|
||||
Scene scene = scenes.get(layoutId);
|
||||
if (scene != null) {
|
||||
|
||||
@@ -81,4 +81,5 @@
|
||||
<item type="id" name="popup_submenu_presenter" />
|
||||
<item type="id" name="action_bar_spinner" />
|
||||
<item type="id" name="current_scene" />
|
||||
<item type="id" name="scene_layoutid_cache" />
|
||||
</resources>
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
<java-symbol type="id" name="clearDefaultHint" />
|
||||
<java-symbol type="id" name="contentPanel" />
|
||||
<java-symbol type="id" name="current_scene" />
|
||||
<java-symbol type="id" name="scene_layoutid_cache" />
|
||||
<java-symbol type="id" name="customPanel" />
|
||||
<java-symbol type="id" name="datePicker" />
|
||||
<java-symbol type="id" name="day" />
|
||||
|
||||
Reference in New Issue
Block a user