Browse Source

migrate to controllers

Daniel Zlotin 8 years ago
parent
commit
2784709255

+ 6
- 8
lib/android/app/src/main/java/com/reactnativenavigation/NavigationActivity.java View File

@@ -6,11 +6,10 @@ import android.support.v7.app.AppCompatActivity;
6 6
 import android.widget.FrameLayout;
7 7
 
8 8
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
9
-import com.reactnativenavigation.layout.Layout;
10
-import com.reactnativenavigation.layout.impl.StackLayout;
9
+import com.reactnativenavigation.viewcontrollers.ViewController;
11 10
 
12 11
 public class NavigationActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
13
-	private Layout layout;
12
+	private ViewController layout;
14 13
 
15 14
 	@Override
16 15
 	protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -38,11 +37,12 @@ public class NavigationActivity extends AppCompatActivity implements DefaultHard
38 37
 	}
39 38
 
40 39
 
41
-	public void setLayout(Layout layout) {
40
+	public void setLayout(ViewController layout) {
42 41
 		this.layout = layout;
42
+		setContentView(layout.getView());
43 43
 	}
44 44
 
45
-	public Layout getLayout() {
45
+	public ViewController getLayout() {
46 46
 		return layout;
47 47
 	}
48 48
 
@@ -53,9 +53,7 @@ public class NavigationActivity extends AppCompatActivity implements DefaultHard
53 53
 
54 54
 	@Override
55 55
 	public void onBackPressed() {
56
-		if (layout instanceof StackLayout && ((StackLayout) layout).onBackPressed()) {
57
-			// do nothing, layout pops
58
-		} else {
56
+		if (!layout.handleBack()) {
59 57
 			super.onBackPressed();
60 58
 		}
61 59
 	}

+ 6
- 6
lib/android/app/src/main/java/com/reactnativenavigation/controllers/Store.java View File

@@ -1,18 +1,18 @@
1 1
 package com.reactnativenavigation.controllers;
2 2
 
3
-import com.reactnativenavigation.layout.Layout;
3
+import com.reactnativenavigation.viewcontrollers.ViewController;
4 4
 
5 5
 import java.util.HashMap;
6 6
 import java.util.Map;
7 7
 
8 8
 public class Store {
9
-	private Map<String, Layout> layoutsById = new HashMap<>();
9
+	private Map<String, ViewController> viewControllersById = new HashMap<>();
10 10
 
11
-	public void setLayout(String id, Layout layout) {
12
-		layoutsById.put(id, layout);
11
+	public void setViewController(String id, ViewController layout) {
12
+		viewControllersById.put(id, layout);
13 13
 	}
14 14
 
15
-	public Layout getLayout(String id) {
16
-		return layoutsById.get(id);
15
+	public ViewController getViewController(String id) {
16
+		return viewControllersById.get(id);
17 17
 	}
18 18
 }

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

@@ -1,16 +0,0 @@
1
-package com.reactnativenavigation.layout;
2
-
3
-import android.view.View;
4
-
5
-import com.reactnativenavigation.layout.impl.StackLayout;
6
-
7
-//TODO delete
8
-public interface Layout {
9
-	void setParentStackLayout(StackLayout stackLayout);
10
-
11
-	StackLayout getParentStackLayout();
12
-
13
-	View getView();
14
-
15
-	void destroy();
16
-}

+ 12
- 11
lib/android/app/src/main/java/com/reactnativenavigation/layout/LayoutFactory.java View File

@@ -5,7 +5,8 @@ import android.app.Activity;
5 5
 import com.facebook.react.ReactInstanceManager;
6 6
 import com.reactnativenavigation.controllers.Store;
7 7
 import com.reactnativenavigation.layout.impl.RootLayout;
8
-import com.reactnativenavigation.layout.impl.StackLayout;
8
+import com.reactnativenavigation.viewcontrollers.StackController;
9
+import com.reactnativenavigation.viewcontrollers.ViewController;
9 10
 
10 11
 public class LayoutFactory {
11 12
 
@@ -19,13 +20,13 @@ public class LayoutFactory {
19 20
 		this.store = store;
20 21
 	}
21 22
 
22
-	public Layout createAndSaveToStore(LayoutNode node) {
23
-		Layout layout = createLayout(node);
24
-		store.setLayout(node.id, layout);
25
-		return layout;
23
+	public ViewController createAndSaveToStore(LayoutNode node) {
24
+		ViewController viewController = create(node);
25
+		store.setViewController(node.id, viewController);
26
+		return viewController;
26 27
 	}
27 28
 
28
-	private Layout createLayout(final LayoutNode node) {
29
+	private ViewController create(final LayoutNode node) {
29 30
 		switch (node.type) {
30 31
 			case Container:
31 32
 				return createContainer(node);
@@ -80,16 +81,16 @@ public class LayoutFactory {
80 81
 //		return createAndSaveToStore(node.children.get(0));
81 82
 //	}
82 83
 
83
-	private Layout createContainer(LayoutNode node) {
84
+	private ViewController createContainer(LayoutNode node) {
84 85
 		return new RootLayout(activity, node.id, node.data.optString("name"), reactInstanceManager);
85 86
 	}
86 87
 
87
-	private Layout createContainerStack(LayoutNode node) {
88
-		final StackLayout layoutStack = new StackLayout(activity);
88
+	private ViewController createContainerStack(LayoutNode node) {
89
+		StackController stackController = new StackController(activity);
89 90
 		for (LayoutNode child : node.children) {
90
-			layoutStack.push(createAndSaveToStore(child));
91
+			stackController.push(createAndSaveToStore(child));
91 92
 		}
92
-		return layoutStack;
93
+		return stackController;
93 94
 	}
94 95
 
95 96
 //	private Layout createBottomTabs(LayoutNode node) {

+ 22
- 38
lib/android/app/src/main/java/com/reactnativenavigation/layout/impl/RootLayout.java View File

@@ -3,48 +3,29 @@ package com.reactnativenavigation.layout.impl;
3 3
 import android.app.Activity;
4 4
 import android.os.Bundle;
5 5
 import android.view.View;
6
-import android.widget.FrameLayout;
7 6
 
8 7
 import com.facebook.react.ReactInstanceManager;
9 8
 import com.facebook.react.ReactRootView;
10
-import com.reactnativenavigation.layout.Layout;
11 9
 import com.reactnativenavigation.react.NavigationEvent;
12
-import com.reactnativenavigation.utils.CompatUtils;
10
+import com.reactnativenavigation.viewcontrollers.ViewController;
13 11
 
14
-public class RootLayout implements Layout, View.OnAttachStateChangeListener {
12
+public class RootLayout extends ViewController implements View.OnAttachStateChangeListener {
15 13
 
16 14
 	private final String id;
17 15
 	private final String name;
18
-	private final FrameLayout view;
19
-	private final ReactRootView reactRootView;
20 16
 	private final ReactInstanceManager reactInstanceManager;
21
-	private StackLayout parentStackLayout;
22 17
 
23
-	public RootLayout(Activity activity, String id, String name, final ReactInstanceManager reactInstanceManager) {
18
+	public RootLayout(final Activity activity, final String id, final String name, final ReactInstanceManager reactInstanceManager) {
19
+		super(activity);
24 20
 		this.id = id;
25 21
 		this.name = name;
26 22
 		this.reactInstanceManager = reactInstanceManager;
27
-		reactRootView = new ReactRootView(activity);
28
-		reactRootView.addOnAttachStateChangeListener(this);
29
-		Bundle opts = new Bundle();
30
-		opts.putString("id", this.id);
31
-		reactRootView.startReactApplication(this.reactInstanceManager, this.name, opts);
32
-		reactRootView.setEventListener(new ReactRootView.ReactRootViewEventListener() {
33
-			@Override
34
-			public void onAttachedToReactInstance(final ReactRootView reactRootView) {
35
-				reactRootView.setEventListener(null);
36
-				onStart();
37
-			}
38
-		});
39
-		view = new FrameLayout(activity);
40
-		view.addView(reactRootView);
41
-		view.setId(CompatUtils.generateViewId());
42 23
 	}
43 24
 
44
-	@Override
45
-	public void destroy() {
46
-		reactRootView.unmountReactApplication();
47
-	}
25
+//	@Override
26
+//	public void destroy() {
27
+//		reactRootView.unmountReactApplication();
28
+//	}
48 29
 
49 30
 	@Override
50 31
 	public void onViewAttachedToWindow(final View v) {
@@ -56,11 +37,6 @@ public class RootLayout implements Layout, View.OnAttachStateChangeListener {
56 37
 		onStop();
57 38
 	}
58 39
 
59
-	@Override
60
-	public View getView() {
61
-		return view;
62
-	}
63
-
64 40
 	private void onStart() {
65 41
 		new NavigationEvent(reactInstanceManager.getCurrentReactContext()).containerStart(id);
66 42
 	}
@@ -69,12 +45,20 @@ public class RootLayout implements Layout, View.OnAttachStateChangeListener {
69 45
 		new NavigationEvent(reactInstanceManager.getCurrentReactContext()).containerStop(id);
70 46
 	}
71 47
 
72
-	public void setParentStackLayout(final StackLayout parentStackLayout) {
73
-		this.parentStackLayout = parentStackLayout;
74
-	}
75
-
76 48
 	@Override
77
-	public StackLayout getParentStackLayout() {
78
-		return parentStackLayout;
49
+	protected View onCreateView() {
50
+		ReactRootView reactRootView = new ReactRootView(getActivity());
51
+		reactRootView.addOnAttachStateChangeListener(this);
52
+		Bundle opts = new Bundle();
53
+		opts.putString("id", this.id);
54
+		reactRootView.startReactApplication(this.reactInstanceManager, this.name, opts);
55
+		reactRootView.setEventListener(new ReactRootView.ReactRootViewEventListener() {
56
+			@Override
57
+			public void onAttachedToReactInstance(final ReactRootView reactRootView) {
58
+				reactRootView.setEventListener(null);
59
+				onStart();
60
+			}
61
+		});
62
+		return reactRootView;
79 63
 	}
80 64
 }

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

@@ -1,81 +0,0 @@
1
-package com.reactnativenavigation.layout.impl;
2
-
3
-import android.content.Context;
4
-import android.view.View;
5
-import android.widget.FrameLayout;
6
-
7
-import com.reactnativenavigation.layout.Layout;
8
-import com.reactnativenavigation.utils.CompatUtils;
9
-
10
-import java.util.Stack;
11
-
12
-public class StackLayout implements Layout {
13
-
14
-	private final Stack<Layout> stack = new Stack<>();
15
-	private final FrameLayout view;
16
-	private StackLayout stackLayout;
17
-
18
-	public StackLayout(Context context) {
19
-		view = new FrameLayout(context);
20
-		view.setId(CompatUtils.generateViewId());
21
-	}
22
-
23
-	public void push(Layout child) {
24
-		child.setParentStackLayout(this);
25
-		stack.push(child);
26
-		view.addView(child.getView());
27
-		if (stack.size() > 1) {
28
-			Layout previousTop = stack.elementAt(stack.size() - 2);
29
-			view.removeView(previousTop.getView());
30
-		}
31
-	}
32
-
33
-	public void pop() {
34
-		Layout top = stack.pop();
35
-		view.removeView(top.getView());
36
-		top.destroy();
37
-		if (!stack.isEmpty()) {
38
-			Layout previousTop = stack.peek();
39
-			view.addView(previousTop.getView());
40
-		}
41
-	}
42
-
43
-	public void pop(Layout layout) {
44
-		if (stack.peek() == layout) {
45
-			pop();
46
-		} else {
47
-			stack.remove(layout);
48
-			view.removeView(layout.getView());
49
-			layout.destroy();
50
-		}
51
-	}
52
-
53
-	public boolean onBackPressed() {
54
-		if (stack.isEmpty()) {
55
-			return false;
56
-		} else {
57
-			pop();
58
-			return true;
59
-		}
60
-	}
61
-
62
-	@Override
63
-	public View getView() {
64
-		return view;
65
-	}
66
-
67
-	@Override
68
-	public void destroy() {
69
-		//
70
-	}
71
-
72
-	@Override
73
-	public void setParentStackLayout(final StackLayout stackLayout) {
74
-		this.stackLayout = stackLayout;
75
-	}
76
-
77
-	@Override
78
-	public StackLayout getParentStackLayout() {
79
-		return stackLayout;
80
-	}
81
-}

+ 6
- 8
lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java View File

@@ -7,13 +7,12 @@ import com.facebook.react.bridge.ReactMethod;
7 7
 import com.facebook.react.bridge.ReadableMap;
8 8
 import com.reactnativenavigation.NavigationActivity;
9 9
 import com.reactnativenavigation.controllers.Store;
10
-import com.reactnativenavigation.layout.Layout;
11 10
 import com.reactnativenavigation.layout.LayoutFactory;
12 11
 import com.reactnativenavigation.layout.LayoutNode;
13
-import com.reactnativenavigation.layout.impl.StackLayout;
14 12
 import com.reactnativenavigation.parse.JSONParser;
15 13
 import com.reactnativenavigation.parse.LayoutNodeParser;
16 14
 import com.reactnativenavigation.utils.UiThread;
15
+import com.reactnativenavigation.viewcontrollers.ViewController;
17 16
 
18 17
 public class NavigationModule extends ReactContextBaseJavaModule {
19 18
 	private static final String NAME = "RNNBridgeModule";
@@ -38,8 +37,7 @@ public class NavigationModule extends ReactContextBaseJavaModule {
38 37
 			public void run() {
39 38
 				final LayoutNode layoutTree = LayoutNodeParser.parse(JSONParser.parse(rawLayoutTree));
40 39
 				LayoutFactory factory = new LayoutFactory(activity(), reactInstanceManager, store);
41
-				final Layout rootView = factory.createAndSaveToStore(layoutTree);
42
-				activity().setContentView(rootView.getView());
40
+				final ViewController rootView = factory.createAndSaveToStore(layoutTree);
43 41
 				activity().setLayout(rootView);
44 42
 			}
45 43
 		});
@@ -52,8 +50,8 @@ public class NavigationModule extends ReactContextBaseJavaModule {
52 50
 			public void run() {
53 51
 				final LayoutNode layoutTree = LayoutNodeParser.parse(JSONParser.parse(rawLayoutTree));
54 52
 				LayoutFactory factory = new LayoutFactory(activity(), reactInstanceManager, store);
55
-				final Layout rootView = factory.createAndSaveToStore(layoutTree);
56
-				((StackLayout) activity().getLayout()).push(rootView);
53
+				final ViewController rootView = factory.createAndSaveToStore(layoutTree);
54
+				store.getViewController(onContainerId).getParentStackController().push(rootView);
57 55
 			}
58 56
 		});
59 57
 	}
@@ -63,8 +61,8 @@ public class NavigationModule extends ReactContextBaseJavaModule {
63 61
 		handle(new Runnable() {
64 62
 			@Override
65 63
 			public void run() {
66
-				Layout layout = store.getLayout(onContainerId);
67
-				layout.getParentStackLayout().pop(layout);
64
+				ViewController layout = store.getViewController(onContainerId);
65
+				layout.getParentStackController().pop(layout);
68 66
 			}
69 67
 		});
70 68
 	}