diff --git a/lib/android/app/src/androidTest/java/com/reactnativenavigation/TestUtils.java b/lib/android/app/src/androidTest/java/com/reactnativenavigation/TestUtils.java index 09b7ec8b9fa..07cd7c5575e 100644 --- a/lib/android/app/src/androidTest/java/com/reactnativenavigation/TestUtils.java +++ b/lib/android/app/src/androidTest/java/com/reactnativenavigation/TestUtils.java @@ -43,10 +43,13 @@ protected TopBar createTopBar(@NonNull Context context, @NonNull StackLayout sta .setId("stack" + CompatUtils.generateViewId()) .setChildRegistry(new ChildControllersRegistry()) .setTopBarController(topBarController) - .setStackPresenter(new StackPresenter(activity, new TitleBarReactViewCreatorMock(), - new TopBarBackgroundViewCreatorMock(), new TitleBarButtonCreatorMock(), + .setStackPresenter(new StackPresenter(activity, + new TitleBarReactViewCreatorMock(), + new TitleBarButtonCreatorMock(), + topBarController, new IconResolver(activity, new ImageLoader()), new TypefaceLoaderMock(), new RenderChecker(), - new Options())) + new Options(), + new TopBarBackgroundViewCreatorMock())) .setInitialOptions(new Options()); } diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/options/LayoutFactory.java b/lib/android/app/src/main/java/com/reactnativenavigation/options/LayoutFactory.java index 32ac19043f6..2a1a26f8e72 100644 --- a/lib/android/app/src/main/java/com/reactnativenavigation/options/LayoutFactory.java +++ b/lib/android/app/src/main/java/com/reactnativenavigation/options/LayoutFactory.java @@ -186,21 +186,22 @@ private ViewController createExternalComponent(ReactContext context, LayoutNo } private ViewController createStack(LayoutNode node) { + final TopBarController topBarController = new TopBarController(); return new StackControllerBuilder(activity, eventEmitter) .setChildren(createChildren(node.children)) .setChildRegistry(childRegistry) - .setTopBarController(new TopBarController()) + .setTopBarController(topBarController) .setId(node.id) .setInitialOptions(parseOptions(node.getOptions())) .setStackPresenter(new StackPresenter(activity, new TitleBarReactViewCreator(), - new TopBarBackgroundViewCreator(), new TitleBarButtonCreator(), + topBarController, new IconResolver(activity, new ImageLoader()), new TypefaceLoader(activity), new RenderChecker(), - defaultOptions - )) + defaultOptions, + new TopBarBackgroundViewCreator())) .setPresenter(new Presenter(activity, defaultOptions)) .build(); } diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackController.java b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackController.java index dfc5cc670c7..65664513491 100644 --- a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackController.java +++ b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackController.java @@ -439,7 +439,7 @@ boolean canPop() { @Override public StackLayout createView() { StackLayout stackLayout = new StackLayout(getActivity(), topBarController, getId()); - presenter.bindView(topBarController, getBottomTabsController()); + presenter.bindView(getBottomTabsController()); addInitialChild(stackLayout); return stackLayout; } diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenter.java b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenter.java index 09807552e18..236710dd893 100644 --- a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenter.java +++ b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenter.java @@ -89,15 +89,17 @@ public class StackPresenter { private final TypefaceLoader typefaceLoader; public StackPresenter(Activity activity, - TitleBarReactViewCreator titleViewCreator, - TopBarBackgroundViewCreator topBarBackgroundViewCreator, - TitleBarButtonCreator buttonCreator, - IconResolver iconResolver, - TypefaceLoader typefaceLoader, - RenderChecker renderChecker, - Options defaultOptions) { + TitleBarReactViewCreator titleViewCreator, + TitleBarButtonCreator buttonCreator, + TopBarController topBarController, + IconResolver iconResolver, + TypefaceLoader typefaceLoader, + RenderChecker renderChecker, + Options defaultOptions, + TopBarBackgroundViewCreator topBarBackgroundViewCreator) { this.activity = activity; this.titleViewCreator = titleViewCreator; + this.topBarController = topBarController; this.topBarBackgroundViewCreator = topBarBackgroundViewCreator; this.buttonCreator = buttonCreator; this.iconResolver = iconResolver; @@ -118,8 +120,7 @@ public Options getDefaultOptions() { return defaultOptions; } - public void bindView(TopBarController topBarController, @Nullable BottomTabsController bottomTabsController) { - this.topBarController = topBarController; + public void bindView(@Nullable BottomTabsController bottomTabsController) { this.bottomTabsController = bottomTabsController; topBar = topBarController.getView(); } diff --git a/lib/android/app/src/test/java/com/reactnativenavigation/TestUtils.java b/lib/android/app/src/test/java/com/reactnativenavigation/TestUtils.java index e5c5799e90c..ecfc97dfa8a 100644 --- a/lib/android/app/src/test/java/com/reactnativenavigation/TestUtils.java +++ b/lib/android/app/src/test/java/com/reactnativenavigation/TestUtils.java @@ -31,19 +31,37 @@ public class TestUtils { public static StackControllerBuilder newStackController(Activity activity) { - TopBarController topBarController = new TopBarController() { - @Override - protected TopBar createTopBar(@NonNull Context context, @NonNull StackLayout stackLayout) { - TopBar topBar = super.createTopBar(context, stackLayout); - topBar.layout(0, 0, 1000, UiUtils.getTopBarHeight(context)); - return topBar; - } - }; + return newStackController(activity, null); + } + + public static StackControllerBuilder newStackController(Activity activity, TopBarController topBarController) { + if (topBarController == null) { + topBarController = new TopBarController() { + @Override + protected TopBar createTopBar(@NonNull Context context, @NonNull StackLayout stackLayout) { + TopBar topBar = super.createTopBar(context, stackLayout); + topBar.layout(0, 0, 1000, UiUtils.getTopBarHeight(context)); + return topBar; + } + }; + } + + StackPresenter stackPresenter = new StackPresenter(activity, + new TitleBarReactViewCreatorMock(), + new TitleBarButtonCreatorMock(), + topBarController, + new IconResolver(activity, + new ImageLoader()), + new TypefaceLoaderMock(), + new RenderChecker(), + new Options(), + new TopBarBackgroundViewCreatorMock()); + return new StackControllerBuilder(activity, Mockito.mock(EventEmitter.class)) .setId("stack" + CompatUtils.generateViewId()) .setChildRegistry(new ChildControllersRegistry()) .setTopBarController(topBarController) - .setStackPresenter(new StackPresenter(activity, new TitleBarReactViewCreatorMock(), new TopBarBackgroundViewCreatorMock(), new TitleBarButtonCreatorMock(), new IconResolver(activity, new ImageLoader()), new TypefaceLoaderMock(), new RenderChecker(), new Options())) + .setStackPresenter(stackPresenter) .setInitialOptions(new Options()); } diff --git a/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/OptionsApplyingTest.java b/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/OptionsApplyingTest.java index fbf428d9900..a712ab1afa8 100644 --- a/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/OptionsApplyingTest.java +++ b/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/OptionsApplyingTest.java @@ -72,8 +72,7 @@ protected TopBar createTopBar(Context context, StackLayout stackLayout) { return topBar; } }; - stack = TestUtils.newStackController(activity) - .setTopBarController(topBarController) + stack = TestUtils.newStackController(activity, topBarController) .build(); stack.ensureViewIsCreated(); stack.getView().layout(0, 0, 1000, 1000); diff --git a/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerTest.kt b/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerTest.kt index 3ef08c2c880..5b9db523374 100644 --- a/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerTest.kt +++ b/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerTest.kt @@ -24,6 +24,7 @@ import com.reactnativenavigation.viewcontrollers.stack.topbar.TopBarAppearanceAn import com.reactnativenavigation.viewcontrollers.stack.topbar.TopBarController import com.reactnativenavigation.viewcontrollers.stack.topbar.button.BackButtonHelper import com.reactnativenavigation.viewcontrollers.stack.topbar.button.IconResolver +import com.reactnativenavigation.viewcontrollers.statusbar.StatusBarPresenter import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController import com.reactnativenavigation.views.stack.StackBehaviour import com.reactnativenavigation.views.stack.StackLayout @@ -43,7 +44,6 @@ import kotlin.test.fail class StackControllerTest : BaseTest() { private lateinit var activity: Activity private lateinit var childRegistry: ChildControllersRegistry - private lateinit var uut: StackController private lateinit var child1: ViewController<*> private lateinit var child1a: ViewController<*> private lateinit var child2: ViewController<*> @@ -56,28 +56,23 @@ class StackControllerTest : BaseTest() { private lateinit var presenter: StackPresenter private lateinit var backButtonHelper: BackButtonHelper private lateinit var eventEmitter: EventEmitter + private lateinit var uut: StackController override fun beforeEach() { super.beforeEach() eventEmitter = mock() backButtonHelper = spy(BackButtonHelper()) activity = newActivity() + StatusBarPresenter.init(activity) SystemUiUtils.saveStatusBarHeight(63) animator = spy(StackAnimator(activity)) childRegistry = ChildControllersRegistry() - presenter = spy(StackPresenter( - activity, - TitleBarReactViewCreatorMock(), - TopBarBackgroundViewCreatorMock(), - TitleBarButtonCreatorMock(), - IconResolver(activity, ImageLoaderMock.mock()), - TypefaceLoaderMock(), - RenderChecker(), - Options() - ) - ) + topBarAnimator = TopBarAppearanceAnimator() + topBarController = createTopBarController(topBarAnimator) + presenter = createStackPresenter() createChildren() - uut = createStack() + + uut = createStackBuilder("stack", ArrayList()).build() activity.setContentView(uut.view) } @@ -101,7 +96,7 @@ class StackControllerTest : BaseTest() { @Test fun childrenMustBeUniqueById() { try { - val uut: StackController = createStack(listOf(child1, child2, child1)) + val uut: StackController = recreateStack(listOf(child1, child2, child1)) fail("Stack should not have duplicate ids!") } catch (e: IllegalArgumentException) { assertThat(e.message).contains(child1.id) @@ -110,7 +105,7 @@ class StackControllerTest : BaseTest() { @Test fun childrenAreAssignedParent() { - val uut: StackController = createStack(listOf(child1, child2)) + val uut: StackController = recreateStack(listOf(child1, child2)) for (child in uut.childControllers) { assertThat(child.parentController == uut).isTrue() } @@ -118,14 +113,14 @@ class StackControllerTest : BaseTest() { @Test fun constructor_backButtonIsAddedToChild() { - createStack(listOf(child1, child2, child3)) + recreateStack(listOf(child1, child2, child3)) assertThat(child2.options.topBar.buttons.back.visible[false]).isTrue() assertThat(child3.options.topBar.buttons.back.visible[false]).isTrue() } @Test fun createView_currentChildIsAdded() { - val uut: StackController = createStack(listOf(child1, child2, child3, child4)) + val uut: StackController = recreateStack(listOf(child1, child2, child3, child4)) assertThat(uut.childControllers.size).isEqualTo(4) assertThat(uut.view.childCount).isEqualTo(2) assertThat(uut.view.getChildAt(0)).isEqualTo(child4.view) @@ -622,7 +617,7 @@ class StackControllerTest : BaseTest() { assertThat(child1.parentController).isNull() uut.push(child1, CommandListenerAdapter()) assertThat(child1.parentController).isEqualTo(uut) - val anotherNavController = createStack("another") + val anotherNavController = recreateStack("another") anotherNavController.ensureViewIsCreated() anotherNavController.push(child2, CommandListenerAdapter()) assertThat(child2.parentController).isEqualTo(anotherNavController) @@ -832,7 +827,7 @@ class StackControllerTest : BaseTest() { @Test fun findControllerById_Deeply() { - val stack = createStack("another") + val stack = recreateStack("another") stack.ensureViewIsCreated() stack.push(child2, CommandListenerAdapter()) uut.push(stack, CommandListenerAdapter()) @@ -923,8 +918,7 @@ class StackControllerTest : BaseTest() { @Test fun stackCanBePushed() { - uut.view.removeFromParent() - val parent = createStack("someStack") + val parent = recreateStack("someStack") parent.ensureViewIsCreated() parent.push(uut, CommandListenerAdapter()) uut.onViewWillAppear() @@ -933,8 +927,7 @@ class StackControllerTest : BaseTest() { @Test fun applyOptions_applyOnlyOnFirstStack() { - uut.view.removeFromParent() - val parent = spy(createStack("someStack")) + val parent = spy(recreateStack("someStack")) parent.ensureViewIsCreated() parent.push(uut, CommandListenerAdapter()) val childOptions = Options() @@ -1056,7 +1049,7 @@ class StackControllerTest : BaseTest() { activity.setContentView(parent) val child = SimpleViewController(activity, childRegistry, "child1", Options()) - val stack = createStack(Collections.singletonList(child)) + val stack = recreateStack(Collections.singletonList(child)) stack.view.visibility = View.INVISIBLE parent.addView(stack.view) @@ -1068,7 +1061,7 @@ class StackControllerTest : BaseTest() { @Test fun onAttachToParent_doesNotCrashWhenCalledAfterDestroy() { Robolectric.getForegroundThreadScheduler().pause() - val spy = spy(createStack()) + val spy = spy(recreateStack()) val view = spy.view spy.push(child1, CommandListenerAdapter()) activity.setContentView(view) @@ -1128,39 +1121,57 @@ class StackControllerTest : BaseTest() { .containsOnly(*ids) } - private fun createStack(): StackController { + private fun recreateStack(): StackController { + uut.view.removeFromParent() + topBarController.view.removeFromParent() + return createStackBuilder("stack", ArrayList()).build() } - private fun createStack(id: String): StackController { + private fun recreateStack(id: String): StackController { + uut.view.removeFromParent() + topBarController.view.removeFromParent() + return createStackBuilder(id, ArrayList()).build() } - private fun createStack(children: List>): StackController { + private fun recreateStack(children: List>): StackController { + uut.view.removeFromParent() + topBarController.view.removeFromParent() + return createStackBuilder("stack", children).build() } private fun createStackBuilder(id: String, children: List>): StackControllerBuilder { - createTopBarController() - return TestUtils.newStackController(activity) + return TestUtils.newStackController(activity, topBarController) .setEventEmitter(eventEmitter) .setChildren(children) .setId(id) - .setTopBarController(topBarController) .setChildRegistry(childRegistry) .setAnimator(animator) .setStackPresenter(presenter) .setBackButtonHelper(backButtonHelper) } - private fun createTopBarController() { - topBarAnimator = TopBarAppearanceAnimator() - topBarController = spy(object : TopBarController(topBarAnimator) { + private fun createTopBarController(topBarAnimator: TopBarAppearanceAnimator): TopBarController = + spy(object : TopBarController(topBarAnimator) { override fun createTopBar(context: Context, stackLayout: StackLayout): TopBar { val spy = spy(super.createTopBar(context, stackLayout)) spy.layout(0, 0, 1000, UiUtils.getTopBarHeight(activity)) return spy } }) - } + + private fun createStackPresenter() = + spy(StackPresenter( + activity, + TitleBarReactViewCreatorMock(), + TitleBarButtonCreatorMock(), + topBarController, + IconResolver(activity, ImageLoaderMock.mock()), + TypefaceLoaderMock(), + RenderChecker(), + Options(), + TopBarBackgroundViewCreatorMock() + )) } \ No newline at end of file diff --git a/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenterTest.kt b/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenterTest.kt index 5e22db102d0..bf519339995 100644 --- a/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenterTest.kt +++ b/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenterTest.kt @@ -24,6 +24,7 @@ import com.reactnativenavigation.viewcontrollers.stack.topbar.button.ButtonContr import com.reactnativenavigation.viewcontrollers.stack.topbar.button.ButtonPresenter import com.reactnativenavigation.viewcontrollers.stack.topbar.button.IconResolver import com.reactnativenavigation.viewcontrollers.stack.topbar.title.TitleBarReactViewController +import com.reactnativenavigation.viewcontrollers.statusbar.StatusBarPresenter import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController import com.reactnativenavigation.views.stack.StackLayout import com.reactnativenavigation.views.stack.topbar.TopBar @@ -66,6 +67,7 @@ class StackPresenterTest : BaseTest() { override fun beforeEach() { super.beforeEach() activity = spy(newActivity()) + StatusBarPresenter.init(activity) val titleViewCreator: TitleBarReactViewCreatorMock = object : TitleBarReactViewCreatorMock() { override fun create(context: Context, componentId: String, componentName: String): TitleBarReactView { reactTitleView = spy(super.create(context, componentId, componentName)) @@ -76,18 +78,19 @@ class StackPresenterTest : BaseTest() { typefaceLoader = createTypeFaceLoader() iconResolver = IconResolverFake(activity) buttonCreator = TitleBarButtonCreatorMock() + topBarController = createTopBarController() ogUut = StackPresenter( - activity, - titleViewCreator, - TopBarBackgroundViewCreatorMock(), - buttonCreator, - iconResolver, - typefaceLoader, - renderChecker, - Options() + activity, + titleViewCreator, + buttonCreator, + topBarController, + iconResolver, + typefaceLoader, + renderChecker, + Options(), + TopBarBackgroundViewCreatorMock() ) uut = spy(ogUut) - createTopBarController() parent = TestUtils.newStackController(activity) .setTopBarController(topBarController) .setStackPresenter(uut) @@ -1043,8 +1046,8 @@ class StackPresenterTest : BaseTest() { verify(topBarController, times(t)).hide() } - private fun createTopBarController() { - topBarController = spy(object : TopBarController() { + private fun createTopBarController(): TopBarController { + return spy(object : TopBarController() { override fun createTopBar(context: Context, stackLayout: StackLayout): TopBar { topBar = spy(super.createTopBar(context, stackLayout)) topBar.layout(0, 0, 1000, UiUtils.getTopBarHeight(activity))