Browse Source

Reset to (#671)

* Don’t create SideMenu button automatically on Android

* Remove left button and add it dynamically

* Fix resetTo animation on Android

Up until now resetTo would destroy the current stack and create a new
one. This was an easy implementation but resulted in jurky
(none existent) animations.
This commit changes resetTo behavior. Instead of recreating the stack,
the we reset to is pushed to the stack, and the other elements are
removed when show animation ends.
Guy Carmeli 8 years ago
parent
commit
4648a3bdf9

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

283
     }
283
     }
284
 
284
 
285
     @Override
285
     @Override
286
-    public void newStack(ScreenParams params) {
286
+    public void newStack(final ScreenParams params) {
287
         ScreenStack currentScreenStack = getCurrentScreenStack();
287
         ScreenStack currentScreenStack = getCurrentScreenStack();
288
-        removeView(currentScreenStack.peek());
289
-        currentScreenStack.destroy();
290
-
291
-        ScreenStack newStack = new ScreenStack(getActivity(), getScreenStackParent(), params.getNavigatorId(), this);
292
-        LayoutParams lp = createScreenLayoutParams(params);
293
-        newStack.pushInitialScreenWithAnimation(params, lp);
294
-        screenStacks[currentStackIndex] = newStack;
295
-
288
+        currentScreenStack.newStack(params, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
296
         bottomTabs.setStyleFromScreen(params.styleParams);
289
         bottomTabs.setStyleFromScreen(params.styleParams);
297
         EventBus.instance.post(new ScreenChangedEvent(params));
290
         EventBus.instance.post(new ScreenChangedEvent(params));
298
     }
291
     }

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

128
 
128
 
129
     @Override
129
     @Override
130
     public void push(ScreenParams params) {
130
     public void push(ScreenParams params) {
131
-        LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
132
-        stack.push(params, lp);
131
+        stack.push(params, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
133
         EventBus.instance.post(new ScreenChangedEvent(params));
132
         EventBus.instance.post(new ScreenChangedEvent(params));
134
     }
133
     }
135
 
134
 
154
     }
153
     }
155
 
154
 
156
     @Override
155
     @Override
157
-    public void newStack(ScreenParams params) {
158
-        removeView(stack.peek());
159
-        stack.destroy();
160
-
161
-        ScreenStack newStack = new ScreenStack(getActivity(), getScreenStackParent(), params.getNavigatorId(), this);
162
-        LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
163
-        newStack.pushInitialScreenWithAnimation(params, lp);
164
-        stack = newStack;
165
-
156
+    public void newStack(final ScreenParams params) {
157
+        stack.newStack(params, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
166
         EventBus.instance.post(new ScreenChangedEvent(params));
158
         EventBus.instance.post(new ScreenChangedEvent(params));
167
     }
159
     }
168
 
160
 

+ 7
- 1
android/app/src/main/java/com/reactnativenavigation/params/TitleBarLeftButtonParams.java View File

1
 package com.reactnativenavigation.params;
1
 package com.reactnativenavigation.params;
2
 
2
 
3
+import android.support.annotation.Nullable;
4
+
3
 import com.balysv.materialmenu.MaterialMenuDrawable;
5
 import com.balysv.materialmenu.MaterialMenuDrawable;
4
 
6
 
5
 public class TitleBarLeftButtonParams extends TitleBarButtonParams {
7
 public class TitleBarLeftButtonParams extends TitleBarButtonParams {
6
-    public MaterialMenuDrawable.IconState iconState;
8
+    @Nullable public MaterialMenuDrawable.IconState iconState;
7
     public boolean overrideBackPressInJs;
9
     public boolean overrideBackPressInJs;
8
 
10
 
9
     public TitleBarLeftButtonParams(TitleBarButtonParams params) {
11
     public TitleBarLeftButtonParams(TitleBarButtonParams params) {
17
         return eventId.equals("back");
19
         return eventId.equals("back");
18
     }
20
     }
19
 
21
 
22
+    public boolean hasIcon() {
23
+        return iconState != null;
24
+    }
25
+
20
     public void setOverrideBackPressInJs(boolean overrideBackPressInJs) {
26
     public void setOverrideBackPressInJs(boolean overrideBackPressInJs) {
21
         this.overrideBackPressInJs = overrideBackPressInJs;
27
         this.overrideBackPressInJs = overrideBackPressInJs;
22
     }
28
     }

+ 5
- 1
android/app/src/main/java/com/reactnativenavigation/params/parsers/TitleBarLeftButtonParamsParser.java View File

9
 
9
 
10
     public TitleBarLeftButtonParams parseSingleButton(Bundle params) {
10
     public TitleBarLeftButtonParams parseSingleButton(Bundle params) {
11
         TitleBarLeftButtonParams leftButtonParams = new TitleBarLeftButtonParams(super.parseSingleButton(params));
11
         TitleBarLeftButtonParams leftButtonParams = new TitleBarLeftButtonParams(super.parseSingleButton(params));
12
+        if (params.isEmpty()) {
13
+            return leftButtonParams;
14
+        }
12
         leftButtonParams.iconState = getIconStateFromId(leftButtonParams.eventId);
15
         leftButtonParams.iconState = getIconStateFromId(leftButtonParams.eventId);
13
         return leftButtonParams;
16
         return leftButtonParams;
14
     }
17
     }
22
             case "accept":
25
             case "accept":
23
                 return MaterialMenuDrawable.IconState.CHECK;
26
                 return MaterialMenuDrawable.IconState.CHECK;
24
             case "sideMenu":
27
             case "sideMenu":
25
-            default:
26
                 return MaterialMenuDrawable.IconState.BURGER;
28
                 return MaterialMenuDrawable.IconState.BURGER;
29
+            default:
30
+                return null;
27
         }
31
         }
28
     }
32
     }
29
 }
33
 }

+ 35
- 1
android/app/src/main/java/com/reactnativenavigation/screens/ScreenStack.java View File

52
         keyboardVisibilityDetector = new KeyboardVisibilityDetector(parent);
52
         keyboardVisibilityDetector = new KeyboardVisibilityDetector(parent);
53
     }
53
     }
54
 
54
 
55
+    public void newStack(final ScreenParams params, LayoutParams layoutParams) {
56
+        final Screen nextScreen = ScreenFactory.create(activity, params, leftButtonOnClickListener);
57
+        final Screen previousScreen = stack.peek();
58
+        if (isStackVisible) {
59
+            pushScreenToVisibleStack(layoutParams, nextScreen, previousScreen, new Screen.OnDisplayListener() {
60
+                @Override
61
+                public void onDisplay() {
62
+                    removeElementsBelowTop();
63
+                }
64
+            });
65
+        } else {
66
+            pushScreenToInvisibleStack(layoutParams, nextScreen, previousScreen);
67
+            removeElementsBelowTop();
68
+        }
69
+    }
70
+
71
+    private void removeElementsBelowTop() {
72
+        while (stack.size() > 1) {
73
+            Screen screen = stack.get(0);
74
+            parent.removeView(screen);
75
+            screen.destroy();
76
+            stack.remove(0);
77
+        }
78
+    }
79
+
55
     public void pushInitialScreenWithAnimation(final ScreenParams initialScreenParams, LayoutParams params) {
80
     public void pushInitialScreenWithAnimation(final ScreenParams initialScreenParams, LayoutParams params) {
56
         isStackVisible = true;
81
         isStackVisible = true;
57
         pushInitialScreen(initialScreenParams, params);
82
         pushInitialScreen(initialScreenParams, params);
81
         }
106
         }
82
     }
107
     }
83
 
108
 
84
-    private void pushScreenToVisibleStack(LayoutParams layoutParams, final Screen nextScreen, final Screen previousScreen) {
109
+    private void pushScreenToVisibleStack(LayoutParams layoutParams, final Screen nextScreen,
110
+                                          final Screen previousScreen) {
111
+        pushScreenToVisibleStack(layoutParams, nextScreen, previousScreen, null);
112
+    }
113
+
114
+    private void pushScreenToVisibleStack(LayoutParams layoutParams,
115
+                                          final Screen nextScreen,
116
+                                          final Screen previousScreen,
117
+                                          @Nullable final Screen.OnDisplayListener onDisplay) {
85
         nextScreen.setVisibility(View.INVISIBLE);
118
         nextScreen.setVisibility(View.INVISIBLE);
86
         addScreen(nextScreen, layoutParams);
119
         addScreen(nextScreen, layoutParams);
87
         nextScreen.setOnDisplayListener(new Screen.OnDisplayListener() {
120
         nextScreen.setOnDisplayListener(new Screen.OnDisplayListener() {
90
                 nextScreen.show(nextScreen.screenParams.animateScreenTransitions, new Runnable() {
123
                 nextScreen.show(nextScreen.screenParams.animateScreenTransitions, new Runnable() {
91
                     @Override
124
                     @Override
92
                     public void run() {
125
                     public void run() {
126
+                        if (onDisplay != null) onDisplay.onDisplay();
93
                         parent.removeView(previousScreen);
127
                         parent.removeView(previousScreen);
94
                     }
128
                     }
95
                 });
129
                 });

+ 11
- 2
android/app/src/main/java/com/reactnativenavigation/views/TitleBar.java View File

53
         if (shouldSetLeftButton(leftButtonParams)) {
53
         if (shouldSetLeftButton(leftButtonParams)) {
54
             createAndSetLeftButton(leftButtonParams, leftButtonOnClickListener, navigatorEventId, overrideBackPressInJs);
54
             createAndSetLeftButton(leftButtonParams, leftButtonOnClickListener, navigatorEventId, overrideBackPressInJs);
55
         } else if (hasLeftButton()) {
55
         } else if (hasLeftButton()) {
56
-            updateLeftButton(leftButtonParams);
56
+            if (leftButtonParams.hasIcon()) {
57
+                updateLeftButton(leftButtonParams);
58
+            } else {
59
+                removeLeftButton();
60
+            }
57
         }
61
         }
58
     }
62
     }
59
 
63
 
64
+    private void removeLeftButton() {
65
+        setNavigationIcon(null);
66
+        leftButton = null;
67
+    }
68
+
60
     public void setStyle(StyleParams params) {
69
     public void setStyle(StyleParams params) {
61
         setVisibility(params.titleBarHidden ? GONE : VISIBLE);
70
         setVisibility(params.titleBarHidden ? GONE : VISIBLE);
62
         setTitleTextColor(params);
71
         setTitleTextColor(params);
115
     }
124
     }
116
 
125
 
117
     private boolean shouldSetLeftButton(TitleBarLeftButtonParams leftButtonParams) {
126
     private boolean shouldSetLeftButton(TitleBarLeftButtonParams leftButtonParams) {
118
-        return leftButton == null && leftButtonParams != null;
127
+        return leftButton == null && leftButtonParams != null && leftButtonParams.iconState != null;
119
     }
128
     }
120
 
129
 
121
     private void createAndSetLeftButton(TitleBarLeftButtonParams leftButtonParams,
130
     private void createAndSetLeftButton(TitleBarLeftButtonParams leftButtonParams,

+ 7
- 4
src/deprecated/platformSpecificDeprecated.android.js View File

271
       }
271
       }
272
     });
272
     });
273
   }
273
   }
274
-  const leftButton = getLeftButton(params);
274
+  let leftButton = getLeftButton(params);
275
   if (leftButton) {
275
   if (leftButton) {
276
     if (leftButton.icon) {
276
     if (leftButton.icon) {
277
       const icon = resolveAssetSource(leftButton.icon);
277
       const icon = resolveAssetSource(leftButton.icon);
279
         leftButton.icon = icon.uri;
279
         leftButton.icon = icon.uri;
280
       }
280
       }
281
     }
281
     }
282
+  } else if (shouldRemoveLeftButton(params)) {
283
+    leftButton = {};
282
   }
284
   }
283
   const fab = getFab(params);
285
   const fab = getFab(params);
284
   newPlatformSpecific.setScreenButtons(navigator.screenInstanceID, navigatorEventID, params.rightButtons, leftButton, fab);
286
   newPlatformSpecific.setScreenButtons(navigator.screenInstanceID, navigatorEventID, params.rightButtons, leftButton, fab);
285
 }
287
 }
286
 
288
 
289
+function shouldRemoveLeftButton(params) {
290
+  return params.leftButtons && params.leftButtons.length === 0;
291
+}
292
+
287
 function navigatorSetTabBadge(navigator, params) {
293
 function navigatorSetTabBadge(navigator, params) {
288
   const badge = params.badge ? params.badge.toString() : '';
294
   const badge = params.badge ? params.badge.toString() : '';
289
   if (params.tabIndex >= 0) {
295
   if (params.tabIndex >= 0) {
394
   }
400
   }
395
 
401
 
396
   let leftButton = getLeftButton(screen);
402
   let leftButton = getLeftButton(screen);
397
-  if (sideMenuParams && !leftButton) {
398
-    leftButton = createSideMenuButton();
399
-  }
400
   if (leftButton) {
403
   if (leftButton) {
401
     if (leftButton.icon) {
404
     if (leftButton.icon) {
402
       const icon = resolveAssetSource(leftButton.icon);
405
       const icon = resolveAssetSource(leftButton.icon);