Skip to content

Commit 831b3f2

Browse files
committed
Bump top-bar ctrl instance to StackPresenter instance create (#8098)
1 parent ea364c2 commit 831b3f2

File tree

8 files changed

+110
-74
lines changed

8 files changed

+110
-74
lines changed

lib/android/app/src/androidTest/java/com/reactnativenavigation/TestUtils.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,13 @@ protected TopBar createTopBar(@NonNull Context context, @NonNull StackLayout sta
4343
.setId("stack" + CompatUtils.generateViewId())
4444
.setChildRegistry(new ChildControllersRegistry())
4545
.setTopBarController(topBarController)
46-
.setStackPresenter(new StackPresenter(activity, new TitleBarReactViewCreatorMock(),
47-
new TopBarBackgroundViewCreatorMock(), new TitleBarButtonCreatorMock(),
46+
.setStackPresenter(new StackPresenter(activity,
47+
new TitleBarReactViewCreatorMock(),
48+
new TitleBarButtonCreatorMock(),
49+
topBarController,
4850
new IconResolver(activity, new ImageLoader()), new TypefaceLoaderMock(), new RenderChecker(),
49-
new Options()))
51+
new Options(),
52+
new TopBarBackgroundViewCreatorMock()))
5053
.setInitialOptions(new Options());
5154
}
5255

lib/android/app/src/main/java/com/reactnativenavigation/options/LayoutFactory.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,21 +186,22 @@ private ViewController<?> createExternalComponent(ReactContext context, LayoutNo
186186
}
187187

188188
private ViewController<?> createStack(LayoutNode node) {
189+
final TopBarController topBarController = new TopBarController();
189190
return new StackControllerBuilder(activity, eventEmitter)
190191
.setChildren(createChildren(node.children))
191192
.setChildRegistry(childRegistry)
192-
.setTopBarController(new TopBarController())
193+
.setTopBarController(topBarController)
193194
.setId(node.id)
194195
.setInitialOptions(parseOptions(node.getOptions()))
195196
.setStackPresenter(new StackPresenter(activity,
196197
new TitleBarReactViewCreator(),
197-
new TopBarBackgroundViewCreator(),
198198
new TitleBarButtonCreator(),
199+
topBarController,
199200
new IconResolver(activity, new ImageLoader()),
200201
new TypefaceLoader(activity),
201202
new RenderChecker(),
202-
defaultOptions
203-
))
203+
defaultOptions,
204+
new TopBarBackgroundViewCreator()))
204205
.setPresenter(new Presenter(activity, defaultOptions))
205206
.build();
206207
}

lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ boolean canPop() {
439439
@Override
440440
public StackLayout createView() {
441441
StackLayout stackLayout = new StackLayout(getActivity(), topBarController, getId());
442-
presenter.bindView(topBarController, getBottomTabsController());
442+
presenter.bindView(getBottomTabsController());
443443
addInitialChild(stackLayout);
444444
return stackLayout;
445445
}

lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenter.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,17 @@ public class StackPresenter {
8989
private final TypefaceLoader typefaceLoader;
9090

9191
public StackPresenter(Activity activity,
92-
TitleBarReactViewCreator titleViewCreator,
93-
TopBarBackgroundViewCreator topBarBackgroundViewCreator,
94-
TitleBarButtonCreator buttonCreator,
95-
IconResolver iconResolver,
96-
TypefaceLoader typefaceLoader,
97-
RenderChecker renderChecker,
98-
Options defaultOptions) {
92+
TitleBarReactViewCreator titleViewCreator,
93+
TitleBarButtonCreator buttonCreator,
94+
TopBarController topBarController,
95+
IconResolver iconResolver,
96+
TypefaceLoader typefaceLoader,
97+
RenderChecker renderChecker,
98+
Options defaultOptions,
99+
TopBarBackgroundViewCreator topBarBackgroundViewCreator) {
99100
this.activity = activity;
100101
this.titleViewCreator = titleViewCreator;
102+
this.topBarController = topBarController;
101103
this.topBarBackgroundViewCreator = topBarBackgroundViewCreator;
102104
this.buttonCreator = buttonCreator;
103105
this.iconResolver = iconResolver;
@@ -118,8 +120,7 @@ public Options getDefaultOptions() {
118120
return defaultOptions;
119121
}
120122

121-
public void bindView(TopBarController topBarController, @Nullable BottomTabsController bottomTabsController) {
122-
this.topBarController = topBarController;
123+
public void bindView(@Nullable BottomTabsController bottomTabsController) {
123124
this.bottomTabsController = bottomTabsController;
124125
topBar = topBarController.getView();
125126
}

lib/android/app/src/test/java/com/reactnativenavigation/TestUtils.java

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,37 @@
3131

3232
public class TestUtils {
3333
public static StackControllerBuilder newStackController(Activity activity) {
34-
TopBarController topBarController = new TopBarController() {
35-
@Override
36-
protected TopBar createTopBar(@NonNull Context context, @NonNull StackLayout stackLayout) {
37-
TopBar topBar = super.createTopBar(context, stackLayout);
38-
topBar.layout(0, 0, 1000, UiUtils.getTopBarHeight(context));
39-
return topBar;
40-
}
41-
};
34+
return newStackController(activity, null);
35+
}
36+
37+
public static StackControllerBuilder newStackController(Activity activity, TopBarController topBarController) {
38+
if (topBarController == null) {
39+
topBarController = new TopBarController() {
40+
@Override
41+
protected TopBar createTopBar(@NonNull Context context, @NonNull StackLayout stackLayout) {
42+
TopBar topBar = super.createTopBar(context, stackLayout);
43+
topBar.layout(0, 0, 1000, UiUtils.getTopBarHeight(context));
44+
return topBar;
45+
}
46+
};
47+
}
48+
49+
StackPresenter stackPresenter = new StackPresenter(activity,
50+
new TitleBarReactViewCreatorMock(),
51+
new TitleBarButtonCreatorMock(),
52+
topBarController,
53+
new IconResolver(activity,
54+
new ImageLoader()),
55+
new TypefaceLoaderMock(),
56+
new RenderChecker(),
57+
new Options(),
58+
new TopBarBackgroundViewCreatorMock());
59+
4260
return new StackControllerBuilder(activity, Mockito.mock(EventEmitter.class))
4361
.setId("stack" + CompatUtils.generateViewId())
4462
.setChildRegistry(new ChildControllersRegistry())
4563
.setTopBarController(topBarController)
46-
.setStackPresenter(new StackPresenter(activity, new TitleBarReactViewCreatorMock(), new TopBarBackgroundViewCreatorMock(), new TitleBarButtonCreatorMock(), new IconResolver(activity, new ImageLoader()), new TypefaceLoaderMock(), new RenderChecker(), new Options()))
64+
.setStackPresenter(stackPresenter)
4765
.setInitialOptions(new Options());
4866
}
4967

lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/OptionsApplyingTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ protected TopBar createTopBar(Context context, StackLayout stackLayout) {
7272
return topBar;
7373
}
7474
};
75-
stack = TestUtils.newStackController(activity)
76-
.setTopBarController(topBarController)
75+
stack = TestUtils.newStackController(activity, topBarController)
7776
.build();
7877
stack.ensureViewIsCreated();
7978
stack.getView().layout(0, 0, 1000, 1000);

lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerTest.kt

Lines changed: 46 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.reactnativenavigation.viewcontrollers.stack.topbar.TopBarAppearanceAn
2424
import com.reactnativenavigation.viewcontrollers.stack.topbar.TopBarController
2525
import com.reactnativenavigation.viewcontrollers.stack.topbar.button.BackButtonHelper
2626
import com.reactnativenavigation.viewcontrollers.stack.topbar.button.IconResolver
27+
import com.reactnativenavigation.viewcontrollers.statusbar.StatusBarPresenter
2728
import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController
2829
import com.reactnativenavigation.views.stack.StackBehaviour
2930
import com.reactnativenavigation.views.stack.StackLayout
@@ -43,7 +44,6 @@ import kotlin.test.fail
4344
class StackControllerTest : BaseTest() {
4445
private lateinit var activity: Activity
4546
private lateinit var childRegistry: ChildControllersRegistry
46-
private lateinit var uut: StackController
4747
private lateinit var child1: ViewController<*>
4848
private lateinit var child1a: ViewController<*>
4949
private lateinit var child2: ViewController<*>
@@ -56,28 +56,23 @@ class StackControllerTest : BaseTest() {
5656
private lateinit var presenter: StackPresenter
5757
private lateinit var backButtonHelper: BackButtonHelper
5858
private lateinit var eventEmitter: EventEmitter
59+
private lateinit var uut: StackController
5960

6061
override fun beforeEach() {
6162
super.beforeEach()
6263
eventEmitter = mock()
6364
backButtonHelper = spy(BackButtonHelper())
6465
activity = newActivity()
66+
StatusBarPresenter.init(activity)
6567
SystemUiUtils.saveStatusBarHeight(63)
6668
animator = spy(StackAnimator(activity))
6769
childRegistry = ChildControllersRegistry()
68-
presenter = spy(StackPresenter(
69-
activity,
70-
TitleBarReactViewCreatorMock(),
71-
TopBarBackgroundViewCreatorMock(),
72-
TitleBarButtonCreatorMock(),
73-
IconResolver(activity, ImageLoaderMock.mock()),
74-
TypefaceLoaderMock(),
75-
RenderChecker(),
76-
Options()
77-
)
78-
)
70+
topBarAnimator = TopBarAppearanceAnimator()
71+
topBarController = createTopBarController(topBarAnimator)
72+
presenter = createStackPresenter()
7973
createChildren()
80-
uut = createStack()
74+
75+
uut = createStackBuilder("stack", ArrayList()).build()
8176
activity.setContentView(uut.view)
8277
}
8378

@@ -101,7 +96,7 @@ class StackControllerTest : BaseTest() {
10196
@Test
10297
fun childrenMustBeUniqueById() {
10398
try {
104-
val uut: StackController = createStack(listOf(child1, child2, child1))
99+
val uut: StackController = recreateStack(listOf(child1, child2, child1))
105100
fail("Stack should not have duplicate ids!")
106101
} catch (e: IllegalArgumentException) {
107102
assertThat(e.message).contains(child1.id)
@@ -110,22 +105,22 @@ class StackControllerTest : BaseTest() {
110105

111106
@Test
112107
fun childrenAreAssignedParent() {
113-
val uut: StackController = createStack(listOf(child1, child2))
108+
val uut: StackController = recreateStack(listOf(child1, child2))
114109
for (child in uut.childControllers) {
115110
assertThat(child.parentController == uut).isTrue()
116111
}
117112
}
118113

119114
@Test
120115
fun constructor_backButtonIsAddedToChild() {
121-
createStack(listOf(child1, child2, child3))
116+
recreateStack(listOf(child1, child2, child3))
122117
assertThat(child2.options.topBar.buttons.back.visible[false]).isTrue()
123118
assertThat(child3.options.topBar.buttons.back.visible[false]).isTrue()
124119
}
125120

126121
@Test
127122
fun createView_currentChildIsAdded() {
128-
val uut: StackController = createStack(listOf(child1, child2, child3, child4))
123+
val uut: StackController = recreateStack(listOf(child1, child2, child3, child4))
129124
assertThat(uut.childControllers.size).isEqualTo(4)
130125
assertThat(uut.view.childCount).isEqualTo(2)
131126
assertThat(uut.view.getChildAt(0)).isEqualTo(child4.view)
@@ -622,7 +617,7 @@ class StackControllerTest : BaseTest() {
622617
assertThat(child1.parentController).isNull()
623618
uut.push(child1, CommandListenerAdapter())
624619
assertThat(child1.parentController).isEqualTo(uut)
625-
val anotherNavController = createStack("another")
620+
val anotherNavController = recreateStack("another")
626621
anotherNavController.ensureViewIsCreated()
627622
anotherNavController.push(child2, CommandListenerAdapter())
628623
assertThat(child2.parentController).isEqualTo(anotherNavController)
@@ -832,7 +827,7 @@ class StackControllerTest : BaseTest() {
832827

833828
@Test
834829
fun findControllerById_Deeply() {
835-
val stack = createStack("another")
830+
val stack = recreateStack("another")
836831
stack.ensureViewIsCreated()
837832
stack.push(child2, CommandListenerAdapter())
838833
uut.push(stack, CommandListenerAdapter())
@@ -923,8 +918,7 @@ class StackControllerTest : BaseTest() {
923918

924919
@Test
925920
fun stackCanBePushed() {
926-
uut.view.removeFromParent()
927-
val parent = createStack("someStack")
921+
val parent = recreateStack("someStack")
928922
parent.ensureViewIsCreated()
929923
parent.push(uut, CommandListenerAdapter())
930924
uut.onViewWillAppear()
@@ -933,8 +927,7 @@ class StackControllerTest : BaseTest() {
933927

934928
@Test
935929
fun applyOptions_applyOnlyOnFirstStack() {
936-
uut.view.removeFromParent()
937-
val parent = spy(createStack("someStack"))
930+
val parent = spy(recreateStack("someStack"))
938931
parent.ensureViewIsCreated()
939932
parent.push(uut, CommandListenerAdapter())
940933
val childOptions = Options()
@@ -1056,7 +1049,7 @@ class StackControllerTest : BaseTest() {
10561049
activity.setContentView(parent)
10571050

10581051
val child = SimpleViewController(activity, childRegistry, "child1", Options())
1059-
val stack = createStack(Collections.singletonList(child))
1052+
val stack = recreateStack(Collections.singletonList(child))
10601053
stack.view.visibility = View.INVISIBLE
10611054

10621055
parent.addView(stack.view)
@@ -1068,7 +1061,7 @@ class StackControllerTest : BaseTest() {
10681061
@Test
10691062
fun onAttachToParent_doesNotCrashWhenCalledAfterDestroy() {
10701063
Robolectric.getForegroundThreadScheduler().pause()
1071-
val spy = spy(createStack())
1064+
val spy = spy(recreateStack())
10721065
val view = spy.view
10731066
spy.push(child1, CommandListenerAdapter())
10741067
activity.setContentView(view)
@@ -1128,39 +1121,57 @@ class StackControllerTest : BaseTest() {
11281121
.containsOnly(*ids)
11291122
}
11301123

1131-
private fun createStack(): StackController {
1124+
private fun recreateStack(): StackController {
1125+
uut.view.removeFromParent()
1126+
topBarController.view.removeFromParent()
1127+
11321128
return createStackBuilder("stack", ArrayList()).build()
11331129
}
11341130

1135-
private fun createStack(id: String): StackController {
1131+
private fun recreateStack(id: String): StackController {
1132+
uut.view.removeFromParent()
1133+
topBarController.view.removeFromParent()
1134+
11361135
return createStackBuilder(id, ArrayList()).build()
11371136
}
11381137

1139-
private fun createStack(children: List<ViewController<*>>): StackController {
1138+
private fun recreateStack(children: List<ViewController<*>>): StackController {
1139+
uut.view.removeFromParent()
1140+
topBarController.view.removeFromParent()
1141+
11401142
return createStackBuilder("stack", children).build()
11411143
}
11421144

11431145
private fun createStackBuilder(id: String, children: List<ViewController<*>>): StackControllerBuilder {
1144-
createTopBarController()
1145-
return TestUtils.newStackController(activity)
1146+
return TestUtils.newStackController(activity, topBarController)
11461147
.setEventEmitter(eventEmitter)
11471148
.setChildren(children)
11481149
.setId(id)
1149-
.setTopBarController(topBarController)
11501150
.setChildRegistry(childRegistry)
11511151
.setAnimator(animator)
11521152
.setStackPresenter(presenter)
11531153
.setBackButtonHelper(backButtonHelper)
11541154
}
11551155

1156-
private fun createTopBarController() {
1157-
topBarAnimator = TopBarAppearanceAnimator()
1158-
topBarController = spy(object : TopBarController(topBarAnimator) {
1156+
private fun createTopBarController(topBarAnimator: TopBarAppearanceAnimator): TopBarController =
1157+
spy(object : TopBarController(topBarAnimator) {
11591158
override fun createTopBar(context: Context, stackLayout: StackLayout): TopBar {
11601159
val spy = spy(super.createTopBar(context, stackLayout))
11611160
spy.layout(0, 0, 1000, UiUtils.getTopBarHeight(activity))
11621161
return spy
11631162
}
11641163
})
1165-
}
1164+
1165+
private fun createStackPresenter() =
1166+
spy(StackPresenter(
1167+
activity,
1168+
TitleBarReactViewCreatorMock(),
1169+
TitleBarButtonCreatorMock(),
1170+
topBarController,
1171+
IconResolver(activity, ImageLoaderMock.mock()),
1172+
TypefaceLoaderMock(),
1173+
RenderChecker(),
1174+
Options(),
1175+
TopBarBackgroundViewCreatorMock()
1176+
))
11661177
}

0 commit comments

Comments
 (0)