diff --git a/demo/src/main/java/com/bytedance/scenedemo/lifecycle/ChildSceneLifecycleCallbacksDemoScene.java b/demo/src/main/java/com/bytedance/scenedemo/lifecycle/ChildSceneLifecycleCallbacksDemoScene.java index 3ee920e4..6bc589ec 100644 --- a/demo/src/main/java/com/bytedance/scenedemo/lifecycle/ChildSceneLifecycleCallbacksDemoScene.java +++ b/demo/src/main/java/com/bytedance/scenedemo/lifecycle/ChildSceneLifecycleCallbacksDemoScene.java @@ -114,6 +114,11 @@ public void onSceneCreated(Scene scene, Bundle savedInstanceState) { log("Scene", scene.toString() + " onSceneCreated"); } + @Override + public void onSceneViewCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState) { + log("Scene", scene.toString() + " onSceneViewCreated"); + } + @Override public void onSceneActivityCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState) { log("Scene", scene.toString() + " onSceneActivityCreated"); diff --git a/library/scene/src/main/java/com/bytedance/scene/Scene.java b/library/scene/src/main/java/com/bytedance/scene/Scene.java index 93d09f83..2e4b9db4 100644 --- a/library/scene/src/main/java/com/bytedance/scene/Scene.java +++ b/library/scene/src/main/java/com/bytedance/scene/Scene.java @@ -371,6 +371,7 @@ public void dispatchCreateView(@Nullable Bundle savedInstanceState, @NonNull Vie throw new SuperNotCalledException("Scene " + this + " did not call through to super.onViewCreated()"); } + dispatchOnSceneViewCreated(this, savedInstanceState, false); setState(State.VIEW_CREATED); } @@ -1132,6 +1133,15 @@ public void dispatchOnSceneCreated(@NonNull Scene scene, @Nullable Bundle savedI } } + /** @hide */ + @RestrictTo(LIBRARY_GROUP) + public void dispatchOnSceneViewCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState, boolean directChild) { + Scene parentScene = getParentScene(); + if (parentScene != null) { + parentScene.dispatchOnSceneViewCreated(scene, savedInstanceState, scene == this); + } + } + /** @hide */ @RestrictTo(LIBRARY_GROUP) public void dispatchOnSceneActivityCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState, boolean directChild) { diff --git a/library/scene/src/main/java/com/bytedance/scene/group/GroupScene.java b/library/scene/src/main/java/com/bytedance/scene/group/GroupScene.java index 0aa2be38..440e370d 100644 --- a/library/scene/src/main/java/com/bytedance/scene/group/GroupScene.java +++ b/library/scene/src/main/java/com/bytedance/scene/group/GroupScene.java @@ -673,6 +673,24 @@ public final void dispatchOnSceneCreated(@NonNull Scene scene, @Nullable Bundle super.dispatchOnSceneCreated(scene, savedInstanceState, directChild); } + /** + * @hide + */ + @RestrictTo(LIBRARY_GROUP) + @Override + public final void dispatchOnSceneViewCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState, boolean directChild) { + if (scene != this) { + List> list = new ArrayList<>(mLifecycleCallbacks); + for (NonNullPair pair : list) { + if (directChild || pair.second) { + pair.first.onSceneViewCreated(scene, savedInstanceState); + } + } + } + + super.dispatchOnSceneViewCreated(scene, savedInstanceState, directChild); + } + /** * @hide */ diff --git a/library/scene/src/main/java/com/bytedance/scene/interfaces/ChildSceneLifecycleAdapterCallbacks.java b/library/scene/src/main/java/com/bytedance/scene/interfaces/ChildSceneLifecycleAdapterCallbacks.java index f816b55f..cc5bba31 100644 --- a/library/scene/src/main/java/com/bytedance/scene/interfaces/ChildSceneLifecycleAdapterCallbacks.java +++ b/library/scene/src/main/java/com/bytedance/scene/interfaces/ChildSceneLifecycleAdapterCallbacks.java @@ -34,6 +34,11 @@ public void onSceneCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceS } + @Override + public void onSceneViewCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState) { + + } + @Override public void onSceneActivityCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState) { diff --git a/library/scene/src/main/java/com/bytedance/scene/interfaces/ChildSceneLifecycleCallbacks.java b/library/scene/src/main/java/com/bytedance/scene/interfaces/ChildSceneLifecycleCallbacks.java index deaa12e6..c14289f0 100644 --- a/library/scene/src/main/java/com/bytedance/scene/interfaces/ChildSceneLifecycleCallbacks.java +++ b/library/scene/src/main/java/com/bytedance/scene/interfaces/ChildSceneLifecycleCallbacks.java @@ -19,6 +19,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.view.View; import com.bytedance.scene.Scene; /** @@ -38,9 +39,18 @@ public interface ChildSceneLifecycleCallbacks { @Deprecated void onSceneCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState); + /** + * Called after the Scene has returned from {@link Scene#onViewCreated(View, Bundle)}. + * View is already created at this moment, but child Scene' view is not created. + * + * @param scene Scene changing state + * @param savedInstanceState Saved instance bundle from a previous instance + */ + void onSceneViewCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState); + /** * Called after the Scene has returned from {@link Scene#onActivityCreated(Bundle)}. - * View is already created at this moment. + * View is already created at this moment, and child Scene' view is created too. * * @param scene Scene changing state * @param savedInstanceState Saved instance bundle from a previous instance diff --git a/library/scene/src/main/java/com/bytedance/scene/navigation/NavigationScene.java b/library/scene/src/main/java/com/bytedance/scene/navigation/NavigationScene.java index cc189866..da060de5 100644 --- a/library/scene/src/main/java/com/bytedance/scene/navigation/NavigationScene.java +++ b/library/scene/src/main/java/com/bytedance/scene/navigation/NavigationScene.java @@ -784,6 +784,24 @@ public void dispatchOnSceneCreated(@NonNull Scene scene, @Nullable Bundle savedI super.dispatchOnSceneCreated(scene, savedInstanceState, directChild); } + /** + * @hide + */ + @RestrictTo(LIBRARY_GROUP) + @Override + public final void dispatchOnSceneViewCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState, boolean directChild) { + if (scene != this) { + List> list = new ArrayList<>(mLifecycleCallbacks); + for (NonNullPair pair : list) { + if (directChild || pair.second) { + pair.first.onSceneViewCreated(scene, savedInstanceState); + } + } + } + + super.dispatchOnSceneViewCreated(scene, savedInstanceState, directChild); + } + /** * @hide */ diff --git a/library/scene/src/test/java/com/bytedance/scene/ChildSceneLifecycleCallbacksTests.java b/library/scene/src/test/java/com/bytedance/scene/ChildSceneLifecycleCallbacksTests.java index 9c3085a6..89b8f7d4 100644 --- a/library/scene/src/test/java/com/bytedance/scene/ChildSceneLifecycleCallbacksTests.java +++ b/library/scene/src/test/java/com/bytedance/scene/ChildSceneLifecycleCallbacksTests.java @@ -34,6 +34,7 @@ public class ChildSceneLifecycleCallbacksTests { @Test public void testNavigationSceneNotRecursiveExcludingOnSceneSaveInstanceState() { final AtomicBoolean isCreatedCalled = new AtomicBoolean(false); + final AtomicBoolean isViewCreatedCalled = new AtomicBoolean(false); final AtomicBoolean isActivityCreatedCalled = new AtomicBoolean(false); final AtomicBoolean isStartedCalled = new AtomicBoolean(false); final AtomicBoolean isResumedCalled = new AtomicBoolean(false); @@ -52,6 +53,15 @@ public void onSceneCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceS assertSame(State.NONE, scene.getState()); } + @Override + public void onSceneViewCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState) { + if (!isViewCreatedCalled.compareAndSet(false, true)) { + throw new IllegalStateException("crash"); + } + assertNotNull(scene.getView()); + assertSame(State.NONE, scene.getState()); + } + @Override public void onSceneActivityCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState) { if (!isActivityCreatedCalled.compareAndSet(false, true)) { @@ -162,6 +172,7 @@ public Scene instantiateScene(ClassLoader cl, String className, Bundle bundle) { lifecycleManager.onDestroyView(); assertTrue(isCreatedCalled.get()); + assertTrue(isViewCreatedCalled.get()); assertTrue(isActivityCreatedCalled.get()); assertTrue(isStartedCalled.get()); assertTrue(isResumedCalled.get()); @@ -174,6 +185,7 @@ public Scene instantiateScene(ClassLoader cl, String className, Bundle bundle) { @Test public void testGroupSceneNotRecursiveExcludingOnSceneSaveInstanceState() { final AtomicBoolean isCreatedCalled = new AtomicBoolean(false); + final AtomicBoolean isViewCreatedCalled = new AtomicBoolean(false); final AtomicBoolean isActivityCreatedCalled = new AtomicBoolean(false); final AtomicBoolean isStartedCalled = new AtomicBoolean(false); final AtomicBoolean isResumedCalled = new AtomicBoolean(false); @@ -192,6 +204,15 @@ public void onSceneCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceS assertSame(State.NONE, scene.getState()); } + @Override + public void onSceneViewCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState) { + if (!isViewCreatedCalled.compareAndSet(false, true)) { + throw new IllegalStateException("crash"); + } + assertNotNull(scene.getView()); + assertSame(State.NONE, scene.getState()); + } + @Override public void onSceneActivityCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState) { if (!isActivityCreatedCalled.compareAndSet(false, true)) { @@ -288,6 +309,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup co rootScene.add(id, scene, "TAG"); assertTrue(isCreatedCalled.get()); + assertTrue(isViewCreatedCalled.get()); assertTrue(isActivityCreatedCalled.get()); assertTrue(isStartedCalled.get()); assertTrue(isResumedCalled.get()); @@ -302,6 +324,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup co @Test public void testGroupSceneRecursiveExcludingOnSceneSaveInstanceState() { final AtomicBoolean isCreatedCalled = new AtomicBoolean(false); + final AtomicBoolean isViewCreatedCalled = new AtomicBoolean(false); final AtomicBoolean isActivityCreatedCalled = new AtomicBoolean(false); final AtomicBoolean isStartedCalled = new AtomicBoolean(false); final AtomicBoolean isResumedCalled = new AtomicBoolean(false); @@ -331,6 +354,18 @@ public void onSceneCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceS assertSame(State.NONE, scene.getState()); } + @Override + public void onSceneViewCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState) { + if (scene != childScene) { + return; + } + if (!isViewCreatedCalled.compareAndSet(false, true)) { + throw new IllegalStateException("crash"); + } + assertNotNull(scene.getView()); + assertSame(State.NONE, scene.getState()); + } + @Override public void onSceneActivityCreated(@NonNull Scene scene, @Nullable Bundle savedInstanceState) { if (scene != childScene) { @@ -456,6 +491,7 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { secondRootScene.add(secondRootId, childScene, "CHILD"); assertTrue(isCreatedCalled.get()); + assertTrue(isViewCreatedCalled.get()); assertTrue(isActivityCreatedCalled.get()); assertTrue(isStartedCalled.get()); assertTrue(isResumedCalled.get());