Add IDs to MenuItems

Useful for differentiating between MenuItems in callbacks, particuarly
xml MenuItems.

Test: Robotests and paintbooth
Change-Id: I01471e59194f6a9a5d5dda2cb5234545b467313f
diff --git a/car-ui-lib/res/values/attrs.xml b/car-ui-lib/res/values/attrs.xml
index 5778cda..84c3682 100644
--- a/car-ui-lib/res/values/attrs.xml
+++ b/car-ui-lib/res/values/attrs.xml
@@ -42,6 +42,8 @@
     </declare-styleable>
 
     <declare-styleable name="CarUiToolbarMenuItem">
+        <!-- Id of MenuItem, used to differentiate them -->
+        <attr name="id" format="integer"/>
         <!-- Show/hide the MenuItem -->
         <attr name="visible" format="boolean"/>
         <!-- Title -->
diff --git a/car-ui-lib/src/com/android/car/ui/toolbar/MenuItem.java b/car-ui-lib/src/com/android/car/ui/toolbar/MenuItem.java
index 5c2503e..fc27679 100644
--- a/car-ui-lib/src/com/android/car/ui/toolbar/MenuItem.java
+++ b/car-ui-lib/src/com/android/car/ui/toolbar/MenuItem.java
@@ -55,6 +55,7 @@
     @CarUxRestrictions.CarUxRestrictionsInfo
     private final int mUxRestrictions;
 
+    private int mId;
     private CarUxRestrictions mCurrentRestrictions;
     private Listener mListener;
     private CharSequence mTitle;
@@ -68,6 +69,7 @@
 
     private MenuItem(Builder builder) {
         mContext = builder.mContext;
+        mId = builder.mId;
         mIsCheckable = builder.mIsCheckable;
         mIsActivatable = builder.mIsActivatable;
         mTitle = builder.mTitle;
@@ -92,6 +94,16 @@
         }
     }
 
+    /** Sets the id, which is purely for the client to distinguish MenuItems with.  */
+    public void setId(int id) {
+        mId = id;
+    }
+
+    /** Gets the id, which is purely for the client to distinguish MenuItems with. */
+    public int getId() {
+        return mId;
+    }
+
     /** Returns whether the MenuItem is enabled */
     public boolean isEnabled() {
         return mIsEnabled;
@@ -288,6 +300,7 @@
     public static final class Builder {
         private Context mContext;
 
+        private int mId;
         private CharSequence mTitle;
         private Drawable mIcon;
         private OnClickListener mOnClickListener;
@@ -323,6 +336,12 @@
             return new MenuItem(this);
         }
 
+        /** Sets the id, which is purely for the client to distinguish MenuItems with. */
+        public Builder setId(int id) {
+            mId = id;
+            return this;
+        }
+
         /** Sets the title to a string resource id */
         public Builder setTitle(int resId) {
             setTitle(mContext.getString(resId));
@@ -497,6 +516,11 @@
         }
     }
 
+    /** Get a new {@link Builder}. */
+    public static Builder builder(Context context) {
+        return new Builder(context);
+    }
+
     /**
      * OnClickListener for a MenuItem.
      */
diff --git a/car-ui-lib/src/com/android/car/ui/toolbar/MenuItemRenderer.java b/car-ui-lib/src/com/android/car/ui/toolbar/MenuItemRenderer.java
index 288642b..183fa5b 100644
--- a/car-ui-lib/src/com/android/car/ui/toolbar/MenuItemRenderer.java
+++ b/car-ui-lib/src/com/android/car/ui/toolbar/MenuItemRenderer.java
@@ -208,6 +208,7 @@
 
         TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.CarUiToolbarMenuItem);
         try {
+            int id = a.getInt(R.styleable.CarUiToolbarMenuItem_id, 0);
             String title = a.getString(R.styleable.CarUiToolbarMenuItem_title);
             Drawable icon = a.getDrawable(R.styleable.CarUiToolbarMenuItem_icon);
             boolean tinted = a.getBoolean(R.styleable.CarUiToolbarMenuItem_tinted, true);
@@ -253,7 +254,8 @@
             parser.next();
             parser.require(XmlPullParser.END_TAG, null, "MenuItem");
 
-            MenuItem.Builder builder = new MenuItem.Builder(c)
+            MenuItem.Builder builder = MenuItem.builder(c)
+                    .setId(id)
                     .setTitle(title)
                     .setIcon(icon)
                     .setOnClickListener(onClickListener)
diff --git a/car-ui-lib/tests/paintbooth/res/xml/menuitems.xml b/car-ui-lib/tests/paintbooth/res/xml/menuitems.xml
index 119afea..74e5e82 100644
--- a/car-ui-lib/tests/paintbooth/res/xml/menuitems.xml
+++ b/car-ui-lib/tests/paintbooth/res/xml/menuitems.xml
@@ -18,6 +18,7 @@
     <MenuItem
         app:title="@string/preferences_screen_title"/>
     <MenuItem
+        app:id="5"
         app:title="Bar"
         app:icon="@drawable/ic_tracklist"
         app:onClick="xmlMenuItemClicked"/>
diff --git a/car-ui-lib/tests/paintbooth/src/com/android/car/ui/paintbooth/toolbar/ToolbarActivity.java b/car-ui-lib/tests/paintbooth/src/com/android/car/ui/paintbooth/toolbar/ToolbarActivity.java
index 0ef44ec..b42a2ec 100644
--- a/car-ui-lib/tests/paintbooth/src/com/android/car/ui/paintbooth/toolbar/ToolbarActivity.java
+++ b/car-ui-lib/tests/paintbooth/src/com/android/car/ui/paintbooth/toolbar/ToolbarActivity.java
@@ -83,7 +83,7 @@
         }));
 
         mButtons.add(Pair.create(getString(R.string.toolbar_add_untined_icon), v -> {
-            mMenuItems.add(new MenuItem.Builder(this)
+            mMenuItems.add(MenuItem.builder(this)
                     .setIcon(R.drawable.ic_tracklist)
                     .setTinted(false)
                     .setOnClickListener(
@@ -95,7 +95,7 @@
 
         Mutable<Integer> overflowCounter = new Mutable<>(1);
         mButtons.add(Pair.create(getString(R.string.toolbar_add_overflow), v -> {
-            mMenuItems.add(new MenuItem.Builder(this)
+            mMenuItems.add(MenuItem.builder(this)
                     .setTitle("Foo " + overflowCounter.value)
                     .setOnClickListener(
                             i -> Toast.makeText(this, "Clicked",
@@ -107,7 +107,7 @@
         }));
 
         mButtons.add(Pair.create(getString(R.string.toolbar_add_switch), v -> {
-            mMenuItems.add(new MenuItem.Builder(this)
+            mMenuItems.add(MenuItem.builder(this)
                     .setCheckable()
                     .setOnClickListener(
                             i ->
@@ -120,7 +120,7 @@
         }));
 
         mButtons.add(Pair.create(getString(R.string.toolbar_add_text), v -> {
-            mMenuItems.add(new MenuItem.Builder(this)
+            mMenuItems.add(MenuItem.builder(this)
                     .setTitle("Baz")
                     .setOnClickListener(
                             i -> Toast.makeText(this, "Clicked",
@@ -130,7 +130,7 @@
         }));
 
         mButtons.add(Pair.create(getString(R.string.toolbar_add_icon_text), v -> {
-            mMenuItems.add(new MenuItem.Builder(this)
+            mMenuItems.add(MenuItem.builder(this)
                     .setIcon(R.drawable.ic_tracklist)
                     .setTitle("Bar")
                     .setShowIconAndTitle(true)
@@ -142,7 +142,7 @@
         }));
 
         mButtons.add(Pair.create(getString(R.string.toolbar_add_untinted_icon_and_text), v -> {
-            mMenuItems.add(new MenuItem.Builder(this)
+            mMenuItems.add(MenuItem.builder(this)
                     .setIcon(R.drawable.ic_tracklist)
                     .setTitle("Bar")
                     .setShowIconAndTitle(true)
@@ -155,7 +155,7 @@
         }));
 
         mButtons.add(Pair.create(getString(R.string.toolbar_add_activatable), v -> {
-            mMenuItems.add(new MenuItem.Builder(this)
+            mMenuItems.add(MenuItem.builder(this)
                     .setIcon(R.drawable.ic_tracklist)
                     .setActivatable()
                     .setOnClickListener(
@@ -166,7 +166,7 @@
         }));
 
         mButtons.add(Pair.create(getString(R.string.toolbar_add_morphing), v -> {
-            mMenuItems.add(new MenuItem.Builder(this)
+            mMenuItems.add(MenuItem.builder(this)
                     .setTitle("Become icon")
                     .setOnClickListener(i ->
                             i.setIcon(i.getIcon() == null ? R.drawable.ic_tracklist : 0))
@@ -268,7 +268,8 @@
     }
 
     public void xmlMenuItemClicked(MenuItem item) {
-        Toast.makeText(this, "Xml item clicked! " + item.getTitle(), Toast.LENGTH_SHORT).show();
+        Toast.makeText(this, "Xml item clicked! " + item.getTitle() + ", id: " + item.getId(),
+                Toast.LENGTH_SHORT).show();
     }
 
     private void getMenuItem(MenuItem.OnClickListener listener) {
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 98f74b5..68c37d1 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
@@ -311,6 +311,26 @@
     }
 
     @Test
+    public void menuItems_builder_id() {
+        MenuItem item = MenuItem.builder(mContext)
+                .setId(5)
+                .build();
+
+        assertThat(item.getId()).isEqualTo(5);
+    }
+
+    @Test
+    public void menuItems_setId_shouldWork() {
+        MenuItem item = MenuItem.builder(mContext).build();
+
+        assertThat(item.getId()).isEqualTo(0);
+
+        item.setId(7);
+
+        assertThat(item.getId()).isEqualTo(7);
+    }
+
+    @Test
     public void menuItems_whenClicked_shouldCallListener() {
         assertThat(getMenuItemViewCount()).isEqualTo(0);