Add primary menuitems

Primary menuitems are menuitems that are just displayed differently.
In the case of the referencedesign, primary menuitems are bordered
buttons while non-primary ones are borderless.

Fixes: 150241472
Test: Manually
Change-Id: I18220394f59ec44c947365260f5a15925397513b
(cherry picked from commit 4466fd69277247ee26b2a9637d702ca42507a63d)
diff --git a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/toolbar/MenuItem.java b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/toolbar/MenuItem.java
index 6ee35d3..27f8140 100644
--- a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/toolbar/MenuItem.java
+++ b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/toolbar/MenuItem.java
@@ -54,6 +54,7 @@
     private final boolean mIsSearch;
     private final boolean mShowIconAndTitle;
     private final boolean mIsTinted;
+    private final boolean mIsPrimary;
     @CarUxRestrictions.CarUxRestrictionsInfo
 
     private int mId;
@@ -88,6 +89,7 @@
         mIsSearch = builder.mIsSearch;
         mShowIconAndTitle = builder.mShowIconAndTitle;
         mIsTinted = builder.mIsTinted;
+        mIsPrimary = builder.mIsPrimary;
         mUxRestrictions = builder.mUxRestrictions;
 
         mCurrentRestrictions = CarUxRestrictionsUtil.getInstance(mContext).getCurrentRestrictions();
@@ -300,6 +302,14 @@
                 : mContext.getDrawable(resId));
     }
 
+    /**
+     * Returns if this MenuItem is a primary MenuItem, which means it should be visually
+     * distinct to indicate that.
+     */
+    public boolean isPrimary() {
+        return mIsPrimary;
+    }
+
     /** Returns if this is the search MenuItem, which has special behavior when searching */
     boolean isSearch() {
         return mIsSearch;
@@ -329,6 +339,7 @@
         private boolean mIsActivated = false;
         private boolean mIsSearch = false;
         private boolean mIsSettings = false;
+        private boolean mIsPrimary = false;
         @CarUxRestrictions.CarUxRestrictionsInfo
         private int mUxRestrictions = CarUxRestrictions.UX_RESTRICTIONS_BASELINE;
 
@@ -508,6 +519,14 @@
         }
 
         /**
+         * Sets whether the MenuItem is primary. This is just a visual change.
+         */
+        public Builder setPrimary(boolean primary) {
+            mIsPrimary = primary;
+            return this;
+        }
+
+        /**
          * Sets under what {@link android.car.drivingstate.CarUxRestrictions.CarUxRestrictionsInfo}
          * the MenuItem should be restricted.
          */
diff --git a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/toolbar/MenuItemRenderer.java b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/toolbar/MenuItemRenderer.java
index 85141f1..92d1430 100644
--- a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/toolbar/MenuItemRenderer.java
+++ b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/toolbar/MenuItemRenderer.java
@@ -32,6 +32,7 @@
 import android.widget.Switch;
 import android.widget.TextView;
 
+import androidx.annotation.LayoutRes;
 import androidx.annotation.XmlRes;
 import androidx.asynclayoutinflater.view.AsyncLayoutInflater;
 import androidx.core.util.Consumer;
@@ -98,7 +99,10 @@
 
     void createView(Consumer<View> callback) {
         AsyncLayoutInflater inflater = new AsyncLayoutInflater(mParentView.getContext());
-        inflater.inflate(R.layout.car_ui_toolbar_menu_item, mParentView, (View view, int resid,
+        @LayoutRes int layout = mMenuItem.isPrimary()
+                ? R.layout.car_ui_toolbar_menu_item_primary
+                : R.layout.car_ui_toolbar_menu_item;
+        inflater.inflate(layout, mParentView, (View view, int resid,
                 ViewGroup parent) -> {
             mView = view;
 
diff --git a/car-ui-lib/car-ui-lib/src/main/res-overlayable/values/overlayable.xml b/car-ui-lib/car-ui-lib/src/main/res-overlayable/values/overlayable.xml
index 453db47..8360815 100644
--- a/car-ui-lib/car-ui-lib/src/main/res-overlayable/values/overlayable.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res-overlayable/values/overlayable.xml
@@ -376,6 +376,7 @@
       <item type="layout" name="car_ui_seekbar_dialog"/>
       <item type="layout" name="car_ui_toolbar"/>
       <item type="layout" name="car_ui_toolbar_menu_item"/>
+      <item type="layout" name="car_ui_toolbar_menu_item_primary"/>
       <item type="layout" name="car_ui_toolbar_search_view"/>
       <item type="layout" name="car_ui_toolbar_tab_item"/>
       <item type="layout" name="car_ui_toolbar_tab_item_flexible"/>
diff --git a/car-ui-lib/car-ui-lib/src/main/res/values/values.xml b/car-ui-lib/car-ui-lib/src/main/res/values/values.xml
index 82a4d65..35f033c 100644
--- a/car-ui-lib/car-ui-lib/src/main/res/values/values.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res/values/values.xml
@@ -19,6 +19,7 @@
     <!-- Toolbar -->
 
     <!-- Layout to be used for toolbar tabs -->
-    <item name="car_ui_toolbar_tab_item_layout" type="layout">@layout/car_ui_toolbar_tab_item</item>
-    <item name="car_ui_toolbar_tab_item_layout_flexible" type="layout">@layout/car_ui_toolbar_tab_item_flexible</item>
+    <layout name="car_ui_toolbar_tab_item_layout">@layout/car_ui_toolbar_tab_item</layout>
+    <layout name="car_ui_toolbar_tab_item_layout_flexible">@layout/car_ui_toolbar_tab_item_flexible</layout>
+    <layout name="car_ui_toolbar_menu_item_primary">@layout/car_ui_toolbar_menu_item</layout>
 </resources>
diff --git a/car-ui-lib/paintbooth/src/main/java/com/android/car/ui/paintbooth/toolbar/ToolbarActivity.java b/car-ui-lib/paintbooth/src/main/java/com/android/car/ui/paintbooth/toolbar/ToolbarActivity.java
index f32818a..b9a9daa 100644
--- a/car-ui-lib/paintbooth/src/main/java/com/android/car/ui/paintbooth/toolbar/ToolbarActivity.java
+++ b/car-ui-lib/paintbooth/src/main/java/com/android/car/ui/paintbooth/toolbar/ToolbarActivity.java
@@ -159,6 +159,30 @@
             toolbar.setMenuItems(mMenuItems);
         }));
 
+        mButtons.add(Pair.create(getString(R.string.toolbar_add_bordered_text), v -> {
+            mMenuItems.add(MenuItem.builder(this)
+                    .setTitle("Baz")
+                    .setPrimary(true)
+                    .setOnClickListener(
+                            i -> Toast.makeText(this, "Clicked",
+                                    Toast.LENGTH_SHORT).show())
+                    .build());
+            toolbar.setMenuItems(mMenuItems);
+        }));
+
+        mButtons.add(Pair.create(getString(R.string.toolbar_add_bordered_icon_text), v -> {
+            mMenuItems.add(MenuItem.builder(this)
+                    .setIcon(R.drawable.ic_tracklist)
+                    .setTitle("Bar")
+                    .setPrimary(true)
+                    .setShowIconAndTitle(true)
+                    .setOnClickListener(
+                            i -> Toast.makeText(this, "Clicked",
+                                    Toast.LENGTH_SHORT).show())
+                    .build());
+            toolbar.setMenuItems(mMenuItems);
+        }));
+
         mButtons.add(Pair.create(getString(R.string.toolbar_add_untinted_icon_and_text), v -> {
             mMenuItems.add(MenuItem.builder(this)
                     .setIcon(R.drawable.ic_tracklist)
diff --git a/car-ui-lib/paintbooth/src/main/res/values/strings.xml b/car-ui-lib/paintbooth/src/main/res/values/strings.xml
index 04f1413..5965d68 100644
--- a/car-ui-lib/paintbooth/src/main/res/values/strings.xml
+++ b/car-ui-lib/paintbooth/src/main/res/values/strings.xml
@@ -180,6 +180,13 @@
   <!-- Text for add icon text button [CHAR_LIMIT=45]-->
   <string name="toolbar_add_icon_text">MenuItem: Add icon and text</string>
 
+
+  <!-- Text for add text button [CHAR_LIMIT=30]-->
+  <string name="toolbar_add_bordered_text">MenuItem: Add bordered text</string>
+
+  <!-- Text for add icon text button [CHAR_LIMIT=45]-->
+  <string name="toolbar_add_bordered_icon_text">MenuItem: Add bordered icon and text</string>
+
   <!-- Text for add untined icon and text button [CHAR_LIMIT=60]-->
   <string name="toolbar_add_untinted_icon_and_text">MenuItem: Add untinted icon and text</string>
 
diff --git a/car-ui-lib/referencedesign/res/layout/car_ui_toolbar_menu_item_primary.xml b/car-ui-lib/referencedesign/res/layout/car_ui_toolbar_menu_item_primary.xml
new file mode 100644
index 0000000..4364271
--- /dev/null
+++ b/car-ui-lib/referencedesign/res/layout/car_ui_toolbar_menu_item_primary.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2020, The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="match_parent"
+    android:focusable="false">
+    <FrameLayout
+        android:id="@+id/car_ui_toolbar_menu_item_icon_container"
+        style="@style/Widget.CarUi.Toolbar.MenuItem.IndividualContainer"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:background="@drawable/car_ui_toolbar_menu_item_icon_ripple">
+        <ImageView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_gravity="center"
+            android:src="@drawable/car_ui_toolbar_menu_item_icon_background"
+            android:scaleType="center"/>
+        <ImageView
+            android:id="@+id/car_ui_toolbar_menu_item_icon"
+            android:layout_width="44dp"
+            android:layout_height="44dp"
+            android:layout_gravity="center"
+            android:tint="@color/car_ui_toolbar_menu_item_icon_color"
+            android:tintMode="src_in"/>
+        <com.android.car.ui.uxr.DrawableStateSwitch
+            android:id="@+id/car_ui_toolbar_menu_item_switch"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:background="@null"
+            android:focusable="false"
+            android:clickable="false"/>
+    </FrameLayout>
+
+    <FrameLayout
+        android:id="@+id/car_ui_toolbar_menu_item_text_container"
+        style="@style/Widget.CarUi.Toolbar.MenuItem.IndividualContainer"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+        <!-- These buttons must have clickable="false" or they will steal the click events from the container -->
+        <com.android.car.ui.uxr.DrawableStateButton
+            android:id="@+id/car_ui_toolbar_menu_item_text"
+            style="@style/Widget.CarUi.Toolbar.TextButton.Primary"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_gravity="center"
+            android:focusable="false"
+            android:clickable="false"/>
+        <com.android.car.ui.uxr.DrawableStateButton
+            android:id="@+id/car_ui_toolbar_menu_item_text_with_icon"
+            style="@style/Widget.CarUi.Toolbar.TextButton.Primary"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_gravity="center"
+            android:focusable="false"
+            android:clickable="false"/>
+    </FrameLayout>
+</FrameLayout>
diff --git a/car-ui-lib/referencedesign/res/values/styles.xml b/car-ui-lib/referencedesign/res/values/styles.xml
index 433911c..ba37aac 100644
--- a/car-ui-lib/referencedesign/res/values/styles.xml
+++ b/car-ui-lib/referencedesign/res/values/styles.xml
@@ -41,6 +41,9 @@
     <style name="Widget.CarUi.Button.Borderless.Colored"
            parent="android:Widget.DeviceDefault.Button.Borderless.Colored"/>
 
+    <style name="Widget.CarUi.Button"
+           parent="android:Widget.DeviceDefault.Button"/>
+
     <style name="Widget.CarUi.Toolbar.TextButton" parent="Widget.CarUi.Button.Borderless.Colored">
         <item name="android:drawableTint">@color/car_ui_toolbar_menu_item_icon_color</item>
         <item name="android:drawablePadding">10dp</item>
@@ -51,6 +54,12 @@
         <item name="android:textColor">@color/car_ui_toolbar_menu_item_icon_color</item>
     </style>
 
+    <style name="Widget.CarUi.Toolbar.TextButton.Primary" parent="Widget.CarUi.Button">
+        <item name="android:drawableTint">@color/car_ui_toolbar_menu_item_icon_color</item>
+        <item name="android:drawablePadding">10dp</item>
+        <item name="android:maxWidth">350dp</item>
+    </style>
+
     <style name="Widget.CarUi.SeekbarPreference"/>
 
     <!-- Style applied to the seekbar widget within the seekbar preference -->
diff --git a/car-ui-lib/referencedesign/res/xml/overlays.xml b/car-ui-lib/referencedesign/res/xml/overlays.xml
index cc9b092..363d389 100644
--- a/car-ui-lib/referencedesign/res/xml/overlays.xml
+++ b/car-ui-lib/referencedesign/res/xml/overlays.xml
@@ -3,6 +3,7 @@
     <item target="layout/car_ui_toolbar" value="@layout/car_ui_toolbar"/>
     <item target="layout/car_ui_toolbar_two_row" value="@layout/car_ui_toolbar_two_row"/>
     <item target="layout/car_ui_toolbar_menu_item" value="@layout/car_ui_toolbar_menu_item"/>
+    <item target="layout/car_ui_toolbar_menu_item_primary" value="@layout/car_ui_toolbar_menu_item_primary"/>
     <item target="layout/car_ui_preference_widget_seekbar" value="@layout/car_ui_preference_widget_seekbar"/>
 
     <item target="drawable/car_ui_icon_arrow_back" value="@drawable/car_ui_icon_arrow_back"/>
diff --git a/car-ui-lib/tests/apitest/current.xml b/car-ui-lib/tests/apitest/current.xml
index 6abc24d..1719818 100644
--- a/car-ui-lib/tests/apitest/current.xml
+++ b/car-ui-lib/tests/apitest/current.xml
@@ -311,6 +311,7 @@
   <public type="layout" name="car_ui_seekbar_dialog"/>
   <public type="layout" name="car_ui_toolbar"/>
   <public type="layout" name="car_ui_toolbar_menu_item"/>
+  <public type="layout" name="car_ui_toolbar_menu_item_primary"/>
   <public type="layout" name="car_ui_toolbar_search_view"/>
   <public type="layout" name="car_ui_toolbar_tab_item"/>
   <public type="layout" name="car_ui_toolbar_tab_item_flexible"/>