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,6 +2,7 @@ package com.reactnativenavigation.controllers;
2 2
 
3 3
 import android.os.Bundle;
4 4
 import android.support.v7.app.AppCompatActivity;
5
+import android.view.View;
5 6
 
6 7
 import com.facebook.react.ReactInstanceManager;
7 8
 import com.facebook.react.ReactNativeHost;
@@ -10,6 +11,7 @@ import com.facebook.react.bridge.ReactContext;
10 11
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
11 12
 import com.facebook.react.shell.MainReactPackage;
12 13
 import com.reactnativenavigation.R;
14
+import com.reactnativenavigation.layout.StackLayout;
13 15
 import com.reactnativenavigation.react.NavigationEventEmitter;
14 16
 import com.reactnativenavigation.react.NavigationPackage;
15 17
 import com.reactnativenavigation.react.ReactDevPermission;
@@ -20,6 +22,7 @@ import java.util.List;
20 22
 public class NavigationActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
21 23
     public static NavigationActivity instance;
22 24
     private ReactNativeHost host;
25
+    private StackLayout root;
23 26
 
24 27
     @Override
25 28
     public void onCreate(Bundle savedInstanceState) {
@@ -81,4 +84,17 @@ public class NavigationActivity extends AppCompatActivity implements DefaultHard
81 84
     public ReactNativeHost getHost() {
82 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,13 +4,29 @@ import android.content.Context;
4 4
 import android.view.View;
5 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 11
     public ContainerStackLayout(Context context) {
9 12
         super(context);
10 13
     }
11 14
 
15
+    @Override
12 16
     public void push(View view) {
13 17
         addView(view);
18
+        removedView = getChildAt(0);
19
+        removeView(removedView);
20
+    }
21
+
22
+    @Override
23
+    public void pop() {
24
+        addView(removedView);
14 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

@@ -0,0 +1,7 @@
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

@@ -0,0 +1,9 @@
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,10 +4,12 @@ import android.app.Activity;
4 4
 import android.view.View;
5 5
 import android.widget.RelativeLayout;
6 6
 
7
+import com.reactnativenavigation.layout.StackLayout;
8
+
7 9
 import java.util.ArrayList;
8 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 14
     private List<View> tabsContent;
13 15
     private BottomTabs bottomTabs;
@@ -60,4 +62,18 @@ public class BottomTabsLayout extends RelativeLayout implements BottomTabs.Botto
60 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,6 +13,7 @@ import com.facebook.react.bridge.ReadableMapKeySetIterator;
13 13
 import com.reactnativenavigation.controllers.NavigationActivity;
14 14
 import com.reactnativenavigation.layout.LayoutFactory;
15 15
 import com.reactnativenavigation.layout.LayoutNode;
16
+import com.reactnativenavigation.layout.StackLayout;
16 17
 import com.reactnativenavigation.layout.bottomtabs.BottomTabsCreator;
17 18
 
18 19
 import java.util.ArrayList;
@@ -50,7 +51,7 @@ public class NavigationModule extends ReactContextBaseJavaModule {
50 51
 
51 52
                 final LayoutNode layoutTreeRoot = readableMapToLayoutNode(layoutTree);
52 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,7 +74,17 @@ public class NavigationModule extends ReactContextBaseJavaModule {
73 74
                         }, new BottomTabsCreator());
74 75
                 final LayoutNode layoutNode = readableMapToLayoutNode(layout);
75 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,7 +173,7 @@ public class LayoutFactoryTest {
173 173
     }
174 174
 
175 175
     @Test
176
-    public void pushAScreenToScreenStack() throws Exception {
176
+    public void pushScreenToScreenStackLayout() throws Exception {
177 177
         when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);
178 178
         final LayoutNode container = createContainerNode();
179 179
         final LayoutNode stackNode = createContainerStackNode(container);
@@ -187,6 +187,22 @@ public class LayoutFactoryTest {
187 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 206
     @Test(expected = IllegalArgumentException.class)
191 207
     public void throwsExceptionForUnknownType() throws Exception {
192 208
         when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);