Pārlūkot izejas kodu

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 gadus atpakaļ
vecāks
revīzija
4648a3bdf9

+ 2
- 9
android/app/src/main/java/com/reactnativenavigation/layouts/BottomTabsLayout.java Parādīt failu

@@ -283,16 +283,9 @@ public class BottomTabsLayout extends BaseLayout implements AHBottomNavigation.O
283 283
     }
284 284
 
285 285
     @Override
286
-    public void newStack(ScreenParams params) {
286
+    public void newStack(final ScreenParams params) {
287 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 289
         bottomTabs.setStyleFromScreen(params.styleParams);
297 290
         EventBus.instance.post(new ScreenChangedEvent(params));
298 291
     }

+ 3
- 11
android/app/src/main/java/com/reactnativenavigation/layouts/SingleScreenLayout.java Parādīt failu

@@ -128,8 +128,7 @@ public class SingleScreenLayout extends BaseLayout {
128 128
 
129 129
     @Override
130 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 132
         EventBus.instance.post(new ScreenChangedEvent(params));
134 133
     }
135 134
 
@@ -154,15 +153,8 @@ public class SingleScreenLayout extends BaseLayout {
154 153
     }
155 154
 
156 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 158
         EventBus.instance.post(new ScreenChangedEvent(params));
167 159
     }
168 160
 

+ 7
- 1
android/app/src/main/java/com/reactnativenavigation/params/TitleBarLeftButtonParams.java Parādīt failu

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

+ 5
- 1
android/app/src/main/java/com/reactnativenavigation/params/parsers/TitleBarLeftButtonParamsParser.java Parādīt failu

@@ -9,6 +9,9 @@ public class TitleBarLeftButtonParamsParser extends TitleBarButtonParamsParser {
9 9
 
10 10
     public TitleBarLeftButtonParams parseSingleButton(Bundle params) {
11 11
         TitleBarLeftButtonParams leftButtonParams = new TitleBarLeftButtonParams(super.parseSingleButton(params));
12
+        if (params.isEmpty()) {
13
+            return leftButtonParams;
14
+        }
12 15
         leftButtonParams.iconState = getIconStateFromId(leftButtonParams.eventId);
13 16
         return leftButtonParams;
14 17
     }
@@ -22,8 +25,9 @@ public class TitleBarLeftButtonParamsParser extends TitleBarButtonParamsParser {
22 25
             case "accept":
23 26
                 return MaterialMenuDrawable.IconState.CHECK;
24 27
             case "sideMenu":
25
-            default:
26 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 Parādīt failu

@@ -52,6 +52,31 @@ public class ScreenStack {
52 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 80
     public void pushInitialScreenWithAnimation(final ScreenParams initialScreenParams, LayoutParams params) {
56 81
         isStackVisible = true;
57 82
         pushInitialScreen(initialScreenParams, params);
@@ -81,7 +106,15 @@ public class ScreenStack {
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 118
         nextScreen.setVisibility(View.INVISIBLE);
86 119
         addScreen(nextScreen, layoutParams);
87 120
         nextScreen.setOnDisplayListener(new Screen.OnDisplayListener() {
@@ -90,6 +123,7 @@ public class ScreenStack {
90 123
                 nextScreen.show(nextScreen.screenParams.animateScreenTransitions, new Runnable() {
91 124
                     @Override
92 125
                     public void run() {
126
+                        if (onDisplay != null) onDisplay.onDisplay();
93 127
                         parent.removeView(previousScreen);
94 128
                     }
95 129
                 });

+ 11
- 2
android/app/src/main/java/com/reactnativenavigation/views/TitleBar.java Parādīt failu

@@ -53,10 +53,19 @@ public class TitleBar extends Toolbar {
53 53
         if (shouldSetLeftButton(leftButtonParams)) {
54 54
             createAndSetLeftButton(leftButtonParams, leftButtonOnClickListener, navigatorEventId, overrideBackPressInJs);
55 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 69
     public void setStyle(StyleParams params) {
61 70
         setVisibility(params.titleBarHidden ? GONE : VISIBLE);
62 71
         setTitleTextColor(params);
@@ -115,7 +124,7 @@ public class TitleBar extends Toolbar {
115 124
     }
116 125
 
117 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 130
     private void createAndSetLeftButton(TitleBarLeftButtonParams leftButtonParams,

+ 7
- 4
src/deprecated/platformSpecificDeprecated.android.js Parādīt failu

@@ -271,7 +271,7 @@ function navigatorSetButtons(navigator, navigatorEventID, _params) {
271 271
       }
272 272
     });
273 273
   }
274
-  const leftButton = getLeftButton(params);
274
+  let leftButton = getLeftButton(params);
275 275
   if (leftButton) {
276 276
     if (leftButton.icon) {
277 277
       const icon = resolveAssetSource(leftButton.icon);
@@ -279,11 +279,17 @@ function navigatorSetButtons(navigator, navigatorEventID, _params) {
279 279
         leftButton.icon = icon.uri;
280 280
       }
281 281
     }
282
+  } else if (shouldRemoveLeftButton(params)) {
283
+    leftButton = {};
282 284
   }
283 285
   const fab = getFab(params);
284 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 293
 function navigatorSetTabBadge(navigator, params) {
288 294
   const badge = params.badge ? params.badge.toString() : '';
289 295
   if (params.tabIndex >= 0) {
@@ -394,9 +400,6 @@ function addNavigatorButtons(screen, sideMenuParams) {
394 400
   }
395 401
 
396 402
   let leftButton = getLeftButton(screen);
397
-  if (sideMenuParams && !leftButton) {
398
-    leftButton = createSideMenuButton();
399
-  }
400 403
   if (leftButton) {
401 404
     if (leftButton.icon) {
402 405
       const icon = resolveAssetSource(leftButton.icon);