Stop sending OnTabSelectedListener calls with null tabs.
Bug: 30824831
Change-Id: Id24f740ec57b5bc9cc0b5a48f6bebf50059d4ef3
diff --git a/design/src/android/support/design/widget/TabLayout.java b/design/src/android/support/design/widget/TabLayout.java
index f1ab4ac..01ca835 100755
--- a/design/src/android/support/design/widget/TabLayout.java
+++ b/design/src/android/support/design/widget/TabLayout.java
@@ -1134,9 +1134,13 @@
setSelectedTabView(newPosition);
}
}
- dispatchTabUnselected(currentTab);
+ if (currentTab != null) {
+ dispatchTabUnselected(currentTab);
+ }
mSelectedTab = tab;
- dispatchTabSelected(tab);
+ if (tab != null) {
+ dispatchTabSelected(tab);
+ }
}
}
diff --git a/design/tests/src/android/support/design/widget/TabLayoutTest.java b/design/tests/src/android/support/design/widget/TabLayoutTest.java
index 2f3ad60..69bf429 100755
--- a/design/tests/src/android/support/design/widget/TabLayoutTest.java
+++ b/design/tests/src/android/support/design/widget/TabLayoutTest.java
@@ -20,6 +20,12 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.support.design.test.R;
import android.support.test.annotation.UiThreadTest;
@@ -82,12 +88,17 @@
@Test
@UiThreadTest
public void testTabWithCustomLayoutSelection1() {
+ final TabLayout.OnTabSelectedListener mockListener =
+ mock(TabLayout.OnTabSelectedListener.class);
final LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
final TabLayout tabLayout = (TabLayout) inflater.inflate(R.layout.design_tabs, null);
+ tabLayout.addOnTabSelectedListener(mockListener);
final TabLayout.Tab tab = tabLayout.newTab();
tab.setCustomView(R.layout.design_tab_item_custom);
tabLayout.addTab(tab);
+ verify(mockListener, times(1)).onTabSelected(eq(tab));
+ verify(mockListener, times(0)).onTabUnselected(any(TabLayout.Tab.class));
assertNotNull("Tab has custom view", tab.getCustomView());
assertEquals("First tab is selected", 0, tabLayout.getSelectedTabPosition());
@@ -97,11 +108,16 @@
@Test
@UiThreadTest
public void testTabWithCustomLayoutSelection2() {
+ final TabLayout.OnTabSelectedListener mockListener =
+ mock(TabLayout.OnTabSelectedListener.class);
final LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
final TabLayout tabLayout = (TabLayout) inflater.inflate(R.layout.design_tabs, null);
+ tabLayout.addOnTabSelectedListener(mockListener);
final TabLayout.Tab tab = tabLayout.newTab();
tabLayout.addTab(tab);
+ verify(mockListener, times(1)).onTabSelected(eq(tab));
+ verify(mockListener, times(0)).onTabUnselected(any(TabLayout.Tab.class));
tab.setCustomView(R.layout.design_tab_item_custom);
assertNotNull("Tab has custom view", tab.getCustomView());
@@ -112,12 +128,23 @@
@Test
@UiThreadTest
public void testMultipleTabsWithCustomLayoutSelection1() {
+ final TabLayout.OnTabSelectedListener mockListener =
+ mock(TabLayout.OnTabSelectedListener.class);
final LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
final TabLayout tabs = (TabLayout) inflater.inflate(R.layout.design_tabs, null);
+ tabs.addOnTabSelectedListener(mockListener);
- tabs.addTab(tabs.newTab().setCustomView(R.layout.design_tab_item_custom));
- tabs.addTab(tabs.newTab().setCustomView(R.layout.design_tab_item_custom), true);
- tabs.addTab(tabs.newTab().setCustomView(R.layout.design_tab_item_custom));
+ final TabLayout.Tab tab1 = tabs.newTab().setCustomView(R.layout.design_tab_item_custom);
+ tabs.addTab(tab1);
+ verify(mockListener, times(1)).onTabSelected(eq(tab1));
+ verify(mockListener, times(0)).onTabUnselected(any(TabLayout.Tab.class));
+ final TabLayout.Tab tab2 = tabs.newTab().setCustomView(R.layout.design_tab_item_custom);
+ tabs.addTab(tab2, true);
+ verify(mockListener, times(1)).onTabSelected(eq(tab2));
+ verify(mockListener, times(1)).onTabUnselected(eq(tab1));
+ final TabLayout.Tab tab3 = tabs.newTab().setCustomView(R.layout.design_tab_item_custom);
+ tabs.addTab(tab3);
+ verifyNoMoreInteractions(mockListener);
assertEquals("Second tab is selected", 1, tabs.getSelectedTabPosition());
assertTabCustomViewSelected(tabs);
@@ -126,12 +153,23 @@
@Test
@UiThreadTest
public void testMultipleTabsWithCustomLayoutSelection2() {
+ final TabLayout.OnTabSelectedListener mockListener =
+ mock(TabLayout.OnTabSelectedListener.class);
final LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
final TabLayout tabs = (TabLayout) inflater.inflate(R.layout.design_tabs, null);
+ tabs.addOnTabSelectedListener(mockListener);
- tabs.addTab(tabs.newTab());
- tabs.addTab(tabs.newTab(), true);
- tabs.addTab(tabs.newTab());
+ final TabLayout.Tab tab1 = tabs.newTab();
+ tabs.addTab(tab1);
+ verify(mockListener, times(1)).onTabSelected(eq(tab1));
+ verify(mockListener, times(0)).onTabUnselected(any(TabLayout.Tab.class));
+ final TabLayout.Tab tab2 = tabs.newTab();
+ tabs.addTab(tab2, true);
+ verify(mockListener, times(1)).onTabSelected(eq(tab2));
+ verify(mockListener, times(1)).onTabUnselected(eq(tab1));
+ final TabLayout.Tab tab3 = tabs.newTab();
+ tabs.addTab(tab3);
+ verifyNoMoreInteractions(mockListener);
tabs.getTabAt(0).setCustomView(R.layout.design_tab_item_custom);
tabs.getTabAt(1).setCustomView(R.layout.design_tab_item_custom);