Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 40a67888 authored by Adam Powell's avatar Adam Powell
Browse files

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
parent 3e1a9eac
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -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) {
+1 −0
Original line number Diff line number Diff line
@@ -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>
+1 −0
Original line number Diff line number Diff line
@@ -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" />