Browse Source

Android: Integrate layout factory onto setRoot()

Amit Davidi 7 years ago
parent
commit
f7d39240b3

+ 0
- 18
android/app/src/main/java/com/reactnativenavigation/layout/LayoutFactory.java View File

4
 import android.view.View;
4
 import android.view.View;
5
 
5
 
6
 import java.util.List;
6
 import java.util.List;
7
-import java.util.Map;
8
 
7
 
9
 public class LayoutFactory {
8
 public class LayoutFactory {
10
     public interface RootViewCreator {
9
     public interface RootViewCreator {
11
         View createRootView(String id, String name);
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
     private Activity activity;
13
     private Activity activity;
31
     private RootViewCreator rootViewCreator;
14
     private RootViewCreator rootViewCreator;
32
 
15
 
49
         }
32
         }
50
 
33
 
51
         return null;
34
         return null;
52
-//        return rootViewCreator.createRootView(id, name);
53
     }
35
     }
54
 
36
 
55
     private void addChildrenNodes(ContainerStack containerStack, List<LayoutNode> children) {
37
     private void addChildrenNodes(ContainerStack containerStack, List<LayoutNode> children) {

+ 20
- 0
android/app/src/main/java/com/reactnativenavigation/layout/LayoutNode.java View File

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 View File

7
 import com.facebook.react.bridge.ReactApplicationContext;
7
 import com.facebook.react.bridge.ReactApplicationContext;
8
 import com.facebook.react.bridge.ReactContextBaseJavaModule;
8
 import com.facebook.react.bridge.ReactContextBaseJavaModule;
9
 import com.facebook.react.bridge.ReactMethod;
9
 import com.facebook.react.bridge.ReactMethod;
10
+import com.facebook.react.bridge.ReadableArray;
10
 import com.facebook.react.bridge.ReadableMap;
11
 import com.facebook.react.bridge.ReadableMap;
12
+import com.facebook.react.bridge.ReadableMapKeySetIterator;
11
 import com.reactnativenavigation.controllers.NavigationActivity;
13
 import com.reactnativenavigation.controllers.NavigationActivity;
12
 import com.reactnativenavigation.layout.LayoutFactory;
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
 public class NavigationModule extends ReactContextBaseJavaModule {
21
 public class NavigationModule extends ReactContextBaseJavaModule {
15
     public static final String NAME = "RNNBridgeModule";
22
     public static final String NAME = "RNNBridgeModule";
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
 //                Map<String, Object> node = new HashMap<String, Object>();
53
 //                Map<String, Object> node = new HashMap<String, Object>();
43
 //                node.put("id", container.getString("id"));
54
 //                node.put("id", container.getString("id"));
44
 //                HashMap<String, Object> data = new HashMap<>();
55
 //                HashMap<String, Object> data = new HashMap<>();
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 View File

29
         return Collections.emptyList();
29
         return Collections.emptyList();
30
     }
30
     }
31
 }
31
 }
32
-

+ 9
- 10
android/app/src/test/java/com/reactnativenavigation/LayoutFactoryTest.java View File

7
 import com.reactnativenavigation.layout.Container;
7
 import com.reactnativenavigation.layout.Container;
8
 import com.reactnativenavigation.layout.ContainerStack;
8
 import com.reactnativenavigation.layout.ContainerStack;
9
 import com.reactnativenavigation.layout.LayoutFactory;
9
 import com.reactnativenavigation.layout.LayoutFactory;
10
-import com.reactnativenavigation.layout.LayoutFactory.LayoutNode;
10
+import com.reactnativenavigation.layout.LayoutNode;
11
 
11
 
12
 import org.junit.Before;
12
 import org.junit.Before;
13
 import org.junit.Test;
13
 import org.junit.Test;
19
 import java.util.Arrays;
19
 import java.util.Arrays;
20
 import java.util.HashMap;
20
 import java.util.HashMap;
21
 import java.util.List;
21
 import java.util.List;
22
-import java.util.Map;
23
 
22
 
24
 import static org.assertj.core.api.Java6Assertions.assertThat;
23
 import static org.assertj.core.api.Java6Assertions.assertThat;
25
 import static org.mockito.ArgumentMatchers.eq;
24
 import static org.mockito.ArgumentMatchers.eq;
94
         return new LayoutFactory(Robolectric.buildActivity(Activity.class).get(), rootViewCreator);
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
     private LayoutNode getContainerStackNode(LayoutNode innerNode) {
104
     private LayoutNode getContainerStackNode(LayoutNode innerNode) {
98
         return getContainerStackNode(Arrays.asList(innerNode));
105
         return getContainerStackNode(Arrays.asList(innerNode));
99
     }
106
     }
105
         return outerNode;
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
     private List<View> assertViewChildrenCount(ViewGroup view, int count) {
115
     private List<View> assertViewChildrenCount(ViewGroup view, int count) {
117
         assertThat(view.getChildCount()).isEqualTo(count);
116
         assertThat(view.getChildCount()).isEqualTo(count);
118
 
117