Procházet zdrojové kódy

Android: Integrate layout factory onto setRoot()

Amit Davidi před 7 roky
rodič
revize
f7d39240b3

+ 0
- 18
android/app/src/main/java/com/reactnativenavigation/layout/LayoutFactory.java Zobrazit soubor

@@ -4,29 +4,12 @@ import android.app.Activity;
4 4
 import android.view.View;
5 5
 
6 6
 import java.util.List;
7
-import java.util.Map;
8 7
 
9 8
 public class LayoutFactory {
10 9
     public interface RootViewCreator {
11 10
         View createRootView(String id, String name);
12 11
     }
13 12
 
14
-    public static class LayoutNode {
15
-        public String id;
16
-        public String type;
17
-        public Map<String, Object> data;
18
-        public List<LayoutNode> children;
19
-
20
-        public LayoutNode() {
21
-        }
22
-
23
-        public LayoutNode(String id, String type, Map<String, Object> data) {
24
-            this.id = id;
25
-            this.type = type;
26
-            this.data = data;
27
-        }
28
-    }
29
-
30 13
     private Activity activity;
31 14
     private RootViewCreator rootViewCreator;
32 15
 
@@ -49,7 +32,6 @@ public class LayoutFactory {
49 32
         }
50 33
 
51 34
         return null;
52
-//        return rootViewCreator.createRootView(id, name);
53 35
     }
54 36
 
55 37
     private void addChildrenNodes(ContainerStack containerStack, List<LayoutNode> children) {

+ 20
- 0
android/app/src/main/java/com/reactnativenavigation/layout/LayoutNode.java Zobrazit soubor

@@ -0,0 +1,20 @@
1
+package com.reactnativenavigation.layout;
2
+
3
+import java.util.List;
4
+import java.util.Map;
5
+
6
+public class LayoutNode {
7
+    public String id;
8
+    public String type;
9
+    public Map<String, Object> data;
10
+    public List<LayoutNode> children;
11
+
12
+    public LayoutNode() {
13
+    }
14
+
15
+    public LayoutNode(String id, String type, Map<String, Object> data) {
16
+        this.id = id;
17
+        this.type = type;
18
+        this.data = data;
19
+    }
20
+}

+ 46
- 0
android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java Zobrazit soubor

@@ -7,9 +7,16 @@ import com.facebook.react.ReactRootView;
7 7
 import com.facebook.react.bridge.ReactApplicationContext;
8 8
 import com.facebook.react.bridge.ReactContextBaseJavaModule;
9 9
 import com.facebook.react.bridge.ReactMethod;
10
+import com.facebook.react.bridge.ReadableArray;
10 11
 import com.facebook.react.bridge.ReadableMap;
12
+import com.facebook.react.bridge.ReadableMapKeySetIterator;
11 13
 import com.reactnativenavigation.controllers.NavigationActivity;
12 14
 import com.reactnativenavigation.layout.LayoutFactory;
15
+import com.reactnativenavigation.layout.LayoutNode;
16
+
17
+import java.util.ArrayList;
18
+import java.util.HashMap;
19
+import java.util.Map;
13 20
 
14 21
 public class NavigationModule extends ReactContextBaseJavaModule {
15 22
     public static final String NAME = "RNNBridgeModule";
@@ -39,6 +46,10 @@ public class NavigationModule extends ReactContextBaseJavaModule {
39 46
                     }
40 47
                 });
41 48
 
49
+                final LayoutNode layoutTreeRoot = readableMapToLayoutNode(layoutTree);
50
+                final View rootView = factory.create(layoutTreeRoot);
51
+                NavigationActivity.instance.setContentView(rootView);
52
+
42 53
 //                Map<String, Object> node = new HashMap<String, Object>();
43 54
 //                node.put("id", container.getString("id"));
44 55
 //                HashMap<String, Object> data = new HashMap<>();
@@ -49,4 +60,39 @@ public class NavigationModule extends ReactContextBaseJavaModule {
49 60
             }
50 61
         });
51 62
     }
63
+
64
+    private LayoutNode readableMapToLayoutNode(ReadableMap readableMap) {
65
+        final LayoutNode layoutNode = new LayoutNode();
66
+        layoutNode.id = readableMap.getString("id");
67
+        layoutNode.type = readableMap.getString("type");
68
+        layoutNode.data = readableMapToJavaMap(readableMap.getMap("data"));
69
+
70
+        ReadableArray childrenNodes = readableMap.getArray("children");
71
+        layoutNode.children = new ArrayList<>(childrenNodes.size());
72
+        for (int i = 0; i < childrenNodes.size(); i++) {
73
+            ReadableMap child = childrenNodes.getMap(i);
74
+            layoutNode.children.add(readableMapToLayoutNode(child));
75
+        }
76
+
77
+        return layoutNode;
78
+    }
79
+
80
+    private Map<String, Object> readableMapToJavaMap(ReadableMap readableMap) {
81
+        final Map<String, Object> map = new HashMap<>();
82
+        for (ReadableMapKeySetIterator it = readableMap.keySetIterator(); it.hasNextKey();) {
83
+            final String key = it.nextKey();
84
+            switch (readableMap.getType(key)) {
85
+                case String:
86
+                    map.put(key, readableMap.getString(key));
87
+                    break;
88
+                case Map:
89
+                    map.put(key, readableMapToJavaMap(readableMap.getMap(key)));
90
+                    break;
91
+                default:
92
+                    throw new IllegalArgumentException("WTF?!");
93
+            }
94
+        }
95
+        return map;
96
+    }
97
+
52 98
 }

+ 0
- 1
android/app/src/main/java/com/reactnativenavigation/react/NavigationPackage.java Zobrazit soubor

@@ -29,4 +29,3 @@ public class NavigationPackage implements ReactPackage {
29 29
         return Collections.emptyList();
30 30
     }
31 31
 }
32
-

+ 9
- 10
android/app/src/test/java/com/reactnativenavigation/LayoutFactoryTest.java Zobrazit soubor

@@ -7,7 +7,7 @@ import android.view.ViewGroup;
7 7
 import com.reactnativenavigation.layout.Container;
8 8
 import com.reactnativenavigation.layout.ContainerStack;
9 9
 import com.reactnativenavigation.layout.LayoutFactory;
10
-import com.reactnativenavigation.layout.LayoutFactory.LayoutNode;
10
+import com.reactnativenavigation.layout.LayoutNode;
11 11
 
12 12
 import org.junit.Before;
13 13
 import org.junit.Test;
@@ -19,7 +19,6 @@ import java.util.ArrayList;
19 19
 import java.util.Arrays;
20 20
 import java.util.HashMap;
21 21
 import java.util.List;
22
-import java.util.Map;
23 22
 
24 23
 import static org.assertj.core.api.Java6Assertions.assertThat;
25 24
 import static org.mockito.ArgumentMatchers.eq;
@@ -94,6 +93,14 @@ public class LayoutFactoryTest {
94 93
         return new LayoutFactory(Robolectric.buildActivity(Activity.class).get(), rootViewCreator);
95 94
     }
96 95
 
96
+    private LayoutNode createContainerNode() {
97
+        return createContainerNode(VIEW_ID, VIEW_NAME);
98
+    }
99
+
100
+    private LayoutNode createContainerNode(final String id, final String name) {
101
+        return new LayoutNode(id, "Container", new HashMap<String, Object>() {{ put("name", name); }});
102
+    }
103
+
97 104
     private LayoutNode getContainerStackNode(LayoutNode innerNode) {
98 105
         return getContainerStackNode(Arrays.asList(innerNode));
99 106
     }
@@ -105,14 +112,6 @@ public class LayoutFactoryTest {
105 112
         return outerNode;
106 113
     }
107 114
 
108
-    private LayoutNode createContainerNode() {
109
-        return createContainerNode(VIEW_ID, VIEW_NAME);
110
-    }
111
-
112
-    private LayoutNode createContainerNode(final String id, final String name) {
113
-        return new LayoutNode(id, "Container", new HashMap<String, Object>() {{ put("name", name); }});
114
-    }
115
-
116 115
     private List<View> assertViewChildrenCount(ViewGroup view, int count) {
117 116
         assertThat(view.getChildCount()).isEqualTo(count);
118 117