Browse Source

stackController

Daniel Zlotin 7 years ago
parent
commit
2a21ed0422

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

1
 package com.reactnativenavigation.viewcontrollers;
1
 package com.reactnativenavigation.viewcontrollers;
2
 
2
 
3
 import android.app.Activity;
3
 import android.app.Activity;
4
-import android.view.View;
5
 import android.view.ViewGroup;
4
 import android.view.ViewGroup;
6
 import android.widget.FrameLayout;
5
 import android.widget.FrameLayout;
7
 
6
 
35
 		getView().addView(child.getView());
34
 		getView().addView(child.getView());
36
 	}
35
 	}
37
 
36
 
37
+	public boolean canPop() {
38
+		return childControllers.size() > 1;
39
+	}
40
+
38
 	public void pop() {
41
 	public void pop() {
39
-		childControllers.pop();
42
+		if (canPop()) {
43
+			childControllers.pop();
44
+		}
40
 	}
45
 	}
41
 
46
 
42
 	public ViewController peek() {
47
 	public ViewController peek() {
53
 
58
 
54
 	@Override
59
 	@Override
55
 	public boolean handleBack() {
60
 	public boolean handleBack() {
56
-		if (size() > 1) {
61
+		if (canPop()) {
57
 			pop();
62
 			pop();
58
 			return true;
63
 			return true;
59
 		} else {
64
 		} else {
62
 	}
67
 	}
63
 
68
 
64
 	@Override
69
 	@Override
65
-	protected View onCreateView() {
70
+	protected ViewGroup onCreateView() {
66
 		return new FrameLayout(getActivity());
71
 		return new FrameLayout(getActivity());
67
 	}
72
 	}
68
 }
73
 }

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

6
 
6
 
7
 public abstract class ViewController {
7
 public abstract class ViewController {
8
 	private final Activity activity;
8
 	private final Activity activity;
9
-	private final View view;
9
+	private View view;
10
 	private StackController stackController;
10
 	private StackController stackController;
11
 
11
 
12
 	public ViewController(Activity activity) {
12
 	public ViewController(Activity activity) {
13
 		this.activity = activity;
13
 		this.activity = activity;
14
-		this.view = onCreateView();
15
 	}
14
 	}
16
 
15
 
17
 	protected abstract View onCreateView();
16
 	protected abstract View onCreateView();
34
 	}
33
 	}
35
 
34
 
36
 	public View getView() {
35
 	public View getView() {
36
+		if (view == null) {
37
+			view = onCreateView();
38
+		}
37
 		return view;
39
 		return view;
38
 	}
40
 	}
39
 }
41
 }

+ 23
- 4
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/StackControllerTest.java View File

7
 import com.reactnativenavigation.BaseTest;
7
 import com.reactnativenavigation.BaseTest;
8
 import com.reactnativenavigation.mocks.SimpleViewController;
8
 import com.reactnativenavigation.mocks.SimpleViewController;
9
 
9
 
10
-import org.junit.Ignore;
11
 import org.junit.Test;
10
 import org.junit.Test;
12
 
11
 
13
 import static org.assertj.core.api.Java6Assertions.assertThat;
12
 import static org.assertj.core.api.Java6Assertions.assertThat;
14
 
13
 
15
-@Ignore
16
 public class StackControllerTest extends BaseTest {
14
 public class StackControllerTest extends BaseTest {
17
 
15
 
18
 	private Activity activity;
16
 	private Activity activity;
58
 		assertThat(uut.getChildControllers()).containsExactly(child2, child1);
56
 		assertThat(uut.getChildControllers()).containsExactly(child2, child1);
59
 		uut.pop();
57
 		uut.pop();
60
 		assertThat(uut.getChildControllers()).containsExactly(child1);
58
 		assertThat(uut.getChildControllers()).containsExactly(child1);
61
-		uut.pop();
62
-		assertThat(uut.getChildControllers()).isEmpty();
63
 	}
59
 	}
64
 
60
 
65
 	@Test
61
 	@Test
100
 		assertThat(uut.handleBack()).isFalse();
96
 		assertThat(uut.handleBack()).isFalse();
101
 	}
97
 	}
102
 
98
 
99
+	@Test
100
+	public void popDoesNothingWhenZeroOrOneChild() throws Exception {
101
+		assertThat(uut.getChildControllers().size()).isZero();
102
+		uut.pop();
103
+		assertThat(uut.getChildControllers().size()).isZero();
104
+
105
+		uut.push(child1);
106
+		uut.pop();
107
+		assertThat(uut.getChildControllers().size()).isEqualTo(1);
108
+	}
109
+
110
+	@Test
111
+	public void canPopWhenSizeIsMoreThanOne() throws Exception {
112
+		assertThat(uut.getChildControllers().size()).isZero();
113
+		assertThat(uut.canPop()).isFalse();
114
+		uut.push(child1);
115
+		assertThat(uut.getChildControllers().size()).isEqualTo(1);
116
+		assertThat(uut.canPop()).isFalse();
117
+		uut.push(child2);
118
+		assertThat(uut.getChildControllers().size()).isEqualTo(2);
119
+		assertThat(uut.canPop()).isTrue();
120
+	}
121
+
103
 	@Test
122
 	@Test
104
 	public void constructsSelfWithFrameLayout() throws Exception {
123
 	public void constructsSelfWithFrameLayout() throws Exception {
105
 		assertThat(uut.getView())
124
 		assertThat(uut.getView())