Browse Source

Update SideMenu enabled in parent (#6196)

When a menu is opened its resolved options are applied. These options set the enabled property of both left and right menus. If a menu is disabled, opening the other menu will unintentionally enable it when it is opened therefore we need to update the enabled properties of both menus in the actual SideMenu layout.

Closes #6182

Co-authored-by: Yogev Ben David <yogev132@gmail.com>
Guy Carmeli 4 years ago
parent
commit
67191e9e7c
No account linked to committer's email address

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

@@ -5,6 +5,7 @@ import android.view.Gravity;
5 5
 import android.view.View;
6 6
 
7 7
 import com.reactnativenavigation.parse.Options;
8
+import com.reactnativenavigation.parse.SideMenuRootOptions;
8 9
 import com.reactnativenavigation.parse.params.Bool;
9 10
 import com.reactnativenavigation.presentation.Presenter;
10 11
 import com.reactnativenavigation.presentation.SideMenuPresenter;
@@ -24,6 +25,8 @@ import androidx.annotation.RestrictTo;
24 25
 import androidx.drawerlayout.widget.DrawerLayout;
25 26
 import androidx.drawerlayout.widget.DrawerLayout.LayoutParams;
26 27
 
28
+import static com.reactnativenavigation.utils.ObjectUtils.perform;
29
+
27 30
 public class SideMenuController extends ParentController<SideMenuRoot> implements DrawerLayout.DrawerListener {
28 31
 
29 32
 	private ViewController center;
@@ -94,6 +97,7 @@ public class SideMenuController extends ParentController<SideMenuRoot> implement
94 97
     public void mergeChildOptions(Options options, ViewController child) {
95 98
         super.mergeChildOptions(options, child);
96 99
         presenter.mergeOptions(options.sideMenuRootOptions);
100
+        mergeLockMode(this.initialOptions, options.sideMenuRootOptions);
97 101
         performOnParentController(parent -> parent.mergeChildOptions(options, child));
98 102
     }
99 103
 
@@ -126,13 +130,13 @@ public class SideMenuController extends ParentController<SideMenuRoot> implement
126 130
     @Override
127 131
     public void onDrawerOpened(@NonNull View drawerView) {
128 132
         ViewController view = this.getMatchingView(drawerView);
129
-        view.mergeOptions(this.getOptionsWithVisibility(this.viewIsLeft(drawerView), true));
133
+        view.mergeOptions(this.getOptionsWithVisibility(isLeftMenu(drawerView), true));
130 134
     }
131 135
 
132 136
     @Override
133 137
     public void onDrawerClosed(@NonNull View drawerView) {
134 138
         ViewController view = this.getMatchingView(drawerView);
135
-        view.mergeOptions(this.getOptionsWithVisibility(this.viewIsLeft(drawerView), false));
139
+        view.mergeOptions(this.getOptionsWithVisibility(isLeftMenu(drawerView), false));
136 140
     }
137 141
 
138 142
     @Override
@@ -179,10 +183,10 @@ public class SideMenuController extends ParentController<SideMenuRoot> implement
179 183
     }
180 184
 
181 185
     private ViewController getMatchingView (View drawerView) {
182
-        return this.viewIsLeft(drawerView) ? left : right;
186
+        return this.isLeftMenu(drawerView) ? left : right;
183 187
     }
184 188
 
185
-    private boolean viewIsLeft (View drawerView) {
189
+    private boolean isLeftMenu(View drawerView) {
186 190
         return (left != null && drawerView.equals(left.getView()));
187 191
     }
188 192
 
@@ -208,6 +212,11 @@ public class SideMenuController extends ParentController<SideMenuRoot> implement
208 212
         }
209 213
     }
210 214
 
215
+    private void mergeLockMode(Options out, SideMenuRootOptions sideMenu) {
216
+        perform(sideMenu.left.enabled.get(null), enabled -> out.sideMenuRootOptions.left.enabled = new Bool(enabled));
217
+        perform(sideMenu.right.enabled.get(null), enabled -> out.sideMenuRootOptions.right.enabled = new Bool(enabled));
218
+    }
219
+
211 220
     @RestrictTo(RestrictTo.Scope.TESTS)
212 221
     SideMenu getSideMenu() {
213 222
         return presenter.getSideMenu();

+ 17
- 0
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/sidemenu/SideMenuControllerTest.java View File

@@ -179,6 +179,21 @@ public class SideMenuControllerTest extends BaseTest {
179 179
         assertThat(uut.resolveCurrentOptions().topBar.title.text.hasValue()).isTrue();
180 180
     }
181 181
 
182
+    @Test
183
+    public void mergeChildOptions_lockModeIsUpdatedInInitialOptions() {
184
+        setLeftRight(left, right);
185
+
186
+        Options leftDisabled = new Options();
187
+        leftDisabled.sideMenuRootOptions.left.enabled = new Bool(false);
188
+        left.mergeOptions(leftDisabled);
189
+        assertThat(uut.resolveCurrentOptions().sideMenuRootOptions.left.enabled.get()).isFalse();
190
+
191
+        Options rightVisible = new Options();
192
+        rightVisible.sideMenuRootOptions.right.visible = new Bool(true);
193
+        right.mergeOptions(rightVisible);
194
+        assertThat(uut.resolveCurrentOptions().sideMenuRootOptions.left.enabled.get()).isFalse();
195
+    }
196
+
182 197
     @Test
183 198
     public void setLeftController_matchesParentByDefault() {
184 199
         SideMenuOptions options = new SideMenuOptions();
@@ -389,5 +404,7 @@ public class SideMenuControllerTest extends BaseTest {
389 404
     private void setLeftRight(ViewController left, ViewController right) {
390 405
         uut.setLeftController(left);
391 406
         uut.setRightController(right);
407
+        left.setParentController(uut);
408
+        right.setParentController(uut);
392 409
     }
393 410
 }