Browse Source

Add a way to dynamically enable/disable a side menu for Android (#1326)

Matt Davies 7 years ago
parent
commit
3176aeb448

+ 5
- 0
android/app/src/main/java/com/reactnativenavigation/bridge/NavigationReactModule.java View File

151
         NavigationCommandsHandler.setSideMenuVisible(animated, visible, Side.fromString(side));
151
         NavigationCommandsHandler.setSideMenuVisible(animated, visible, Side.fromString(side));
152
     }
152
     }
153
 
153
 
154
+    @ReactMethod
155
+    public void setSideMenuEnabled(boolean enabled, String side) {
156
+        NavigationCommandsHandler.setSideMenuEnabled(enabled, Side.fromString(side));
157
+    }
158
+
154
     @ReactMethod
159
     @ReactMethod
155
     public void toggleTopBarVisible(final ReadableMap params) {
160
     public void toggleTopBarVisible(final ReadableMap params) {
156
     }
161
     }

+ 4
- 0
android/app/src/main/java/com/reactnativenavigation/controllers/NavigationActivity.java View File

314
         layout.setSideMenuVisible(animated, visible, side);
314
         layout.setSideMenuVisible(animated, visible, side);
315
     }
315
     }
316
 
316
 
317
+    public void setSideMenuEnabled(boolean enabled, Side side) {
318
+        layout.setSideMenuEnabled(enabled, side);
319
+    }
320
+
317
     public void selectTopTabByTabIndex(String screenInstanceId, int index) {
321
     public void selectTopTabByTabIndex(String screenInstanceId, int index) {
318
         layout.selectTopTabByTabIndex(screenInstanceId, index);
322
         layout.selectTopTabByTabIndex(screenInstanceId, index);
319
         modalController.selectTopTabByTabIndex(screenInstanceId, index);
323
         modalController.selectTopTabByTabIndex(screenInstanceId, index);

+ 14
- 0
android/app/src/main/java/com/reactnativenavigation/controllers/NavigationCommandsHandler.java View File

317
         });
317
         });
318
     }
318
     }
319
 
319
 
320
+    public static void setSideMenuEnabled(final boolean enabled, final Side side) {
321
+        final NavigationActivity currentActivity = NavigationActivity.currentActivity;
322
+        if (currentActivity == null) {
323
+            return;
324
+        }
325
+
326
+        NavigationApplication.instance.runOnMainThread(new Runnable() {
327
+            @Override
328
+            public void run() {
329
+                currentActivity.setSideMenuEnabled(enabled, side);
330
+            }
331
+        });
332
+    }
333
+
320
     public static void selectTopTabByTabIndex(final String screenInstanceId, final int index) {
334
     public static void selectTopTabByTabIndex(final String screenInstanceId, final int index) {
321
         final NavigationActivity currentActivity = NavigationActivity.currentActivity;
335
         final NavigationActivity currentActivity = NavigationActivity.currentActivity;
322
         if (currentActivity == null) {
336
         if (currentActivity == null) {

+ 8
- 0
android/app/src/main/java/com/reactnativenavigation/layouts/BottomTabsLayout.java View File

3
 import android.os.Bundle;
3
 import android.os.Bundle;
4
 import android.support.annotation.NonNull;
4
 import android.support.annotation.NonNull;
5
 import android.support.annotation.Nullable;
5
 import android.support.annotation.Nullable;
6
+import android.support.v4.widget.DrawerLayout;
6
 import android.support.v7.app.AppCompatActivity;
7
 import android.support.v7.app.AppCompatActivity;
7
 import android.view.View;
8
 import android.view.View;
8
 import android.widget.RelativeLayout;
9
 import android.widget.RelativeLayout;
231
         }
232
         }
232
     }
233
     }
233
 
234
 
235
+    @Override
236
+    public void setSideMenuEnabled(boolean enabled, Side side) {
237
+        if (sideMenu != null) {
238
+            sideMenu.setDrawerLockMode(enabled ? DrawerLayout.LOCK_MODE_UNLOCKED : DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
239
+        }
240
+    }
241
+
234
     @Override
242
     @Override
235
     public void showSnackbar(SnackbarParams params) {
243
     public void showSnackbar(SnackbarParams params) {
236
         final String eventId = getCurrentScreenStack().peek().getNavigatorEventId();
244
         final String eventId = getCurrentScreenStack().peek().getNavigatorEventId();

+ 2
- 0
android/app/src/main/java/com/reactnativenavigation/layouts/Layout.java View File

37
 
37
 
38
     void setSideMenuVisible(boolean animated, boolean visible, Side side);
38
     void setSideMenuVisible(boolean animated, boolean visible, Side side);
39
 
39
 
40
+    void setSideMenuEnabled(boolean enabled, Side side);
41
+
40
     void showSnackbar(SnackbarParams params);
42
     void showSnackbar(SnackbarParams params);
41
 
43
 
42
     void showSlidingOverlay(SlidingOverlayParams params);
44
     void showSlidingOverlay(SlidingOverlayParams params);

+ 7
- 0
android/app/src/main/java/com/reactnativenavigation/layouts/SingleScreenLayout.java View File

219
         }
219
         }
220
     }
220
     }
221
 
221
 
222
+    @Override
223
+    public void setSideMenuEnabled(boolean enabled, Side side) {
224
+        if (sideMenu != null) {
225
+            sideMenu.setEnabled(enabled, side);
226
+        }
227
+    }
228
+
222
     @Override
229
     @Override
223
     public void showSnackbar(SnackbarParams params) {
230
     public void showSnackbar(SnackbarParams params) {
224
         final String navigatorEventId = stack.peek().getNavigatorEventId();
231
         final String navigatorEventId = stack.peek().getNavigatorEventId();

+ 8
- 0
android/app/src/main/java/com/reactnativenavigation/views/SideMenu.java View File

61
         }
61
         }
62
     }
62
     }
63
 
63
 
64
+    public void setEnabled(boolean enabled, Side side) {
65
+        if (enabled) {
66
+            setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, side.gravity);
67
+        } else {
68
+            setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, side.gravity);
69
+        }
70
+    }
71
+
64
     public void openDrawer(Side side) {
72
     public void openDrawer(Side side) {
65
         openDrawer(side.gravity);
73
         openDrawer(side.gravity);
66
     }
74
     }

+ 11
- 0
docs/screen-api.md View File

173
 });
173
 });
174
 ```
174
 ```
175
 
175
 
176
+## setDrawerEnabled(params = {}) (Android only)
177
+
178
+Enables or disables the side menu drawer assuming you have one in your app. Both drawers are enabled by default.
179
+
180
+```js
181
+this.props.navigator.setDrawerEnabled({
182
+  side: 'left', // the side of the drawer since you can have two, 'left' / 'right'
183
+  enabled: false // should the drawer be enabled or disabled (locked closed)
184
+});
185
+```
186
+
176
 ## toggleTabs(params = {})
187
 ## toggleTabs(params = {})
177
 
188
 
178
 Toggle whether the tabs are displayed or not (only in tab-based apps).
189
 Toggle whether the tabs are displayed or not (only in tab-based apps).

+ 4
- 0
src/Screen.js View File

96
     return platformSpecific.navigatorToggleDrawer(this, params);
96
     return platformSpecific.navigatorToggleDrawer(this, params);
97
   }
97
   }
98
 
98
 
99
+  setDrawerEnabled(params = {}) {
100
+    return platformSpecific.navigatorSetDrawerEnabled(this, params);
101
+  }
102
+
99
   toggleTabs(params = {}) {
103
   toggleTabs(params = {}) {
100
     return platformSpecific.navigatorToggleTabs(this, params);
104
     return platformSpecific.navigatorToggleTabs(this, params);
101
   }
105
   }

+ 5
- 0
src/deprecated/platformSpecificDeprecated.android.js View File

388
   }
388
   }
389
 }
389
 }
390
 
390
 
391
+function navigatorSetDrawerEnabled(navigator, params) {
392
+  newPlatformSpecific.setSideMenuEnabled(params.enabled, params.side);
393
+}
394
+
391
 function navigatorToggleNavBar(navigator, params) {
395
 function navigatorToggleNavBar(navigator, params) {
392
   const screenInstanceID = navigator.screenInstanceID;
396
   const screenInstanceID = navigator.screenInstanceID;
393
   const visible = params.to === 'shown' || params.to === 'show';
397
   const visible = params.to === 'shown' || params.to === 'show';
693
   navigatorSwitchToTab,
697
   navigatorSwitchToTab,
694
   navigatorSwitchToTopTab,
698
   navigatorSwitchToTopTab,
695
   navigatorToggleDrawer,
699
   navigatorToggleDrawer,
700
+  navigatorSetDrawerEnabled,
696
   navigatorToggleTabs,
701
   navigatorToggleTabs,
697
   navigatorToggleNavBar,
702
   navigatorToggleNavBar,
698
   showSnackbar,
703
   showSnackbar,

+ 5
- 0
src/platformSpecific.android.js View File

121
   NativeReactModule.setSideMenuVisible(animated, visible, side);
121
   NativeReactModule.setSideMenuVisible(animated, visible, side);
122
 }
122
 }
123
 
123
 
124
+function setSideMenuEnabled(enabled, side) {
125
+  NativeReactModule.setSideMenuEnabled(enabled, side);
126
+}
127
+
124
 function selectTopTabByTabIndex(screenInstanceId, index) {
128
 function selectTopTabByTabIndex(screenInstanceId, index) {
125
   NativeReactModule.selectTopTabByTabIndex(screenInstanceId, index);
129
   NativeReactModule.selectTopTabByTabIndex(screenInstanceId, index);
126
 }
130
 }
195
   dismissInAppNotification,
199
   dismissInAppNotification,
196
   toggleSideMenuVisible,
200
   toggleSideMenuVisible,
197
   setSideMenuVisible,
201
   setSideMenuVisible,
202
+  setSideMenuEnabled,
198
   selectBottomTabByNavigatorId,
203
   selectBottomTabByNavigatorId,
199
   selectBottomTabByTabIndex,
204
   selectBottomTabByTabIndex,
200
   setBottomTabBadgeByNavigatorId,
205
   setBottomTabBadgeByNavigatorId,