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
 import android.view.View;
5
 import android.view.View;
6
 
6
 
7
 import com.reactnativenavigation.parse.Options;
7
 import com.reactnativenavigation.parse.Options;
8
+import com.reactnativenavigation.parse.SideMenuRootOptions;
8
 import com.reactnativenavigation.parse.params.Bool;
9
 import com.reactnativenavigation.parse.params.Bool;
9
 import com.reactnativenavigation.presentation.Presenter;
10
 import com.reactnativenavigation.presentation.Presenter;
10
 import com.reactnativenavigation.presentation.SideMenuPresenter;
11
 import com.reactnativenavigation.presentation.SideMenuPresenter;
24
 import androidx.drawerlayout.widget.DrawerLayout;
25
 import androidx.drawerlayout.widget.DrawerLayout;
25
 import androidx.drawerlayout.widget.DrawerLayout.LayoutParams;
26
 import androidx.drawerlayout.widget.DrawerLayout.LayoutParams;
26
 
27
 
28
+import static com.reactnativenavigation.utils.ObjectUtils.perform;
29
+
27
 public class SideMenuController extends ParentController<SideMenuRoot> implements DrawerLayout.DrawerListener {
30
 public class SideMenuController extends ParentController<SideMenuRoot> implements DrawerLayout.DrawerListener {
28
 
31
 
29
 	private ViewController center;
32
 	private ViewController center;
94
     public void mergeChildOptions(Options options, ViewController child) {
97
     public void mergeChildOptions(Options options, ViewController child) {
95
         super.mergeChildOptions(options, child);
98
         super.mergeChildOptions(options, child);
96
         presenter.mergeOptions(options.sideMenuRootOptions);
99
         presenter.mergeOptions(options.sideMenuRootOptions);
100
+        mergeLockMode(this.initialOptions, options.sideMenuRootOptions);
97
         performOnParentController(parent -> parent.mergeChildOptions(options, child));
101
         performOnParentController(parent -> parent.mergeChildOptions(options, child));
98
     }
102
     }
99
 
103
 
126
     @Override
130
     @Override
127
     public void onDrawerOpened(@NonNull View drawerView) {
131
     public void onDrawerOpened(@NonNull View drawerView) {
128
         ViewController view = this.getMatchingView(drawerView);
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
     @Override
136
     @Override
133
     public void onDrawerClosed(@NonNull View drawerView) {
137
     public void onDrawerClosed(@NonNull View drawerView) {
134
         ViewController view = this.getMatchingView(drawerView);
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
     @Override
142
     @Override
179
     }
183
     }
180
 
184
 
181
     private ViewController getMatchingView (View drawerView) {
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
         return (left != null && drawerView.equals(left.getView()));
190
         return (left != null && drawerView.equals(left.getView()));
187
     }
191
     }
188
 
192
 
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
     @RestrictTo(RestrictTo.Scope.TESTS)
220
     @RestrictTo(RestrictTo.Scope.TESTS)
212
     SideMenu getSideMenu() {
221
     SideMenu getSideMenu() {
213
         return presenter.getSideMenu();
222
         return presenter.getSideMenu();

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

179
         assertThat(uut.resolveCurrentOptions().topBar.title.text.hasValue()).isTrue();
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
     @Test
197
     @Test
183
     public void setLeftController_matchesParentByDefault() {
198
     public void setLeftController_matchesParentByDefault() {
184
         SideMenuOptions options = new SideMenuOptions();
199
         SideMenuOptions options = new SideMenuOptions();
389
     private void setLeftRight(ViewController left, ViewController right) {
404
     private void setLeftRight(ViewController left, ViewController right) {
390
         uut.setLeftController(left);
405
         uut.setLeftController(left);
391
         uut.setRightController(right);
406
         uut.setRightController(right);
407
+        left.setParentController(uut);
408
+        right.setParentController(uut);
392
     }
409
     }
393
 }
410
 }