Browse Source

tabs selection

Daniel Zlotin 7 years ago
parent
commit
e745532c05

+ 20
- 12
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/BottomTabsController.java View File

12
 import com.reactnativenavigation.utils.CompatUtils;
12
 import com.reactnativenavigation.utils.CompatUtils;
13
 
13
 
14
 import java.util.ArrayList;
14
 import java.util.ArrayList;
15
+import java.util.Collection;
15
 import java.util.List;
16
 import java.util.List;
16
 
17
 
17
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
18
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
21
 
22
 
22
 public class BottomTabsController extends ParentController implements BottomNavigationView.OnNavigationItemSelectedListener {
23
 public class BottomTabsController extends ParentController implements BottomNavigationView.OnNavigationItemSelectedListener {
23
 	private BottomNavigationView bottomNavigationView;
24
 	private BottomNavigationView bottomNavigationView;
24
-	private int selectedIndex = 0;
25
 	private List<ViewController> tabs = new ArrayList<>();
25
 	private List<ViewController> tabs = new ArrayList<>();
26
+	private int selectedIndex = 0;
26
 
27
 
27
 	public BottomTabsController(final Activity activity, final String id) {
28
 	public BottomTabsController(final Activity activity, final String id) {
28
 		super(activity, id);
29
 		super(activity, id);
50
 
51
 
51
 	@Override
52
 	@Override
52
 	public boolean onNavigationItemSelected(@NonNull final MenuItem item) {
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
 		tabs.get(selectedIndex).getView().setVisibility(View.GONE);
59
 		tabs.get(selectedIndex).getView().setVisibility(View.GONE);
54
-		selectedIndex = item.getItemId();
60
+		selectedIndex = newIndex;
55
 		tabs.get(selectedIndex).getView().setVisibility(View.VISIBLE);
61
 		tabs.get(selectedIndex).getView().setVisibility(View.VISIBLE);
56
-		return true;
57
 	}
62
 	}
58
 
63
 
59
 	public void setTabs(final List<ViewController> tabs) {
64
 	public void setTabs(final List<ViewController> tabs) {
63
 		this.tabs = tabs;
68
 		this.tabs = tabs;
64
 		getView();
69
 		getView();
65
 		for (int i = 0; i < tabs.size(); i++) {
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
 	public int getSelectedIndex() {
85
 	public int getSelectedIndex() {
79
 	}
87
 	}
80
 
88
 
81
 	@Override
89
 	@Override
82
-	public Iterable<ViewController> getChildControllers() {
90
+	public Collection<ViewController> getChildControllers() {
83
 		return tabs;
91
 		return tabs;
84
 	}
92
 	}
85
 }
93
 }

+ 3
- 1
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/ParentController.java View File

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

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

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

+ 13
- 22
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/BottomTabsControllerTest.java View File

3
 import android.app.Activity;
3
 import android.app.Activity;
4
 import android.support.annotation.NonNull;
4
 import android.support.annotation.NonNull;
5
 import android.support.design.widget.BottomNavigationView;
5
 import android.support.design.widget.BottomNavigationView;
6
-import android.view.MenuItem;
7
 import android.view.View;
6
 import android.view.View;
8
 import android.widget.RelativeLayout;
7
 import android.widget.RelativeLayout;
9
 
8
 
10
 import com.reactnativenavigation.BaseTest;
9
 import com.reactnativenavigation.BaseTest;
11
 import com.reactnativenavigation.mocks.SimpleViewController;
10
 import com.reactnativenavigation.mocks.SimpleViewController;
12
 
11
 
13
-import org.assertj.core.api.Condition;
12
+import org.assertj.core.api.iterable.Extractor;
14
 import org.junit.Test;
13
 import org.junit.Test;
15
 
14
 
16
 import java.util.Arrays;
15
 import java.util.Arrays;
17
 import java.util.List;
16
 import java.util.List;
18
 
17
 
19
 import static org.assertj.core.api.Java6Assertions.assertThat;
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
 public class BottomTabsControllerTest extends BaseTest {
20
 public class BottomTabsControllerTest extends BaseTest {
24
 
21
 
60
 		List<ViewController> tabs = createTabs();
57
 		List<ViewController> tabs = createTabs();
61
 		uut.setTabs(tabs);
58
 		uut.setTabs(tabs);
62
 		assertThat(uut.getView().getChildCount()).isEqualTo(6);
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
 	@Test
68
 	@Test
71
-	public void onTabSelected_SelectsTab() throws Exception {
69
+	public void selectTabAtIndex() throws Exception {
72
 		uut.setTabs(createTabs());
70
 		uut.setTabs(createTabs());
73
 		assertThat(uut.getSelectedIndex()).isZero();
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
 		assertThat(uut.getSelectedIndex()).isEqualTo(3);
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
 			@Override
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
 	@Test
84
 	@Test

+ 3
- 2
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/ParentControllerTest.java View File

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