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

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

@@ -104,7 +104,7 @@ public abstract class ParentController<T extends ViewGroup> extends ChildControl
104 104
     }
105 105
 
106 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,11 +70,11 @@ public class SideMenuController extends ParentController<DrawerLayout> {
70 70
     }
71 71
 
72 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 75
         new SideMenuOptionsPresenter(getView()).present(options.sideMenuRootOptions);
76 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,7 +279,7 @@ public abstract class ViewController<T extends ViewGroup> implements ViewTreeObs
279 279
 
280 280
     public abstract void sendOnNavigationButtonPressed(String buttonId);
281 281
 
282
-    protected boolean isViewShown() {
282
+    public boolean isViewShown() {
283 283
         return !isDestroyed &&
284 284
                getView().isShown() &&
285 285
                view != null &&

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

@@ -90,12 +90,12 @@ public class BottomTabsController extends ParentController implements AHBottomNa
90 90
     }
91 91
 
92 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 95
         presenter.mergeChildOptions(options, child);
96 96
         tabPresenter.mergeChildOptions(options, child);
97 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,11 +91,13 @@ public class StackController extends ParentController<StackLayout> {
91 91
     }
92 92
 
93 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 102
         performOnParentController(parentController ->
101 103
                 ((ParentController) parentController).mergeChildOptions(
@@ -105,6 +107,7 @@ public class StackController extends ParentController<StackLayout> {
105 107
                                 .clearFabOptions()
106 108
                                 .clearTopTabOptions()
107 109
                                 .clearTopTabsOptions(),
110
+                        childController,
108 111
                         child
109 112
                 )
110 113
         );

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

@@ -94,8 +94,8 @@ public class TopTabsController extends ParentController<TopTabsViewPager> {
94 94
     }
95 95
 
96 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 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,7 +53,7 @@ public class SimpleViewController extends ChildController<SimpleViewController.S
53 53
 
54 54
     @Override
55 55
     public void mergeOptions(Options options) {
56
-        performOnParentController(parentController -> parentController.mergeChildOptions(options, getView()));
56
+        performOnParentController(parentController -> parentController.mergeChildOptions(options, this, getView()));
57 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,6 +52,7 @@ import static org.mockito.Mockito.mock;
52 52
 import static org.mockito.Mockito.spy;
53 53
 import static org.mockito.Mockito.times;
54 54
 import static org.mockito.Mockito.verify;
55
+import static org.mockito.Mockito.when;
55 56
 
56 57
 public class StackControllerTest extends BaseTest {
57 58
 
@@ -762,8 +763,9 @@ public class StackControllerTest extends BaseTest {
762 763
                         .build());
763 764
         Options optionsToMerge = new Options();
764 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 771
     @Test
@@ -783,10 +785,11 @@ public class StackControllerTest extends BaseTest {
783 785
         optionsToMerge.topBar.testId = new Text("topBarID");
784 786
         optionsToMerge.bottomTabsOptions.testId = new Text("bottomTabsID");
785 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 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 793
         assertThat(captor.getValue().topBar.testId.hasValue()).isFalse();
791 794
         assertThat(captor.getValue().bottomTabsOptions.testId.get()).isEqualTo(optionsToMerge.bottomTabsOptions.testId.get());
792 795
     }
@@ -801,16 +804,26 @@ public class StackControllerTest extends BaseTest {
801 804
         options.topBar.testId = new Text("id");
802 805
         options.fabOptions.id = new Text("fabId");
803 806
         Component component = mock(Component.class);
807
+        ViewController vc = mock(ViewController.class);
804 808
 
805 809
         assertThat(options.fabOptions.hasValue()).isTrue();
806
-        uut.mergeChildOptions(options, component);
810
+        uut.mergeChildOptions(options, vc, component);
807 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 813
         assertThat(captor.getValue().animations.push.hasValue()).isFalse();
810 814
         assertThat(captor.getValue().topBar.testId.hasValue()).isFalse();
811 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 827
     @Test
815 828
     public void destroy() {
816 829
         uut.ensureViewIsCreated();