Skip to content

Commit 08f2cfb

Browse files
authored
Bump top-bar ctrl instance to StackPresenter instance create (#8098)
1 parent adf027d commit 08f2cfb

File tree

7 files changed

+104
-71
lines changed

7 files changed

+104
-71
lines changed

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
@@ -187,21 +187,22 @@ private ViewController<?> createExternalComponent(ReactContext context, LayoutNo
187187
}
188188

189189
private ViewController<?> createStack(LayoutNode node) {
190+
final TopBarController topBarController = new TopBarController();
190191
return new StackControllerBuilder(activity, eventEmitter)
191192
.setChildren(createChildren(node.children))
192193
.setChildRegistry(childRegistry)
193-
.setTopBarController(new TopBarController())
194+
.setTopBarController(topBarController)
194195
.setId(node.id)
195196
.setInitialOptions(parseOptions(node.getOptions()))
196197
.setStackPresenter(new StackPresenter(activity,
197198
new TitleBarReactViewCreator(reactInstanceManager),
198-
new TopBarBackgroundViewCreator(reactInstanceManager),
199199
new TitleBarButtonCreator(reactInstanceManager),
200+
topBarController,
200201
new IconResolver(activity, new ImageLoader()),
201202
new TypefaceLoader(activity),
202203
new RenderChecker(),
203-
defaultOptions
204-
))
204+
defaultOptions,
205+
new TopBarBackgroundViewCreator(reactInstanceManager)))
205206
.setPresenter(new Presenter(activity, defaultOptions))
206207
.build();
207208
}

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
@@ -70,8 +70,7 @@ protected TopBar createTopBar(Context context, StackLayout stackLayout) {
7070
return topBar;
7171
}
7272
};
73-
stack = TestUtils.newStackController(activity)
74-
.setTopBarController(topBarController)
73+
stack = TestUtils.newStackController(activity, topBarController)
7574
.build();
7675
stack.ensureViewIsCreated();
7776
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
@@ -42,7 +43,6 @@ import kotlin.test.fail
4243
class StackControllerTest : BaseTest() {
4344
private lateinit var activity: Activity
4445
private lateinit var childRegistry: ChildControllersRegistry
45-
private lateinit var uut: StackController
4646
private lateinit var child1: ViewController<*>
4747
private lateinit var child1a: ViewController<*>
4848
private lateinit var child2: ViewController<*>
@@ -55,28 +55,23 @@ class StackControllerTest : BaseTest() {
5555
private lateinit var presenter: StackPresenter
5656
private lateinit var backButtonHelper: BackButtonHelper
5757
private lateinit var eventEmitter: EventEmitter
58+
private lateinit var uut: StackController
5859

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

@@ -100,7 +95,7 @@ class StackControllerTest : BaseTest() {
10095
@Test
10196
fun childrenMustBeUniqueById() {
10297
try {
103-
val uut: StackController = createStack(listOf(child1, child2, child1))
98+
val uut: StackController = recreateStack(listOf(child1, child2, child1))
10499
fail("Stack should not have duplicate ids!")
105100
} catch (e: IllegalArgumentException) {
106101
assertThat(e.message).contains(child1.id)
@@ -109,22 +104,22 @@ class StackControllerTest : BaseTest() {
109104

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

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

125120
@Test
126121
fun createView_currentChildIsAdded() {
127-
val uut: StackController = createStack(listOf(child1, child2, child3, child4))
122+
val uut: StackController = recreateStack(listOf(child1, child2, child3, child4))
128123
assertThat(uut.childControllers.size).isEqualTo(4)
129124
assertThat(uut.view.childCount).isEqualTo(2)
130125
assertThat(uut.view.getChildAt(0)).isEqualTo(child4.view)
@@ -621,7 +616,7 @@ class StackControllerTest : BaseTest() {
621616
assertThat(child1.parentController).isNull()
622617
uut.push(child1, CommandListenerAdapter())
623618
assertThat(child1.parentController).isEqualTo(uut)
624-
val anotherNavController = createStack("another")
619+
val anotherNavController = recreateStack("another")
625620
anotherNavController.ensureViewIsCreated()
626621
anotherNavController.push(child2, CommandListenerAdapter())
627622
assertThat(child2.parentController).isEqualTo(anotherNavController)
@@ -831,7 +826,7 @@ class StackControllerTest : BaseTest() {
831826

832827
@Test
833828
fun findControllerById_Deeply() {
834-
val stack = createStack("another")
829+
val stack = recreateStack("another")
835830
stack.ensureViewIsCreated()
836831
stack.push(child2, CommandListenerAdapter())
837832
uut.push(stack, CommandListenerAdapter())
@@ -922,8 +917,7 @@ class StackControllerTest : BaseTest() {
922917

923918
@Test
924919
fun stackCanBePushed() {
925-
uut.view.removeFromParent()
926-
val parent = createStack("someStack")
920+
val parent = recreateStack("someStack")
927921
parent.ensureViewIsCreated()
928922
parent.push(uut, CommandListenerAdapter())
929923
uut.onViewWillAppear()
@@ -932,8 +926,7 @@ class StackControllerTest : BaseTest() {
932926

933927
@Test
934928
fun applyOptions_applyOnlyOnFirstStack() {
935-
uut.view.removeFromParent()
936-
val parent = spy(createStack("someStack"))
929+
val parent = spy(recreateStack("someStack"))
937930
parent.ensureViewIsCreated()
938931
parent.push(uut, CommandListenerAdapter())
939932
val childOptions = Options()
@@ -1055,7 +1048,7 @@ class StackControllerTest : BaseTest() {
10551048
activity.setContentView(parent)
10561049

10571050
val child = SimpleViewController(activity, childRegistry, "child1", Options())
1058-
val stack = createStack(Collections.singletonList(child))
1051+
val stack = recreateStack(Collections.singletonList(child))
10591052
stack.view.visibility = View.INVISIBLE
10601053

10611054
parent.addView(stack.view)
@@ -1067,7 +1060,7 @@ class StackControllerTest : BaseTest() {
10671060
@Test
10681061
fun onAttachToParent_doesNotCrashWhenCalledAfterDestroy() {
10691062
Robolectric.getForegroundThreadScheduler().pause()
1070-
val spy = spy(createStack())
1063+
val spy = spy(recreateStack())
10711064
val view = spy.view
10721065
spy.push(child1, CommandListenerAdapter())
10731066
activity.setContentView(view)
@@ -1127,39 +1120,57 @@ class StackControllerTest : BaseTest() {
11271120
.containsOnly(*ids)
11281121
}
11291122

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

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

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

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

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

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

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.reactnativenavigation.viewcontrollers.stack.topbar.button.ButtonContr
2424
import com.reactnativenavigation.viewcontrollers.stack.topbar.button.ButtonPresenter
2525
import com.reactnativenavigation.viewcontrollers.stack.topbar.button.IconResolver
2626
import com.reactnativenavigation.viewcontrollers.stack.topbar.title.TitleBarReactViewController
27+
import com.reactnativenavigation.viewcontrollers.statusbar.StatusBarPresenter
2728
import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController
2829
import com.reactnativenavigation.views.stack.StackLayout
2930
import com.reactnativenavigation.views.stack.topbar.TopBar
@@ -65,6 +66,7 @@ class StackPresenterTest : BaseTest() {
6566
override fun beforeEach() {
6667
super.beforeEach()
6768
activity = spy(newActivity())
69+
StatusBarPresenter.init(activity)
6870
val titleViewCreator: TitleBarReactViewCreatorMock = object : TitleBarReactViewCreatorMock() {
6971
override fun create(activity: Activity, componentId: String, componentName: String): TitleBarReactView {
7072
reactTitleView = spy(super.create(activity, componentId, componentName))
@@ -75,18 +77,19 @@ class StackPresenterTest : BaseTest() {
7577
typefaceLoader = createTypeFaceLoader()
7678
iconResolver = IconResolverFake(activity)
7779
buttonCreator = TitleBarButtonCreatorMock()
80+
topBarController = createTopBarController()
7881
ogUut = StackPresenter(
79-
activity,
80-
titleViewCreator,
81-
TopBarBackgroundViewCreatorMock(),
82-
buttonCreator,
83-
iconResolver,
84-
typefaceLoader,
85-
renderChecker,
86-
Options()
82+
activity,
83+
titleViewCreator,
84+
buttonCreator,
85+
topBarController,
86+
iconResolver,
87+
typefaceLoader,
88+
renderChecker,
89+
Options(),
90+
TopBarBackgroundViewCreatorMock()
8791
)
8892
uut = spy(ogUut)
89-
createTopBarController()
9093
parent = TestUtils.newStackController(activity)
9194
.setTopBarController(topBarController)
9295
.setStackPresenter(uut)
@@ -1042,8 +1045,8 @@ class StackPresenterTest : BaseTest() {
10421045
verify(topBarController, times(t)).hide()
10431046
}
10441047

1045-
private fun createTopBarController() {
1046-
topBarController = spy(object : TopBarController() {
1048+
private fun createTopBarController(): TopBarController {
1049+
return spy(object : TopBarController() {
10471050
override fun createTopBar(context: Context, stackLayout: StackLayout): TopBar {
10481051
topBar = spy(super.createTopBar(context, stackLayout))
10491052
topBar.layout(0, 0, 1000, UiUtils.getTopBarHeight(activity))

0 commit comments

Comments
 (0)