Browse Source

Merge child options in stack controller only if child is visible

This needs to be addressed for other ParentControllers as well
Guy Carmeli 6 years ago
parent
commit
2fb2885608

+ 2
- 2
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/ComponentViewController.java View File

50
     }
50
     }
51
 
51
 
52
     @Override
52
     @Override
53
-    protected boolean isViewShown() {
53
+    public boolean isViewShown() {
54
         return super.isViewShown() && view.isReady();
54
         return super.isViewShown() && view.isReady();
55
     }
55
     }
56
 
56
 
63
 
63
 
64
     @Override
64
     @Override
65
     public void mergeOptions(Options options) {
65
     public void mergeOptions(Options options) {
66
-        performOnParentController(parentController -> parentController.mergeChildOptions(options, getView()));
66
+        performOnParentController(parentController -> parentController.mergeChildOptions(options, this, getView()));
67
         super.mergeOptions(options);
67
         super.mergeOptions(options);
68
     }
68
     }
69
 
69
 

+ 1
- 1
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/ParentController.java View File

104
     }
104
     }
105
 
105
 
106
     @CallSuper
106
     @CallSuper
107
-    public void mergeChildOptions(Options options, Component child) {
107
+    public void mergeChildOptions(Options options, ViewController childController, Component child) {
108
 
108
 
109
     }
109
     }
110
 
110
 

+ 3
- 3
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/SideMenuController.java View File

70
     }
70
     }
71
 
71
 
72
     @Override
72
     @Override
73
-    public void mergeChildOptions(Options options, Component child) {
74
-        super.mergeChildOptions(options, child);
73
+    public void mergeChildOptions(Options options, ViewController childController, Component child) {
74
+        super.mergeChildOptions(options, childController, child);
75
         new SideMenuOptionsPresenter(getView()).present(options.sideMenuRootOptions);
75
         new SideMenuOptionsPresenter(getView()).present(options.sideMenuRootOptions);
76
         performOnParentController(parentController ->
76
         performOnParentController(parentController ->
77
-                ((ParentController) parentController).mergeChildOptions(options.copy().clearSideMenuOptions(), child)
77
+                ((ParentController) parentController).mergeChildOptions(options.copy().clearSideMenuOptions(), childController, child)
78
         );
78
         );
79
     }
79
     }
80
 
80
 

+ 1
- 1
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/ViewController.java View File

279
 
279
 
280
     public abstract void sendOnNavigationButtonPressed(String buttonId);
280
     public abstract void sendOnNavigationButtonPressed(String buttonId);
281
 
281
 
282
-    protected boolean isViewShown() {
282
+    public boolean isViewShown() {
283
         return !isDestroyed &&
283
         return !isDestroyed &&
284
                getView().isShown() &&
284
                getView().isShown() &&
285
                view != null &&
285
                view != null &&

+ 3
- 3
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsController.java View File

90
     }
90
     }
91
 
91
 
92
     @Override
92
     @Override
93
-    public void mergeChildOptions(Options options, Component child) {
94
-        super.mergeChildOptions(options, child);
93
+    public void mergeChildOptions(Options options, ViewController childController, Component child) {
94
+        super.mergeChildOptions(options, childController, child);
95
         presenter.mergeChildOptions(options, child);
95
         presenter.mergeChildOptions(options, child);
96
         tabPresenter.mergeChildOptions(options, child);
96
         tabPresenter.mergeChildOptions(options, child);
97
         performOnParentController(parentController ->
97
         performOnParentController(parentController ->
98
-                ((ParentController) parentController).mergeChildOptions(options.copy().clearBottomTabsOptions(), child)
98
+                ((ParentController) parentController).mergeChildOptions(options.copy().clearBottomTabsOptions(), childController, child)
99
         );
99
         );
100
     }
100
     }
101
 
101
 

+ 8
- 5
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackController.java View File

91
     }
91
     }
92
 
92
 
93
     @Override
93
     @Override
94
-    public void mergeChildOptions(Options options, Component child) {
95
-        super.mergeChildOptions(options, child);
96
-        presenter.mergeChildOptions(options, resolveCurrentOptions(), child);
97
-        if (options.fabOptions.hasValue() && child instanceof ReactComponent) {
98
-            fabOptionsPresenter.mergeOptions(options.fabOptions, (ReactComponent) child, getView());
94
+    public void mergeChildOptions(Options options, ViewController childController, Component child) {
95
+        super.mergeChildOptions(options, childController, child);
96
+        if (childController.isViewShown()) {
97
+            presenter.mergeChildOptions(options, resolveCurrentOptions(), child);
98
+            if (options.fabOptions.hasValue() && child instanceof ReactComponent) {
99
+                fabOptionsPresenter.mergeOptions(options.fabOptions, (ReactComponent) child, getView());
100
+            }
99
         }
101
         }
100
         performOnParentController(parentController ->
102
         performOnParentController(parentController ->
101
                 ((ParentController) parentController).mergeChildOptions(
103
                 ((ParentController) parentController).mergeChildOptions(
105
                                 .clearFabOptions()
107
                                 .clearFabOptions()
106
                                 .clearTopTabOptions()
108
                                 .clearTopTabOptions()
107
                                 .clearTopTabsOptions(),
109
                                 .clearTopTabsOptions(),
110
+                        childController,
108
                         child
111
                         child
109
                 )
112
                 )
110
         );
113
         );

+ 2
- 2
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/toptabs/TopTabsController.java View File

94
     }
94
     }
95
 
95
 
96
     @CallSuper
96
     @CallSuper
97
-    public void mergeChildOptions(Options options, Component child) {
98
-        super.mergeChildOptions(options, child);
97
+    public void mergeChildOptions(Options options, ViewController childController, Component child) {
98
+        super.mergeChildOptions(options, childController, child);
99
         performOnParentController(parentController -> ((ParentController) parentController).applyChildOptions(options.copy(), child));
99
         performOnParentController(parentController -> ((ParentController) parentController).applyChildOptions(options.copy(), child));
100
     }
100
     }
101
 
101
 

+ 1
- 1
lib/android/app/src/test/java/com/reactnativenavigation/mocks/SimpleViewController.java View File

53
 
53
 
54
     @Override
54
     @Override
55
     public void mergeOptions(Options options) {
55
     public void mergeOptions(Options options) {
56
-        performOnParentController(parentController -> parentController.mergeChildOptions(options, getView()));
56
+        performOnParentController(parentController -> parentController.mergeChildOptions(options, this, getView()));
57
         super.mergeOptions(options);
57
         super.mergeOptions(options);
58
     }
58
     }
59
 
59
 

+ 19
- 6
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerTest.java View File

52
 import static org.mockito.Mockito.spy;
52
 import static org.mockito.Mockito.spy;
53
 import static org.mockito.Mockito.times;
53
 import static org.mockito.Mockito.times;
54
 import static org.mockito.Mockito.verify;
54
 import static org.mockito.Mockito.verify;
55
+import static org.mockito.Mockito.when;
55
 
56
 
56
 public class StackControllerTest extends BaseTest {
57
 public class StackControllerTest extends BaseTest {
57
 
58
 
762
                         .build());
763
                         .build());
763
         Options optionsToMerge = new Options();
764
         Options optionsToMerge = new Options();
764
         Component component = mock(Component.class);
765
         Component component = mock(Component.class);
765
-        uut.mergeChildOptions(optionsToMerge, component);
766
-        verify(uut, times(1)).mergeChildOptions(optionsToMerge, component);
766
+        ViewController vc = mock(ViewController.class);
767
+        uut.mergeChildOptions(optionsToMerge, vc, component);
768
+        verify(uut, times(1)).mergeChildOptions(optionsToMerge, vc, component);
767
     }
769
     }
768
 
770
 
769
     @Test
771
     @Test
783
         optionsToMerge.topBar.testId = new Text("topBarID");
785
         optionsToMerge.topBar.testId = new Text("topBarID");
784
         optionsToMerge.bottomTabsOptions.testId = new Text("bottomTabsID");
786
         optionsToMerge.bottomTabsOptions.testId = new Text("bottomTabsID");
785
         Component component = mock(Component.class);
787
         Component component = mock(Component.class);
786
-        uut.mergeChildOptions(optionsToMerge, component);
788
+        ViewController vc = mock(ViewController.class);
789
+        uut.mergeChildOptions(optionsToMerge, vc, component);
787
 
790
 
788
         ArgumentCaptor<Options> captor = ArgumentCaptor.forClass(Options.class);
791
         ArgumentCaptor<Options> captor = ArgumentCaptor.forClass(Options.class);
789
-        verify(parentController, times(1)).mergeChildOptions(captor.capture(), eq(component));
792
+        verify(parentController, times(1)).mergeChildOptions(captor.capture(), eq(vc), eq(component));
790
         assertThat(captor.getValue().topBar.testId.hasValue()).isFalse();
793
         assertThat(captor.getValue().topBar.testId.hasValue()).isFalse();
791
         assertThat(captor.getValue().bottomTabsOptions.testId.get()).isEqualTo(optionsToMerge.bottomTabsOptions.testId.get());
794
         assertThat(captor.getValue().bottomTabsOptions.testId.get()).isEqualTo(optionsToMerge.bottomTabsOptions.testId.get());
792
     }
795
     }
801
         options.topBar.testId = new Text("id");
804
         options.topBar.testId = new Text("id");
802
         options.fabOptions.id = new Text("fabId");
805
         options.fabOptions.id = new Text("fabId");
803
         Component component = mock(Component.class);
806
         Component component = mock(Component.class);
807
+        ViewController vc = mock(ViewController.class);
804
 
808
 
805
         assertThat(options.fabOptions.hasValue()).isTrue();
809
         assertThat(options.fabOptions.hasValue()).isTrue();
806
-        uut.mergeChildOptions(options, component);
810
+        uut.mergeChildOptions(options, vc, component);
807
         ArgumentCaptor<Options> captor = ArgumentCaptor.forClass(Options.class);
811
         ArgumentCaptor<Options> captor = ArgumentCaptor.forClass(Options.class);
808
-        verify(parentController, times(1)).mergeChildOptions(captor.capture(), eq(component));
812
+        verify(parentController, times(1)).mergeChildOptions(captor.capture(), eq(vc), eq(component));
809
         assertThat(captor.getValue().animations.push.hasValue()).isFalse();
813
         assertThat(captor.getValue().animations.push.hasValue()).isFalse();
810
         assertThat(captor.getValue().topBar.testId.hasValue()).isFalse();
814
         assertThat(captor.getValue().topBar.testId.hasValue()).isFalse();
811
         assertThat(captor.getValue().fabOptions.hasValue()).isFalse();
815
         assertThat(captor.getValue().fabOptions.hasValue()).isFalse();
812
     }
816
     }
813
 
817
 
818
+    @Test
819
+    public void mergeChildOptions_presenterDoesNotApplyOptionsIfViewIsNotShown() {
820
+        ViewController vc = mock(ViewController.class);
821
+        when(vc.isViewShown()).thenReturn(false);
822
+        Component child = mock(Component.class);
823
+        uut.mergeChildOptions(new Options(), vc, child);
824
+        verify(presenter, times(0)).mergeChildOptions(any(), any(), any());
825
+    }
826
+
814
     @Test
827
     @Test
815
     public void destroy() {
828
     public void destroy() {
816
         uut.ensureViewIsCreated();
829
         uut.ensureViewIsCreated();