Browse Source

Support pushing screens to unselected tabs

Guy Carmeli 8 years ago
parent
commit
fafc52a124

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

@@ -52,7 +52,6 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
52 52
         if (sideMenuParams == null) {
53 53
             return;
54 54
         }
55
-
56 55
         sideMenu = new SideMenu(getContext(), sideMenuParams);
57 56
         RelativeLayout.LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
58 57
         addView(sideMenu, lp);
@@ -65,8 +64,8 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
65 64
     }
66 65
 
67 66
     private void createAndAddScreens(int position) {
68
-        ScreenStack newStack = new ScreenStack(activity, getContentContainer(), this);
69 67
         ScreenParams screenParams = params.tabParams.get(position);
68
+        ScreenStack newStack = new ScreenStack(activity, getContentContainer(), screenParams.navigatorId, this);
70 69
         newStack.pushInitialScreen(screenParams, createScreenLayoutParams(screenParams));
71 70
         screenStacks[position] = newStack;
72 71
     }
@@ -163,8 +162,17 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
163 162
 
164 163
     @Override
165 164
     public void push(ScreenParams screenParams) {
166
-        getCurrentScreenStack().push(screenParams, createScreenLayoutParams(screenParams));
167
-        bottomTabs.setStyleFromScreen(screenParams.styleParams);
165
+        ScreenStack screenStack = getScreenStack(screenParams.navigatorId);
166
+        if (screenStack == null) {
167
+            return;
168
+        }
169
+
170
+        if (isCurrentStack(screenStack)) {
171
+            screenStack.push(screenParams, createScreenLayoutParams(screenParams));
172
+            bottomTabs.setStyleFromScreen(screenParams.styleParams);
173
+        } else {
174
+            screenStack.push(screenParams, createScreenLayoutParams(screenParams));
175
+        }
168 176
     }
169 177
 
170 178
     @Override
@@ -189,7 +197,7 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
189 197
         currentScreenStack.destroy();
190 198
         removeView(currentScreenStack.peek());
191 199
 
192
-        ScreenStack newStack = new ScreenStack(activity, this, this);
200
+        ScreenStack newStack = new ScreenStack(activity, this, params.navigatorId, this);
193 201
         LayoutParams lp = createScreenLayoutParams(params);
194 202
         newStack.pushInitialScreen(params, lp);
195 203
         screenStacks[currentStackIndex] = newStack;
@@ -220,19 +228,32 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
220 228
     }
221 229
 
222 230
     private void showStackAndUpdateStyle(ScreenStack newStack) {
223
-        newStack.showFirstScreen();
231
+        newStack.show();
224 232
         bottomTabs.setStyleFromScreen(newStack.getCurrentScreenStyleParams());
225 233
     }
226 234
 
227 235
     private void hideCurrentStack() {
228 236
         ScreenStack currentScreenStack = getCurrentScreenStack();
229
-        currentScreenStack.hideScreen();
237
+        currentScreenStack.hide();
230 238
     }
231 239
 
232 240
     private ScreenStack getCurrentScreenStack() {
233 241
         return screenStacks[currentStackIndex];
234 242
     }
235 243
 
244
+    private @Nullable ScreenStack getScreenStack(String navigatorId) {
245
+        for (ScreenStack screenStack : screenStacks) {
246
+            if (screenStack.getNavigatorId().equals(navigatorId)) {
247
+                return screenStack;
248
+            }
249
+        }
250
+        return null;
251
+    }
252
+
253
+    private boolean isCurrentStack(ScreenStack screenStack) {
254
+        return getCurrentScreenStack() == screenStack;
255
+    }
256
+
236 257
     private void setBottomTabsStyleFromCurrentScreen() {
237 258
         bottomTabs.setStyleFromScreen(getCurrentScreenStack().getCurrentScreenStyleParams());
238 259
     }
@@ -248,7 +269,6 @@ public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottom
248 269
             });
249 270
             return true;
250 271
         }
251
-
252 272
         return false;
253 273
     }
254 274
 

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

@@ -60,10 +60,10 @@ public class SingleScreenLayout extends RelativeLayout implements Layout {
60 60
         if (stack != null) {
61 61
             stack.destroy();
62 62
         }
63
-        stack = new ScreenStack(activity, parent, this);
63
+        stack = new ScreenStack(activity, parent, screenParams.navigatorId, this);
64 64
         LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
65 65
         stack.pushInitialScreen(screenParams, lp);
66
-        stack.showFirstScreen();
66
+        stack.show();
67 67
     }
68 68
 
69 69
     @Override

+ 1
- 0
android/app/src/main/java/com/reactnativenavigation/params/ScreenParams.java View File

@@ -21,6 +21,7 @@ public class ScreenParams {
21 21
 
22 22
     public String screenInstanceId;
23 23
     public String navigatorEventId;
24
+    public String navigatorId;
24 25
     public Bundle navigationParams;
25 26
 
26 27
     public boolean hasTopTabs() {

+ 2
- 0
android/app/src/main/java/com/reactnativenavigation/params/parsers/ScreenParamsParser.java View File

@@ -17,6 +17,7 @@ public class ScreenParamsParser extends Parser {
17 17
     private static final String KEY_SCREEN_ID = "screenId";
18 18
     private static final String KEY_SCREEN_INSTANCE_ID = "screenInstanceID";
19 19
     private static final String KEY_NAVIGATOR_EVENT_ID = "navigatorEventID";
20
+    private static final String KEY_NAVIGATOR_ID = "navigatorID";
20 21
     private static final String KEY_NAVIGATION_PARAMS = "navigationParams";
21 22
     private static final String KEY_RIGHT_BUTTONS = "rightButtons";
22 23
     private static final String KEY_LEFT_BUTTON = "leftButton";
@@ -34,6 +35,7 @@ public class ScreenParamsParser extends Parser {
34 35
         assertKeyExists(params, KEY_NAVIGATION_PARAMS);
35 36
         result.navigationParams = params.getBundle(KEY_NAVIGATION_PARAMS);
36 37
         result.navigatorEventId = result.navigationParams.getString(KEY_NAVIGATOR_EVENT_ID);
38
+        result.navigatorId = result.navigationParams.getString(KEY_NAVIGATOR_ID);
37 39
         result.screenInstanceId = result.navigationParams.getString(KEY_SCREEN_INSTANCE_ID);
38 40
 
39 41
         result.styleParams = new StyleParamsParser(params.getBundle(STYLE_PARAMS)).parse();

+ 29
- 2
android/app/src/main/java/com/reactnativenavigation/screens/ScreenStack.java View File

@@ -27,12 +27,20 @@ public class ScreenStack {
27 27
     private LeftButtonOnClickListener leftButtonOnClickListener;
28 28
     private Stack<Screen> stack = new Stack<>();
29 29
     private final KeyboardVisibilityDetector keyboardVisibilityDetector;
30
+    private boolean isStackVisible = false;
31
+    private final String navigatorId;
32
+
33
+    public String getNavigatorId() {
34
+        return navigatorId;
35
+    }
30 36
 
31 37
     public ScreenStack(AppCompatActivity activity,
32 38
                        RelativeLayout parent,
39
+                       String navigatorId,
33 40
                        LeftButtonOnClickListener leftButtonOnClickListener) {
34 41
         this.activity = activity;
35 42
         this.parent = parent;
43
+        this.navigatorId = navigatorId;
36 44
         this.leftButtonOnClickListener = leftButtonOnClickListener;
37 45
         keyboardVisibilityDetector = new KeyboardVisibilityDetector(parent);
38 46
     }
@@ -46,6 +54,15 @@ public class ScreenStack {
46 54
     public void push(final ScreenParams params, RelativeLayout.LayoutParams layoutParams) {
47 55
         Screen nextScreen = ScreenFactory.create(activity, params, leftButtonOnClickListener);
48 56
         final Screen previousScreen = stack.peek();
57
+        if (isStackVisible) {
58
+            pushScreenToVisibleStack(params, layoutParams, nextScreen, previousScreen);
59
+        } else {
60
+            pushScreenToInvisibleStack(layoutParams, nextScreen, previousScreen);
61
+        }
62
+    }
63
+
64
+    private void pushScreenToVisibleStack(ScreenParams params, RelativeLayout.LayoutParams layoutParams,
65
+                                          Screen nextScreen, final Screen previousScreen) {
49 66
         addScreen(nextScreen, layoutParams);
50 67
         nextScreen.show(params.animateScreenTransitions, new Runnable() {
51 68
             @Override
@@ -55,6 +72,13 @@ public class ScreenStack {
55 72
         });
56 73
     }
57 74
 
75
+    private void pushScreenToInvisibleStack(RelativeLayout.LayoutParams layoutParams, Screen nextScreen,
76
+                                            Screen previousScreen) {
77
+        nextScreen.setVisibility(View.INVISIBLE);
78
+        addScreen(nextScreen, layoutParams);
79
+        removePreviousWithoutUnmount(previousScreen);
80
+    }
81
+
58 82
     private void addScreen(Screen screen, RelativeLayout.LayoutParams layoutParams) {
59 83
         parent.addView(screen, layoutParams);
60 84
         stack.push(screen);
@@ -109,6 +133,7 @@ public class ScreenStack {
109 133
     }
110 134
 
111 135
     private void readdPrevious(Screen previous) {
136
+        previous.setVisibility(View.VISIBLE);
112 137
         parent.addView(previous, 0);
113 138
         previous.preventMountAfterReattachedToWindow();
114 139
     }
@@ -188,11 +213,13 @@ public class ScreenStack {
188 213
         }
189 214
     }
190 215
 
191
-    public void showFirstScreen() {
216
+    public void show() {
217
+        isStackVisible = true;
192 218
         stack.peek().setVisibility(View.VISIBLE);
193 219
     }
194 220
 
195
-    public void hideScreen() {
221
+    public void hide() {
222
+        isStackVisible = false;
196 223
         stack.peek().setVisibility(View.INVISIBLE);
197 224
     }
198 225
 }