Daniel Zlotin пре 7 година
родитељ
комит
e745532c05

+ 20
- 12
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/BottomTabsController.java Прегледај датотеку

@@ -12,6 +12,7 @@ import android.widget.RelativeLayout;
12 12
 import com.reactnativenavigation.utils.CompatUtils;
13 13
 
14 14
 import java.util.ArrayList;
15
+import java.util.Collection;
15 16
 import java.util.List;
16 17
 
17 18
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
@@ -21,8 +22,8 @@ import static android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM;
21 22
 
22 23
 public class BottomTabsController extends ParentController implements BottomNavigationView.OnNavigationItemSelectedListener {
23 24
 	private BottomNavigationView bottomNavigationView;
24
-	private int selectedIndex = 0;
25 25
 	private List<ViewController> tabs = new ArrayList<>();
26
+	private int selectedIndex = 0;
26 27
 
27 28
 	public BottomTabsController(final Activity activity, final String id) {
28 29
 		super(activity, id);
@@ -50,10 +51,14 @@ public class BottomTabsController extends ParentController implements BottomNavi
50 51
 
51 52
 	@Override
52 53
 	public boolean onNavigationItemSelected(@NonNull final MenuItem item) {
54
+		selectTabAtIndex(item.getItemId());
55
+		return true;
56
+	}
57
+
58
+	public void selectTabAtIndex(final int newIndex) {
53 59
 		tabs.get(selectedIndex).getView().setVisibility(View.GONE);
54
-		selectedIndex = item.getItemId();
60
+		selectedIndex = newIndex;
55 61
 		tabs.get(selectedIndex).getView().setVisibility(View.VISIBLE);
56
-		return true;
57 62
 	}
58 63
 
59 64
 	public void setTabs(final List<ViewController> tabs) {
@@ -63,15 +68,18 @@ public class BottomTabsController extends ParentController implements BottomNavi
63 68
 		this.tabs = tabs;
64 69
 		getView();
65 70
 		for (int i = 0; i < tabs.size(); i++) {
66
-			ViewController tab = tabs.get(i);
67
-			bottomNavigationView.getMenu().add(0, i, Menu.NONE, String.valueOf(i));
68
-			RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT);
69
-			params.addRule(ABOVE, bottomNavigationView.getId());
70
-			getView().addView(tab.getView(), params);
71
-			if (i > 0) {
72
-				tab.getView().setVisibility(View.GONE);
73
-			}
71
+			String title = String.valueOf(i);
72
+			createTab(tabs.get(i), i, title);
74 73
 		}
74
+		selectTabAtIndex(0);
75
+	}
76
+
77
+	private void createTab(ViewController tab, final int index, final String title) {
78
+		bottomNavigationView.getMenu().add(0, index, Menu.NONE, title);
79
+		RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT);
80
+		params.addRule(ABOVE, bottomNavigationView.getId());
81
+		tab.getView().setVisibility(View.GONE);
82
+		getView().addView(tab.getView(), params);
75 83
 	}
76 84
 
77 85
 	public int getSelectedIndex() {
@@ -79,7 +87,7 @@ public class BottomTabsController extends ParentController implements BottomNavi
79 87
 	}
80 88
 
81 89
 	@Override
82
-	public Iterable<ViewController> getChildControllers() {
90
+	public Collection<ViewController> getChildControllers() {
83 91
 		return tabs;
84 92
 	}
85 93
 }

+ 3
- 1
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/ParentController.java Прегледај датотеку

@@ -2,12 +2,14 @@ package com.reactnativenavigation.viewcontrollers;
2 2
 
3 3
 import android.app.Activity;
4 4
 
5
+import java.util.Collection;
6
+
5 7
 public abstract class ParentController extends ViewController {
6 8
 	public ParentController(final Activity activity, final String id) {
7 9
 		super(activity, id);
8 10
 	}
9 11
 
10
-	public abstract Iterable<ViewController> getChildControllers();
12
+	public abstract Collection<ViewController> getChildControllers();
11 13
 
12 14
 	public ViewController findControllerById(final String id) {
13 15
 		ViewController fromSuper = super.findControllerById(id);

+ 3
- 1
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/StackController.java Прегледај датотеку

@@ -6,6 +6,8 @@ import android.support.annotation.Nullable;
6 6
 import android.view.ViewGroup;
7 7
 import android.widget.FrameLayout;
8 8
 
9
+import java.util.Collection;
10
+
9 11
 public class StackController extends ParentController {
10 12
 	private final IndexedStack<ViewController> stack = new IndexedStack<>();
11 13
 
@@ -108,7 +110,7 @@ public class StackController extends ParentController {
108 110
 	}
109 111
 
110 112
 	@Override
111
-	public Iterable<ViewController> getChildControllers() {
113
+	public Collection<ViewController> getChildControllers() {
112 114
 		return stack.values();
113 115
 	}
114 116
 }

+ 13
- 22
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/BottomTabsControllerTest.java Прегледај датотеку

@@ -3,22 +3,19 @@ package com.reactnativenavigation.viewcontrollers;
3 3
 import android.app.Activity;
4 4
 import android.support.annotation.NonNull;
5 5
 import android.support.design.widget.BottomNavigationView;
6
-import android.view.MenuItem;
7 6
 import android.view.View;
8 7
 import android.widget.RelativeLayout;
9 8
 
10 9
 import com.reactnativenavigation.BaseTest;
11 10
 import com.reactnativenavigation.mocks.SimpleViewController;
12 11
 
13
-import org.assertj.core.api.Condition;
12
+import org.assertj.core.api.iterable.Extractor;
14 13
 import org.junit.Test;
15 14
 
16 15
 import java.util.Arrays;
17 16
 import java.util.List;
18 17
 
19 18
 import static org.assertj.core.api.Java6Assertions.assertThat;
20
-import static org.mockito.Mockito.mock;
21
-import static org.mockito.Mockito.when;
22 19
 
23 20
 public class BottomTabsControllerTest extends BaseTest {
24 21
 
@@ -60,34 +57,28 @@ public class BottomTabsControllerTest extends BaseTest {
60 57
 		List<ViewController> tabs = createTabs();
61 58
 		uut.setTabs(tabs);
62 59
 		assertThat(uut.getView().getChildCount()).isEqualTo(6);
63
-		assertThat(uut.getView().getChildAt(1).getVisibility()).isEqualTo(View.VISIBLE);
64
-		assertThat(uut.getView().getChildAt(2).getVisibility()).isEqualTo(View.GONE);
65
-		assertThat(uut.getView().getChildAt(3).getVisibility()).isEqualTo(View.GONE);
66
-		assertThat(uut.getView().getChildAt(4).getVisibility()).isEqualTo(View.GONE);
67
-		assertThat(uut.getView().getChildAt(5).getVisibility()).isEqualTo(View.GONE);
60
+		assertThat(uut.getChildControllers()).extracting(new Extractor<ViewController, Integer>() {
61
+			@Override
62
+			public Integer extract(final ViewController input) {
63
+				return input.getView().getVisibility();
64
+			}
65
+		}).containsExactly(View.VISIBLE, View.GONE, View.GONE, View.GONE, View.GONE);
68 66
 	}
69 67
 
70 68
 	@Test
71
-	public void onTabSelected_SelectsTab() throws Exception {
69
+	public void selectTabAtIndex() throws Exception {
72 70
 		uut.setTabs(createTabs());
73 71
 		assertThat(uut.getSelectedIndex()).isZero();
74 72
 
75
-		MenuItem menuItem = mock(MenuItem.class);
76
-		when(menuItem.getItemId()).thenReturn(3);
77
-		assertThat(uut.onNavigationItemSelected(menuItem)).isTrue();
73
+		uut.selectTabAtIndex(3);
78 74
 
79 75
 		assertThat(uut.getSelectedIndex()).isEqualTo(3);
80
-		assertThat(uut.getChildControllers()).areExactly(1, new Condition<ViewController>() {
76
+		assertThat(uut.getChildControllers()).extracting(new Extractor<ViewController, Integer>() {
81 77
 			@Override
82
-			public boolean matches(final ViewController value) {
83
-				return value.getView().getVisibility() == View.VISIBLE;
78
+			public Integer extract(final ViewController input) {
79
+				return input.getView().getVisibility();
84 80
 			}
85
-		});
86
-//		assertThat(uut.getView().getChildAt(1).getVisibility()).isEqualTo(View.GONE);
87
-//		assertThat(uut.getView().getChildAt(2).getVisibility()).isEqualTo(View.GONE);
88
-//		assertThat(uut.getView().getChildAt(3).getVisibility()).isEqualTo(View.GONE);
89
-//		assertThat(uut.getView().getChildAt(4).getVisibility()).isEqualTo(View.VISIBLE);
90
-//		assertThat(uut.getView().getChildAt(5).getVisibility()).isEqualTo(View.GONE);
81
+		}).containsExactly(View.GONE, View.GONE, View.GONE, View.VISIBLE, View.GONE);
91 82
 	}
92 83
 
93 84
 	@Test

+ 3
- 2
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/ParentControllerTest.java Прегледај датотеку

@@ -11,6 +11,7 @@ import com.reactnativenavigation.mocks.SimpleViewController;
11 11
 import org.junit.Test;
12 12
 
13 13
 import java.util.Arrays;
14
+import java.util.Collection;
14 15
 import java.util.Collections;
15 16
 
16 17
 import static org.assertj.core.api.Java6Assertions.assertThat;
@@ -30,7 +31,7 @@ public class ParentControllerTest extends BaseTest {
30 31
 	public void findControllerById_ReturnsSelfIfSameId() throws Exception {
31 32
 		ParentController uut = new ParentController(activity, "uut") {
32 33
 			@Override
33
-			public Iterable<ViewController> getChildControllers() {
34
+			public Collection<ViewController> getChildControllers() {
34 35
 				return Collections.emptyList();
35 36
 			}
36 37
 
@@ -56,7 +57,7 @@ public class ParentControllerTest extends BaseTest {
56 57
 
57 58
 		ParentController uut = new ParentController(activity, "uut") {
58 59
 			@Override
59
-			public Iterable<ViewController> getChildControllers() {
60
+			public Collection<ViewController> getChildControllers() {
60 61
 				return Arrays.<ViewController>asList(someInnerStack);
61 62
 			}
62 63