Merge "Add boot user override id to its own label" into qt-dev
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_left.xml
similarity index 100%
rename from tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_left.xml
rename to tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_left.xml
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_right.xml
similarity index 100%
rename from tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_right.xml
rename to tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_right.xml
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_sharp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_left.xml
similarity index 100%
rename from tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_sharp_left.xml
rename to tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_left.xml
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_sharp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_right.xml
similarity index 100%
rename from tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_sharp_right.xml
rename to tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_right.xml
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_slight_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_left.xml
similarity index 100%
rename from tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_slight_left.xml
rename to tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_left.xml
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_slight_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_right.xml
similarity index 100%
rename from tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_slight_right.xml
rename to tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_right.xml
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_straight.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_straight.xml
similarity index 100%
rename from tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_straight.xml
rename to tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_straight.xml
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw.xml
new file mode 100644
index 0000000..fe948fc
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw.xml
@@ -0,0 +1,7 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+    <group android:pivotX="10" android:scaleX="-1">
+        <path android:fillColor="#FF000000"
+              android:pathData="M5.5,10.002a.17879.17879,0,0,0,.27124.18866l1.47589-.67188a.1933.1933,0,0,1,.20471.31177l-2.45184,3.17145l-2.45184-3.1714900000000004a.1933.1933,0,0,1,.20471-.31177l1.476.67188a.17876.17876,0,0,0,.2711299999999994-.18862000000000023v-.002000000000000668a5.51888,5.51888,0,0,1,2.75293-4.76563l.5.86523a4.51856,4.51856,0,0,0-2.25293,3.9003999999999994v.002Zm6.75146-3.89941a4.51948,4.51948,0,0,1,2.24854,3.897409999999999h1a5.5223,5.5223,0,0,0-2.74756-4.7627l-.001440000000000552-.00006000000000039307a.17878.17878,0,0,1-.027789999999999537-.32923999999999953l1.3197899999999994-.9422400000000004a.19332.19332,0,0,0-.16766-.33319l-3.97247.53766l1.52063,3.70911a.19331.19331,0,0,0,.37238-.02142l.1561199999999996-1.6141500000000004a.17945.17945,0,0,1,.29945999999999984-.1412299999999993Zm.4954200000000011,8.663409999999999a.17879.17879,0,0,1,.299.14053l.1561,1.61412a.1933.1933,0,0,0,.37235.02141l1.520669999999999-3.709059999999999l-3.97245-.53766a.1933.1933,0,0,0-.16764.33317l1.31982.94225a.17879.17879,0,0,1-.02781.32923l.00361-.00254a4.57684,4.57684,0,0,1-4.502,0l-.501.86523a5.50442,5.50442,0,0,0,5.50391,0Z"/>
+    </group>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_left.xml
new file mode 100644
index 0000000..038da24
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_left.xml
@@ -0,0 +1,7 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+    <group android:pivotX="10" android:scaleX="-1">
+        <path android:fillColor="#FF000000"
+              android:pathData="M7,6.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.1999999999999993a3.20363,3.20363,0,0,0,3.2,3.1999999999999993m0-7.199999999999999a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm7.83777-5.45184a.1933.1933,0,0,0-.31177.20471l.67188,1.47589a.17881.17881,0,0,1-.18872.2712399999999988h-5.00916v.5a2.99994,2.99994,0,0,1-3,3h-.5v4h1v-3.030760000000001a4.0032,4.0032,0,0,0,3.469239999999999-3.469239999999999h4.03992a.17881.17881,0,0,1,.18872.27124l-.6718799999999998,1.4758899999999997a.1933.1933,0,0,0,.31177.20471l3.1713900000000024-2.4518400000000007Z"/>
+    </group>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_right.xml
new file mode 100644
index 0000000..a96201d
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_right.xml
@@ -0,0 +1,7 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+    <group android:pivotX="10" android:scaleX="-1">
+        <path android:fillColor="#FF000000"
+              android:pathData="M13,6.2a3.8,3.8,0,1,1-3.8000000000000007,3.8a3.80428,3.80428,0,0,1,3.8000000000000007-3.8m0,7a3.2,3.2,0,1,0-3.1999999999999993-3.1999999999999993a3.20363,3.20363,0,0,0,3.1999999999999993,3.1999999999999993m0-7.199999999999999a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm2.82861-5.82813a4.0315,4.0315,0,0,0-.542-.45459a4.078,4.078,0,0,0-5.11475.4541a3.96842,3.96842,0,0,0-1.141099999999998,2.328619999999999h-4.030760000000001a.17879.17879,0,0,1-.18866-.27124l.6718799999999998-1.4758899999999997a.1933.1933,0,0,0-.31177-.20471l-3.17145,2.4518400000000007l3.17145,2.45184a.1933.1933,0,0,0,.31177-.20471l-.6718799999999998-1.4758899999999997a.17879.17879,0,0,1,.1886599999999996-.2712400000000006h5v-.5a2.98063,2.98063,0,0,1,.87891-2.12158a3.06088,3.06088,0,0,1,3.83545-.34082a3.02248,3.02248,0,0,1,.40723.34131a2.99976,2.99976,0,0,1-2.1215899999999994,5.12109h-.5v4h1v-3.030760000000001a4.00038,4.00038,0,0,0,2.3286099999999994-6.797369999999999Z"/>
+    </group>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_sharp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_sharp_left.xml
new file mode 100644
index 0000000..da060af
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_sharp_left.xml
@@ -0,0 +1,7 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+    <group android:pivotX="10" android:scaleX="-1">
+        <path android:fillColor="#FF000000"
+              android:pathData="M8.97217,5.2a3.8,3.8,0,1,1-3.8,3.8a3.8043,3.8043,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.2a3.20362,3.20362,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm7.491,1.02374a.19328.19328,0,0,0-.36517-.07568l-.5685199999999995,1.5187399999999993a.17883.17883,0,0,1-.32526.05835l-.00018.00018l-3.75726-3.75726l-.35352.35352a2.98022,2.98022,0,0,1-2.121089999999999.8784100000000006h-.5v4h1v-3.030760000000001a3.95621,3.95621,0,0,0,1.95264-.80859l3.07312,3.07275a.17841.17841,0,0,1-.05914.324l-1.5186900000000012.5686000000000018a.1933.1933,0,0,0,.07568.36523l3.9762200000000014.5087699999999984Z"/>
+    </group>
+</vector>
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_sharp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_sharp_right.xml
new file mode 100644
index 0000000..91165f8
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_sharp_right.xml
@@ -0,0 +1,7 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+    <group android:pivotX="10" android:scaleX="-1">
+        <path android:fillColor="#FF000000"
+              android:pathData="M10.994,5.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.1999999999999993a3.20363,3.20363,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm2.8291-5.82813a4.03583,4.03583,0,0,0-.54248-.45459a4.07906,4.07906,0,0,0-5.11475.4541a4.00058,4.00058,0,0,0-.33252,5.28076l-3.0657700000000023,3.06578a.17873.17873,0,0,1-.325-.05847l-.5685799999999994-1.518740000000001a.19332.19332,0,0,0-.36523.07568l-.5087700000000002,3.9762600000000017l3.97626-.50879a.19332.19332,0,0,0,.07568-.36523l-1.5187400000000002-.5685500000000001a.17879.17879,0,0,1-.05835-.3252l-.00037-.00037l3.40378-3.40567l.33838-.353l-.34521-.34619a2.9995,2.9995,0,0,1,.0014699999999994162-4.241229999999998a3.06063,3.06063,0,0,1,3.83545-.34082a3.02673,3.02673,0,0,1,.40771.34131a3,3,0,0,1-2.1220599999999994,5.12109h-.5v4h1v-3.030760000000001a4.00076,4.00076,0,0,0,2.3290900000000008-6.797369999999999Z"/>
+    </group>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_slight_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_slight_left.xml
new file mode 100644
index 0000000..6bdd564
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_slight_left.xml
@@ -0,0 +1,7 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+    <group android:pivotX="10" android:scaleX="-1">
+        <path android:fillColor="#FF000000"
+              android:pathData="M8.97128,7.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.2a3.20363,3.20363,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm4.081189999999999-10.548729999999999a.19328.19328,0,0,0-.07568.36517l1.51874.5686a.17878.17878,0,0,1,.05835.3252l.00006.00006l-3.8150899999999996,3.8150899999999988l.35352.35352a2.99976,2.99976,0,0,1-2.1210999999999984,5.121090000000001h-.5v3.97917h1v-3.0099300000000007a4.00123,4.00123,0,0,0,2.66016-6.42236l3.1295699999999993-3.1295399999999978a.17878.17878,0,0,1,.3252.05835l.5684999999999985,1.5187400000000002a.19332.19332,0,0,0,.36523-.07574l.50879-3.9762Z"/>
+    </group>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_slight_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_slight_right.xml
new file mode 100644
index 0000000..00c0fa5
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_slight_right.xml
@@ -0,0 +1,7 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+    <group android:pivotX="10" android:scaleX="-1">
+        <path android:fillColor="#FF000000"
+              android:pathData="M10.97473,7.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.2a3.20363,3.20363,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm-5.499-9.20184a.17879.17879,0,0,1,.05835000000000079-.32515999999999945l1.51872-.5685899999999999a.1933.1933,0,0,0-.0757-.36521l-3.97624-.50881l.50881,3.97625a.1933.1933,0,0,0,.36521.0757l.56854-1.51872a.17879.17879,0,0,1,.32521-.05835m6.7061,9.464a4.00038,4.00038,0,0,0,2.32861-6.79736a4.0315,4.0315,0,0,0-.542-.45459a4.07671,4.07671,0,0,0-4.73975.12256l-3.75294-3.749l-.707.708l4.439,4.43311l.353-.35352a3.05971,3.05971,0,0,1,3.83545-.34082a3.02248,3.02248,0,0,1,.40723.34131a2.99976,2.99976,0,0,1-2.1216100000000004,5.121040000000001h-.5v4h1v-3.030760000000001Z"/>
+    </group>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_straight.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_straight.xml
new file mode 100644
index 0000000..0961145
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_straight.xml
@@ -0,0 +1,7 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+    <group android:pivotX="10" android:scaleX="-1">
+        <path android:fillColor="#FF000000"
+              android:pathData="M10,8.2a3.8,3.8,0,1,1-3.8,3.8000000000000007a3.80427,3.80427,0,0,1,3.8-3.8000000000000007m0,7a3.2,3.2,0,1,0-3.2-3.1999999999999993a3.20363,3.20363,0,0,0,3.2,3.1999999999999993m0-7.199999999999999a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm2.83057-5.82666a3.97135,3.97135,0,0,0-2.33057-1.1425799999999988v-3.0266100000000007a.17881.17881,0,0,1,.27124-.18872l1.4758899999999997.6718700000000002a.19329.19329,0,0,0,.20471-.31177l-2.4518400000000007-3.17138l-2.45184,3.1713899999999997a.1933.1933,0,0,0,.20471.31177l1.476-.67187a.17879.17879,0,0,1,.2711299999999994.18871000000000038v3.99585h.5a3,3,0,1,1,0,6h-.5v3h1v-2.030760000000001a4.00076,4.00076,0,0,0,2.33057-6.7959Z"/>
+    </group>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_uturn.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_left.xml
similarity index 100%
rename from tests/DirectRenderingClusterSample/res/drawable/direction_uturn.xml
rename to tests/DirectRenderingClusterSample/res/drawable/direction_uturn_left.xml
diff --git a/tests/DirectRenderingClusterSample/res/layout/include_navigation_state.xml b/tests/DirectRenderingClusterSample/res/layout/include_navigation_state.xml
index 23b8ff3..8f1196a 100644
--- a/tests/DirectRenderingClusterSample/res/layout/include_navigation_state.xml
+++ b/tests/DirectRenderingClusterSample/res/layout/include_navigation_state.xml
@@ -4,12 +4,24 @@
               android:layout_height="match_parent"
               android:orientation="horizontal">
 
-    <ImageView
-        android:id="@+id/maneuver"
-        android:layout_width="@dimen/maneuver_width"
-        android:layout_height="@dimen/maneuver_height"
-        android:layout_margin="@dimen/maneuver_margin"
-        android:tint="@android:color/white"/>
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+        <ImageView
+            android:id="@+id/maneuver"
+            android:layout_width="@dimen/maneuver_width"
+            android:layout_height="@dimen/maneuver_height"
+            android:layout_marginLeft="@dimen/maneuver_margin"
+            android:layout_marginRight="@dimen/maneuver_margin"
+            android:tint="@android:color/white"/>
+        <ImageView
+            android:id="@+id/provided_maneuver"
+            android:layout_width="@dimen/provided_maneuver_width"
+            android:layout_height="@dimen/provided_maneuver_height"
+            android:layout_gravity="center"/>
+    </LinearLayout>
 
     <LinearLayout
         android:layout_width="match_parent"
@@ -64,5 +76,11 @@
                 android:ellipsize="end"
                 android:textSize="@dimen/segment_text_size"/>
         </LinearLayout>
+
+        <android.car.cluster.sample.LaneView
+            android:id="@+id/provided_lane"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/provided_laneview_height"
+            android:layout_marginLeft="@dimen/distance_width"/>
     </LinearLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/values/dimens.xml b/tests/DirectRenderingClusterSample/res/values/dimens.xml
index 34a8a53..9ada025 100644
--- a/tests/DirectRenderingClusterSample/res/values/dimens.xml
+++ b/tests/DirectRenderingClusterSample/res/values/dimens.xml
@@ -16,7 +16,7 @@
     <dimen name="gear_text_size">28sp</dimen>
     <dimen name="gear_icon_margin">5dp</dimen>
     <!-- Information space -->
-    <dimen name="info_height">80dp</dimen>
+    <dimen name="info_height">100dp</dimen>
     <dimen name="info_label_text_size">10sp</dimen>
     <dimen name="info_value_text_size">20sp</dimen>
 
@@ -28,6 +28,8 @@
     <dimen name="maneuver_width">60dp</dimen>
     <dimen name="maneuver_height">60dp</dimen>
     <dimen name="maneuver_margin">8dp</dimen>
+    <dimen name="provided_maneuver_width">30dp</dimen>
+    <dimen name="provided_maneuver_height">30dp</dimen>
     <!-- Distance -->
     <dimen name="distance_width">125dp</dimen>
     <dimen name="distance_text_size">20sp</dimen>
@@ -40,6 +42,7 @@
     <dimen name="cue_text_size">15sp</dimen>
     <!-- Lane -->
     <dimen name="laneview_height">25dp</dimen>
+    <dimen name="provided_laneview_height">25dp</dimen>
     <dimen name="lane_width">50dp</dimen>
     <dimen name="lane_height">50dp</dimen>
 
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/LaneView.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/LaneView.java
index ff021de..1181fa2 100644
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/LaneView.java
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/LaneView.java
@@ -23,10 +23,13 @@
 import android.graphics.PorterDuffColorFilter;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.VectorDrawable;
+import android.os.Handler;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
+import androidx.car.cluster.navigation.ImageReference;
 import androidx.car.cluster.navigation.Lane;
 import androidx.car.cluster.navigation.LaneDirection;
 
@@ -37,6 +40,10 @@
  * View component that displays the Lane preview information on the instrument cluster display
  */
 public class LaneView extends LinearLayout {
+    private static final String TAG = "Cluster.LaneView";
+
+    private Handler mHandler = new Handler();
+
     private ArrayList<Lane> mLanes;
 
     private final int mWidth = (int) getResources().getDimension(R.dimen.lane_width);
@@ -61,10 +68,32 @@
         super(context, attrs, defStyleAttr);
     }
 
+    public void setLanes(ImageReference imageReference, ImageResolver imageResolver) {
+        imageResolver
+                .getBitmap(imageReference, 0, getHeight())
+                .thenAccept(bitmap -> {
+                    mHandler.post(() -> {
+                        removeAllViews();
+                        ImageView imgView = new ImageView(getContext());
+                        imgView.setImageBitmap(bitmap);
+                        imgView.setAdjustViewBounds(true);
+                        addView(imgView);
+                    });
+                })
+                .exceptionally(ex -> {
+                    removeAllViews();
+                    if (Log.isLoggable(TAG, Log.DEBUG)) {
+                        Log.d(TAG, "Unable to fetch image for lane: " + imageReference);
+                    }
+                    return null;
+                });
+    }
+
     public void setLanes(List<Lane> lanes) {
         mLanes = new ArrayList<>(lanes);
         removeAllViews();
 
+        // Use drawables for lane directional guidance
         for (Lane lane : mLanes) {
             Bitmap bitmap = combineBitmapFromLane(lane);
             ImageView imgView = new ImageView(getContext());
@@ -203,7 +232,7 @@
             case SHARP_RIGHT:
                 return mContext.getDrawable(R.drawable.direction_turn_sharp_right);
             case U_TURN_LEFT:
-                return mContext.getDrawable(R.drawable.direction_uturn);
+                return mContext.getDrawable(R.drawable.direction_uturn_left);
             case U_TURN_RIGHT:
                 return mContext.getDrawable(R.drawable.direction_uturn_right);
         }
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavStateController.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavStateController.java
index 1e4ba96..bb39e63 100644
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavStateController.java
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavStateController.java
@@ -18,6 +18,7 @@
 import android.annotation.Nullable;
 import android.content.Context;
 import android.graphics.drawable.Drawable;
+import android.os.Handler;
 import android.util.Log;
 import android.view.View;
 import android.widget.ImageView;
@@ -26,6 +27,7 @@
 import androidx.car.cluster.navigation.Destination;
 import androidx.car.cluster.navigation.Destination.Traffic;
 import androidx.car.cluster.navigation.Distance;
+import androidx.car.cluster.navigation.ImageReference;
 import androidx.car.cluster.navigation.Maneuver;
 import androidx.car.cluster.navigation.NavigationState;
 import androidx.car.cluster.navigation.Segment;
@@ -40,8 +42,12 @@
 public class NavStateController {
     private static final String TAG = "Cluster.NavController";
 
+    private Handler mHandler = new Handler();
+
     private ImageView mManeuver;
+    private ImageView mProvidedManeuver;
     private LaneView mLane;
+    private LaneView mProvidedLane;
     private TextView mDistance;
     private TextView mSegment;
     private TextView mEta;
@@ -57,7 +63,9 @@
      */
     public NavStateController(View container) {
         mManeuver = container.findViewById(R.id.maneuver);
+        mProvidedManeuver = container.findViewById(R.id.provided_maneuver);
         mLane = container.findViewById(R.id.lane);
+        mProvidedLane = container.findViewById(R.id.provided_lane);
         mDistance = container.findViewById(R.id.distance);
         mSegment = container.findViewById(R.id.segment);
         mEta = container.findViewById(R.id.eta);
@@ -86,15 +94,21 @@
         mEta.setText(eta != null ? formatEta(eta) : null);
         mEta.setTextColor(getTrafficColor(traffic));
         mManeuver.setImageDrawable(getManeuverIcon(step != null ? step.getManeuver() : null));
+        setProvidedManeuverIcon(mProvidedManeuver,
+                step != null ? step.getManeuver().getIcon() : null);
         mDistance.setText(formatDistance(step != null ? step.getDistance() : null));
         mSegment.setText(state != null ? getSegmentString(state.getCurrentSegment()) : null);
         mCue.setRichText(step != null ? step.getCue() : null, mImageResolver);
 
         if (step != null && step.getLanes().size() > 0) {
+            mProvidedLane.setLanes(step.getLanesImage(), mImageResolver);
+            mProvidedLane.setVisibility(View.VISIBLE);
+
             mLane.setLanes(step.getLanes());
             mLane.setVisibility(View.VISIBLE);
         } else {
             mLane.setVisibility(View.GONE);
+            mProvidedLane.setVisibility(View.GONE);
         }
     }
 
@@ -138,6 +152,27 @@
         return null;
     }
 
+    private void setProvidedManeuverIcon(ImageView view, ImageReference imageReference) {
+        if (mImageResolver == null || imageReference == null) {
+            view.setImageBitmap(null);
+            return;
+        }
+
+        mImageResolver
+                .getBitmap(imageReference, 0, view.getHeight())
+                .thenAccept(bitmap -> {
+                    mHandler.post(() -> {
+                        view.setImageBitmap(bitmap);
+                    });
+                })
+                .exceptionally(ex -> {
+                    if (Log.isLoggable(TAG, Log.DEBUG)) {
+                        Log.d(TAG, "Unable to fetch image for maneuver: " + imageReference);
+                    }
+                    return null;
+                });
+    }
+
     private Drawable getManeuverIcon(@Nullable Maneuver maneuver) {
         if (maneuver == null) {
             return null;
@@ -166,7 +201,7 @@
             case TURN_SHARP_RIGHT:
                 return mContext.getDrawable(R.drawable.direction_turn_sharp_right);
             case U_TURN_LEFT:
-                return mContext.getDrawable(R.drawable.direction_uturn);
+                return mContext.getDrawable(R.drawable.direction_uturn_left);
             case U_TURN_RIGHT:
                 return mContext.getDrawable(R.drawable.direction_uturn_right);
             case ON_RAMP_SLIGHT_LEFT:
@@ -182,7 +217,7 @@
             case ON_RAMP_SHARP_RIGHT:
                 return mContext.getDrawable(R.drawable.direction_on_ramp_sharp_right);
             case ON_RAMP_U_TURN_LEFT:
-                return mContext.getDrawable(R.drawable.direction_uturn);
+                return mContext.getDrawable(R.drawable.direction_uturn_left);
             case ON_RAMP_U_TURN_RIGHT:
                 return mContext.getDrawable(R.drawable.direction_uturn_right);
             case OFF_RAMP_SLIGHT_LEFT:
@@ -206,37 +241,37 @@
             case ROUNDABOUT_EXIT:
                 return mContext.getDrawable(R.drawable.direction_roundabout);
             case ROUNDABOUT_ENTER_AND_EXIT_CW_SHARP_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_roundabout_sharp_right);
+                return mContext.getDrawable(R.drawable.direction_roundabout_cw_sharp_right);
             case ROUNDABOUT_ENTER_AND_EXIT_CW_NORMAL_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_roundabout_right);
+                return mContext.getDrawable(R.drawable.direction_roundabout_cw_right);
             case ROUNDABOUT_ENTER_AND_EXIT_CW_SLIGHT_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_roundabout_slight_right);
+                return mContext.getDrawable(R.drawable.direction_roundabout_cw_slight_right);
             case ROUNDABOUT_ENTER_AND_EXIT_CW_STRAIGHT:
-                return mContext.getDrawable(R.drawable.direction_roundabout_straight);
+                return mContext.getDrawable(R.drawable.direction_roundabout_cw_straight);
             case ROUNDABOUT_ENTER_AND_EXIT_CW_SHARP_LEFT:
-                return mContext.getDrawable(R.drawable.direction_roundabout_sharp_left);
+                return mContext.getDrawable(R.drawable.direction_roundabout_cw_sharp_left);
             case ROUNDABOUT_ENTER_AND_EXIT_CW_NORMAL_LEFT:
-                return mContext.getDrawable(R.drawable.direction_roundabout_left);
+                return mContext.getDrawable(R.drawable.direction_roundabout_cw_left);
             case ROUNDABOUT_ENTER_AND_EXIT_CW_SLIGHT_LEFT:
-                return mContext.getDrawable(R.drawable.direction_roundabout_slight_left);
+                return mContext.getDrawable(R.drawable.direction_roundabout_cw_slight_left);
             case ROUNDABOUT_ENTER_AND_EXIT_CW_U_TURN:
                 return mContext.getDrawable(R.drawable.direction_uturn_right);
             case ROUNDABOUT_ENTER_AND_EXIT_CCW_SHARP_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_roundabout_sharp_right);
+                return mContext.getDrawable(R.drawable.direction_roundabout_ccw_sharp_right);
             case ROUNDABOUT_ENTER_AND_EXIT_CCW_NORMAL_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_roundabout_right);
+                return mContext.getDrawable(R.drawable.direction_roundabout_ccw_right);
             case ROUNDABOUT_ENTER_AND_EXIT_CCW_SLIGHT_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_roundabout_slight_right);
+                return mContext.getDrawable(R.drawable.direction_roundabout_ccw_slight_right);
             case ROUNDABOUT_ENTER_AND_EXIT_CCW_STRAIGHT:
-                return mContext.getDrawable(R.drawable.direction_roundabout_straight);
+                return mContext.getDrawable(R.drawable.direction_roundabout_ccw_straight);
             case ROUNDABOUT_ENTER_AND_EXIT_CCW_SHARP_LEFT:
-                return mContext.getDrawable(R.drawable.direction_roundabout_sharp_left);
+                return mContext.getDrawable(R.drawable.direction_roundabout_ccw_sharp_left);
             case ROUNDABOUT_ENTER_AND_EXIT_CCW_NORMAL_LEFT:
-                return mContext.getDrawable(R.drawable.direction_roundabout_left);
+                return mContext.getDrawable(R.drawable.direction_roundabout_ccw_left);
             case ROUNDABOUT_ENTER_AND_EXIT_CCW_SLIGHT_LEFT:
-                return mContext.getDrawable(R.drawable.direction_roundabout_slight_left);
+                return mContext.getDrawable(R.drawable.direction_roundabout_ccw_slight_left);
             case ROUNDABOUT_ENTER_AND_EXIT_CCW_U_TURN:
-                return mContext.getDrawable(R.drawable.direction_uturn);
+                return mContext.getDrawable(R.drawable.direction_uturn_left);
             case STRAIGHT:
                 return mContext.getDrawable(R.drawable.direction_continue);
             case FERRY_BOAT:
@@ -262,7 +297,7 @@
 
         String unit = "";
 
-        switch(distance.getDisplayUnit()){
+        switch (distance.getDisplayUnit()) {
             case METERS:
                 unit = "m";
                 break;
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java
index 871d93f..ba64ce5 100644
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java
@@ -284,18 +284,9 @@
         Log.i(TAG, "Casting stopped");
     }
 
-    private synchronized void restart() {
-        // This method could be called from different threads when receiver has disconnected.
-        if (mHandler.hasMessages(MSG_START)) return;
-        mHandler.sendMessage(Message.obtain(mHandler, MSG_STOP));
-        mHandler.sendMessage(Message.obtain(mHandler, MSG_START));
-    }
-
     private class BroadcastThreadHandler extends Handler {
         private static final int MAX_FAIL_COUNT = 10;
         private int mFailConnectCounter;
-        private SocketThread mSocketThread;
-        private PipeThread mPipeThread;
 
         BroadcastThreadHandler(Looper looper) {
             super(looper);
@@ -306,6 +297,13 @@
             switch (msg.what) {
                 case MSG_START:
                     Log.i(TAG, "Received start message");
+
+                    // Make sure mActiveThread cannot start multiple times
+                    if (mActiveThread != null) {
+                        Log.w(TAG, "Trying to start a running thread. Race condition may exist");
+                        break;
+                    }
+
                     // Failure to connect to either pipe or network returns null
                     if (mActiveThread == null) {
                         mActiveThread = tryPipeConnect();
@@ -324,10 +322,16 @@
                         mHandler.sendMessage(Message.obtain(mHandler, MSG_START));
                         break;
                     }
-                    mFailConnectCounter = 0;
-                    mCounter.clientsConnected++;
-                    mActiveThread.start();
-                    startCasting(this);
+
+                    try {
+                        mFailConnectCounter = 0;
+                        mCounter.clientsConnected++;
+                        mActiveThread.start();
+                        startCasting(this);
+                    } catch (Exception e) {
+                        Log.e(TAG, "Failed to start thread", e);
+                        Log.e(TAG, "DebugCounter: " + mCounter);
+                    }
                     break;
 
                 case MSG_STOP:
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java
index 2c7f0d6..9def7ee 100644
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java
@@ -16,11 +16,14 @@
 package android.car.cluster.sample;
 import android.os.Handler;
 import android.os.Message;
+import android.util.Log;
 
 /**
  * This class serves as a template for sending to specific clients of the broadcaster.
  */
 public abstract class SenderThread extends Thread {
+    private static final String TAG = "Cluster.SenderThread";
+
     private Handler mHandler;
 
     SenderThread(Handler handler) {
@@ -34,8 +37,10 @@
      * Tells the broadcasting thread to stop and close everything in progress, and start over again.
      * It will kill the current instance of this thread, and produce a new one.
      */
-    void restart() {
+    synchronized void restart() {
         if (mHandler.hasMessages(NetworkedVirtualDisplay.MSG_START)) return;
+        Log.i(TAG, "Sending STOP and START msgs to NetworkedVirtualDisplay");
+
         mHandler.sendMessage(Message.obtain(mHandler, NetworkedVirtualDisplay.MSG_STOP));
         mHandler.sendMessage(Message.obtain(mHandler, NetworkedVirtualDisplay.MSG_START));
     }
diff --git a/tests/EmbeddedKitchenSinkApp/res/raw/nav_state_data.json b/tests/EmbeddedKitchenSinkApp/res/raw/nav_state_data.json
index d51a341..414cc2d 100644
--- a/tests/EmbeddedKitchenSinkApp/res/raw/nav_state_data.json
+++ b/tests/EmbeddedKitchenSinkApp/res/raw/nav_state_data.json
@@ -16,8 +16,11 @@
               "mText": "Stay on"
             },
             {
+              "mText": "US 101",
               "mImage": {
-                "mContentUri": "content://com.google.android.car.kitchensink.cluster.clustercontentprovider/img/US_101.png"
+                "mContentUri": "content://com.google.android.car.kitchensink.cluster.clustercontentprovider/img/US_101.png",
+                "mOriginalWidth": 60,
+                "mOriginalHeight": 52
               }
             },
             {