Преглед на файлове

Add infra for adding Snackbar to Layouts.

Guy Carmeli преди 8 години
родител
ревизия
af4e990660

+ 8
- 0
android/app/src/main/java/com/reactnativenavigation/bridge/NavigationReactModule.java Целия файл

6
 import com.facebook.react.bridge.ReadableArray;
6
 import com.facebook.react.bridge.ReadableArray;
7
 import com.facebook.react.bridge.ReadableMap;
7
 import com.facebook.react.bridge.ReadableMap;
8
 import com.reactnativenavigation.controllers.NavigationCommandsHandler;
8
 import com.reactnativenavigation.controllers.NavigationCommandsHandler;
9
+import com.reactnativenavigation.params.SnackbarParams;
9
 import com.reactnativenavigation.params.TitleBarButtonParams;
10
 import com.reactnativenavigation.params.TitleBarButtonParams;
10
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
11
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
12
+import com.reactnativenavigation.params.parsers.SnackbarParamsParser;
11
 import com.reactnativenavigation.params.parsers.TitleBarButtonParamsParser;
13
 import com.reactnativenavigation.params.parsers.TitleBarButtonParamsParser;
12
 import com.reactnativenavigation.params.parsers.TitleBarLeftButtonParamsParser;
14
 import com.reactnativenavigation.params.parsers.TitleBarLeftButtonParamsParser;
13
 
15
 
153
     public void dismissTopModal() {
155
     public void dismissTopModal() {
154
         NavigationCommandsHandler.dismissTopModal();
156
         NavigationCommandsHandler.dismissTopModal();
155
     }
157
     }
158
+
159
+    @ReactMethod
160
+    public void showSnackbar(final ReadableMap params) {
161
+        SnackbarParams snackbarParams = new SnackbarParamsParser().parse(BundleConverter.toBundle(params));
162
+        NavigationCommandsHandler.showSnackbar(snackbarParams);
163
+    }
156
 }
164
 }

+ 5
- 0
android/app/src/main/java/com/reactnativenavigation/controllers/NavigationActivity.java Целия файл

12
 import com.reactnativenavigation.layouts.LayoutFactory;
12
 import com.reactnativenavigation.layouts.LayoutFactory;
13
 import com.reactnativenavigation.params.ActivityParams;
13
 import com.reactnativenavigation.params.ActivityParams;
14
 import com.reactnativenavigation.params.ScreenParams;
14
 import com.reactnativenavigation.params.ScreenParams;
15
+import com.reactnativenavigation.params.SnackbarParams;
15
 import com.reactnativenavigation.params.TitleBarButtonParams;
16
 import com.reactnativenavigation.params.TitleBarButtonParams;
16
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
17
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
17
 import com.reactnativenavigation.react.JsDevReloadHandler;
18
 import com.reactnativenavigation.react.JsDevReloadHandler;
239
             ((BottomTabsLayout) layout).setBottomTabBadgeByNavigatorId(navigatorId, badge);
240
             ((BottomTabsLayout) layout).setBottomTabBadgeByNavigatorId(navigatorId, badge);
240
         }
241
         }
241
     }
242
     }
243
+
244
+    public void showSnackbar(SnackbarParams params) {
245
+        layout.showSnackbar(params);
246
+    }
242
 }
247
 }

+ 15
- 0
android/app/src/main/java/com/reactnativenavigation/controllers/NavigationCommandsHandler.java Целия файл

6
 import com.reactnativenavigation.NavigationApplication;
6
 import com.reactnativenavigation.NavigationApplication;
7
 import com.reactnativenavigation.params.ActivityParams;
7
 import com.reactnativenavigation.params.ActivityParams;
8
 import com.reactnativenavigation.params.ScreenParams;
8
 import com.reactnativenavigation.params.ScreenParams;
9
+import com.reactnativenavigation.params.SnackbarParams;
9
 import com.reactnativenavigation.params.TitleBarButtonParams;
10
 import com.reactnativenavigation.params.TitleBarButtonParams;
10
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
11
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
11
 import com.reactnativenavigation.params.parsers.ActivityParamsParser;
12
 import com.reactnativenavigation.params.parsers.ActivityParamsParser;
294
             }
295
             }
295
         });
296
         });
296
     }
297
     }
298
+
299
+    public static void showSnackbar(final SnackbarParams params) {
300
+        final NavigationActivity currentActivity = NavigationActivity.currentActivity;
301
+        if (currentActivity == null) {
302
+            return;
303
+        }
304
+
305
+        NavigationApplication.instance.runOnMainThread(new Runnable() {
306
+            @Override
307
+            public void run() {
308
+                currentActivity.showSnackbar(params);
309
+            }
310
+        });
311
+    }
297
 }
312
 }

+ 16
- 0
android/app/src/main/java/com/reactnativenavigation/layouts/BottomTabsLayout.java Целия файл

10
 import com.reactnativenavigation.params.ActivityParams;
10
 import com.reactnativenavigation.params.ActivityParams;
11
 import com.reactnativenavigation.params.ScreenParams;
11
 import com.reactnativenavigation.params.ScreenParams;
12
 import com.reactnativenavigation.params.SideMenuParams;
12
 import com.reactnativenavigation.params.SideMenuParams;
13
+import com.reactnativenavigation.params.SnackbarParams;
13
 import com.reactnativenavigation.params.TitleBarButtonParams;
14
 import com.reactnativenavigation.params.TitleBarButtonParams;
14
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
15
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
15
 import com.reactnativenavigation.screens.ScreenStack;
16
 import com.reactnativenavigation.screens.ScreenStack;
16
 import com.reactnativenavigation.views.BottomTabs;
17
 import com.reactnativenavigation.views.BottomTabs;
17
 import com.reactnativenavigation.views.SideMenu;
18
 import com.reactnativenavigation.views.SideMenu;
19
+import com.reactnativenavigation.views.SnackbarContainer;
18
 
20
 
19
 import java.util.List;
21
 import java.util.List;
20
 
22
 
25
 
27
 
26
     private final AppCompatActivity activity;
28
     private final AppCompatActivity activity;
27
     private ActivityParams params;
29
     private ActivityParams params;
30
+    private SnackbarContainer snackbarContainer;
28
     private BottomTabs bottomTabs;
31
     private BottomTabs bottomTabs;
29
     private ScreenStack[] screenStacks;
32
     private ScreenStack[] screenStacks;
30
     private final SideMenuParams sideMenuParams;
33
     private final SideMenuParams sideMenuParams;
45
         createBottomTabs();
48
         createBottomTabs();
46
         addBottomTabs();
49
         addBottomTabs();
47
         addScreenStacks();
50
         addScreenStacks();
51
+        createSnackbarContainer();
48
         showInitialScreenStack();
52
         showInitialScreenStack();
49
     }
53
     }
50
 
54
 
94
         getScreenStackParent().addView(bottomTabs, lp);
98
         getScreenStackParent().addView(bottomTabs, lp);
95
     }
99
     }
96
 
100
 
101
+    private void createSnackbarContainer() {
102
+        snackbarContainer = new SnackbarContainer(getContext());
103
+        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT);
104
+        lp.addRule(ABOVE, bottomTabs.getId());
105
+        snackbarContainer.setLayoutParams(lp);
106
+    }
107
+
97
     private void showInitialScreenStack() {
108
     private void showInitialScreenStack() {
98
         showStackAndUpdateStyle(screenStacks[0]);
109
         showStackAndUpdateStyle(screenStacks[0]);
99
     }
110
     }
164
         }
175
         }
165
     }
176
     }
166
 
177
 
178
+    @Override
179
+    public void showSnackbar(SnackbarParams params) {
180
+        // TODO: implement me
181
+    }
182
+
167
     public void selectBottomTabByTabIndex(Integer index) {
183
     public void selectBottomTabByTabIndex(Integer index) {
168
         bottomTabs.setCurrentItem(index);
184
         bottomTabs.setCurrentItem(index);
169
     }
185
     }

+ 3
- 0
android/app/src/main/java/com/reactnativenavigation/layouts/Layout.java Целия файл

2
 
2
 
3
 import android.view.View;
3
 import android.view.View;
4
 
4
 
5
+import com.reactnativenavigation.params.SnackbarParams;
5
 import com.reactnativenavigation.params.TitleBarButtonParams;
6
 import com.reactnativenavigation.params.TitleBarButtonParams;
6
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
7
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
7
 
8
 
23
     void toggleSideMenuVisible(boolean animated);
24
     void toggleSideMenuVisible(boolean animated);
24
 
25
 
25
     void setSideMenuVisible(boolean animated, boolean visible);
26
     void setSideMenuVisible(boolean animated, boolean visible);
27
+
28
+    void showSnackbar(SnackbarParams params);
26
 }
29
 }

+ 6
- 0
android/app/src/main/java/com/reactnativenavigation/layouts/SingleScreenLayout.java Целия файл

7
 
7
 
8
 import com.reactnativenavigation.params.ScreenParams;
8
 import com.reactnativenavigation.params.ScreenParams;
9
 import com.reactnativenavigation.params.SideMenuParams;
9
 import com.reactnativenavigation.params.SideMenuParams;
10
+import com.reactnativenavigation.params.SnackbarParams;
10
 import com.reactnativenavigation.params.TitleBarButtonParams;
11
 import com.reactnativenavigation.params.TitleBarButtonParams;
11
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
12
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
12
 import com.reactnativenavigation.screens.ScreenStack;
13
 import com.reactnativenavigation.screens.ScreenStack;
148
         }
149
         }
149
     }
150
     }
150
 
151
 
152
+    @Override
153
+    public void showSnackbar(SnackbarParams params) {
154
+        // TODO: implement me
155
+    }
156
+
151
     @Override
157
     @Override
152
     public boolean onTitleBarBackButtonClick() {
158
     public boolean onTitleBarBackButtonClick() {
153
         if (leftButtonOnClickListener != null) {
159
         if (leftButtonOnClickListener != null) {

+ 8
- 0
android/app/src/main/java/com/reactnativenavigation/params/SnackbarParams.java Целия файл

1
+package com.reactnativenavigation.params;
2
+
3
+public class SnackbarParams {
4
+    public String text;
5
+    public StyleParams.Color textColor;
6
+    public String buttonText;
7
+    public StyleParams.Color buttonColor;
8
+}

+ 3
- 0
android/app/src/main/java/com/reactnativenavigation/params/StyleParams.java Целия файл

55
 
55
 
56
     public boolean drawScreenAboveBottomTabs;
56
     public boolean drawScreenAboveBottomTabs;
57
 
57
 
58
+    public Color snackbarTextColor;
59
+    public Color snackbarButtonColor;
60
+
58
     public boolean bottomTabsHidden;
61
     public boolean bottomTabsHidden;
59
     public boolean bottomTabsHiddenOnScroll;
62
     public boolean bottomTabsHiddenOnScroll;
60
     public Color bottomTabsColor;
63
     public Color bottomTabsColor;

+ 7
- 1
android/app/src/main/java/com/reactnativenavigation/params/parsers/Parser.java Целия файл

2
 
2
 
3
 import android.os.Bundle;
3
 import android.os.Bundle;
4
 
4
 
5
+import com.reactnativenavigation.params.StyleParams;
6
+
5
 import java.util.ArrayList;
7
 import java.util.ArrayList;
6
 import java.util.Collections;
8
 import java.util.Collections;
7
 import java.util.List;
9
 import java.util.List;
11
         return bundle.keySet().contains(key);
13
         return bundle.keySet().contains(key);
12
     }
14
     }
13
 
15
 
14
-
15
     protected static void assertKeyExists(Bundle bundle, String key) {
16
     protected static void assertKeyExists(Bundle bundle, String key) {
16
         if (!hasKey(bundle, key)) {
17
         if (!hasKey(bundle, key)) {
17
             throw new KeyDoesNotExistsException(key);
18
             throw new KeyDoesNotExistsException(key);
35
         }
36
         }
36
         return result;
37
         return result;
37
     }
38
     }
39
+
40
+    protected StyleParams.Color getColor(Bundle bundle, String key, StyleParams.Color defaultColor) {
41
+        StyleParams.Color color = StyleParams.Color.parse(bundle.getString(key));
42
+        return color.hasColor() || defaultColor == null ? color : defaultColor;
43
+    }
38
 }
44
 }

+ 18
- 0
android/app/src/main/java/com/reactnativenavigation/params/parsers/SnackbarParamsParser.java Целия файл

1
+package com.reactnativenavigation.params.parsers;
2
+
3
+import android.os.Bundle;
4
+
5
+import com.reactnativenavigation.params.AppStyle;
6
+import com.reactnativenavigation.params.SnackbarParams;
7
+import com.reactnativenavigation.params.StyleParams;
8
+
9
+public class SnackbarParamsParser extends Parser {
10
+    public SnackbarParams parse(Bundle params) {
11
+        SnackbarParams result = new SnackbarParams();
12
+        result.text = params.getString("text");
13
+        result.textColor = getColor(params, "textColor", AppStyle.appStyle.snackbarTextColor);
14
+        result.buttonText = params.getString("buttonText");
15
+        result.buttonColor = getColor(params, "buttonColor", AppStyle.appStyle.snackbarButtonColor);
16
+        return result;
17
+    }
18
+}

+ 0
- 6
android/app/src/main/java/com/reactnativenavigation/params/parsers/TitleBarButtonParamsParser.java Целия файл

3
 import android.os.Bundle;
3
 import android.os.Bundle;
4
 
4
 
5
 import com.reactnativenavigation.params.AppStyle;
5
 import com.reactnativenavigation.params.AppStyle;
6
-import com.reactnativenavigation.params.StyleParams;
7
 import com.reactnativenavigation.params.TitleBarButtonParams;
6
 import com.reactnativenavigation.params.TitleBarButtonParams;
8
 import com.reactnativenavigation.react.ImageLoader;
7
 import com.reactnativenavigation.react.ImageLoader;
9
 
8
 
33
         return result;
32
         return result;
34
     }
33
     }
35
 
34
 
36
-    private StyleParams.Color getColor(Bundle bundle, String key, StyleParams.Color defaultColor) {
37
-        StyleParams.Color color = StyleParams.Color.parse(bundle.getString(key));
38
-        return color.hasColor() || defaultColor == null ? color : defaultColor;
39
-    }
40
-
41
     private static TitleBarButtonParams.ShowAsAction parseShowAsAction(String showAsAction) {
35
     private static TitleBarButtonParams.ShowAsAction parseShowAsAction(String showAsAction) {
42
         if (showAsAction == null) {
36
         if (showAsAction == null) {
43
             return TitleBarButtonParams.ShowAsAction.IfRoom;
37
             return TitleBarButtonParams.ShowAsAction.IfRoom;

+ 12
- 0
android/app/src/main/java/com/reactnativenavigation/views/SnackbarContainer.java Целия файл

1
+package com.reactnativenavigation.views;
2
+
3
+import android.content.Context;
4
+import android.widget.LinearLayout;
5
+
6
+public class SnackbarContainer extends LinearLayout {
7
+
8
+    public SnackbarContainer(Context context) {
9
+        super(context);
10
+        setOrientation(LinearLayout.VERTICAL);
11
+    }
12
+}

+ 4
- 0
src/Screen.js Целия файл

101
     return platformSpecific.navigatorSwitchToTab(this, params);
101
     return platformSpecific.navigatorSwitchToTab(this, params);
102
   }
102
   }
103
 
103
 
104
+  showSnackbar(params = {}) {
105
+    return platformSpecific.showSnackbar(this, params);
106
+  }
107
+
104
   setOnNavigatorEvent(callback) {
108
   setOnNavigatorEvent(callback) {
105
     this.navigatorEventHandler = callback;
109
     this.navigatorEventHandler = callback;
106
     if (!this.navigatorEventSubscription) {
110
     if (!this.navigatorEventSubscription) {

+ 6
- 1
src/deprecated/platformSpecificDeprecated.android.js Целия файл

418
   screen.navigatorStyle = Object.assign({}, screen.navigatorStyle, Screen.navigatorStyle);
418
   screen.navigatorStyle = Object.assign({}, screen.navigatorStyle, Screen.navigatorStyle);
419
 }
419
 }
420
 
420
 
421
+function showSnackbar(navigator, params) {
422
+  return newPlatformSpecific.showSnackbar(params.text);
423
+}
424
+
421
 export default {
425
 export default {
422
   startTabBasedApp,
426
   startTabBasedApp,
423
   startSingleScreenApp,
427
   startSingleScreenApp,
434
   navigatorSwitchToTab,
438
   navigatorSwitchToTab,
435
   navigatorToggleDrawer,
439
   navigatorToggleDrawer,
436
   navigatorToggleTabs,
440
   navigatorToggleTabs,
437
-  navigatorToggleNavBar
441
+  navigatorToggleNavBar,
442
+  showSnackbar
438
 };
443
 };

+ 6
- 1
src/platformSpecific.android.js Целия файл

108
   NativeReactModule.setBottomTabBadgeByNavigatorId(navigatorId, badge);
108
   NativeReactModule.setBottomTabBadgeByNavigatorId(navigatorId, badge);
109
 }
109
 }
110
 
110
 
111
+function showSnackbar(text) {
112
+  NativeReactModule.showSnackbar(text);
113
+}
114
+
111
 module.exports = {
115
 module.exports = {
112
   startApp,
116
   startApp,
113
   push,
117
   push,
126
   selectBottomTabByNavigatorId,
130
   selectBottomTabByNavigatorId,
127
   selectBottomTabByTabIndex,
131
   selectBottomTabByTabIndex,
128
   setBottomTabBadgeByNavigatorId,
132
   setBottomTabBadgeByNavigatorId,
129
-  setBottomTabBadgeByIndex
133
+  setBottomTabBadgeByIndex,
134
+  showSnackbar
130
 };
135
 };