Gate two row layout for Toolbar

Use car_ui_toolbar_tabs_on_second_row attribute.
Previously orientation (portrait vs landscape) determined whether the
layout should have one or two rows.

Fixes: 140926183
Test: ToolbarTest

Change-Id: I0e15c266f5bd305e6f62227e3942a92ed1a20122
diff --git a/car-ui-lib/tests/robotests/src/com/android/car/ui/toolbar/ToolbarTest.java b/car-ui-lib/tests/robotests/src/com/android/car/ui/toolbar/ToolbarTest.java
index f39c582..59e4f2b 100644
--- a/car-ui-lib/tests/robotests/src/com/android/car/ui/toolbar/ToolbarTest.java
+++ b/car-ui-lib/tests/robotests/src/com/android/car/ui/toolbar/ToolbarTest.java
@@ -18,7 +18,11 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
 import android.content.Context;
+import android.content.res.Resources;
 import android.view.View;
 import android.view.ViewGroup;
 
@@ -43,6 +47,7 @@
 public class ToolbarTest {
 
     private Context mContext;
+    private Resources mResources;
     private ActivityController<TestActivity> mActivityController;
     private TestActivity mActivity;
     private Toolbar mToolbar;
@@ -50,10 +55,9 @@
     @Before
     public void setUp() {
         mContext = RuntimeEnvironment.application;
-
+        mResources = mContext.getResources();
         mActivityController = Robolectric.buildActivity(TestActivity.class);
         mActivityController.setup();
-
         mActivity = mActivityController.get();
         mToolbar = mActivity.findViewById(R.id.toolbar);
     }
@@ -170,6 +174,117 @@
     }
 
     @Test
+    public void testState_twoRow_withTitle_withTabs() {
+        mockResources();
+        when(mResources.getBoolean(R.bool.car_ui_toolbar_tabs_on_second_row)).thenReturn(true);
+
+        Toolbar toolbar = new Toolbar(mContext);
+        assertThat(toolbar.isTabsInSecondRow()).isTrue();
+
+        // Set title and tabs for toolbar.
+        toolbar.setTitle("Test title");
+        toolbar.addTab(new TabLayout.Tab(mContext.getDrawable(R.drawable.test_ic_launcher), "Foo"));
+        toolbar.addTab(new TabLayout.Tab(mContext.getDrawable(R.drawable.test_ic_launcher), "Foo"));
+
+        // Toolbar should display two rows, showing both title and tabs.
+        assertThat(toolbar.findViewById(R.id.car_ui_toolbar_tabs).getVisibility()).isEqualTo(
+                View.VISIBLE);
+        assertThat(toolbar.findViewById(R.id.car_ui_toolbar_title).getVisibility()).isEqualTo(
+                View.VISIBLE);
+    }
+
+    @Test
+    public void testState_twoRow_withTitle()  {
+        mockResources();
+        when(mResources.getBoolean(R.bool.car_ui_toolbar_tabs_on_second_row)).thenReturn(true);
+
+        Toolbar toolbar = new Toolbar(mContext);
+        assertThat(toolbar.isTabsInSecondRow()).isTrue();
+
+        toolbar.setTitle("Test title");
+
+        // Toolbar should display two rows, but no tabs are set so they should not be visible.
+        assertThat(toolbar.findViewById(R.id.car_ui_toolbar_title).getVisibility()).isEqualTo(
+                View.VISIBLE);
+        assertThat(toolbar.findViewById(R.id.car_ui_toolbar_tabs).getVisibility()).isNotEqualTo(
+                View.VISIBLE);
+    }
+
+    @Test
+    public void testState_twoRow_withTabs() {
+        mockResources();
+        when(mResources.getBoolean(R.bool.car_ui_toolbar_tabs_on_second_row)).thenReturn(true);
+
+        Toolbar toolbar = new Toolbar(mContext);
+        assertThat(toolbar.isTabsInSecondRow()).isTrue();
+        toolbar.addTab(new TabLayout.Tab(mContext.getDrawable(R.drawable.test_ic_launcher), "Foo"));
+        toolbar.addTab(new TabLayout.Tab(mContext.getDrawable(R.drawable.test_ic_launcher), "Foo"));
+
+        // Toolbar should display two rows with an empty title and tabs.
+        assertThat(toolbar.findViewById(R.id.car_ui_toolbar_tabs).getVisibility()).isEqualTo(
+                View.VISIBLE);
+        assertThat(toolbar.findViewById(R.id.car_ui_toolbar_title).getVisibility()).isEqualTo(
+                View.VISIBLE);
+    }
+
+    @Test
+    public void testState_oneRow_withTitle_withTabs() {
+        mockResources();
+        when(mResources.getBoolean(R.bool.car_ui_toolbar_tabs_on_second_row)).thenReturn(false);
+
+        Toolbar toolbar = new Toolbar(mContext);
+        assertThat(toolbar.isTabsInSecondRow()).isFalse();
+
+        // Set title and tabs for toolbar.
+        toolbar.setTitle("Test title");
+        toolbar.addTab(new TabLayout.Tab(mContext.getDrawable(R.drawable.test_ic_launcher), "Foo"));
+        toolbar.addTab(new TabLayout.Tab(mContext.getDrawable(R.drawable.test_ic_launcher), "Foo"));
+
+        // With only one row available, toolbar will only show tabs and not the title.
+        assertThat(toolbar.findViewById(R.id.car_ui_toolbar_tabs).getVisibility()).isEqualTo(
+                View.VISIBLE);
+        assertThat(toolbar.findViewById(R.id.car_ui_toolbar_title).getVisibility()).isNotEqualTo(
+                View.VISIBLE);
+    }
+
+    @Test
+    public void testState_oneRow_withTitle() {
+        mockResources();
+        when(mResources.getBoolean(R.bool.car_ui_toolbar_tabs_on_second_row)).thenReturn(false);
+
+
+        Toolbar toolbar = new Toolbar(mContext);
+        assertThat(toolbar.isTabsInSecondRow()).isFalse();
+
+        toolbar.setTitle("Test title");
+
+        // Toolbar should display one row with the title and no tabs.
+        assertThat(toolbar.findViewById(R.id.car_ui_toolbar_tabs).getVisibility()).isNotEqualTo(
+                View.VISIBLE);
+        assertThat(toolbar.findViewById(R.id.car_ui_toolbar_title).getVisibility()).isEqualTo(
+                View.VISIBLE);
+    }
+
+    @Test
+    public void testState_oneRow_withTabs() {
+        mockResources();
+        when(mResources.getBoolean(R.bool.car_ui_toolbar_tabs_on_second_row)).thenReturn(false);
+
+
+        Toolbar toolbar = new Toolbar(mContext);
+        assertThat(toolbar.isTabsInSecondRow()).isFalse();
+
+        toolbar.addTab(new TabLayout.Tab(mContext.getDrawable(R.drawable.test_ic_launcher), "Foo"));
+        toolbar.addTab(new TabLayout.Tab(mContext.getDrawable(R.drawable.test_ic_launcher), "Foo"));
+
+        // Toolbar should display one row with only tabs.
+        assertThat(toolbar.findViewById(R.id.car_ui_toolbar_tabs).getVisibility()).isEqualTo(
+                View.VISIBLE);
+        assertThat(toolbar.findViewById(R.id.car_ui_toolbar_title).getVisibility()).isNotEqualTo(
+                View.VISIBLE);
+    }
+
+    @Test
     public void registerOnBackListener_whenListenerRegisteredTwice_shouldntCallListenerTwice() {
         mToolbar.setState(Toolbar.State.SUBPAGE);
         Mutable<Integer> timesBackPressed = new Mutable<>(0);
@@ -226,8 +341,10 @@
     @Test
     public void menuItems_null_shouldRemoveExistingMenuItems() {
         mToolbar.setMenuItems(Arrays.asList(
-                createMenuItem(i -> { }),
-                createMenuItem(i -> { })));
+                createMenuItem(i -> {
+                }),
+                createMenuItem(i -> {
+                })));
 
         assertThat(getMenuItemViewCount()).isEqualTo(2);
 
@@ -238,7 +355,8 @@
 
     @Test
     public void menuItems_setVisibility_shouldDefaultToShown() {
-        MenuItem item = createMenuItem(i -> { });
+        MenuItem item = createMenuItem(i -> {
+        });
         mToolbar.setMenuItems(Collections.singletonList(item));
 
         assertThat(getMenuItemView(0).isShown()).isTrue();
@@ -246,7 +364,8 @@
 
     @Test
     public void menuItems_setVisibility_shouldHide() {
-        MenuItem item = createMenuItem(i -> { });
+        MenuItem item = createMenuItem(i -> {
+        });
         mToolbar.setMenuItems(Collections.singletonList(item));
 
         item.setVisible(false);
@@ -255,7 +374,8 @@
 
     @Test
     public void menuItems_setVisibility_shouldReshowAfterHiding() {
-        MenuItem item = createMenuItem(i -> { });
+        MenuItem item = createMenuItem(i -> {
+        });
         mToolbar.setMenuItems(Collections.singletonList(item));
 
         item.setVisible(false);
@@ -266,8 +386,10 @@
     @Test
     public void menuItems_equalItems_shouldntRecreateViews() {
         List<MenuItem> menuItems = Arrays.asList(
-                createMenuItem(i -> { }),
-                createMenuItem(i -> { }));
+                createMenuItem(i -> {
+                }),
+                createMenuItem(i -> {
+                }));
         mToolbar.setMenuItems(menuItems);
 
         assertThat(getMenuItemViewCount()).isEqualTo(2);
@@ -282,8 +404,10 @@
     @Test
     public void menuItems_searchScreen_shouldHideMenuItems() {
         mToolbar.setMenuItems(Arrays.asList(
-                MenuItem.Builder.createSearch(mContext, i -> { }),
-                createMenuItem(i -> { })));
+                MenuItem.Builder.createSearch(mContext, i -> {
+                }),
+                createMenuItem(i -> {
+                })));
 
         mToolbar.setShowMenuItemsWhileSearching(false);
         mToolbar.setState(Toolbar.State.SEARCH);
@@ -295,8 +419,10 @@
     @Test
     public void menuItems_showMenuItemsWhileSearching() {
         mToolbar.setMenuItems(Arrays.asList(
-                MenuItem.Builder.createSearch(mContext, i -> { }),
-                createMenuItem(i -> { })));
+                MenuItem.Builder.createSearch(mContext, i -> {
+                }),
+                createMenuItem(i -> {
+                })));
 
         mToolbar.setShowMenuItemsWhileSearching(true);
         mToolbar.setState(Toolbar.State.SEARCH);
@@ -312,6 +438,12 @@
                 .build();
     }
 
+    private void mockResources() {
+        mContext = spy(RuntimeEnvironment.application);
+        mResources = spy(mContext.getResources());
+        when(mContext.getResources()).thenReturn(mResources);
+    }
+
     private int getMenuItemViewCount() {
         return ((ViewGroup) mToolbar
                 .findViewById(R.id.car_ui_toolbar_menu_items_container))