Daniel Zlotin 8 years ago
parent
commit
66d591dbe3

+ 10
- 17
lib/android/app/src/main/java/com/reactnativenavigation/NavigationActivity.java View File

3
 import android.os.Bundle;
3
 import android.os.Bundle;
4
 import android.support.annotation.Nullable;
4
 import android.support.annotation.Nullable;
5
 import android.support.v7.app.AppCompatActivity;
5
 import android.support.v7.app.AppCompatActivity;
6
-import android.widget.FrameLayout;
7
 
6
 
8
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
7
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
9
-import com.reactnativenavigation.viewcontrollers.ViewController;
8
+import com.reactnativenavigation.viewcontrollers.Navigator;
10
 
9
 
11
 public class NavigationActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
10
 public class NavigationActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
12
-	private ViewController viewController;
11
+	private Navigator navigator;
13
 
12
 
14
 	@Override
13
 	@Override
15
 	protected void onCreate(@Nullable Bundle savedInstanceState) {
14
 	protected void onCreate(@Nullable Bundle savedInstanceState) {
16
 		super.onCreate(savedInstanceState);
15
 		super.onCreate(savedInstanceState);
17
-		setContentView(new FrameLayout(this));
18
-		app().getInitializer().onActivityCreated(this);
16
+		navigator = new Navigator(this);
17
+		navigator.onActivityCreated();
19
 	}
18
 	}
20
 
19
 
21
 	@Override
20
 	@Override
22
 	protected void onResume() {
21
 	protected void onResume() {
23
 		super.onResume();
22
 		super.onResume();
24
-		app().getInitializer().onActivityResumed(this);
23
+		navigator.onActivityResumed();
25
 	}
24
 	}
26
 
25
 
27
 	@Override
26
 	@Override
28
 	protected void onPause() {
27
 	protected void onPause() {
29
 		super.onPause();
28
 		super.onPause();
30
-		app().getInitializer().onActivityPaused(this);
29
+		navigator.onActivityPaused();
31
 	}
30
 	}
32
 
31
 
33
 	@Override
32
 	@Override
34
 	protected void onDestroy() {
33
 	protected void onDestroy() {
35
 		super.onDestroy();
34
 		super.onDestroy();
36
-		app().getInitializer().onActivityDestroyed(this);
37
-	}
38
-
39
-
40
-	public void setViewController(ViewController viewController) {
41
-		this.viewController = viewController;
42
-		setContentView(viewController.getView());
35
+		navigator.onActivityDestroyed();
43
 	}
36
 	}
44
 
37
 
45
 	@Override
38
 	@Override
49
 
42
 
50
 	@Override
43
 	@Override
51
 	public void onBackPressed() {
44
 	public void onBackPressed() {
52
-		if (!viewController.handleBack()) {
45
+		if (!navigator.handleBack()) {
53
 			super.onBackPressed();
46
 			super.onBackPressed();
54
 		}
47
 		}
55
 	}
48
 	}
56
 
49
 
57
-	private NavigationApplication app() {
58
-		return ((NavigationApplication) getApplication());
50
+	public Navigator getNavigator() {
51
+		return navigator;
59
 	}
52
 	}
60
 }
53
 }

+ 42
- 3
lib/android/app/src/main/java/com/reactnativenavigation/NavigationApplication.java View File

1
 package com.reactnativenavigation;
1
 package com.reactnativenavigation;
2
 
2
 
3
+import android.app.Activity;
3
 import android.app.Application;
4
 import android.app.Application;
5
+import android.os.Bundle;
4
 
6
 
5
 import com.facebook.react.ReactApplication;
7
 import com.facebook.react.ReactApplication;
6
 import com.facebook.react.ReactNativeHost;
8
 import com.facebook.react.ReactNativeHost;
7
 import com.reactnativenavigation.react.NavigationReactInitializer;
9
 import com.reactnativenavigation.react.NavigationReactInitializer;
8
 import com.reactnativenavigation.react.NavigationReactNativeHost;
10
 import com.reactnativenavigation.react.NavigationReactNativeHost;
9
 
11
 
10
-public abstract class NavigationApplication extends Application implements ReactApplication {
12
+public abstract class NavigationApplication extends Application implements ReactApplication, Application.ActivityLifecycleCallbacks {
11
 
13
 
12
 	private Store store;
14
 	private Store store;
13
 	private NavigationReactNativeHost reactNativeHost;
15
 	private NavigationReactNativeHost reactNativeHost;
19
 		store = new Store();
21
 		store = new Store();
20
 		reactNativeHost = new NavigationReactNativeHost(this, isDebug(), store);
22
 		reactNativeHost = new NavigationReactNativeHost(this, isDebug(), store);
21
 		initializer = new NavigationReactInitializer(reactNativeHost.getReactInstanceManager(), isDebug());
23
 		initializer = new NavigationReactInitializer(reactNativeHost.getReactInstanceManager(), isDebug());
24
+		registerActivityLifecycleCallbacks(this);
22
 	}
25
 	}
23
 
26
 
24
 	@Override
27
 	@Override
28
 
31
 
29
 	public abstract boolean isDebug();
32
 	public abstract boolean isDebug();
30
 
33
 
31
-	NavigationReactInitializer getInitializer() {
32
-		return initializer;
34
+	@Override
35
+	public void onActivityCreated(final Activity activity, final Bundle savedInstanceState) {
36
+		if (activity instanceof NavigationActivity) {
37
+			initializer.onActivityCreated((NavigationActivity) activity);
38
+		}
39
+	}
40
+
41
+	@Override
42
+	public void onActivityStarted(final Activity activity) {
43
+	}
44
+
45
+	@Override
46
+	public void onActivityResumed(final Activity activity) {
47
+		if (activity instanceof NavigationActivity) {
48
+			initializer.onActivityResumed((NavigationActivity) activity);
49
+		}
50
+	}
51
+
52
+	@Override
53
+	public void onActivityPaused(final Activity activity) {
54
+		if (activity instanceof NavigationActivity) {
55
+			initializer.onActivityPaused((NavigationActivity) activity);
56
+		}
57
+	}
58
+
59
+	@Override
60
+	public void onActivityStopped(final Activity activity) {
61
+	}
62
+
63
+	@Override
64
+	public void onActivitySaveInstanceState(final Activity activity, final Bundle outState) {
65
+	}
66
+
67
+	@Override
68
+	public void onActivityDestroyed(final Activity activity) {
69
+		if (activity instanceof NavigationActivity) {
70
+			initializer.onActivityDestroyed((NavigationActivity) activity);
71
+		}
33
 	}
72
 	}
34
 }
73
 }

+ 12
- 1
lib/android/app/src/main/java/com/reactnativenavigation/layout/impl/ReactRootViewController.java View File

13
 	private final String id;
13
 	private final String id;
14
 	private final String name;
14
 	private final String name;
15
 	private final ReactInstanceManager reactInstanceManager;
15
 	private final ReactInstanceManager reactInstanceManager;
16
+	private boolean attachedToReactInstance = false;
16
 
17
 
17
 	public ReactRootViewController(final Activity activity, final String id, final String name, final ReactInstanceManager reactInstanceManager) {
18
 	public ReactRootViewController(final Activity activity, final String id, final String name, final ReactInstanceManager reactInstanceManager) {
18
 		super(activity);
19
 		super(activity);
42
 //
43
 //
43
 //	private void onStop() {
44
 //	private void onStop() {
44
 //		new NavigationEvent(reactInstanceManager.getCurrentReactContext()).containerStop(id);
45
 //		new NavigationEvent(reactInstanceManager.getCurrentReactContext()).containerStop(id);
46
+//	}
47
+
48
+//	@Override
49
+//	public void onStart() {
50
+//		super.onStart();
51
+//		if (attachedToReactInstance) {
52
+//			new NavigationEvent(reactInstanceManager.getCurrentReactContext()).containerStart(id);
53
+//		} else {
54
+//			throw new RuntimeException("Not yet attached to react");
55
+//		}
45
 //	}
56
 //	}
46
 
57
 
47
 	@Override
58
 	@Override
54
 			@Override
65
 			@Override
55
 			public void onAttachedToReactInstance(final ReactRootView reactRootView) {
66
 			public void onAttachedToReactInstance(final ReactRootView reactRootView) {
56
 				reactRootView.setEventListener(null);
67
 				reactRootView.setEventListener(null);
57
-				onStart();
68
+				attachedToReactInstance = true;
58
 			}
69
 			}
59
 		});
70
 		});
60
 		return reactRootView;
71
 		return reactRootView;

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

14
 import com.reactnativenavigation.parse.JSONParser;
14
 import com.reactnativenavigation.parse.JSONParser;
15
 import com.reactnativenavigation.parse.LayoutNodeParser;
15
 import com.reactnativenavigation.parse.LayoutNodeParser;
16
 import com.reactnativenavigation.utils.UiThread;
16
 import com.reactnativenavigation.utils.UiThread;
17
+import com.reactnativenavigation.viewcontrollers.Navigator;
17
 import com.reactnativenavigation.viewcontrollers.ViewController;
18
 import com.reactnativenavigation.viewcontrollers.ViewController;
18
 
19
 
19
 public class NavigationModule extends ReactContextBaseJavaModule {
20
 public class NavigationModule extends ReactContextBaseJavaModule {
39
 			public void run() {
40
 			public void run() {
40
 				final LayoutNode layoutTree = LayoutNodeParser.parse(JSONParser.parse(rawLayoutTree));
41
 				final LayoutNode layoutTree = LayoutNodeParser.parse(JSONParser.parse(rawLayoutTree));
41
 				final ViewController viewController = newLayoutFactory().createAndSaveToStore(layoutTree);
42
 				final ViewController viewController = newLayoutFactory().createAndSaveToStore(layoutTree);
42
-				activity().setViewController(viewController);
43
+				navigator().setRoot(viewController);
43
 			}
44
 			}
44
 		});
45
 		});
45
 	}
46
 	}
90
 		return (NavigationActivity) getCurrentActivity();
91
 		return (NavigationActivity) getCurrentActivity();
91
 	}
92
 	}
92
 
93
 
94
+	private Navigator navigator() {
95
+		return activity().getNavigator();
96
+	}
97
+
93
 	@NonNull
98
 	@NonNull
94
 	private LayoutFactory newLayoutFactory() {
99
 	private LayoutFactory newLayoutFactory() {
95
 		return new LayoutFactory(activity(), reactInstanceManager, store);
100
 		return new LayoutFactory(activity(), reactInstanceManager, store);

+ 52
- 0
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/Navigator.java View File

1
+package com.reactnativenavigation.viewcontrollers;
2
+
3
+import android.app.Activity;
4
+import android.view.View;
5
+import android.widget.FrameLayout;
6
+
7
+public class Navigator extends ViewController {
8
+	private boolean activityResumed = false;
9
+	private ViewController pendingViewControllerStart;
10
+
11
+	public Navigator(final Activity activity) {
12
+		super(activity);
13
+	}
14
+
15
+	@Override
16
+	protected View createView() {
17
+		FrameLayout view = new FrameLayout(getActivity());
18
+		return view;
19
+	}
20
+
21
+	public boolean isActivityResumed() {
22
+		return activityResumed;
23
+	}
24
+
25
+	public void setRoot(final ViewController viewController) {
26
+		getActivity().setContentView(viewController.getView());
27
+		if (activityResumed) {
28
+//			viewController.onStart();
29
+		} else {
30
+			pendingViewControllerStart = viewController;
31
+		}
32
+	}
33
+
34
+	public void onActivityCreated() {
35
+		getActivity().setContentView(getView());
36
+	}
37
+
38
+	public void onActivityResumed() {
39
+		activityResumed = true;
40
+		if (pendingViewControllerStart != null) {
41
+//			pendingViewControllerStart.onStart();
42
+			pendingViewControllerStart = null;
43
+		}
44
+	}
45
+
46
+	public void onActivityPaused() {
47
+		activityResumed = false;
48
+	}
49
+
50
+	public void onActivityDestroyed() {
51
+	}
52
+}

+ 2
- 2
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/StackController.java View File

15
 	}
15
 	}
16
 
16
 
17
 	public void push(final ViewController child) {
17
 	public void push(final ViewController child) {
18
-		ViewController previousTop = peek();
18
+		final ViewController previousTop = peek();
19
 
19
 
20
 		child.setStackController(this);
20
 		child.setStackController(this);
21
 		stack.push(child);
21
 		stack.push(child);
22
-		getView().addView(child.getView());
23
 
22
 
23
+		getView().addView(child.getView());
24
 		if (previousTop != null) {
24
 		if (previousTop != null) {
25
 			getView().removeView(previousTop.getView());
25
 			getView().removeView(previousTop.getView());
26
 		}
26
 		}

+ 0
- 18
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/ViewController.java View File

35
 	public View getView() {
35
 	public View getView() {
36
 		if (view == null) {
36
 		if (view == null) {
37
 			view = createView();
37
 			view = createView();
38
-			onCreate();
39
 		}
38
 		}
40
 		return view;
39
 		return view;
41
 	}
40
 	}
42
-
43
-	public void onCreate() {
44
-
45
-	}
46
-
47
-	public void onStart() {
48
-
49
-	}
50
-
51
-	public void onStop() {
52
-
53
-	}
54
-
55
-	public void onDestroy() {
56
-
57
-	}
58
-
59
 }
41
 }

+ 37
- 0
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/NavigatorTest.java View File

1
+package com.reactnativenavigation.viewcontrollers;
2
+
3
+import android.app.Activity;
4
+
5
+import com.reactnativenavigation.BaseTest;
6
+import com.reactnativenavigation.mocks.SimpleViewController;
7
+
8
+import org.junit.Test;
9
+
10
+import static org.assertj.core.api.Java6Assertions.assertThat;
11
+import static org.mockito.Mockito.spy;
12
+
13
+public class NavigatorTest extends BaseTest {
14
+	private Activity activity;
15
+	private Navigator uut;
16
+	private SimpleViewController viewController;
17
+
18
+	@Override
19
+	public void beforeEach() {
20
+		super.beforeEach();
21
+		activity = newActivity();
22
+		viewController = spy(new SimpleViewController(activity, "simpleViewController"));
23
+		uut = new Navigator(activity);
24
+	}
25
+
26
+
27
+	@Test
28
+	public void isActivityRusumed() throws Exception {
29
+		assertThat(uut.isActivityResumed()).isFalse();
30
+		uut.onActivityCreated();
31
+		assertThat(uut.isActivityResumed()).isFalse();
32
+		uut.onActivityResumed();
33
+		assertThat(uut.isActivityResumed()).isTrue();
34
+		uut.onActivityPaused();
35
+		assertThat(uut.isActivityResumed()).isFalse();
36
+	}
37
+}