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

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

@@ -9,6 +9,7 @@ import android.widget.RelativeLayout;
9 9
 import com.aurelhubert.ahbottomnavigation.AHBottomNavigation;
10 10
 import com.reactnativenavigation.NavigationApplication;
11 11
 import com.reactnativenavigation.params.ActivityParams;
12
+import com.reactnativenavigation.params.FabParams;
12 13
 import com.reactnativenavigation.params.ScreenParams;
13 14
 import com.reactnativenavigation.params.SideMenuParams;
14 15
 import com.reactnativenavigation.params.SnackbarParams;
@@ -17,7 +18,7 @@ import com.reactnativenavigation.params.TitleBarLeftButtonParams;
17 18
 import com.reactnativenavigation.screens.ScreenStack;
18 19
 import com.reactnativenavigation.views.BottomTabs;
19 20
 import com.reactnativenavigation.views.SideMenu;
20
-import com.reactnativenavigation.views.SnackbarContainer;
21
+import com.reactnativenavigation.views.SnackbarAndFabContainer;
21 22
 
22 23
 import java.util.List;
23 24
 
@@ -28,7 +29,7 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
28 29
 
29 30
     private final AppCompatActivity activity;
30 31
     private ActivityParams params;
31
-    private SnackbarContainer snackbarContainer;
32
+    private SnackbarAndFabContainer snackbarAndFabContainer;
32 33
     private BottomTabs bottomTabs;
33 34
     private ScreenStack[] screenStacks;
34 35
     private final SideMenuParams sideMenuParams;
@@ -51,6 +52,7 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
51 52
         addScreenStacks();
52 53
         createSnackbarContainer();
53 54
         showInitialScreenStack();
55
+        showFab();
54 56
     }
55 57
 
56 58
     private void createSideMenu() {
@@ -100,17 +102,23 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
100 102
     }
101 103
 
102 104
     private void createSnackbarContainer() {
103
-        snackbarContainer = new SnackbarContainer(getContext());
104
-        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT);
105
+        snackbarAndFabContainer = new SnackbarAndFabContainer(getContext());
106
+        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT);
105 107
         lp.addRule(ABOVE, bottomTabs.getId());
106
-        snackbarContainer.setLayoutParams(lp);
107
-        getScreenStackParent().addView(snackbarContainer);
108
+        getScreenStackParent().addView(snackbarAndFabContainer, lp);
108 109
     }
109 110
 
110 111
     private void showInitialScreenStack() {
111 112
         showStackAndUpdateStyle(screenStacks[0]);
112 113
     }
113 114
 
115
+    private void showFab() {
116
+        FabParams fabParams = getCurrentScreenStack().peek().getFabParams();
117
+        if (fabParams != null) {
118
+            snackbarAndFabContainer.showFab(fabParams);
119
+        }
120
+    }
121
+
114 122
     @Override
115 123
     public View asView() {
116 124
         return this;
@@ -187,7 +195,7 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
187 195
     @Override
188 196
     public void showSnackbar(SnackbarParams params) {
189 197
         final String eventId = getCurrentScreenStack().peek().getNavigatorEventId();
190
-        snackbarContainer.showSnackbar(eventId, params);
198
+        snackbarAndFabContainer.showSnackbar(eventId, params);
191 199
     }
192 200
 
193 201
     public void selectBottomTabByTabIndex(Integer index) {
@@ -205,7 +213,7 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
205 213
         if (isCurrentStack(screenStack)) {
206 214
             bottomTabs.setStyleFromScreen(screenParams.styleParams);
207 215
         }
208
-        snackbarContainer.onScreenChange();
216
+        snackbarAndFabContainer.onScreenChange();
209 217
     }
210 218
 
211 219
     @Override
@@ -216,14 +224,14 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
216 224
                 setBottomTabsStyleFromCurrentScreen();
217 225
             }
218 226
         });
219
-        snackbarContainer.onScreenChange();
227
+        snackbarAndFabContainer.onScreenChange();
220 228
     }
221 229
 
222 230
     @Override
223 231
     public void popToRoot(ScreenParams params) {
224 232
         getCurrentScreenStack().popToRoot(params.animateScreenTransitions);
225 233
         setBottomTabsStyleFromCurrentScreen();
226
-        snackbarContainer.onScreenChange();
234
+        snackbarAndFabContainer.onScreenChange();
227 235
     }
228 236
 
229 237
     @Override
@@ -238,12 +246,12 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
238 246
         screenStacks[currentStackIndex] = newStack;
239 247
 
240 248
         bottomTabs.setStyleFromScreen(params.styleParams);
241
-        snackbarContainer.onScreenChange();
249
+        snackbarAndFabContainer.onScreenChange();
242 250
     }
243 251
 
244 252
     @Override
245 253
     public void destroy() {
246
-        snackbarContainer.destroy();
254
+        snackbarAndFabContainer.destroy();
247 255
         for (ScreenStack screenStack : screenStacks) {
248 256
             screenStack.destroy();
249 257
         }
@@ -256,7 +264,7 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
256 264
     public boolean onTabSelected(int position, boolean wasSelected) {
257 265
         hideCurrentStack();
258 266
         showNewStack(position);
259
-        snackbarContainer.onScreenChange();
267
+        snackbarAndFabContainer.onScreenChange();
260 268
         return true;
261 269
     }
262 270
 

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

@@ -14,7 +14,7 @@ import com.reactnativenavigation.params.TitleBarLeftButtonParams;
14 14
 import com.reactnativenavigation.screens.ScreenStack;
15 15
 import com.reactnativenavigation.views.LeftButtonOnClickListener;
16 16
 import com.reactnativenavigation.views.SideMenu;
17
-import com.reactnativenavigation.views.SnackbarContainer;
17
+import com.reactnativenavigation.views.SnackbarAndFabContainer;
18 18
 
19 19
 import java.util.List;
20 20
 
@@ -27,7 +27,7 @@ public class SingleScreenLayout extends RelativeLayout implements Layout {
27 27
     protected final ScreenParams screenParams;
28 28
     private final SideMenuParams sideMenuParams;
29 29
     protected ScreenStack stack;
30
-    private SnackbarContainer snackbarContainer;
30
+    private SnackbarAndFabContainer snackbarAndFabContainer;
31 31
     protected LeftButtonOnClickListener leftButtonOnClickListener;
32 32
     private @Nullable SideMenu sideMenu;
33 33
 
@@ -75,11 +75,11 @@ public class SingleScreenLayout extends RelativeLayout implements Layout {
75 75
     }
76 76
 
77 77
     private void createSnackbarContainer() {
78
-        snackbarContainer = new SnackbarContainer(getContext());
78
+        snackbarAndFabContainer = new SnackbarAndFabContainer(getContext());
79 79
         RelativeLayout.LayoutParams lp = new LayoutParams(MATCH_PARENT, WRAP_CONTENT);
80 80
         lp.addRule(ALIGN_PARENT_BOTTOM);
81
-        snackbarContainer.setLayoutParams(lp);
82
-        getScreenStackParent().addView(snackbarContainer);
81
+        snackbarAndFabContainer.setLayoutParams(lp);
82
+        getScreenStackParent().addView(snackbarAndFabContainer);
83 83
     }
84 84
 
85 85
     @Override
@@ -99,7 +99,7 @@ public class SingleScreenLayout extends RelativeLayout implements Layout {
99 99
     @Override
100 100
     public void destroy() {
101 101
         stack.destroy();
102
-        snackbarContainer.destroy();
102
+        snackbarAndFabContainer.destroy();
103 103
         if (sideMenu != null) {
104 104
             sideMenu.destroy();
105 105
         }
@@ -109,26 +109,26 @@ public class SingleScreenLayout extends RelativeLayout implements Layout {
109 109
     public void push(ScreenParams params) {
110 110
         LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
111 111
         stack.push(params, lp);
112
-        snackbarContainer.onScreenChange();
112
+        snackbarAndFabContainer.onScreenChange();
113 113
     }
114 114
 
115 115
     @Override
116 116
     public void pop(ScreenParams params) {
117 117
         stack.pop(params.animateScreenTransitions);
118
-        snackbarContainer.onScreenChange();
118
+        snackbarAndFabContainer.onScreenChange();
119 119
     }
120 120
 
121 121
     @Override
122 122
     public void popToRoot(ScreenParams params) {
123 123
         stack.popToRoot(params.animateScreenTransitions);
124
-        snackbarContainer.onScreenChange();
124
+        snackbarAndFabContainer.onScreenChange();
125 125
     }
126 126
 
127 127
     @Override
128 128
     public void newStack(ScreenParams params) {
129 129
         RelativeLayout parent = sideMenu == null ? this : sideMenu.getContentContainer();
130 130
         createStack(parent);
131
-        snackbarContainer.onScreenChange();
131
+        snackbarAndFabContainer.onScreenChange();
132 132
     }
133 133
 
134 134
     @Override
@@ -179,7 +179,7 @@ public class SingleScreenLayout extends RelativeLayout implements Layout {
179 179
     @Override
180 180
     public void showSnackbar(SnackbarParams params) {
181 181
         final String navigatorEventId = stack.peek().getNavigatorEventId();
182
-        snackbarContainer.showSnackbar(navigatorEventId, params);
182
+        snackbarAndFabContainer.showSnackbar(navigatorEventId, params);
183 183
     }
184 184
 
185 185
     @Override

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

@@ -0,0 +1,8 @@
1
+package com.reactnativenavigation.params;
2
+
3
+import android.graphics.drawable.Drawable;
4
+
5
+public class FabActionParams {
6
+    public String id;
7
+    public Drawable icon;
8
+}

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

@@ -0,0 +1,13 @@
1
+package com.reactnativenavigation.params;
2
+
3
+import android.graphics.drawable.Drawable;
4
+
5
+import java.util.List;
6
+
7
+public class FabParams {
8
+    public Drawable collapsedIcon;
9
+    public Drawable expendedIcon;
10
+    public StyleParams.Color backgroundColor;
11
+    public String id;
12
+    public List<FabActionParams> actions;
13
+}

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

@@ -16,7 +16,7 @@ public class ScreenParams {
16 16
     public String fragmentCreatorClassName;
17 17
     public Bundle fragmentCreatorPassProps;
18 18
     public boolean animateScreenTransitions;
19
-
19
+    public FabParams fabParams;
20 20
     public String tabLabel;
21 21
     public Drawable tabIcon;
22 22
 

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

@@ -0,0 +1,15 @@
1
+package com.reactnativenavigation.params.parsers;
2
+
3
+import android.os.Bundle;
4
+
5
+import com.reactnativenavigation.params.FabActionParams;
6
+import com.reactnativenavigation.react.ImageLoader;
7
+
8
+public class FabActionParamsParser extends Parser {
9
+    public FabActionParams parse(Bundle params) {
10
+        FabActionParams fabActionParams = new FabActionParams();
11
+        fabActionParams.id = params.getString("id");
12
+        fabActionParams.icon = ImageLoader.loadImage(params.getString("icon"));
13
+        return fabActionParams;
14
+    }
15
+}

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

@@ -0,0 +1,33 @@
1
+package com.reactnativenavigation.params.parsers;
2
+
3
+import android.os.Bundle;
4
+
5
+import com.reactnativenavigation.params.FabActionParams;
6
+import com.reactnativenavigation.params.FabParams;
7
+import com.reactnativenavigation.params.StyleParams;
8
+import com.reactnativenavigation.react.ImageLoader;
9
+
10
+public class FabParamsParser extends Parser {
11
+    public FabParams parse(Bundle params) {
12
+        FabParams fabParams = new FabParams();
13
+        fabParams.id = params.getString("id");
14
+        fabParams.backgroundColor = getColor(params, "backgroundColor", new StyleParams.Color());
15
+
16
+        if (hasKey(params, "collapsedIcon")) {
17
+            fabParams.collapsedIcon = ImageLoader.loadImage(params.getString("collapsedIcon"));
18
+        }
19
+        if (hasKey(params, "expendedIcon")) {
20
+            fabParams.expendedIcon = ImageLoader.loadImage(params.getString("expendedIcon"));
21
+        }
22
+        if (hasKey(params, "actions")) {
23
+            fabParams.actions = parseBundle(params.getBundle("actions"), new ParseStrategy<FabActionParams>() {
24
+                @Override
25
+                public FabActionParams parse(Bundle params) {
26
+                    return new FabActionParamsParser().parse(params);
27
+                }
28
+            });
29
+        }
30
+
31
+        return fabParams;
32
+    }
33
+}

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

@@ -3,6 +3,7 @@ package com.reactnativenavigation.params.parsers;
3 3
 import android.graphics.drawable.Drawable;
4 4
 import android.os.Bundle;
5 5
 
6
+import com.reactnativenavigation.params.FabParams;
6 7
 import com.reactnativenavigation.params.NavigationParams;
7 8
 import com.reactnativenavigation.params.ScreenParams;
8 9
 import com.reactnativenavigation.params.TitleBarButtonParams;
@@ -18,6 +19,7 @@ public class ScreenParamsParser extends Parser {
18 19
     private static final String KEY_NAVIGATION_PARAMS = "navigationParams";
19 20
     private static final String KEY_RIGHT_BUTTONS = "rightButtons";
20 21
     private static final String KEY_LEFT_BUTTON = "leftButton";
22
+    private static final String KEY_FAB = "fab";
21 23
     private static final String KEY_BACK_BUTTON_HIDDEN = "backButtonHidden";
22 24
     private static final String STYLE_PARAMS = "styleParams";
23 25
     private static final String TOP_TABS = "topTabs";
@@ -46,6 +48,8 @@ public class ScreenParamsParser extends Parser {
46 48
             result.fragmentCreatorPassProps = params.getBundle(FRAGMENT_CREATOR_PASS_PROPS);
47 49
         }
48 50
 
51
+        result.fabParams = parseFab(params);
52
+
49 53
         result.tabLabel = getTabLabel(params);
50 54
         result.tabIcon = getTabIcon(params);
51 55
 
@@ -99,6 +103,14 @@ public class ScreenParamsParser extends Parser {
99 103
         return leftButton;
100 104
     }
101 105
 
106
+    private static FabParams parseFab(Bundle params) {
107
+        FabParams fabParams = null;
108
+        if (hasKey(params, KEY_FAB)) {
109
+            fabParams = new FabParamsParser().parse(params.getBundle(KEY_FAB));
110
+        }
111
+        return fabParams;
112
+    }
113
+
102 114
     public List<ScreenParams> parseTabs(Bundle params) {
103 115
         return parseBundle(params, new ParseStrategy<ScreenParams>() {
104 116
             @Override

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

@@ -9,6 +9,7 @@ import android.view.Window;
9 9
 import android.widget.RelativeLayout;
10 10
 
11 11
 import com.reactnativenavigation.animation.VisibilityAnimator;
12
+import com.reactnativenavigation.params.FabParams;
12 13
 import com.reactnativenavigation.params.ScreenParams;
13 14
 import com.reactnativenavigation.params.StyleParams;
14 15
 import com.reactnativenavigation.params.TitleBarButtonParams;
@@ -136,6 +137,10 @@ public abstract class Screen extends RelativeLayout {
136 137
         return screenParams.getNavigatorEventId();
137 138
     }
138 139
 
140
+    public FabParams getFabParams() {
141
+        return screenParams.fabParams;
142
+    }
143
+
139 144
     public void setTopBarVisible(boolean visible, boolean animate) {
140 145
         topBarVisibilityAnimator.setVisible(visible, animate);
141 146
     }

android/app/src/main/java/com/reactnativenavigation/views/SnackbarContainer.java → android/app/src/main/java/com/reactnativenavigation/views/SnackbarAndFabContainer.java Целия файл

@@ -1,17 +1,23 @@
1 1
 package com.reactnativenavigation.views;
2 2
 
3 3
 import android.content.Context;
4
+import android.support.annotation.NonNull;
4 5
 import android.support.design.widget.CoordinatorLayout;
6
+import android.support.design.widget.FloatingActionButton;
7
+import android.view.Gravity;
8
+import android.view.ViewGroup;
5 9
 
6 10
 import com.reactnativenavigation.events.ScreenChangeBroadcastReceiver;
11
+import com.reactnativenavigation.params.FabParams;
7 12
 import com.reactnativenavigation.params.SnackbarParams;
13
+import com.reactnativenavigation.utils.ViewUtils;
8 14
 
9
-public class SnackbarContainer extends CoordinatorLayout implements Snakbar.OnDismissListener, ScreenChangeBroadcastReceiver.OnScreenChangeListener {
10
-
15
+public class SnackbarAndFabContainer extends CoordinatorLayout implements Snakbar.OnDismissListener, ScreenChangeBroadcastReceiver.OnScreenChangeListener {
16
+    private static final String TAG = "SnackbarAndFabContainer";
11 17
     private Snakbar snakbar;
12 18
     private ScreenChangeBroadcastReceiver screenChangeBroadcastReceiver;
13 19
 
14
-    public SnackbarContainer(Context context) {
20
+    public SnackbarAndFabContainer(Context context) {
15 21
         super(context);
16 22
         registerTabSelectedReceiver();
17 23
     }
@@ -46,4 +52,13 @@ public class SnackbarContainer extends CoordinatorLayout implements Snakbar.OnDi
46 52
     public void onScreenChangeListener() {
47 53
         onScreenChange();
48 54
     }
55
+
56
+    public void showFab(@NonNull FabParams fabParams) {
57
+        FloatingActionButton fab = new FloatingActionButton(getContext());
58
+        CoordinatorLayout.LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
59
+        lp.gravity = Gravity.RIGHT | Gravity.BOTTOM;
60
+        int margin = (int) ViewUtils.convertDpToPixel(16);
61
+        lp.setMargins(0, 0, margin, margin);
62
+        addView(fab, lp);
63
+    }
49 64
 }

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

@@ -16,6 +16,18 @@ public class Snakbar {
16 16
         void onDismiss();
17 17
     }
18 18
 
19
+    public void show() {
20
+        snackbar.show();
21
+    }
22
+
23
+    public void dismiss() {
24
+        snackbar.dismiss();
25
+    }
26
+
27
+    public View getView() {
28
+        return snackbar.getView();
29
+    }
30
+
19 31
     public Snakbar(OnDismissListener parent, String navigatorEventId, SnackbarParams params) {
20 32
         this.parent = parent;
21 33
         this.navigatorEventId = navigatorEventId;
@@ -60,12 +72,4 @@ public class Snakbar {
60 72
             }
61 73
         });
62 74
     }
63
-
64
-    public void show() {
65
-        snackbar.show();
66
-    }
67
-
68
-    public void dismiss() {
69
-        snackbar.dismiss();
70
-    }
71 75
 }

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

@@ -357,6 +357,11 @@ function addNavigatorButtons(screen, sideMenuParams) {
357 357
     }
358 358
   }
359 359
 
360
+  const fab = getFab(screen);
361
+  if (fab) {
362
+    screen.fab = fab;
363
+  }
364
+
360 365
   if (rightButtons) {
361 366
     screen.rightButtons = rightButtons;
362 367
   }
@@ -365,6 +370,24 @@ function addNavigatorButtons(screen, sideMenuParams) {
365 370
   }
366 371
 }
367 372
 
373
+function getFab(screen) {
374
+  if (screen.fab) {
375
+    const fab = screen.fab;
376
+    debugger;
377
+    fab.collapsedIcon = resolveAssetSource(fab.collapsedIcon).uri;
378
+    fab.expendedIcon = resolveAssetSource(fab.expendedIcon).uri;
379
+
380
+    if (fab.actions) {
381
+      _.forEach(fab.actions, (action) => {
382
+        action.icon = resolveAssetSource(action.icon).uri;
383
+        return action;
384
+      })
385
+    }
386
+
387
+    return fab;
388
+  }
389
+}
390
+
368 391
 function createSideMenuButton() {
369 392
   return {
370 393
     id: "sideMenu"