Daniel Zlotin 7 years ago
parent
commit
66d591dbe3

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

@@ -3,43 +3,36 @@ package com.reactnativenavigation;
3 3
 import android.os.Bundle;
4 4
 import android.support.annotation.Nullable;
5 5
 import android.support.v7.app.AppCompatActivity;
6
-import android.widget.FrameLayout;
7 6
 
8 7
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
9
-import com.reactnativenavigation.viewcontrollers.ViewController;
8
+import com.reactnativenavigation.viewcontrollers.Navigator;
10 9
 
11 10
 public class NavigationActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
12
-	private ViewController viewController;
11
+	private Navigator navigator;
13 12
 
14 13
 	@Override
15 14
 	protected void onCreate(@Nullable Bundle savedInstanceState) {
16 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 20
 	@Override
22 21
 	protected void onResume() {
23 22
 		super.onResume();
24
-		app().getInitializer().onActivityResumed(this);
23
+		navigator.onActivityResumed();
25 24
 	}
26 25
 
27 26
 	@Override
28 27
 	protected void onPause() {
29 28
 		super.onPause();
30
-		app().getInitializer().onActivityPaused(this);
29
+		navigator.onActivityPaused();
31 30
 	}
32 31
 
33 32
 	@Override
34 33
 	protected void onDestroy() {
35 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 38
 	@Override
@@ -49,12 +42,12 @@ public class NavigationActivity extends AppCompatActivity implements DefaultHard
49 42
 
50 43
 	@Override
51 44
 	public void onBackPressed() {
52
-		if (!viewController.handleBack()) {
45
+		if (!navigator.handleBack()) {
53 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,13 +1,15 @@
1 1
 package com.reactnativenavigation;
2 2
 
3
+import android.app.Activity;
3 4
 import android.app.Application;
5
+import android.os.Bundle;
4 6
 
5 7
 import com.facebook.react.ReactApplication;
6 8
 import com.facebook.react.ReactNativeHost;
7 9
 import com.reactnativenavigation.react.NavigationReactInitializer;
8 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 14
 	private Store store;
13 15
 	private NavigationReactNativeHost reactNativeHost;
@@ -19,6 +21,7 @@ public abstract class NavigationApplication extends Application implements React
19 21
 		store = new Store();
20 22
 		reactNativeHost = new NavigationReactNativeHost(this, isDebug(), store);
21 23
 		initializer = new NavigationReactInitializer(reactNativeHost.getReactInstanceManager(), isDebug());
24
+		registerActivityLifecycleCallbacks(this);
22 25
 	}
23 26
 
24 27
 	@Override
@@ -28,7 +31,43 @@ public abstract class NavigationApplication extends Application implements React
28 31
 
29 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,6 +13,7 @@ public class ReactRootViewController extends ViewController {
13 13
 	private final String id;
14 14
 	private final String name;
15 15
 	private final ReactInstanceManager reactInstanceManager;
16
+	private boolean attachedToReactInstance = false;
16 17
 
17 18
 	public ReactRootViewController(final Activity activity, final String id, final String name, final ReactInstanceManager reactInstanceManager) {
18 19
 		super(activity);
@@ -42,6 +43,16 @@ public class ReactRootViewController extends ViewController {
42 43
 //
43 44
 //	private void onStop() {
44 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 58
 	@Override
@@ -54,7 +65,7 @@ public class ReactRootViewController extends ViewController {
54 65
 			@Override
55 66
 			public void onAttachedToReactInstance(final ReactRootView reactRootView) {
56 67
 				reactRootView.setEventListener(null);
57
-				onStart();
68
+				attachedToReactInstance = true;
58 69
 			}
59 70
 		});
60 71
 		return reactRootView;

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

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

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

@@ -0,0 +1,52 @@
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,12 +15,12 @@ public class StackController extends ViewController {
15 15
 	}
16 16
 
17 17
 	public void push(final ViewController child) {
18
-		ViewController previousTop = peek();
18
+		final ViewController previousTop = peek();
19 19
 
20 20
 		child.setStackController(this);
21 21
 		stack.push(child);
22
-		getView().addView(child.getView());
23 22
 
23
+		getView().addView(child.getView());
24 24
 		if (previousTop != null) {
25 25
 			getView().removeView(previousTop.getView());
26 26
 		}

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

@@ -35,25 +35,7 @@ public abstract class ViewController {
35 35
 	public View getView() {
36 36
 		if (view == null) {
37 37
 			view = createView();
38
-			onCreate();
39 38
 		}
40 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

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