Browse Source

Pop from ContainerStack

Guy Carmeli 8 years ago
parent
commit
a21b2e08fb

+ 16
- 0
android/app/src/main/java/com/reactnativenavigation/controllers/NavigationActivity.java View File

2
 
2
 
3
 import android.os.Bundle;
3
 import android.os.Bundle;
4
 import android.support.v7.app.AppCompatActivity;
4
 import android.support.v7.app.AppCompatActivity;
5
+import android.view.View;
5
 
6
 
6
 import com.facebook.react.ReactInstanceManager;
7
 import com.facebook.react.ReactInstanceManager;
7
 import com.facebook.react.ReactNativeHost;
8
 import com.facebook.react.ReactNativeHost;
10
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
11
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
11
 import com.facebook.react.shell.MainReactPackage;
12
 import com.facebook.react.shell.MainReactPackage;
12
 import com.reactnativenavigation.R;
13
 import com.reactnativenavigation.R;
14
+import com.reactnativenavigation.layout.StackLayout;
13
 import com.reactnativenavigation.react.NavigationEventEmitter;
15
 import com.reactnativenavigation.react.NavigationEventEmitter;
14
 import com.reactnativenavigation.react.NavigationPackage;
16
 import com.reactnativenavigation.react.NavigationPackage;
15
 import com.reactnativenavigation.react.ReactDevPermission;
17
 import com.reactnativenavigation.react.ReactDevPermission;
20
 public class NavigationActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
22
 public class NavigationActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
21
     public static NavigationActivity instance;
23
     public static NavigationActivity instance;
22
     private ReactNativeHost host;
24
     private ReactNativeHost host;
25
+    private StackLayout root;
23
 
26
 
24
     @Override
27
     @Override
25
     public void onCreate(Bundle savedInstanceState) {
28
     public void onCreate(Bundle savedInstanceState) {
81
     public ReactNativeHost getHost() {
84
     public ReactNativeHost getHost() {
82
         return host;
85
         return host;
83
     }
86
     }
87
+
88
+    public void setRoot(StackLayout rootView) {
89
+        this.root = rootView;
90
+        setContentView(rootView.asView());
91
+    }
92
+
93
+    public void push(View view) {
94
+        root.push(view);
95
+    }
96
+
97
+    public void pop() {
98
+        root.pop();
99
+    }
84
 }
100
 }

+ 17
- 1
android/app/src/main/java/com/reactnativenavigation/layout/ContainerStackLayout.java View File

4
 import android.view.View;
4
 import android.view.View;
5
 import android.widget.FrameLayout;
5
 import android.widget.FrameLayout;
6
 
6
 
7
-public class ContainerStackLayout extends FrameLayout {
7
+public class ContainerStackLayout extends FrameLayout implements StackLayout {
8
+
9
+    private View removedView;
10
+
8
     public ContainerStackLayout(Context context) {
11
     public ContainerStackLayout(Context context) {
9
         super(context);
12
         super(context);
10
     }
13
     }
11
 
14
 
15
+    @Override
12
     public void push(View view) {
16
     public void push(View view) {
13
         addView(view);
17
         addView(view);
18
+        removedView = getChildAt(0);
19
+        removeView(removedView);
20
+    }
21
+
22
+    @Override
23
+    public void pop() {
24
+        addView(removedView);
14
         removeView(getChildAt(0));
25
         removeView(getChildAt(0));
15
     }
26
     }
27
+
28
+    @Override
29
+    public View asView() {
30
+        return this;
31
+    }
16
 }
32
 }

+ 7
- 0
android/app/src/main/java/com/reactnativenavigation/layout/Layout.java View File

1
+package com.reactnativenavigation.layout;
2
+
3
+import android.view.View;
4
+
5
+public interface Layout {
6
+    public View asView();
7
+}

+ 9
- 0
android/app/src/main/java/com/reactnativenavigation/layout/StackLayout.java View File

1
+package com.reactnativenavigation.layout;
2
+
3
+import android.view.View;
4
+
5
+public interface StackLayout extends Layout {
6
+    public void push(View view);
7
+
8
+    public void pop();
9
+}

+ 17
- 1
android/app/src/main/java/com/reactnativenavigation/layout/bottomtabs/BottomTabsLayout.java View File

4
 import android.view.View;
4
 import android.view.View;
5
 import android.widget.RelativeLayout;
5
 import android.widget.RelativeLayout;
6
 
6
 
7
+import com.reactnativenavigation.layout.StackLayout;
8
+
7
 import java.util.ArrayList;
9
 import java.util.ArrayList;
8
 import java.util.List;
10
 import java.util.List;
9
 
11
 
10
-public class BottomTabsLayout extends RelativeLayout implements BottomTabs.BottomTabsSelectionListener {
12
+public class BottomTabsLayout extends RelativeLayout implements BottomTabs.BottomTabsSelectionListener, StackLayout {
11
 
13
 
12
     private List<View> tabsContent;
14
     private List<View> tabsContent;
13
     private BottomTabs bottomTabs;
15
     private BottomTabs bottomTabs;
60
         tabsContent.get(tabId).setVisibility(View.GONE);
62
         tabsContent.get(tabId).setVisibility(View.GONE);
61
     }
63
     }
62
 
64
 
65
+    @Override
66
+    public void push(View view) {
67
+
68
+    }
69
+
70
+    @Override
71
+    public void pop() {
72
+
73
+    }
74
+
75
+    @Override
76
+    public View asView() {
77
+        return this;
78
+    }
63
 }
79
 }

+ 13
- 2
android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java View File

13
 import com.reactnativenavigation.controllers.NavigationActivity;
13
 import com.reactnativenavigation.controllers.NavigationActivity;
14
 import com.reactnativenavigation.layout.LayoutFactory;
14
 import com.reactnativenavigation.layout.LayoutFactory;
15
 import com.reactnativenavigation.layout.LayoutNode;
15
 import com.reactnativenavigation.layout.LayoutNode;
16
+import com.reactnativenavigation.layout.StackLayout;
16
 import com.reactnativenavigation.layout.bottomtabs.BottomTabsCreator;
17
 import com.reactnativenavigation.layout.bottomtabs.BottomTabsCreator;
17
 
18
 
18
 import java.util.ArrayList;
19
 import java.util.ArrayList;
50
 
51
 
51
                 final LayoutNode layoutTreeRoot = readableMapToLayoutNode(layoutTree);
52
                 final LayoutNode layoutTreeRoot = readableMapToLayoutNode(layoutTree);
52
                 final View rootView = factory.create(layoutTreeRoot);
53
                 final View rootView = factory.create(layoutTreeRoot);
53
-                NavigationActivity.instance.setContentView(rootView);
54
+                NavigationActivity.instance.setRoot((StackLayout) rootView);
54
             }
55
             }
55
         });
56
         });
56
     }
57
     }
73
                         }, new BottomTabsCreator());
74
                         }, new BottomTabsCreator());
74
                 final LayoutNode layoutNode = readableMapToLayoutNode(layout);
75
                 final LayoutNode layoutNode = readableMapToLayoutNode(layout);
75
                 final View rootView = factory.create(layoutNode);
76
                 final View rootView = factory.create(layoutNode);
76
-                NavigationActivity.instance.setContentView(rootView);
77
+                NavigationActivity.instance.push(rootView);
78
+            }
79
+        });
80
+    }
81
+
82
+    @ReactMethod
83
+    public void pop(String onContainerId) {
84
+        NavigationActivity.instance.runOnUiThread(new Runnable() {
85
+            @Override
86
+            public void run() {
87
+                NavigationActivity.instance.pop();
77
             }
88
             }
78
         });
89
         });
79
     }
90
     }

+ 17
- 1
android/app/src/test/java/com/reactnativenavigation/LayoutFactoryTest.java View File

173
     }
173
     }
174
 
174
 
175
     @Test
175
     @Test
176
-    public void pushAScreenToScreenStack() throws Exception {
176
+    public void pushScreenToScreenStackLayout() throws Exception {
177
         when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);
177
         when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);
178
         final LayoutNode container = createContainerNode();
178
         final LayoutNode container = createContainerNode();
179
         final LayoutNode stackNode = createContainerStackNode(container);
179
         final LayoutNode stackNode = createContainerStackNode(container);
187
         assertThat(result.getChildAt(0)).isEqualTo(otherMockView);
187
         assertThat(result.getChildAt(0)).isEqualTo(otherMockView);
188
     }
188
     }
189
 
189
 
190
+    @Test
191
+    public void popScreenFromScreenStackLayout() {
192
+        when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);
193
+        final LayoutNode container = createContainerNode();
194
+        final LayoutNode stackNode = createContainerStackNode(container);
195
+        final ContainerStackLayout containerStackLayout = (ContainerStackLayout) createLayoutFactory().create(stackNode);
196
+
197
+        when(reactRootViewCreator.create(eq(OTHER_NODE_ID), eq(OTHER_REACT_ROOT_VIEW_KEY))).thenReturn(otherMockView);
198
+        final LayoutNode pushedContainer = createContainerNode(OTHER_NODE_ID, OTHER_REACT_ROOT_VIEW_KEY);
199
+        containerStackLayout.push(createLayoutFactory().create(pushedContainer));
200
+
201
+        containerStackLayout.pop();
202
+        ViewGroup result = (ViewGroup) TestUtils.assertViewChildrenCount(containerStackLayout, 1).get(0);
203
+        assertThat(result.getChildAt(0)).isEqualTo(mockView);
204
+    }
205
+
190
     @Test(expected = IllegalArgumentException.class)
206
     @Test(expected = IllegalArgumentException.class)
191
     public void throwsExceptionForUnknownType() throws Exception {
207
     public void throwsExceptionForUnknownType() throws Exception {
192
         when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);
208
         when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);