Merge "Include disabled state color to preference text colors" into pi-car-dev
diff --git a/car-media-common/res/values/integers.xml b/car-media-common/res/values/integers.xml
index a1e7faa..2c6177d 100644
--- a/car-media-common/res/values/integers.xml
+++ b/car-media-common/res/values/integers.xml
@@ -27,10 +27,13 @@
     <!-- Number of columns in app selector -->
     <integer name="num_app_selector_columns">3</integer>
 
-    <!-- For the playback widget (com.android.car.media.common.PlaybackFragment), defines the
-        maximum square into which requested media items bitmaps must fit (larger bitmaps are
-        scaled down).
+    <!-- Defines the maximum square into which requested media items bitmaps must fit (smaller
+        bitmaps are not modified, larger ones are resized to fit into the square, preserving their
+        aspect ratio). A 256x256 bitmap takes 250 KB or memory, and a 512x512 takes 1 MB so this
+        number should be set conservatively while making sure the displayed bitmaps look good.
+        This value is also passed to media applications so they can pre-fetch their artwork at an
+        optimal resolution.
     -->
-    <integer name="playback_widget_bitmap_max_size_px">256</integer>
+    <integer name="media_items_bitmap_max_size_px">256</integer>
 
 </resources>
diff --git a/car-media-common/src/com/android/car/media/common/MediaConstants.java b/car-media-common/src/com/android/car/media/common/MediaConstants.java
index 967680c..a3ec31c 100644
--- a/car-media-common/src/com/android/car/media/common/MediaConstants.java
+++ b/car-media-common/src/com/android/car/media/common/MediaConstants.java
@@ -16,11 +16,22 @@
 
 package com.android.car.media.common;
 
+import androidx.media.MediaBrowserServiceCompat;
+
 /**
  * Holds constants used when dealing with MediaBrowserServices that support the
  * content style API for media.
  */
 public final class MediaConstants {
+
+    /**
+     * Integer extra indicating the recommended size (in pixels) for media art bitmaps. The value
+     * is passed in the rootHints Bundle of {@link MediaBrowserServiceCompat#onGetRoot} and can be
+     * retrieved with: rootHints.getInt("android.media.extras.MEDIA_ART_SIZE_HINT_PIXELS", 0).
+     */
+    public static final String EXTRA_MEDIA_ART_SIZE_HINT_PIXELS =
+            "android.media.extras.MEDIA_ART_SIZE_HINT_PIXELS";
+
     /**
      * Bundle extra holding the Pending Intent to launch to let users resolve the current error.
      * See {@link #ERROR_RESOLUTION_ACTION_LABEL} for more details.
diff --git a/car-media-common/src/com/android/car/media/common/PlaybackFragment.java b/car-media-common/src/com/android/car/media/common/PlaybackFragment.java
index b66f9d9..8d04733 100644
--- a/car-media-common/src/com/android/car/media/common/PlaybackFragment.java
+++ b/car-media-common/src/com/android/car/media/common/PlaybackFragment.java
@@ -91,7 +91,7 @@
                 // Let the Media center trampoline figure out what to open.
                 v -> startActivity(new Intent(Car.CAR_INTENT_ACTION_MEDIA_TEMPLATE)));
 
-        int max = activity.getResources().getInteger(R.integer.playback_widget_bitmap_max_size_px);
+        int max = activity.getResources().getInteger(R.integer.media_items_bitmap_max_size_px);
         Size maxArtSize = new Size(max, max);
         mAlbumArtBinder = new ImageBinder<>(PlaceholderType.FOREGROUND, maxArtSize,
                 drawable -> {
diff --git a/car-media-common/src/com/android/car/media/common/source/MediaBrowserConnector.java b/car-media-common/src/com/android/car/media/common/source/MediaBrowserConnector.java
index 36f90c8..b16164a 100644
--- a/car-media-common/src/com/android/car/media/common/source/MediaBrowserConnector.java
+++ b/car-media-common/src/com/android/car/media/common/source/MediaBrowserConnector.java
@@ -22,9 +22,12 @@
 import android.annotation.Nullable;
 import android.content.ComponentName;
 import android.content.Context;
+import android.os.Bundle;
 import android.support.v4.media.MediaBrowserCompat;
 import android.util.Log;
 
+import com.android.car.media.common.MediaConstants;
+
 /**
  * A helper class to connect to a single {@link MediaBrowserCompat}. Connecting to a new one
  * automatically disconnects the previous browser. Changes of the currently connected browser are
@@ -43,6 +46,7 @@
 
     private final Context mContext;
     private final Callback mCallback;
+    private final int mMaxBitmapSizePx;
 
     @Nullable private ComponentName mBrowseService;
     @Nullable private MediaBrowserCompat mBrowser;
@@ -55,6 +59,8 @@
     MediaBrowserConnector(@NonNull Context context, @NonNull Callback callback) {
         mContext = context;
         mCallback = callback;
+        mMaxBitmapSizePx = mContext.getResources().getInteger(
+                com.android.car.media.common.R.integer.media_items_bitmap_max_size_px);
     }
 
     /** Counter so callbacks from obsolete connections can be ignored. */
@@ -139,6 +145,8 @@
     @NonNull
     protected MediaBrowserCompat createMediaBrowser(@NonNull ComponentName browseService,
             @NonNull MediaBrowserCompat.ConnectionCallback callback) {
-        return new MediaBrowserCompat(mContext, browseService, callback, null);
+        Bundle rootHints = new Bundle();
+        rootHints.putInt(MediaConstants.EXTRA_MEDIA_ART_SIZE_HINT_PIXELS, mMaxBitmapSizePx);
+        return new MediaBrowserCompat(mContext, browseService, callback, rootHints);
     }
 }
diff --git a/car-ui-lib/res/color/car_ui_tab_item_selector.xml b/car-ui-lib/res/color/car_ui_toolbar_tab_item_selector.xml
similarity index 81%
rename from car-ui-lib/res/color/car_ui_tab_item_selector.xml
rename to car-ui-lib/res/color/car_ui_toolbar_tab_item_selector.xml
index c9c8d8d..b2ec68a 100644
--- a/car-ui-lib/res/color/car_ui_tab_item_selector.xml
+++ b/car-ui-lib/res/color/car_ui_toolbar_tab_item_selector.xml
@@ -16,6 +16,6 @@
   -->
 
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:color="@color/car_ui_tab_selected_color" android:state_selected="true"/>
-    <item android:color="@color/car_ui_tab_unselected_color"/>
+    <item android:color="@color/car_ui_toolbar_tab_selected_color" android:state_selected="true"/>
+    <item android:color="@color/car_ui_toolbar_tab_unselected_color"/>
 </selector>
diff --git a/car-ui-lib/res/layout-port/car_ui_toolbar.xml b/car-ui-lib/res/layout-port/car_ui_toolbar.xml
index 16014dc..2ea89d0 100644
--- a/car-ui-lib/res/layout-port/car_ui_toolbar.xml
+++ b/car-ui-lib/res/layout-port/car_ui_toolbar.xml
@@ -23,35 +23,35 @@
     <androidx.constraintlayout.widget.Guideline
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:id="@+id/toolbar_start_guideline"
+        android:id="@+id/car_ui_toolbar_start_guideline"
         app:layout_constraintGuide_begin="@dimen/car_ui_toolbar_start_inset"
         android:orientation="vertical"/>
 
     <androidx.constraintlayout.widget.Guideline
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:id="@+id/toolbar_top_guideline"
+        android:id="@+id/car_ui_toolbar_top_guideline"
         app:layout_constraintGuide_begin="@dimen/car_ui_toolbar_top_inset"
         android:orientation="horizontal"/>
 
     <androidx.constraintlayout.widget.Guideline
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:id="@+id/toolbar_end_guideline"
+        android:id="@+id/car_ui_toolbar_end_guideline"
         app:layout_constraintGuide_end="@dimen/car_ui_toolbar_end_inset"
         android:orientation="vertical"/>
 
     <androidx.constraintlayout.widget.Guideline
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:id="@+id/toolbar_bottom_guideline"
+        android:id="@+id/car_ui_toolbar_bottom_guideline"
         app:layout_constraintGuide_end="@dimen/car_ui_toolbar_bottom_inset"
         android:orientation="horizontal"/>
 
     <androidx.constraintlayout.widget.Guideline
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:id="@+id/toolbar_start_margin_guideline"
+        android:id="@+id/car_ui_toolbar_start_margin_guideline"
         app:layout_constraintGuide_begin="@dimen/car_ui_toolbar_margin"
         android:orientation="vertical"/>
 
@@ -66,7 +66,7 @@
         android:focusableInTouchMode="true"/>
 
     <androidx.constraintlayout.widget.Guideline
-        android:id="@+id/row_separator_guideline"
+        android:id="@+id/car_ui_toolbar_row_separator_guideline"
         android:layout_width="0dp"
         android:layout_height="0dp"
         android:orientation="horizontal"
@@ -74,32 +74,32 @@
 
     <!-- can't use 0dp for layout_height or the constraintlayout effect kicks in -->
     <View
-        android:id="@+id/row_separator"
+        android:id="@+id/car_ui_toolbar_row_separator"
         android:layout_width="match_parent"
         android:layout_height="0.01dp"
         style="@style/Widget.CarUi.Toolbar.SeparatorView"
-        app:layout_constraintTop_toBottomOf="@id/row_separator_guideline"
+        app:layout_constraintTop_toBottomOf="@id/car_ui_toolbar_row_separator_guideline"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintEnd_toEndOf="parent"/>
 
     <FrameLayout
-        android:id="@+id/nav_icon_container"
+        android:id="@+id/car_ui_toolbar_nav_icon_container"
         android:layout_width="0dp"
         android:layout_height="0dp"
         android:background="?android:attr/selectableItemBackground"
-        app:layout_constraintTop_toTopOf="@id/toolbar_top_guideline"
-        app:layout_constraintBottom_toTopOf="@id/row_separator"
-        app:layout_constraintStart_toStartOf="@id/toolbar_start_guideline"
-        app:layout_constraintEnd_toStartOf="@id/toolbar_start_margin_guideline">
+        app:layout_constraintTop_toTopOf="@id/car_ui_toolbar_top_guideline"
+        app:layout_constraintBottom_toTopOf="@id/car_ui_toolbar_row_separator"
+        app:layout_constraintStart_toStartOf="@id/car_ui_toolbar_start_guideline"
+        app:layout_constraintEnd_toStartOf="@id/car_ui_toolbar_start_margin_guideline">
         <ImageView
-            android:id="@+id/nav_icon"
+            android:id="@+id/car_ui_toolbar_nav_icon"
             android:layout_width="@dimen/car_ui_toolbar_icon_size"
             android:layout_height="@dimen/car_ui_toolbar_icon_size"
             android:layout_gravity="center"
             android:scaleType="fitXY"
             style="@style/Widget.CarUi.Toolbar.NavIcon"/>
         <ImageView
-            android:id="@+id/logo"
+            android:id="@+id/car_ui_toolbar_logo"
             android:layout_width="@dimen/car_ui_toolbar_icon_size"
             android:layout_height="@dimen/car_ui_toolbar_icon_size"
             android:layout_gravity="center"
@@ -107,46 +107,46 @@
     </FrameLayout>
 
     <TextView
-        android:id="@+id/title"
+        android:id="@+id/car_ui_toolbar_title"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginStart="@dimen/car_ui_toolbar_title_margin_start"
         android:singleLine="true"
         style="@style/TextAppearance.CarUi.Widget.Toolbar.Title"
-        app:layout_constraintTop_toTopOf="@id/toolbar_top_guideline"
-        app:layout_constraintBottom_toTopOf="@id/row_separator"
-        app:layout_constraintStart_toEndOf="@id/toolbar_start_margin_guideline"
-        app:layout_constraintEnd_toStartOf="@id/menu_items_container"/>
+        app:layout_constraintTop_toTopOf="@id/car_ui_toolbar_top_guideline"
+        app:layout_constraintBottom_toTopOf="@id/car_ui_toolbar_row_separator"
+        app:layout_constraintStart_toEndOf="@id/car_ui_toolbar_start_margin_guideline"
+        app:layout_constraintEnd_toStartOf="@id/car_ui_toolbar_menu_items_container"/>
 
     <com.android.car.ui.toolbar.SearchView
-        android:id="@+id/search_view"
+        android:id="@+id/car_ui_toolbar_search_view"
         android:layout_width="0dp"
         android:layout_height="match_parent"
         android:visibility="gone"
-        app:layout_constraintTop_toTopOf="@id/toolbar_top_guideline"
-        app:layout_constraintBottom_toTopOf="@id/row_separator"
-        app:layout_constraintStart_toEndOf="@id/nav_icon_container"
-        app:layout_constraintEnd_toStartOf="@id/menu_items_container"/>
+        app:layout_constraintTop_toTopOf="@id/car_ui_toolbar_top_guideline"
+        app:layout_constraintBottom_toTopOf="@id/car_ui_toolbar_row_separator"
+        app:layout_constraintStart_toEndOf="@id/car_ui_toolbar_nav_icon_container"
+        app:layout_constraintEnd_toStartOf="@id/car_ui_toolbar_menu_items_container"/>
 
     <FrameLayout
-        android:id="@+id/custom_view_container"
+        android:id="@+id/car_ui_toolbar_custom_view_container"
         android:layout_width="0dp"
         android:layout_height="0dp"
         android:visibility="gone"
-        app:layout_constraintTop_toTopOf="@id/toolbar_top_guideline"
-        app:layout_constraintBottom_toTopOf="@id/row_separator"
-        app:layout_constraintStart_toEndOf="@id/nav_icon_container"
-        app:layout_constraintEnd_toStartOf="@id/menu_items_container"/>
+        app:layout_constraintTop_toTopOf="@id/car_ui_toolbar_top_guideline"
+        app:layout_constraintBottom_toTopOf="@id/car_ui_toolbar_row_separator"
+        app:layout_constraintStart_toEndOf="@id/car_ui_toolbar_nav_icon_container"
+        app:layout_constraintEnd_toStartOf="@id/car_ui_toolbar_menu_items_container"/>
 
     <LinearLayout
-        android:id="@+id/menu_items_container"
+        android:id="@+id/car_ui_toolbar_menu_items_container"
         android:layout_width="wrap_content"
         android:layout_height="0dp"
         android:orientation="horizontal"
         android:divider="@drawable/car_ui_toolbar_menu_item_divider"
         android:showDividers="beginning|middle|end"
-        app:layout_constraintTop_toTopOf="@id/toolbar_top_guideline"
-        app:layout_constraintBottom_toTopOf="@id/row_separator"
+        app:layout_constraintTop_toTopOf="@id/car_ui_toolbar_top_guideline"
+        app:layout_constraintBottom_toTopOf="@id/car_ui_toolbar_row_separator"
         app:layout_constraintEnd_toStartOf="@id/car_ui_toolbar_overflow_button"/>
 
     <FrameLayout
@@ -156,9 +156,9 @@
         android:layout_marginLeft="@dimen/car_ui_toolbar_menu_item_margin"
         android:layout_marginRight="@dimen/car_ui_toolbar_menu_item_margin"
         android:visibility="gone"
-        app:layout_constraintTop_toTopOf="@id/toolbar_top_guideline"
-        app:layout_constraintBottom_toTopOf="@id/row_separator"
-        app:layout_constraintEnd_toEndOf="@id/toolbar_end_guideline">
+        app:layout_constraintTop_toTopOf="@id/car_ui_toolbar_top_guideline"
+        app:layout_constraintBottom_toTopOf="@id/car_ui_toolbar_row_separator"
+        app:layout_constraintEnd_toEndOf="@id/car_ui_toolbar_end_guideline">
         <ImageView
             android:src="@drawable/car_ui_icon_overflow_menu"
             android:layout_width="@dimen/car_ui_primary_icon_size"
@@ -170,15 +170,15 @@
     </FrameLayout>
 
     <com.android.car.ui.toolbar.TabLayout
-        android:id="@+id/tabs"
+        android:id="@+id/car_ui_toolbar_tabs"
         android:layout_width="match_parent"
         android:layout_height="@dimen/car_ui_toolbar_second_row_height"
-        app:layout_constraintTop_toBottomOf="@id/row_separator"
-        app:layout_constraintBottom_toTopOf="@id/toolbar_bottom_guideline"/>
+        app:layout_constraintTop_toBottomOf="@id/car_ui_toolbar_row_separator"
+        app:layout_constraintBottom_toTopOf="@id/car_ui_toolbar_bottom_guideline"/>
 
     <!-- can't use 0dp for layout_height or the constraintlayout effect kicks in -->
     <View
-        android:id="@+id/bottom_styleable"
+        android:id="@+id/car_ui_toolbar_bottom_styleable"
         android:layout_width="match_parent"
         android:layout_height="0.01dp"
         style="@style/Widget.CarUi.Toolbar.BottomView"
diff --git a/car-ui-lib/res/layout/car_ui_list_preference_dialog.xml b/car-ui-lib/res/layout/car_ui_list_preference_dialog.xml
new file mode 100644
index 0000000..b3c9855
--- /dev/null
+++ b/car-ui-lib/res/layout/car_ui_list_preference_dialog.xml
@@ -0,0 +1,36 @@
+<?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.
+  -->
+
+<FrameLayout
+    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="match_parent"
+    android:id="@+id/dialog_container">
+
+    <com.android.car.ui.recyclerview.CarUiRecyclerView
+        android:id="@+id/radio_list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+
+    <com.android.car.ui.toolbar.Toolbar
+        android:id="@+id/toolbar"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:state="subpage"/>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/car-ui-lib/res/layout/car_ui_radio_button_item.xml b/car-ui-lib/res/layout/car_ui_radio_button_item.xml
new file mode 100644
index 0000000..e6733b1
--- /dev/null
+++ b/car-ui-lib/res/layout/car_ui_radio_button_item.xml
@@ -0,0 +1,23 @@
+<?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.
+  -->
+
+
+<RadioButton
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/radio_button"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"/>
diff --git a/car-ui-lib/res/layout/car_ui_toolbar.xml b/car-ui-lib/res/layout/car_ui_toolbar.xml
index 870424c..c43a606 100644
--- a/car-ui-lib/res/layout/car_ui_toolbar.xml
+++ b/car-ui-lib/res/layout/car_ui_toolbar.xml
@@ -33,59 +33,59 @@
     <androidx.constraintlayout.widget.Guideline
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:id="@+id/toolbar_start_guideline"
+        android:id="@+id/car_ui_toolbar_start_guideline"
         app:layout_constraintGuide_begin="@dimen/car_ui_toolbar_start_inset"
         android:orientation="vertical"/>
 
     <androidx.constraintlayout.widget.Guideline
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:id="@+id/toolbar_top_guideline"
+        android:id="@+id/car_ui_toolbar_top_guideline"
         app:layout_constraintGuide_begin="@dimen/car_ui_toolbar_top_inset"
         android:orientation="horizontal"/>
 
     <androidx.constraintlayout.widget.Guideline
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:id="@+id/toolbar_end_guideline"
+        android:id="@+id/car_ui_toolbar_end_guideline"
         app:layout_constraintGuide_end="@dimen/car_ui_toolbar_end_inset"
         android:orientation="vertical"/>
 
     <androidx.constraintlayout.widget.Guideline
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:id="@+id/toolbar_bottom_guideline"
+        android:id="@+id/car_ui_toolbar_bottom_guideline"
         app:layout_constraintGuide_end="@dimen/car_ui_toolbar_bottom_inset"
         android:orientation="horizontal"/>
 
     <androidx.constraintlayout.widget.Guideline
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:id="@+id/toolbar_start_margin_guideline"
+        android:id="@+id/car_ui_toolbar_start_margin_guideline"
         app:layout_constraintGuide_begin="@dimen/car_ui_toolbar_margin"
         android:orientation="vertical"/>
 
     <!-- The horizontal bias here is so that when you set this view as GONE, it will be
          treated as if it's all the way to the left instead of centered in the margin -->
     <FrameLayout
-        android:id="@+id/nav_icon_container"
+        android:id="@+id/car_ui_toolbar_nav_icon_container"
         android:layout_width="0dp"
         android:layout_height="0dp"
         android:background="?android:attr/selectableItemBackground"
-        app:layout_constraintTop_toTopOf="@id/toolbar_top_guideline"
-        app:layout_constraintBottom_toTopOf="@id/toolbar_bottom_guideline"
-        app:layout_constraintStart_toEndOf="@id/toolbar_start_guideline"
-        app:layout_constraintEnd_toStartOf="@id/toolbar_start_margin_guideline"
+        app:layout_constraintTop_toTopOf="@id/car_ui_toolbar_top_guideline"
+        app:layout_constraintBottom_toTopOf="@id/car_ui_toolbar_bottom_guideline"
+        app:layout_constraintStart_toEndOf="@id/car_ui_toolbar_start_guideline"
+        app:layout_constraintEnd_toStartOf="@id/car_ui_toolbar_start_margin_guideline"
         app:layout_constraintHorizontal_bias="0.0">
         <ImageView
-            android:id="@+id/nav_icon"
+            android:id="@+id/car_ui_toolbar_nav_icon"
             android:layout_width="@dimen/car_ui_toolbar_icon_size"
             android:layout_height="@dimen/car_ui_toolbar_icon_size"
             android:layout_gravity="center"
             android:scaleType="fitXY"
             style="@style/Widget.CarUi.Toolbar.NavIcon"/>
         <ImageView
-            android:id="@+id/logo"
+            android:id="@+id/car_ui_toolbar_logo"
             android:layout_width="@dimen/car_ui_toolbar_icon_size"
             android:layout_height="@dimen/car_ui_toolbar_icon_size"
             android:layout_gravity="center"
@@ -93,46 +93,46 @@
     </FrameLayout>
 
     <TextView
-        android:id="@+id/title"
+        android:id="@+id/car_ui_toolbar_title"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginStart="@dimen/car_ui_toolbar_title_margin_start"
         android:singleLine="true"
         style="@style/TextAppearance.CarUi.Widget.Toolbar.Title"
-        app:layout_constraintTop_toTopOf="@id/toolbar_top_guideline"
-        app:layout_constraintBottom_toTopOf="@id/toolbar_bottom_guideline"
-        app:layout_constraintStart_toEndOf="@+id/toolbar_start_margin_guideline"
-        app:layout_constraintEnd_toStartOf="@+id/menu_items_container"/>
+        app:layout_constraintTop_toTopOf="@id/car_ui_toolbar_top_guideline"
+        app:layout_constraintBottom_toTopOf="@id/car_ui_toolbar_bottom_guideline"
+        app:layout_constraintStart_toEndOf="@+id/car_ui_toolbar_start_margin_guideline"
+        app:layout_constraintEnd_toStartOf="@+id/car_ui_toolbar_menu_items_container"/>
 
     <com.android.car.ui.toolbar.TabLayout
-        android:id="@+id/tabs"
+        android:id="@+id/car_ui_toolbar_tabs"
         android:layout_width="wrap_content"
         android:layout_height="0dp"
-        app:layout_constraintTop_toTopOf="@id/toolbar_top_guideline"
-        app:layout_constraintBottom_toTopOf="@id/toolbar_bottom_guideline"
-        app:layout_constraintStart_toEndOf="@+id/nav_icon_container"
-        app:layout_constraintEnd_toStartOf="@+id/menu_items_container"
+        app:layout_constraintTop_toTopOf="@id/car_ui_toolbar_top_guideline"
+        app:layout_constraintBottom_toTopOf="@id/car_ui_toolbar_bottom_guideline"
+        app:layout_constraintStart_toEndOf="@+id/car_ui_toolbar_nav_icon_container"
+        app:layout_constraintEnd_toStartOf="@+id/car_ui_toolbar_menu_items_container"
         app:layout_constraintHorizontal_bias="0.0"/>
 
     <FrameLayout
-        android:id="@+id/custom_view_container"
+        android:id="@+id/car_ui_toolbar_custom_view_container"
         android:layout_width="0dp"
         android:layout_height="0dp"
         android:visibility="gone"
-        app:layout_constraintTop_toTopOf="@id/toolbar_top_guideline"
-        app:layout_constraintBottom_toTopOf="@id/toolbar_bottom_guideline"
-        app:layout_constraintStart_toEndOf="@+id/nav_icon_container"
-        app:layout_constraintEnd_toStartOf="@+id/menu_items_container"/>
+        app:layout_constraintTop_toTopOf="@id/car_ui_toolbar_top_guideline"
+        app:layout_constraintBottom_toTopOf="@id/car_ui_toolbar_bottom_guideline"
+        app:layout_constraintStart_toEndOf="@+id/car_ui_toolbar_nav_icon_container"
+        app:layout_constraintEnd_toStartOf="@+id/car_ui_toolbar_menu_items_container"/>
 
     <LinearLayout
-        android:id="@+id/menu_items_container"
+        android:id="@+id/car_ui_toolbar_menu_items_container"
         android:layout_width="wrap_content"
         android:layout_height="0dp"
         android:orientation="horizontal"
         android:divider="@drawable/car_ui_toolbar_menu_item_divider"
         android:showDividers="beginning|middle|end"
-        app:layout_constraintTop_toTopOf="@id/toolbar_top_guideline"
-        app:layout_constraintBottom_toTopOf="@id/toolbar_bottom_guideline"
+        app:layout_constraintTop_toTopOf="@id/car_ui_toolbar_top_guideline"
+        app:layout_constraintBottom_toTopOf="@id/car_ui_toolbar_bottom_guideline"
         app:layout_constraintEnd_toStartOf="@+id/car_ui_toolbar_overflow_button"/>
 
     <FrameLayout
@@ -142,9 +142,9 @@
         android:layout_marginLeft="@dimen/car_ui_toolbar_menu_item_margin"
         android:layout_marginRight="@dimen/car_ui_toolbar_menu_item_margin"
         android:visibility="gone"
-        app:layout_constraintTop_toTopOf="@id/toolbar_top_guideline"
-        app:layout_constraintBottom_toTopOf="@id/toolbar_bottom_guideline"
-        app:layout_constraintEnd_toEndOf="@id/toolbar_end_guideline">
+        app:layout_constraintTop_toTopOf="@id/car_ui_toolbar_top_guideline"
+        app:layout_constraintBottom_toTopOf="@id/car_ui_toolbar_bottom_guideline"
+        app:layout_constraintEnd_toEndOf="@id/car_ui_toolbar_end_guideline">
         <ImageView
             android:src="@drawable/car_ui_icon_overflow_menu"
             android:layout_width="@dimen/car_ui_primary_icon_size"
@@ -156,32 +156,32 @@
     </FrameLayout>
 
     <com.android.car.ui.toolbar.SearchView
-        android:id="@+id/search_view"
+        android:id="@+id/car_ui_toolbar_search_view"
         android:layout_width="0dp"
         android:layout_height="match_parent"
         android:visibility="gone"
-        app:layout_constraintTop_toTopOf="@id/toolbar_top_guideline"
-        app:layout_constraintBottom_toTopOf="@id/toolbar_bottom_guideline"
-        app:layout_constraintStart_toEndOf="@+id/nav_icon_container"
-        app:layout_constraintEnd_toStartOf="@+id/menu_items_container"/>
+        app:layout_constraintTop_toTopOf="@id/car_ui_toolbar_top_guideline"
+        app:layout_constraintBottom_toTopOf="@id/car_ui_toolbar_bottom_guideline"
+        app:layout_constraintStart_toEndOf="@+id/car_ui_toolbar_nav_icon_container"
+        app:layout_constraintEnd_toStartOf="@+id/car_ui_toolbar_menu_items_container"/>
 
     <!-- can't use 0dp for layout_height or the constraintlayout effect kicks in -->
     <View
-        android:id="@+id/row_separator"
+        android:id="@+id/car_ui_toolbar_row_separator"
         android:layout_width="match_parent"
         android:layout_height="0.01dp"
         style="@style/Widget.CarUi.Toolbar.SeparatorView"
-        app:layout_constraintTop_toBottomOf="@id/toolbar_top_guideline"
+        app:layout_constraintTop_toBottomOf="@id/car_ui_toolbar_bottom_guideline"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintEnd_toEndOf="parent"/>
 
     <!-- can't use 0dp for layout_height or the constraintlayout effect kicks in -->
     <View
-        android:id="@+id/bottom_styleable"
+        android:id="@+id/car_ui_toolbar_bottom_styleable"
         android:layout_width="match_parent"
         android:layout_height="0.01dp"
         style="@style/Widget.CarUi.Toolbar.BottomView"
-        app:layout_constraintTop_toBottomOf="@+id/row_separator"
+        app:layout_constraintTop_toBottomOf="@+id/car_ui_toolbar_row_separator"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintEnd_toEndOf="parent"/>
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/car-ui-lib/res/layout/car_ui_search_view.xml b/car-ui-lib/res/layout/car_ui_toolbar_search_view.xml
similarity index 94%
rename from car-ui-lib/res/layout/car_ui_search_view.xml
rename to car-ui-lib/res/layout/car_ui_toolbar_search_view.xml
index 6878d6a..333d187 100644
--- a/car-ui-lib/res/layout/car_ui_search_view.xml
+++ b/car-ui-lib/res/layout/car_ui_toolbar_search_view.xml
@@ -20,7 +20,7 @@
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <EditText
-        android:id="@+id/search_bar"
+        android:id="@+id/car_ui_toolbar_search_bar"
         android:layout_height="match_parent"
         android:layout_width="match_parent"
         android:paddingStart="@dimen/car_ui_touch_target_width"
@@ -43,7 +43,7 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintStart_toStartOf="parent">
         <ImageView
-            android:id="@+id/icon"
+            android:id="@+id/car_ui_toolbar_search_icon"
             android:layout_width="@dimen/car_ui_primary_icon_size"
             android:layout_height="@dimen/car_ui_primary_icon_size"
             android:layout_gravity="center"
@@ -52,7 +52,7 @@
     </FrameLayout>
 
     <FrameLayout
-        android:id="@+id/search_close"
+        android:id="@+id/car_ui_toolbar_search_close"
         android:layout_width="@dimen/car_ui_touch_target_width"
         android:layout_height="@dimen/car_ui_touch_target_height"
         app:layout_constraintTop_toTopOf="parent"
diff --git a/car-ui-lib/res/layout/car_ui_tab_item.xml b/car-ui-lib/res/layout/car_ui_toolbar_tab_item.xml
similarity index 73%
rename from car-ui-lib/res/layout/car_ui_tab_item.xml
rename to car-ui-lib/res/layout/car_ui_toolbar_tab_item.xml
index b387ae3..91a010d 100644
--- a/car-ui-lib/res/layout/car_ui_tab_item.xml
+++ b/car-ui-lib/res/layout/car_ui_toolbar_tab_item.xml
@@ -18,15 +18,15 @@
 <merge
     xmlns:android="http://schemas.android.com/apk/res/android">
     <ImageView
-        android:id="@+id/car_ui_tab_item_icon"
-        android:layout_width="@dimen/car_ui_tab_icon_width"
-        android:layout_height="@dimen/car_ui_tab_icon_height"
+        android:id="@+id/car_ui_toolbar_tab_item_icon"
+        android:layout_width="@dimen/car_ui_toolbar_tab_icon_width"
+        android:layout_height="@dimen/car_ui_toolbar_tab_icon_height"
         android:scaleType="fitCenter"
-        android:tint="@color/car_ui_tab_item_selector"
+        android:tint="@color/car_ui_toolbar_tab_item_selector"
         android:tintMode="src_in"/>
     <TextView
-        android:id="@+id/car_ui_tab_item_text"
-        android:layout_width="@dimen/car_ui_tab_text_width"
+        android:id="@+id/car_ui_toolbar_tab_item_text"
+        android:layout_width="@dimen/car_ui_toolbar_tab_text_width"
         android:layout_height="wrap_content"
         android:singleLine="true"
         android:gravity="center"
diff --git a/car-ui-lib/res/values/bools.xml b/car-ui-lib/res/values/bools.xml
index 2e59118..548c87c 100644
--- a/car-ui-lib/res/values/bools.xml
+++ b/car-ui-lib/res/values/bools.xml
@@ -24,12 +24,9 @@
          true. -->
     <bool name="car_ui_scrollbar_above_recycler_view">true</bool>
 
-    <bool name="car_ui_preference_allow_divider_above">false</bool>
-    <bool name="car_ui_preference_allow_divider_below">false</bool>
-    <bool name="car_ui_preference_category_allow_divider_above">false</bool>
-    <bool name="car_ui_preference_category_allow_divider_below">false</bool>
-
     <bool name="car_ui_preference_switch_toggle_show_animation">true</bool>
     <bool name="car_ui_preference_switch_toggle_use_text_track">false</bool>
     <bool name="car_ui_preference_show_chevron">false</bool>
+
+    <bool name="car_ui_preference_list_show_full_screen">true</bool>
 </resources>
diff --git a/car-ui-lib/res/values/colors.xml b/car-ui-lib/res/values/colors.xml
index d4a78d7..ae35ba5 100644
--- a/car-ui-lib/res/values/colors.xml
+++ b/car-ui-lib/res/values/colors.xml
@@ -21,17 +21,10 @@
     <!-- The ripple color. -->
     <color name="car_ui_ripple_color">#27ffffff</color>
 
-    <!-- Tabs -->
-
-    <!-- Selected colors -->
-    <color name="car_ui_tab_selected_color">@color/car_ui_primary_text_color</color>
-    <!-- Normal colors -->
-    <color name="car_ui_tab_unselected_color">@color/car_ui_secondary_text_color</color>
-
     <!-- Toolbar -->
 
     <!-- Color used on the navigation icon -->
-    <color name="car_ui_nav_icon_color">@color/car_ui_primary_text_color</color>
+    <color name="car_ui_toolbar_nav_icon_color">@color/car_ui_primary_text_color</color>
     <!-- Text color applied to the hint displayed inside the search box -->
     <color name="car_ui_toolbar_search_hint_text_color">#33FFFFFF</color>
     <!-- Menu item colors -->
@@ -44,6 +37,10 @@
     <color name="car_ui_toolbar_menu_item_icon_background_disabled_color">@color/car_ui_toolbar_menu_item_icon_disabled_color</color>
     <color name="car_ui_toolbar_menu_item_icon_background_restricted_color">@color/car_ui_toolbar_menu_item_icon_restricted_color</color>
     <color name="car_ui_toolbar_menu_item_icon_background_activated_color">@color/car_ui_primary_text_color</color>
+    <!-- Tab selected color -->
+    <color name="car_ui_toolbar_tab_selected_color">@color/car_ui_primary_text_color</color>
+    <!-- Tab normal color -->
+    <color name="car_ui_toolbar_tab_unselected_color">@color/car_ui_secondary_text_color</color>
 
     <!-- Recycler View  -->
 
diff --git a/car-ui-lib/res/values/dimens.xml b/car-ui-lib/res/values/dimens.xml
index 5e7d7e6..72206d1 100644
--- a/car-ui-lib/res/values/dimens.xml
+++ b/car-ui-lib/res/values/dimens.xml
@@ -37,13 +37,13 @@
     <!-- Tabs -->
 
     <!-- Exact size of the tab textbox. Use @dimen/wrap_content if this must be flexible -->
-    <dimen name="car_ui_tab_text_width">135dp</dimen>
+    <dimen name="car_ui_toolbar_tab_text_width">135dp</dimen>
     <!-- Horizontal padding between tabs -->
-    <dimen name="car_ui_tab_padding_x">12dp</dimen>
+    <dimen name="car_ui_toolbar_tab_padding_x">12dp</dimen>
     <!-- Tab icon width (if icons are enabled) -->
-    <dimen name="car_ui_tab_icon_width">36dp</dimen>
+    <dimen name="car_ui_toolbar_tab_icon_width">36dp</dimen>
     <!-- Tab icon height (if icons are enabled) -->
-    <dimen name="car_ui_tab_icon_height">36dp</dimen>
+    <dimen name="car_ui_toolbar_tab_icon_height">36dp</dimen>
 
     <!-- Toolbar -->
     <dimen name="car_ui_toolbar_row_height">96dp</dimen>
diff --git a/car-ui-lib/res/values/styles.xml b/car-ui-lib/res/values/styles.xml
index 0a5bf88..70867ed 100644
--- a/car-ui-lib/res/values/styles.xml
+++ b/car-ui-lib/res/values/styles.xml
@@ -25,7 +25,7 @@
     <style name="Widget.CarUi.Toolbar"/>
 
     <style name="Widget.CarUi.Toolbar.NavIcon">
-        <item name="android:tint">@color/car_ui_nav_icon_color</item>
+        <item name="android:tint">@color/car_ui_toolbar_nav_icon_color</item>
         <item name="android:src">@drawable/car_ui_icon_arrow_back</item>
     </style>
 
@@ -55,12 +55,17 @@
         <item name="android:scrollbars">none</item>
     </style>
 
+    <style name="Preference.CarUi.ListPreference" parent="android:Theme.DeviceDefault.Dialog">
+        <item name="android:windowNoTitle">true</item>
+        <!-- Set this to true if you want Full Screen without status bar -->
+        <item name="android:windowFullscreen">true</item>
+        <item name="android:windowIsFloating">false</item>
+    </style>
+
     <!-- Preference Styles -->
 
     <style name="Preference.CarUi">
         <item name="android:layout">@layout/car_ui_preference</item>
-        <item name="allowDividerAbove">@bool/car_ui_preference_allow_divider_above</item>
-        <item name="allowDividerBelow">@bool/car_ui_preference_allow_divider_below</item>
     </style>
 
     <style name="Preference.CarUi.Category">
@@ -68,8 +73,6 @@
         <!-- The title should not dim if the category is disabled, instead only the preference children should dim. -->
         <item name="android:shouldDisableView">false</item>
         <item name="android:selectable">false</item>
-        <item name="allowDividerAbove">@bool/car_ui_preference_category_allow_divider_above</item>
-        <item name="allowDividerBelow">@bool/car_ui_preference_category_allow_divider_below</item>
     </style>
 
     <style name="Preference.CarUi.CheckBoxPreference">
@@ -113,6 +116,10 @@
         <item name="android:layout">@layout/car_ui_preference_fragment</item>
     </style>
 
+    <style name="RadioButton.CarUi" parent="android:Widget.DeviceDefault.Light.CompoundButton.RadioButton">
+        <item name="android:textAppearance">?android:attr/textAppearanceLarge</item>
+    </style>
+
     <style name="PreferenceFragmentList.CarUi">
         <item name="android:paddingTop">0dp</item>
         <item name="android:paddingBottom">0dp</item>
@@ -165,7 +172,7 @@
     <style name="TextAppearance.CarUi.Widget.Toolbar.Tab">
         <item name="android:textSize">24sp</item>
         <item name="android:letterSpacing">@dimen/car_ui_letter_spacing_body3</item>
-        <item name="android:textColor">@color/car_ui_tab_item_selector</item>
+        <item name="android:textColor">@color/car_ui_toolbar_tab_item_selector</item>
     </style>
 
 </resources>
diff --git a/car-ui-lib/res/values/themes.xml b/car-ui-lib/res/values/themes.xml
index 6574a31..70e6872 100644
--- a/car-ui-lib/res/values/themes.xml
+++ b/car-ui-lib/res/values/themes.xml
@@ -200,6 +200,8 @@
 
         <!-- Used by CarUiRecyclerView -->
         <item name="carUiRecyclerViewStyle">@style/Widget.CarUi.CarUiRecyclerView</item>
+
+        <item name="radioButtonStyle">@style/RadioButton.CarUi</item>
     </style>
 
     <style name="CarUiPreferenceTheme">
diff --git a/car-ui-lib/res/values/values.xml b/car-ui-lib/res/values/values.xml
index 2eb4d70..cca83de 100644
--- a/car-ui-lib/res/values/values.xml
+++ b/car-ui-lib/res/values/values.xml
@@ -19,9 +19,9 @@
     <!-- Toolbar -->
 
     <!-- Whether tabs should use flex layout or not -->
-    <bool name="car_ui_tab_flexible_layout">false</bool>
+    <bool name="car_ui_toolbar_tab_flexible_layout">false</bool>
     <!-- Layout to be used for toolbar tabs -->
-    <item name="car_ui_tab_item_layout" type="layout">@layout/car_ui_tab_item</item>
+    <item name="car_ui_toolbar_tab_item_layout" type="layout">@layout/car_ui_toolbar_tab_item</item>
 
     <!-- Preferences -->
 
diff --git a/car-ui-lib/src/com/android/car/ui/preference/CarUiRecyclerViewRadioButtonAdapter.java b/car-ui-lib/src/com/android/car/ui/preference/CarUiRecyclerViewRadioButtonAdapter.java
new file mode 100644
index 0000000..93c74dd
--- /dev/null
+++ b/car-ui-lib/src/com/android/car/ui/preference/CarUiRecyclerViewRadioButtonAdapter.java
@@ -0,0 +1,109 @@
+/*
+ * 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.
+ */
+
+package com.android.car.ui.preference;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.RadioButton;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.car.ui.R;
+
+import java.util.List;
+
+/**
+ * The adapter for the recyclerview containing radio buttons as the items.
+ */
+public class CarUiRecyclerViewRadioButtonAdapter extends
+        RecyclerView.Adapter<CarUiRecyclerViewRadioButtonAdapter.ViewHolder> {
+
+    /**
+     * Callback that will be issued after any radio button is clicked.
+     */
+    public interface OnRadioButtonClickedListener {
+        /**
+         * Will be called when radio button is clicked.
+         *
+         * @param position of the radio button.
+         */
+        void onClick(int position);
+    }
+
+    private OnRadioButtonClickedListener mOnRadioButtonClickedListener;
+
+    private List<String> mList;
+    private int mSelectedPosition = -1;
+
+    public CarUiRecyclerViewRadioButtonAdapter(List<String> list, int position) {
+        mList = list;
+        mSelectedPosition = position;
+    }
+
+    @Override
+    public CarUiRecyclerViewRadioButtonAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
+            int viewType) {
+        View view = LayoutInflater.from(parent.getContext())
+                .inflate(R.layout.car_ui_radio_button_item, parent, false);
+        return new CarUiRecyclerViewRadioButtonAdapter.ViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(CarUiRecyclerViewRadioButtonAdapter.ViewHolder holder,
+            int position) {
+        String entry = mList.get(position);
+        //since only one radio button is allowed to be selected,
+        // this condition un-checks previous selections
+        holder.mRadioButton.setChecked(mSelectedPosition == position);
+        holder.mRadioButton.setText(entry);
+    }
+
+    @Override
+    public int getItemCount() {
+        return mList.size();
+    }
+
+    /** Registers a new {@link OnRadioButtonClickedListener} listener. */
+    public void registerListener(OnRadioButtonClickedListener listener) {
+        mOnRadioButtonClickedListener = listener;
+    }
+
+    /** Unregisters a {@link OnRadioButtonClickedListener} listener\. */
+    public void unregisterOnBackListener(OnRadioButtonClickedListener listener) {
+        mOnRadioButtonClickedListener = null;
+    }
+
+    /** The viewholder class for recyclerview containing radio buttons. */
+    public class ViewHolder extends RecyclerView.ViewHolder {
+
+        public RadioButton mRadioButton;
+
+        public ViewHolder(View view) {
+            super(view);
+            mRadioButton = (RadioButton) view.findViewById(R.id.radio_button);
+
+            mRadioButton.setOnClickListener(v -> {
+                mSelectedPosition = getAdapterPosition();
+                notifyDataSetChanged();
+                if (mOnRadioButtonClickedListener != null) {
+                    mOnRadioButtonClickedListener.onClick(mSelectedPosition);
+                }
+            });
+        }
+    }
+}
diff --git a/car-ui-lib/src/com/android/car/ui/preference/ListPreferenceDialogFragment.java b/car-ui-lib/src/com/android/car/ui/preference/ListPreferenceDialogFragment.java
index 2d0a51d..2d68940 100644
--- a/car-ui-lib/src/com/android/car/ui/preference/ListPreferenceDialogFragment.java
+++ b/car-ui-lib/src/com/android/car/ui/preference/ListPreferenceDialogFragment.java
@@ -17,21 +17,37 @@
 package com.android.car.ui.preference;
 
 import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
 
 import androidx.annotation.NonNull;
+import androidx.fragment.app.DialogFragment;
 import androidx.preference.ListPreference;
 
+import com.android.car.ui.R;
+import com.android.car.ui.recyclerview.CarUiRecyclerView;
+import com.android.car.ui.toolbar.Toolbar;
+
+import java.util.ArrayList;
+
 /**
  * Presents a dialog with a list of options associated with a {@link ListPreference}.
  *
  * <p>Note: this is borrowed as-is from androidx.preference.ListPreferenceDialogFragmentCompat
  * with updates to formatting to match the project style. Automotive applications should use this
  * implementations in order to launch the system themed platform {@link AlertDialog} instead of the
- * one in the support library.
+ * one in the support library. In addition this list preference can be shown in a full screen
+ * dialog. Full screen dialog will have a custom layout returned by  {@link #onCreateDialogView} and
+ * the window size is changes in {@link #onStart()}.
  */
-public class ListPreferenceDialogFragment extends PreferenceDialogFragment {
+public class ListPreferenceDialogFragment extends PreferenceDialogFragment implements
+        Toolbar.OnBackListener, CarUiRecyclerViewRadioButtonAdapter.OnRadioButtonClickedListener {
 
     private static final String SAVE_STATE_INDEX = "ListPreferenceDialogFragment.index";
     private static final String SAVE_STATE_ENTRIES = "ListPreferenceDialogFragment.entries";
@@ -41,6 +57,9 @@
     private int mClickedDialogEntryIndex;
     private CharSequence[] mEntries;
     private CharSequence[] mEntryValues;
+    private View mDialogView;
+    private CarUiRecyclerView mCarUiRecyclerView;
+    private boolean mShowFullScreen;
 
     /**
      * Returns a new instance of {@link ListPreferenceDialogFragment} for the {@link
@@ -55,8 +74,14 @@
     }
 
     @Override
+    public View onCreateDialogView(Context context) {
+        return mShowFullScreen ? mDialogView : super.onCreateDialogView(context);
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+
         if (savedInstanceState == null) {
             ListPreference preference = getListPreference();
 
@@ -73,6 +98,52 @@
             mEntries = savedInstanceState.getCharSequenceArray(SAVE_STATE_ENTRIES);
             mEntryValues = savedInstanceState.getCharSequenceArray(SAVE_STATE_ENTRY_VALUES);
         }
+
+        mShowFullScreen = getContext().getResources().getBoolean(
+                R.bool.car_ui_preference_list_show_full_screen);
+        if (!mShowFullScreen) {
+            return;
+        }
+
+        setStyle(DialogFragment.STYLE_NORMAL, R.style.Preference_CarUi_ListPreference);
+        LayoutInflater inflater = LayoutInflater.from(getContext());
+        mDialogView = inflater.inflate(R.layout.car_ui_list_preference_dialog, null);
+
+        Toolbar toolbar = mDialogView.findViewById(R.id.toolbar);
+        toolbar.registerOnBackListener(this);
+
+        ArrayList<String> entries = new ArrayList<>();
+        for (int i = 0; i < mEntries.length; i++) {
+            entries.add(mEntries[i].toString());
+        }
+
+        mCarUiRecyclerView = mDialogView.findViewById(R.id.radio_list);
+        CarUiRecyclerViewRadioButtonAdapter adapter = new CarUiRecyclerViewRadioButtonAdapter(
+                entries, mClickedDialogEntryIndex);
+        mCarUiRecyclerView.setAdapter(adapter);
+        adapter.registerListener(this);
+
+        mDialogView.getViewTreeObserver()
+                .addOnGlobalLayoutListener(
+                        new ViewTreeObserver.OnGlobalLayoutListener() {
+                            @Override
+                            public void onGlobalLayout() {
+                                mDialogView.getViewTreeObserver()
+                                        .removeOnGlobalLayoutListener(this);
+                                int recyclerViewHeight =
+                                        getDialog().getWindow().getDecorView().getHeight();
+
+                                mCarUiRecyclerView.setPadding(mCarUiRecyclerView.getPaddingLeft(),
+                                        toolbar.getHeight(),
+                                        mCarUiRecyclerView.getPaddingRight(),
+                                        mCarUiRecyclerView.getPaddingBottom());
+
+                                ViewGroup.LayoutParams params =
+                                        mCarUiRecyclerView.getLayoutParams();
+                                params.height = recyclerViewHeight;
+                                mCarUiRecyclerView.setLayoutParams(params);
+                            }
+                        });
     }
 
     @Override
@@ -91,20 +162,31 @@
     protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
         super.onPrepareDialogBuilder(builder);
 
-        builder.setSingleChoiceItems(mEntries, mClickedDialogEntryIndex,
-                (dialog, which) -> {
-                    mClickedDialogEntryIndex = which;
+        if (mShowFullScreen) {
+            builder.setPositiveButton(null, null);
+            builder.setNegativeButton(null, null);
+            builder.setTitle(null);
+            return;
+        } else {
+            builder.setSingleChoiceItems(mEntries, mClickedDialogEntryIndex,
+                    (dialog, which) -> onClick(which));
 
-                    // Clicking on an item simulates the positive button click, and dismisses the
-                    // dialog.
-                    ListPreferenceDialogFragment.this.onClick(dialog,
-                            DialogInterface.BUTTON_POSITIVE);
-                    dialog.dismiss();
-                });
+            // The typical interaction for list-based dialogs is to have click-on-an-item dismiss
+            // the
+            // dialog instead of the user having to press 'Ok'.
+            builder.setPositiveButton(null, null);
+        }
+    }
 
-        // The typical interaction for list-based dialogs is to have click-on-an-item dismiss the
-        // dialog instead of the user having to press 'Ok'.
-        builder.setPositiveButton(null, null);
+    @Override
+    public void onStart() {
+        super.onStart();
+        Dialog dialog = getDialog();
+        if (dialog != null && mShowFullScreen) {
+            int width = ViewGroup.LayoutParams.MATCH_PARENT;
+            int height = ViewGroup.LayoutParams.MATCH_PARENT;
+            dialog.getWindow().setLayout(width, height);
+        }
     }
 
     @Override
@@ -118,4 +200,17 @@
         }
     }
 
+    @Override
+    public boolean onBack() {
+        onClick(getDialog(), DialogInterface.BUTTON_NEGATIVE);
+        getDialog().dismiss();
+        return true;
+    }
+
+    @Override
+    public void onClick(int position) {
+        mClickedDialogEntryIndex = position;
+        onClick(getDialog(), DialogInterface.BUTTON_POSITIVE);
+        getDialog().dismiss();
+    }
 }
diff --git a/car-ui-lib/src/com/android/car/ui/toolbar/SearchView.java b/car-ui-lib/src/com/android/car/ui/toolbar/SearchView.java
index 35898db..a62c0df 100644
--- a/car-ui-lib/src/com/android/car/ui/toolbar/SearchView.java
+++ b/car-ui-lib/src/com/android/car/ui/toolbar/SearchView.java
@@ -71,11 +71,11 @@
         super(context, attrs, defStyleAttr);
 
         LayoutInflater inflater = LayoutInflater.from(context);
-        inflater.inflate(R.layout.car_ui_search_view, this, true);
+        inflater.inflate(R.layout.car_ui_toolbar_search_view, this, true);
 
-        mSearchText = requireViewById(R.id.search_bar);
-        mIcon = requireViewById(R.id.icon);
-        mCloseIcon = requireViewById(R.id.search_close);
+        mSearchText = requireViewById(R.id.car_ui_toolbar_search_bar);
+        mIcon = requireViewById(R.id.car_ui_toolbar_search_icon);
+        mCloseIcon = requireViewById(R.id.car_ui_toolbar_search_close);
         mCloseIcon.setOnClickListener(view -> mSearchText.getText().clear());
 
         mSearchText.setOnFocusChangeListener(
diff --git a/car-ui-lib/src/com/android/car/ui/toolbar/TabLayout.java b/car-ui-lib/src/com/android/car/ui/toolbar/TabLayout.java
index 066da0f..c24b773 100644
--- a/car-ui-lib/src/com/android/car/ui/toolbar/TabLayout.java
+++ b/car-ui-lib/src/com/android/car/ui/toolbar/TabLayout.java
@@ -16,6 +16,7 @@
 package com.android.car.ui.toolbar;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.util.ArraySet;
@@ -80,7 +81,7 @@
     private final boolean mTabFlexibleLayout;
     private final int mTabPaddingX;
 
-    private final Set<Listener> mListeners;
+    private final Set<Listener> mListeners = new ArraySet<>();
 
     private final TabAdapter mTabAdapter;
 
@@ -94,12 +95,12 @@
 
     public TabLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
-        mListeners = new ArraySet<>();
+        Resources resources = context.getResources();
 
-        mTabPaddingX = context.getResources().getDimensionPixelSize(R.dimen.car_ui_tab_padding_x);
-        mTabFlexibleLayout = context.getResources().getBoolean(R.bool.car_ui_tab_flexible_layout);
+        mTabPaddingX = resources.getDimensionPixelSize(R.dimen.car_ui_toolbar_tab_padding_x);
+        mTabFlexibleLayout = resources.getBoolean(R.bool.car_ui_toolbar_tab_flexible_layout);
 
-        mTabAdapter = new TabAdapter(context, R.layout.car_ui_tab_item_layout, this);
+        mTabAdapter = new TabAdapter(context, R.layout.car_ui_toolbar_tab_item_layout, this);
     }
 
     /**
@@ -289,8 +290,8 @@
         private void presentTabItemView(int position, @NonNull View tabItemView) {
             Tab tab = mTabList.get(position);
 
-            ImageView iconView = tabItemView.findViewById(R.id.car_ui_tab_item_icon);
-            TextView textView = tabItemView.findViewById(R.id.car_ui_tab_item_text);
+            ImageView iconView = tabItemView.findViewById(R.id.car_ui_toolbar_tab_item_icon);
+            TextView textView = tabItemView.findViewById(R.id.car_ui_toolbar_tab_item_text);
 
             tabItemView.setOnClickListener(view -> selectTab(tab));
             tab.bindText(textView);
diff --git a/car-ui-lib/src/com/android/car/ui/toolbar/Toolbar.java b/car-ui-lib/src/com/android/car/ui/toolbar/Toolbar.java
index a028dcc..95da690 100644
--- a/car-ui-lib/src/com/android/car/ui/toolbar/Toolbar.java
+++ b/car-ui-lib/src/com/android/car/ui/toolbar/Toolbar.java
@@ -165,14 +165,14 @@
                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         inflater.inflate(getToolbarLayout(), this, true);
 
-        mTabLayout = requireViewById(R.id.tabs);
-        mNavIcon = requireViewById(R.id.nav_icon);
-        mLogo = requireViewById(R.id.logo);
-        mNavIconContainer = requireViewById(R.id.nav_icon_container);
-        mMenuItemsContainer = requireViewById(R.id.menu_items_container);
-        mTitle = requireViewById(R.id.title);
-        mSearchView = requireViewById(R.id.search_view);
-        mCustomViewContainer = requireViewById(R.id.custom_view_container);
+        mTabLayout = requireViewById(R.id.car_ui_toolbar_tabs);
+        mNavIcon = requireViewById(R.id.car_ui_toolbar_nav_icon);
+        mLogo = requireViewById(R.id.car_ui_toolbar_logo);
+        mNavIconContainer = requireViewById(R.id.car_ui_toolbar_nav_icon_container);
+        mMenuItemsContainer = requireViewById(R.id.car_ui_toolbar_menu_items_container);
+        mTitle = requireViewById(R.id.car_ui_toolbar_title);
+        mSearchView = requireViewById(R.id.car_ui_toolbar_search_view);
+        mCustomViewContainer = requireViewById(R.id.car_ui_toolbar_custom_view_container);
         mOverflowButton = requireViewById(R.id.car_ui_toolbar_overflow_button);
 
         TypedArray a = context.obtainStyledAttributes(
diff --git a/car-ui-lib/tests/robotests/src/com/android/car/ui/recyclerview/CarUiRecyclerViewTest.java b/car-ui-lib/tests/robotests/src/com/android/car/ui/recyclerview/CarUiRecyclerViewTest.java
index d8793d1..5b2a1e3 100644
--- a/car-ui-lib/tests/robotests/src/com/android/car/ui/recyclerview/CarUiRecyclerViewTest.java
+++ b/car-ui-lib/tests/robotests/src/com/android/car/ui/recyclerview/CarUiRecyclerViewTest.java
@@ -79,9 +79,9 @@
                 .inflate(R.layout.test_linear_car_ui_recycler_view, null);
 
         mCarUiRecyclerView = mView.findViewById(R.id.test_prv);
-        mCarUiRecyclerView.setAdapter(mAdapter);
 
-        assertThat(mCarUiRecyclerView.getLayoutManager()).isInstanceOf(LinearLayoutManager.class);
+        assertThat(mCarUiRecyclerView.getEffectiveLayoutManager()).isInstanceOf(
+                LinearLayoutManager.class);
     }
 
     @Test
@@ -90,9 +90,9 @@
                 .inflate(R.layout.test_grid_car_ui_recycler_view, null);
 
         mCarUiRecyclerView = mView.findViewById(R.id.test_prv);
-        mCarUiRecyclerView.setAdapter(mAdapter);
 
-        assertThat(mCarUiRecyclerView.getLayoutManager()).isInstanceOf(GridLayoutManager.class);
+        assertThat(mCarUiRecyclerView.getEffectiveLayoutManager()).isInstanceOf(
+                GridLayoutManager.class);
     }
 
     @Test
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 dacefa2..1a415c2 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
@@ -113,7 +113,7 @@
         mToolbar.setState(Toolbar.State.HOME);
         mToolbar.setLogo(R.drawable.test_ic_launcher);
 
-        assertThat(mToolbar.findViewById(R.id.logo).isShown()).isTrue();
+        assertThat(mToolbar.findViewById(R.id.car_ui_toolbar_logo).isShown()).isTrue();
     }
 
     @Test
@@ -121,7 +121,7 @@
         mToolbar.setState(Toolbar.State.SUBPAGE);
         mToolbar.setLogo(R.drawable.test_ic_launcher);
 
-        assertThat(mToolbar.findViewById(R.id.logo).isShown()).isFalse();
+        assertThat(mToolbar.findViewById(R.id.car_ui_toolbar_logo).isShown()).isFalse();
     }
 
     @Test
@@ -129,7 +129,7 @@
         mToolbar.setState(Toolbar.State.HOME);
         mToolbar.setLogo(0);
 
-        assertThat(mToolbar.findViewById(R.id.logo).isShown()).isFalse();
+        assertThat(mToolbar.findViewById(R.id.car_ui_toolbar_logo).isShown()).isFalse();
     }
 
     @Test
@@ -137,7 +137,7 @@
         mToolbar.setState(Toolbar.State.SUBPAGE);
         mToolbar.setLogo(0);
 
-        assertThat(mToolbar.findViewById(R.id.logo).isShown()).isFalse();
+        assertThat(mToolbar.findViewById(R.id.car_ui_toolbar_logo).isShown()).isFalse();
     }
 
     @Test
@@ -203,8 +203,7 @@
 
     @Test
     public void menuItems_whenClicked_shouldCallListener() {
-        assertThat(((ViewGroup) mToolbar.findViewById(R.id.menu_items_container)).getChildCount())
-                .isEqualTo(0);
+        assertThat(getMenuItemViewCount()).isEqualTo(0);
 
         Mutable<Boolean> button1Clicked = new Mutable<>(false);
         Mutable<Boolean> button2Clicked = new Mutable<>(false);
@@ -212,16 +211,13 @@
                 createMenuItem(i -> button1Clicked.value = true),
                 createMenuItem(i -> button2Clicked.value = true)));
 
-        assertThat(((ViewGroup) mToolbar.findViewById(R.id.menu_items_container)).getChildCount())
-                .isEqualTo(2);
+        assertThat(getMenuItemViewCount()).isEqualTo(2);
 
-        ((ViewGroup) mToolbar.findViewById(R.id.menu_items_container))
-                .getChildAt(0).performClick();
+        getMenuItemView(0).performClick();
 
         assertThat(button1Clicked.value).isTrue();
 
-        ((ViewGroup) mToolbar.findViewById(R.id.menu_items_container))
-                .getChildAt(1).performClick();
+        getMenuItemView(1).performClick();
 
         assertThat(button2Clicked.value).isTrue();
     }
@@ -232,13 +228,11 @@
                 createMenuItem(i -> { }),
                 createMenuItem(i -> { })));
 
-        assertThat(((ViewGroup) mToolbar.findViewById(R.id.menu_items_container)).getChildCount())
-                .isEqualTo(2);
+        assertThat(getMenuItemViewCount()).isEqualTo(2);
 
         mToolbar.setMenuItems(null);
 
-        assertThat(((ViewGroup) mToolbar.findViewById(R.id.menu_items_container)).getChildCount())
-                .isEqualTo(0);
+        assertThat(getMenuItemViewCount()).isEqualTo(0);
     }
 
     @Test
@@ -246,10 +240,7 @@
         MenuItem item = createMenuItem(i -> { });
         mToolbar.setMenuItems(Collections.singletonList(item));
 
-        View itemView = ((ViewGroup) mToolbar.findViewById(R.id.menu_items_container))
-                .getChildAt(0);
-
-        assertThat(itemView.isShown()).isTrue();
+        assertThat(getMenuItemView(0).isShown()).isTrue();
     }
 
     @Test
@@ -257,11 +248,8 @@
         MenuItem item = createMenuItem(i -> { });
         mToolbar.setMenuItems(Collections.singletonList(item));
 
-        View itemView = ((ViewGroup) mToolbar.findViewById(R.id.menu_items_container))
-                .getChildAt(0);
-
         item.setVisible(false);
-        assertThat(itemView.isShown()).isFalse();
+        assertThat(getMenuItemView(0).isShown()).isFalse();
     }
 
     @Test
@@ -269,12 +257,9 @@
         MenuItem item = createMenuItem(i -> { });
         mToolbar.setMenuItems(Collections.singletonList(item));
 
-        View itemView = ((ViewGroup) mToolbar.findViewById(R.id.menu_items_container))
-                .getChildAt(0);
-
         item.setVisible(false);
         item.setVisible(true);
-        assertThat(itemView.isShown()).isTrue();
+        assertThat(getMenuItemView(0).isShown()).isTrue();
     }
 
     @Test
@@ -284,16 +269,13 @@
                 createMenuItem(i -> { }));
         mToolbar.setMenuItems(menuItems);
 
-        assertThat(((ViewGroup) mToolbar.findViewById(R.id.menu_items_container)).getChildCount())
-                .isEqualTo(2);
+        assertThat(getMenuItemViewCount()).isEqualTo(2);
 
-        View firstMenuItemView = ((ViewGroup) mToolbar.findViewById(R.id.menu_items_container))
-                .getChildAt(0);
+        View firstMenuItemView = getMenuItemView(0);
 
         mToolbar.setMenuItems(menuItems);
 
-        assertThat(firstMenuItemView).isSameAs(((ViewGroup) mToolbar
-                .findViewById(R.id.menu_items_container)).getChildAt(0));
+        assertThat(firstMenuItemView).isSameAs(getMenuItemView(0));
     }
 
     @Test
@@ -305,10 +287,8 @@
         mToolbar.setShowMenuItemsWhileSearching(false);
         mToolbar.setState(Toolbar.State.SEARCH);
 
-        assertThat(((ViewGroup) mToolbar.findViewById(R.id.menu_items_container))
-                .getChildAt(0).isShown()).isFalse();
-        assertThat(((ViewGroup) mToolbar.findViewById(R.id.menu_items_container))
-                .getChildAt(1).isShown()).isFalse();
+        assertThat(getMenuItemView(0).isShown()).isFalse();
+        assertThat(getMenuItemView(1).isShown()).isFalse();
     }
 
     @Test
@@ -320,10 +300,8 @@
         mToolbar.setShowMenuItemsWhileSearching(true);
         mToolbar.setState(Toolbar.State.SEARCH);
 
-        assertThat(((ViewGroup) mToolbar.findViewById(R.id.menu_items_container))
-                .getChildAt(0).isShown()).isFalse();
-        assertThat(((ViewGroup) mToolbar.findViewById(R.id.menu_items_container))
-                .getChildAt(1).isShown()).isTrue();
+        assertThat(getMenuItemView(0).isShown()).isFalse();
+        assertThat(getMenuItemView(1).isShown()).isTrue();
     }
 
     private MenuItem createMenuItem(MenuItem.OnClickListener listener) {
@@ -333,8 +311,20 @@
                 .build();
     }
 
+    private int getMenuItemViewCount() {
+        return ((ViewGroup) mToolbar
+                .findViewById(R.id.car_ui_toolbar_menu_items_container))
+                .getChildCount();
+    }
+
+    private View getMenuItemView(int index) {
+        return ((ViewGroup) mToolbar
+                .findViewById(R.id.car_ui_toolbar_menu_items_container))
+                .getChildAt(index);
+    }
+
     private void pressBack() {
-        mToolbar.findViewById(R.id.nav_icon_container).performClick();
+        mToolbar.findViewById(R.id.car_ui_toolbar_nav_icon_container).performClick();
     }
 
     private static class Mutable<T> {