Merge "Allow showing tabs while in subpages" into pi-car-dev
diff --git a/car-media-common/src/com/android/car/media/common/playback/PlaybackViewModel.java b/car-media-common/src/com/android/car/media/common/playback/PlaybackViewModel.java
index 80a00f2..4e9957a 100644
--- a/car-media-common/src/com/android/car/media/common/playback/PlaybackViewModel.java
+++ b/car-media-common/src/com/android/car/media/common/playback/PlaybackViewModel.java
@@ -299,7 +299,7 @@
                             .collect(Collectors.toList());
 
             mSanitizedQueue.setValue(filtered);
-            mHasQueue.setValue(!filtered.isEmpty());
+            mHasQueue.setValue(filtered.size() > 1);
         }
 
         @Override
diff --git a/car-ui-lib/res/drawable/car_ui_list_item_avatar_icon_outline.xml b/car-ui-lib/res/drawable/car_ui_list_item_avatar_icon_outline.xml
new file mode 100644
index 0000000..f8b63f5
--- /dev/null
+++ b/car-ui-lib/res/drawable/car_ui_list_item_avatar_icon_outline.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 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.
+  -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+</shape>
diff --git a/car-ui-lib/res/drawable/car_ui_preference_icon_chevron.xml b/car-ui-lib/res/drawable/car_ui_preference_icon_chevron.xml
new file mode 100644
index 0000000..61d594c
--- /dev/null
+++ b/car-ui-lib/res/drawable/car_ui_preference_icon_chevron.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright 2019 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.
+  -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+  <item android:state_enabled="false" android:drawable="@drawable/car_ui_preference_icon_chevron_disabled"/>
+  <item android:state_enabled="true" android:drawable="@drawable/car_ui_preference_icon_chevron_enabled"/>
+</selector>
\ No newline at end of file
diff --git a/car-ui-lib/res/layout/car_ui_list_item.xml b/car-ui-lib/res/layout/car_ui_list_item.xml
index b7efd33..4ec2535 100644
--- a/car-ui-lib/res/layout/car_ui_list_item.xml
+++ b/car-ui-lib/res/layout/car_ui_list_item.xml
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?><!--
+<?xml version="1.0" encoding="utf-8"?>
+<!--
   ~ Copyright 2019 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,7 +15,8 @@
   ~ limitations under the License.
   -->
 
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="@dimen/car_ui_list_item_height">
@@ -65,6 +67,24 @@
             android:layout_width="@dimen/car_ui_list_item_icon_size"
             android:layout_height="@dimen/car_ui_list_item_icon_size"
             android:layout_gravity="center"
+            android:visibility="gone"
+            android:scaleType="fitXY" />
+
+        <ImageView
+            android:id="@+id/content_icon"
+            android:layout_width="@dimen/car_ui_list_item_content_icon_width"
+            android:layout_height="@dimen/car_ui_list_item_content_icon_height"
+            android:layout_gravity="center"
+            android:visibility="gone"
+            android:scaleType="fitXY" />
+
+        <ImageView
+            android:id="@+id/avatar_icon"
+            android:background="@drawable/car_ui_list_item_avatar_icon_outline"
+            android:layout_width="@dimen/car_ui_list_item_avatar_icon_width"
+            android:layout_height="@dimen/car_ui_list_item_avatar_icon_height"
+            android:layout_gravity="center"
+            android:visibility="gone"
             android:scaleType="fitXY" />
     </FrameLayout>
 
diff --git a/car-ui-lib/res/values/dimens.xml b/car-ui-lib/res/values/dimens.xml
index 171d3ba..3a77194 100644
--- a/car-ui-lib/res/values/dimens.xml
+++ b/car-ui-lib/res/values/dimens.xml
@@ -191,19 +191,27 @@
     <dimen name="car_ui_list_item_header_start_inset">0dp</dimen>
     <dimen name="car_ui_list_item_start_inset">0dp</dimen>
     <dimen name="car_ui_list_item_end_inset">0dp</dimen>
-    <dimen name="car_ui_list_item_text_start_margin">0dp</dimen>
+    <dimen name="car_ui_list_item_text_start_margin">24dp</dimen>
     <dimen name="car_ui_list_item_text_no_icon_start_margin">24dp</dimen>
+
+    <!-- List item icons  -->
+
     <dimen name="car_ui_list_item_icon_size">@dimen/car_ui_primary_icon_size</dimen>
+    <dimen name="car_ui_list_item_content_icon_width">@dimen/car_ui_list_item_icon_container_width</dimen>
+    <dimen name="car_ui_list_item_content_icon_height">@dimen/car_ui_list_item_icon_container_width</dimen>
+    <dimen name="car_ui_list_item_avatar_icon_width">@dimen/car_ui_primary_icon_size</dimen>
+    <dimen name="car_ui_list_item_avatar_icon_height">@dimen/car_ui_primary_icon_size</dimen>
     <dimen name="car_ui_list_item_supplemental_icon_size">@dimen/car_ui_primary_icon_size</dimen>
     <dimen name="car_ui_list_item_icon_container_width">112dp</dimen>
     <dimen name="car_ui_list_item_action_divider_width">1dp</dimen>
     <dimen name="car_ui_list_item_action_divider_height">60dp</dimen>
 
+    <!-- List item actions  -->
+
     <dimen name="car_ui_list_item_radio_button_height">@dimen/car_ui_list_item_height</dimen>
     <dimen name="car_ui_list_item_radio_button_start_inset">@dimen/car_ui_list_item_start_inset</dimen>
     <dimen name="car_ui_list_item_radio_button_end_inset">@dimen/car_ui_list_item_end_inset</dimen>
     <dimen name="car_ui_list_item_radio_button_icon_container_width">@dimen/car_ui_list_item_icon_container_width</dimen>
-
     <dimen name="car_ui_list_item_check_box_height">@dimen/car_ui_list_item_height</dimen>
     <dimen name="car_ui_list_item_check_box_start_inset">@dimen/car_ui_list_item_start_inset</dimen>
     <dimen name="car_ui_list_item_check_box_end_inset">@dimen/car_ui_list_item_end_inset</dimen>
diff --git a/car-ui-lib/res/values/drawables.xml b/car-ui-lib/res/values/drawables.xml
index c5c58ee..181846c 100644
--- a/car-ui-lib/res/values/drawables.xml
+++ b/car-ui-lib/res/values/drawables.xml
@@ -32,6 +32,8 @@
 
     <!-- Preferences -->
 
-    <!-- Overlayable drawable to use for the preference chevron -->
-    <item name="car_ui_preference_icon_chevron" type="drawable">@null</item>
+    <!-- Overlayable drawable to use for the preference chevron when preference is enabled -->
+    <item name="car_ui_preference_icon_chevron_enabled" type="drawable">@null</item>
+    <!-- Overlayable drawable to use for the preference chevron when preference is disabled -->
+    <item name="car_ui_preference_icon_chevron_disabled" type="drawable">@null</item>
 </resources>
diff --git a/car-ui-lib/src/com/android/car/ui/recyclerview/CarUiContentListItem.java b/car-ui-lib/src/com/android/car/ui/recyclerview/CarUiContentListItem.java
index 724b639..88255c8 100644
--- a/car-ui-lib/src/com/android/car/ui/recyclerview/CarUiContentListItem.java
+++ b/car-ui-lib/src/com/android/car/ui/recyclerview/CarUiContentListItem.java
@@ -34,12 +34,28 @@
         /**
          * Called when the checked state of a list item has changed.
          *
-         * @param item The item whose checked state changed.
+         * @param item      The item whose checked state changed.
          * @param isChecked new checked state of list item.
          */
         void onCheckedChanged(CarUiContentListItem item, boolean isChecked);
     }
 
+    public enum IconType {
+        /**
+         * For an icon type of CONTENT, the primary icon is a larger than {@code STANDARD}.
+         */
+        CONTENT,
+        /**
+         * For an icon type of STANDARD, the primary icon is the standard size.
+         */
+        STANDARD,
+        /**
+         * For an icon type of AVATAR, the primary icon is masked to provide an icon with a modified
+         * shape.
+         */
+        AVATAR
+    }
+
     /**
      * Enum of secondary action types of a list item.
      */
@@ -74,6 +90,7 @@
     private CharSequence mTitle;
     private CharSequence mBody;
     private Action mAction;
+    private IconType mPrimaryIconType;
     private boolean mIsActionDividerVisible;
     private boolean mIsChecked;
     private OnCheckedChangedListener mOnCheckedChangedListener;
@@ -81,6 +98,7 @@
 
     public CarUiContentListItem() {
         mAction = Action.NONE;
+        mPrimaryIconType = IconType.STANDARD;
     }
 
     /**
@@ -135,6 +153,22 @@
     }
 
     /**
+     * Returns the primary icon type for the item.
+     */
+    public IconType getPrimaryIconType() {
+        return mPrimaryIconType;
+    }
+
+    /**
+     * Sets the primary icon type for the item.
+     *
+     * @param icon the icon type for the item.
+     */
+    public void setPrimaryIconType(IconType icon) {
+        mPrimaryIconType = icon;
+    }
+
+    /**
      * Returns {@code true} if the item is checked. Will always return {@code false} when the action
      * type for the item is {@code Action.NONE}.
      */
diff --git a/car-ui-lib/src/com/android/car/ui/recyclerview/CarUiListItemAdapter.java b/car-ui-lib/src/com/android/car/ui/recyclerview/CarUiListItemAdapter.java
index 91a4d71..865722c 100644
--- a/car-ui-lib/src/com/android/car/ui/recyclerview/CarUiListItemAdapter.java
+++ b/car-ui-lib/src/com/android/car/ui/recyclerview/CarUiListItemAdapter.java
@@ -152,6 +152,8 @@
         private final TextView mTitle;
         private final TextView mBody;
         private final ImageView mIcon;
+        private final ImageView mContentIcon;
+        private final ImageView mAvatarIcon;
         private final ViewGroup mIconContainer;
         private final ViewGroup mActionContainer;
         private final View mActionDivider;
@@ -169,6 +171,8 @@
             mTitle = itemView.requireViewById(R.id.title);
             mBody = itemView.requireViewById(R.id.body);
             mIcon = itemView.requireViewById(R.id.icon);
+            mContentIcon = itemView.requireViewById(R.id.content_icon);
+            mAvatarIcon = itemView.requireViewById(R.id.avatar_icon);
             mIconContainer = itemView.requireViewById(R.id.icon_container);
             mActionContainer = itemView.requireViewById(R.id.action_container);
             mActionDivider = itemView.requireViewById(R.id.action_divider);
@@ -201,16 +205,34 @@
                 mBody.setVisibility(View.GONE);
             }
 
+            mIcon.setVisibility(View.GONE);
+            mContentIcon.setVisibility(View.GONE);
+            mAvatarIcon.setVisibility(View.GONE);
+
             if (icon != null) {
-                mIcon.setImageDrawable(icon);
                 mIconContainer.setVisibility(View.VISIBLE);
+
+                switch (item.getPrimaryIconType()) {
+                    case CONTENT:
+                        mContentIcon.setVisibility(View.VISIBLE);
+                        mContentIcon.setImageDrawable(icon);
+                        break;
+                    case STANDARD:
+                        mIcon.setVisibility(View.VISIBLE);
+                        mIcon.setImageDrawable(icon);
+                        break;
+                    case AVATAR:
+                        mAvatarIcon.setVisibility(View.VISIBLE);
+                        mAvatarIcon.setImageDrawable(icon);
+                        mAvatarIcon.setClipToOutline(true);
+                        break;
+                }
             } else {
                 mIconContainer.setVisibility(View.GONE);
             }
 
             mActionDivider.setVisibility(
                     item.isActionDividerVisible() ? View.VISIBLE : View.GONE);
-
             mSwitch.setVisibility(View.GONE);
             mCheckBox.setVisibility(View.GONE);
             mRadioButton.setVisibility(View.GONE);
diff --git a/car-ui-lib/tests/apitest/current.xml b/car-ui-lib/tests/apitest/current.xml
index 4ee3e7d..d29307a 100644
--- a/car-ui-lib/tests/apitest/current.xml
+++ b/car-ui-lib/tests/apitest/current.xml
@@ -59,11 +59,15 @@
   <public type="dimen" name="car_ui_letter_spacing_body3"/>
   <public type="dimen" name="car_ui_list_item_action_divider_height"/>
   <public type="dimen" name="car_ui_list_item_action_divider_width"/>
+  <public type="dimen" name="car_ui_list_item_avatar_icon_height"/>
+  <public type="dimen" name="car_ui_list_item_avatar_icon_width"/>
   <public type="dimen" name="car_ui_list_item_body_text_size"/>
   <public type="dimen" name="car_ui_list_item_check_box_end_inset"/>
   <public type="dimen" name="car_ui_list_item_check_box_height"/>
   <public type="dimen" name="car_ui_list_item_check_box_icon_container_width"/>
   <public type="dimen" name="car_ui_list_item_check_box_start_inset"/>
+  <public type="dimen" name="car_ui_list_item_content_icon_height"/>
+  <public type="dimen" name="car_ui_list_item_content_icon_width"/>
   <public type="dimen" name="car_ui_list_item_end_inset"/>
   <public type="dimen" name="car_ui_list_item_header_height"/>
   <public type="dimen" name="car_ui_list_item_header_start_inset"/>
@@ -168,9 +172,12 @@
   <public type="drawable" name="car_ui_icon_search_nav_icon"/>
   <public type="drawable" name="car_ui_icon_settings"/>
   <public type="drawable" name="car_ui_list_header_background"/>
+  <public type="drawable" name="car_ui_list_item_avatar_icon_outline"/>
   <public type="drawable" name="car_ui_list_item_background"/>
   <public type="drawable" name="car_ui_list_item_divider"/>
   <public type="drawable" name="car_ui_preference_icon_chevron"/>
+  <public type="drawable" name="car_ui_preference_icon_chevron_disabled"/>
+  <public type="drawable" name="car_ui_preference_icon_chevron_enabled"/>
   <public type="drawable" name="car_ui_recyclerview_button_ripple_background"/>
   <public type="drawable" name="car_ui_recyclerview_divider"/>
   <public type="drawable" name="car_ui_recyclerview_ic_down"/>
diff --git a/car-ui-lib/tests/paintbooth/res/drawable/ic_sample_logo.png b/car-ui-lib/tests/paintbooth/res/drawable/ic_sample_logo.png
new file mode 100644
index 0000000..a4f8245
--- /dev/null
+++ b/car-ui-lib/tests/paintbooth/res/drawable/ic_sample_logo.png
Binary files differ
diff --git a/car-ui-lib/tests/paintbooth/src/com/android/car/ui/paintbooth/caruirecyclerview/CarUiListItemActivity.java b/car-ui-lib/tests/paintbooth/src/com/android/car/ui/paintbooth/caruirecyclerview/CarUiListItemActivity.java
index a5aeeee..c2d78ca 100644
--- a/car-ui-lib/tests/paintbooth/src/com/android/car/ui/paintbooth/caruirecyclerview/CarUiListItemActivity.java
+++ b/car-ui-lib/tests/paintbooth/src/com/android/car/ui/paintbooth/caruirecyclerview/CarUiListItemActivity.java
@@ -84,6 +84,19 @@
         mData.add(item);
 
         item = new CarUiContentListItem();
+        item.setTitle("Test Title -- with content icon");
+        item.setPrimaryIconType(CarUiContentListItem.IconType.CONTENT);
+        item.setIcon(getDrawable(R.drawable.ic_sample_logo));
+        mData.add(item);
+
+        item = new CarUiContentListItem();
+        item.setTitle("Test Title");
+        item.setBody("With avatar icon.");
+        item.setIcon(getDrawable(R.drawable.ic_sample_logo));
+        item.setPrimaryIconType(CarUiContentListItem.IconType.AVATAR);
+        mData.add(item);
+
+        item = new CarUiContentListItem();
         item.setIcon(getDrawable(R.drawable.ic_launcher));
         item.setTitle("Title -- Item with checkbox");
         item.setBody("Will present toast on change of selection state.");