Browse Source

minor fixes

Daniel Zlotin 8 years ago
parent
commit
3911e8cdc3

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

29
         super(activity);
29
         super(activity);
30
         this.activity = activity;
30
         this.activity = activity;
31
         this.params = params;
31
         this.params = params;
32
-        screenStacks = new ScreenStack[(params.tabParams.size())];
32
+        screenStacks = new ScreenStack[params.tabParams.size()];
33
         createLayout();
33
         createLayout();
34
     }
34
     }
35
 
35
 
65
     }
65
     }
66
 
66
 
67
     private void showInitialScreenStack() {
67
     private void showInitialScreenStack() {
68
-        showStack(screenStacks[0]);
68
+        showStackAndUpdateStyle(screenStacks[0]);
69
     }
69
     }
70
 
70
 
71
     @Override
71
     @Override
86
     @Override
86
     @Override
87
     public void setTopBarVisible(String screenInstanceId, boolean hidden, boolean animated) {
87
     public void setTopBarVisible(String screenInstanceId, boolean hidden, boolean animated) {
88
         for (int i = 0; i < bottomTabs.getItemsCount(); i++) {
88
         for (int i = 0; i < bottomTabs.getItemsCount(); i++) {
89
-            screenStacks[i].setTopBarVisible(screenInstanceId, hidden, animated);
89
+            screenStacks[i].setScreenTopBarVisible(screenInstanceId, hidden, animated);
90
         }
90
         }
91
     }
91
     }
92
 
92
 
93
     @Override
93
     @Override
94
     public void setTitleBarTitle(String screenInstanceId, String title) {
94
     public void setTitleBarTitle(String screenInstanceId, String title) {
95
         for (int i = 0; i < bottomTabs.getItemsCount(); i++) {
95
         for (int i = 0; i < bottomTabs.getItemsCount(); i++) {
96
-            screenStacks[i].setTitleBarTitle(screenInstanceId, title);
96
+            screenStacks[i].setScreenTitleBarTitle(screenInstanceId, title);
97
         }
97
         }
98
     }
98
     }
99
 
99
 
100
     @Override
100
     @Override
101
     public void setTitleBarRightButtons(String screenInstanceId, String navigatorEventId, List<TitleBarButtonParams> titleBarButtons) {
101
     public void setTitleBarRightButtons(String screenInstanceId, String navigatorEventId, List<TitleBarButtonParams> titleBarButtons) {
102
         for (int i = 0; i < bottomTabs.getItemsCount(); i++) {
102
         for (int i = 0; i < bottomTabs.getItemsCount(); i++) {
103
-            screenStacks[i].setTitleBarRightButtons(screenInstanceId, navigatorEventId, titleBarButtons);
103
+            screenStacks[i].setScreenTitleBarRightButtons(screenInstanceId, navigatorEventId, titleBarButtons);
104
         }
104
         }
105
     }
105
     }
106
 
106
 
107
     @Override
107
     @Override
108
     public void setTitleBarLeftButton(String screenInstanceId, String navigatorEventId, TitleBarLeftButtonParams titleBarLeftButtonParams) {
108
     public void setTitleBarLeftButton(String screenInstanceId, String navigatorEventId, TitleBarLeftButtonParams titleBarLeftButtonParams) {
109
         for (int i = 0; i < bottomTabs.getItemsCount(); i++) {
109
         for (int i = 0; i < bottomTabs.getItemsCount(); i++) {
110
-            screenStacks[i].setTitleBarLeftButton(screenInstanceId, navigatorEventId, titleBarLeftButtonParams);
110
+            screenStacks[i].setScreenTitleBarLeftButton(screenInstanceId, navigatorEventId, titleBarLeftButtonParams);
111
         }
111
         }
112
     }
112
     }
113
 
113
 
149
         hideCurrentStack();
149
         hideCurrentStack();
150
 
150
 
151
         ScreenStack newStack = screenStacks[position];
151
         ScreenStack newStack = screenStacks[position];
152
-        showStack(newStack);
152
+        showStackAndUpdateStyle(newStack);
153
         currentStackIndex = position;
153
         currentStackIndex = position;
154
 
154
 
155
         return true;
155
         return true;
156
     }
156
     }
157
 
157
 
158
-    private void showStack(ScreenStack newStack) {
158
+    private void showStackAndUpdateStyle(ScreenStack newStack) {
159
         newStack.setVisibility(VISIBLE);
159
         newStack.setVisibility(VISIBLE);
160
         bottomTabs.setStyleFromScreen(newStack.getCurrentScreenStyleParams());
160
         bottomTabs.setStyleFromScreen(newStack.getCurrentScreenStyleParams());
161
     }
161
     }

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

72
 
72
 
73
     @Override
73
     @Override
74
     public void setTopBarVisible(String screenInstanceID, boolean visible, boolean animate) {
74
     public void setTopBarVisible(String screenInstanceID, boolean visible, boolean animate) {
75
-        stack.setTopBarVisible(screenInstanceID, visible, animate);
75
+        stack.setScreenTopBarVisible(screenInstanceID, visible, animate);
76
     }
76
     }
77
 
77
 
78
     @Override
78
     @Override
79
     public void setTitleBarTitle(String screenInstanceId, String title) {
79
     public void setTitleBarTitle(String screenInstanceId, String title) {
80
-        stack.setTitleBarTitle(screenInstanceId, title);
80
+        stack.setScreenTitleBarTitle(screenInstanceId, title);
81
     }
81
     }
82
 
82
 
83
     @Override
83
     @Override
88
     @Override
88
     @Override
89
     public void setTitleBarRightButtons(String screenInstanceId, String navigatorEventId,
89
     public void setTitleBarRightButtons(String screenInstanceId, String navigatorEventId,
90
                                         List<TitleBarButtonParams> titleBarRightButtons) {
90
                                         List<TitleBarButtonParams> titleBarRightButtons) {
91
-        stack.setTitleBarRightButtons(screenInstanceId, navigatorEventId, titleBarRightButtons);
91
+        stack.setScreenTitleBarRightButtons(screenInstanceId, navigatorEventId, titleBarRightButtons);
92
     }
92
     }
93
 
93
 
94
     @Override
94
     @Override
95
     public void setTitleBarLeftButton(String screenInstanceId, String navigatorEventId, TitleBarLeftButtonParams titleBarLeftButtonParams) {
95
     public void setTitleBarLeftButton(String screenInstanceId, String navigatorEventId, TitleBarLeftButtonParams titleBarLeftButtonParams) {
96
-        stack.setTitleBarLeftButton(screenInstanceId, navigatorEventId, titleBarLeftButtonParams);
96
+        stack.setScreenTitleBarLeftButton(screenInstanceId, navigatorEventId, titleBarLeftButtonParams);
97
     }
97
     }
98
 }
98
 }

+ 39
- 48
android/app/src/main/java/com/reactnativenavigation/screens/ScreenStack.java View File

8
 import com.reactnativenavigation.params.ScreenStyleParams;
8
 import com.reactnativenavigation.params.ScreenStyleParams;
9
 import com.reactnativenavigation.params.TitleBarButtonParams;
9
 import com.reactnativenavigation.params.TitleBarButtonParams;
10
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
10
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
11
+import com.reactnativenavigation.utils.Task;
11
 import com.reactnativenavigation.views.TitleBarBackButtonListener;
12
 import com.reactnativenavigation.views.TitleBarBackButtonListener;
12
 
13
 
13
 import java.util.List;
14
 import java.util.List;
17
 
18
 
18
 // TODO there's really no reason for ScreenStack to extend FrameLayout. All screens can be added to parent.
19
 // TODO there's really no reason for ScreenStack to extend FrameLayout. All screens can be added to parent.
19
 public class ScreenStack extends FrameLayout implements TitleBarBackButtonListener {
20
 public class ScreenStack extends FrameLayout implements TitleBarBackButtonListener {
21
+
20
     private final AppCompatActivity activity;
22
     private final AppCompatActivity activity;
21
     private Stack<Screen> stack = new Stack<>();
23
     private Stack<Screen> stack = new Stack<>();
22
 
24
 
50
 
52
 
51
     public void pop() {
53
     public void pop() {
52
         if (!canPop()) {
54
         if (!canPop()) {
53
-            throw new RuntimeException("Can't pop ScreenStack of size " + getStackSize());
55
+            return;
54
         }
56
         }
55
 
57
 
56
         Screen toRemove = stack.pop();
58
         Screen toRemove = stack.pop();
89
         return getStackSize() > 1;
91
         return getStackSize() > 1;
90
     }
92
     }
91
 
93
 
92
-    public void setTopBarVisible(String screenInstanceId, boolean visible, boolean animate) {
93
-        Screen screen = findScreenByScreenInstanceId(screenInstanceId);
94
-        if (screen != null) {
95
-            screen.setTopBarVisible(visible, animate);
96
-        }
97
-    }
98
-
99
-    public Screen findScreenByScreenInstanceId(String screenInstanceId) {
100
-        if (stack.isEmpty()) {
101
-            return null;
102
-        }
103
-
104
-        for (Screen screen : stack) {
105
-            if (screen.getScreenInstanceId().equals(screenInstanceId)) {
106
-                return screen;
94
+    public void setScreenTopBarVisible(String screenInstanceId, final boolean visible, final boolean animate) {
95
+        performOnScreen(screenInstanceId, new Task<Screen>() {
96
+            @Override
97
+            public void run(Screen param) {
98
+                param.setTopBarVisible(visible, animate);
107
             }
99
             }
108
-        }
109
-
110
-        return null;
100
+        });
111
     }
101
     }
112
 
102
 
113
-    public void setTitleBarTitle(String screenInstanceId, String title) {
114
-        Screen screen = findScreenByScreenInstanceId(screenInstanceId);
115
-        if (screen != null) {
116
-            screen.setTitleBarTitle(title);
117
-        }
103
+    public void setScreenTitleBarTitle(String screenInstanceId, final String title) {
104
+        performOnScreen(screenInstanceId, new Task<Screen>() {
105
+            @Override
106
+            public void run(Screen param) {
107
+                param.setTitleBarTitle(title);
108
+            }
109
+        });
118
     }
110
     }
119
 
111
 
120
-    public void setTitleBarRightButtons(String screenInstanceId, String navigatorEventId, List<TitleBarButtonParams> titleBarButtons) {
121
-        Screen screen = findScreenByScreenInstanceId(screenInstanceId);
122
-        if (screen != null) {
123
-            screen.setTitleBarRightButtons(navigatorEventId, titleBarButtons);
124
-        }
112
+    public void setScreenTitleBarRightButtons(String screenInstanceId, final String navigatorEventId, final List<TitleBarButtonParams> titleBarButtons) {
113
+        performOnScreen(screenInstanceId, new Task<Screen>() {
114
+            @Override
115
+            public void run(Screen param) {
116
+                param.setTitleBarRightButtons(navigatorEventId, titleBarButtons);
117
+            }
118
+        });
125
     }
119
     }
126
 
120
 
127
-    public void setTitleBarLeftButton(String screenInstanceId, String navigatorEventId, TitleBarLeftButtonParams titleBarLeftButtonParams) {
128
-        Screen screen = findScreenByScreenInstanceId(screenInstanceId);
129
-        if (screen != null) {
130
-            screen.setTitleBarLeftButton(navigatorEventId, this, titleBarLeftButtonParams);
131
-        }
121
+    public void setScreenTitleBarLeftButton(String screenInstanceId, final String navigatorEventId, final TitleBarLeftButtonParams titleBarLeftButtonParams) {
122
+        performOnScreen(screenInstanceId, new Task<Screen>() {
123
+            @Override
124
+            public void run(Screen param) {
125
+                param.setTitleBarLeftButton(navigatorEventId, ScreenStack.this, titleBarLeftButtonParams);
126
+            }
127
+        });
132
     }
128
     }
133
 
129
 
134
     @Override
130
     @Override
138
         }
134
         }
139
     }
135
     }
140
 
136
 
141
-    public void preventUnmountOnDetachedFromWindow() {
142
-        for (Screen screen : stack) {
143
-            screen.preventUnmountOnDetachedFromWindow();
144
-        }
137
+    public ScreenStyleParams getCurrentScreenStyleParams() {
138
+        return stack.peek().getStyleParams();
145
     }
139
     }
146
 
140
 
147
-    public void ensureUnmountOnDetachedFromWindow() {
148
-        for (Screen screen : stack) {
149
-            screen.ensureUnmountOnDetachedFromWindow();
141
+    private void performOnScreen(String screenInstanceId, Task<Screen> task) {
142
+        if (stack.isEmpty()) {
143
+            return;
150
         }
144
         }
151
-    }
152
 
145
 
153
-    public void preventMountAfterReatachedToWindow() {
154
         for (Screen screen : stack) {
146
         for (Screen screen : stack) {
155
-            screen.preventMountAfterReattachedToWindow();
147
+            if (screen.getScreenInstanceId().equals(screenInstanceId)) {
148
+                task.run(screen);
149
+                return;
150
+            }
156
         }
151
         }
157
     }
152
     }
158
-
159
-    public ScreenStyleParams getCurrentScreenStyleParams() {
160
-        return stack.peek().getStyleParams();
161
-    }
162
 }
153
 }

+ 5
- 0
android/app/src/main/java/com/reactnativenavigation/utils/Task.java View File

1
+package com.reactnativenavigation.utils;
2
+
3
+public interface Task<T> {
4
+    void run(T param);
5
+}

+ 47
- 1
example-redux/src/app.js View File

35
   startApp(root) {
35
   startApp(root) {
36
     switch (root) {
36
     switch (root) {
37
       case 'login':
37
       case 'login':
38
+        //Navigation.startSingleScreenApp({
39
+        //  screen: {
40
+        //    screen: 'example.LoginScreen',
41
+        //    title: 'Login',
42
+        //    navigatorStyle: {}
43
+        //  },
44
+        //  passProps: {
45
+        //    str: 'This is a prop passed in \'startSingleScreenApp()\'!',
46
+        //    obj: {
47
+        //      str: 'This is a prop passed in an object!',
48
+        //      arr: [
49
+        //        {
50
+        //          str: 'This is a prop in an object in an array in an object!'
51
+        //        }
52
+        //      ],
53
+        //      arr2: [
54
+        //        [
55
+        //          'array of strings',
56
+        //          'with two strings'
57
+        //        ],
58
+        //        [
59
+        //          1, 2, 3
60
+        //        ]
61
+        //      ]
62
+        //    },
63
+        //    num: 1234
64
+        //  }
65
+        //});
38
         Navigation.startSingleScreenApp({
66
         Navigation.startSingleScreenApp({
39
           screen: {
67
           screen: {
40
-            screen: 'example.LoginScreen',
68
+            screen: 'example.FirstTabScreen',
41
             title: 'Login',
69
             title: 'Login',
70
+            topTabs: [
71
+              {
72
+                screenId: 'example.ListScreen',
73
+                title: 'Tab1'
74
+              },
75
+              {
76
+                screenId: 'example.PushedScreen',
77
+                title: 'Tab2'
78
+              },
79
+              {
80
+                screenId: 'example.PushedScreen',
81
+                title: 'Tab3'
82
+              },
83
+              {
84
+                screenId: 'example.FirstTabScreen',
85
+                title: 'Tab4'
86
+              }
87
+            ],
42
             navigatorStyle: {}
88
             navigatorStyle: {}
43
           },
89
           },
44
           passProps: {
90
           passProps: {

+ 6
- 7
example-redux/src/screens/PushedScreen.js View File

25
   };
25
   };
26
 
26
 
27
   static navigatorButtons = {
27
   static navigatorButtons = {
28
-    leftButton:
29
-      {
30
-        id: 'back',
31
-        color: '#00ff00'
32
-      }
28
+    leftButton: {
29
+      id: 'back',
30
+      color: '#00ff00'
31
+    }
33
   };
32
   };
34
 
33
 
35
   constructor(props) {
34
   constructor(props) {
127
 
126
 
128
   onPushPress() {
127
   onPushPress() {
129
     this.props.navigator.push({
128
     this.props.navigator.push({
130
-      title: "More",
131
-      screen: "example.PushedScreen",
129
+      title: "List",
130
+      screen: "example.ListScreen",
132
       passProps: {
131
       passProps: {
133
         passed: 'This is a prop passed in \'navigator.push()\'!',
132
         passed: 'This is a prop passed in \'navigator.push()\'!',
134
         obj: {
133
         obj: {