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.");