Merge "Update to use inline Mockito so we can mock Final class" into qt-dev
diff --git a/car-cluster-logging-renderer/Android.mk b/car-cluster-logging-renderer/Android.mk
deleted file mode 100644
index 5d88b48..0000000
--- a/car-cluster-logging-renderer/Android.mk
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright (C) 2015 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.
-#
-#
-ifneq ($(TARGET_BUILD_PDK),true)
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := android.car.cluster.loggingrenderer
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-# Each update should be signed by OEMs
-LOCAL_CERTIFICATE := platform
-LOCAL_PRIVILEGED_MODULE := true
-
-LOCAL_PROGUARD_FLAG_FILES := proguard.flags
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_JAVA_LIBRARIES += android.car
-
-LOCAL_STATIC_ANDROID_LIBRARIES += \
-    androidx.car_car-cluster
-
-LOCAL_REQUIRED_MODULES := privapp_whitelist_android.car.cluster.loggingrenderer
-
-include $(BUILD_PACKAGE)
-endif
diff --git a/car-cluster-logging-renderer/AndroidManifest.xml b/car-cluster-logging-renderer/AndroidManifest.xml
deleted file mode 100644
index 81fa46d..0000000
--- a/car-cluster-logging-renderer/AndroidManifest.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="android.car.cluster.loggingrenderer"
-      android:sharedUserId="android.uid.system"
-      android:versionCode="1"
-      android:versionName="1.0">
-
-    <protected-broadcast android:name="android.car.cluster.NAVIGATION_STATE_UPDATE"/>
-
-    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/>
-
-    <application android:label="@string/app_name"
-                 android:icon="@drawable/ic_launcher"
-                 android:directBootAware="true"
-                 android:persistent="true">
-        <service android:name=".LoggingClusterRenderingService"
-                 android:exported="false"
-                 android:permission="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"
-        />
-    </application>
-</manifest>
diff --git a/car-cluster-logging-renderer/proguard.flags b/car-cluster-logging-renderer/proguard.flags
deleted file mode 100644
index 22cc22d..0000000
--- a/car-cluster-logging-renderer/proguard.flags
+++ /dev/null
@@ -1,3 +0,0 @@
--verbose
--keep @com.android.internal.annotations.VisibleForTesting class *
-
diff --git a/car-cluster-logging-renderer/res/drawable-hdpi/ic_launcher.png b/car-cluster-logging-renderer/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 96a442e..0000000
--- a/car-cluster-logging-renderer/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/car-cluster-logging-renderer/res/drawable-ldpi/ic_launcher.png b/car-cluster-logging-renderer/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 9923872..0000000
--- a/car-cluster-logging-renderer/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/car-cluster-logging-renderer/res/drawable-mdpi/ic_launcher.png b/car-cluster-logging-renderer/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index 359047d..0000000
--- a/car-cluster-logging-renderer/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/car-cluster-logging-renderer/res/drawable-xhdpi/ic_launcher.png b/car-cluster-logging-renderer/res/drawable-xhdpi/ic_launcher.png
deleted file mode 100644
index 71c6d76..0000000
--- a/car-cluster-logging-renderer/res/drawable-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/car-cluster-logging-renderer/res/values-af/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-am/strings.xml b/car-cluster-logging-renderer/res/values-am/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-am/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ar/strings.xml b/car-cluster-logging-renderer/res/values-ar/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ar/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-as/strings.xml b/car-cluster-logging-renderer/res/values-as/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-as/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-az/strings.xml b/car-cluster-logging-renderer/res/values-az/strings.xml
deleted file mode 100644
index a3ea5d3..0000000
--- a/car-cluster-logging-renderer/res/values-az/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"ALƏT_KLASTERİ_TƏCHİZATÇISI_GİRİŞİ"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-b+sr+Latn/strings.xml b/car-cluster-logging-renderer/res/values-b+sr+Latn/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-b+sr+Latn/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-be/strings.xml b/car-cluster-logging-renderer/res/values-be/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-be/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-bg/strings.xml b/car-cluster-logging-renderer/res/values-bg/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-bg/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-bn/strings.xml b/car-cluster-logging-renderer/res/values-bn/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-bn/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-bs/strings.xml b/car-cluster-logging-renderer/res/values-bs/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-bs/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ca/strings.xml b/car-cluster-logging-renderer/res/values-ca/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ca/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-cs/strings.xml b/car-cluster-logging-renderer/res/values-cs/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-cs/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-da/strings.xml b/car-cluster-logging-renderer/res/values-da/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-da/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-de/strings.xml b/car-cluster-logging-renderer/res/values-de/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-de/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-el/strings.xml b/car-cluster-logging-renderer/res/values-el/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-el/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-en-rAU/strings.xml b/car-cluster-logging-renderer/res/values-en-rAU/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-en-rAU/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-en-rCA/strings.xml b/car-cluster-logging-renderer/res/values-en-rCA/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-en-rCA/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-en-rGB/strings.xml b/car-cluster-logging-renderer/res/values-en-rGB/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-en-rIN/strings.xml b/car-cluster-logging-renderer/res/values-en-rIN/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-en-rIN/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-en-rXC/strings.xml b/car-cluster-logging-renderer/res/values-en-rXC/strings.xml
deleted file mode 100644
index 9cf17c1..0000000
--- a/car-cluster-logging-renderer/res/values-en-rXC/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‎‎‏‎‏‏‏‎‏‏‏‎‎‎‎‏‏‏‏‎‏‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‎‎‏‎‏‏‎‏‎‏‏‎LOGGING_INSTRUMENT_CLUSTER_RENDERER‎‏‎‎‏‎"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-es-rUS/strings.xml b/car-cluster-logging-renderer/res/values-es-rUS/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-es/strings.xml b/car-cluster-logging-renderer/res/values-es/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-es/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-et/strings.xml b/car-cluster-logging-renderer/res/values-et/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-et/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-eu/strings.xml b/car-cluster-logging-renderer/res/values-eu/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-eu/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-fa/strings.xml b/car-cluster-logging-renderer/res/values-fa/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-fa/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-fi/strings.xml b/car-cluster-logging-renderer/res/values-fi/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-fi/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-fr-rCA/strings.xml b/car-cluster-logging-renderer/res/values-fr-rCA/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-fr-rCA/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-fr/strings.xml b/car-cluster-logging-renderer/res/values-fr/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-fr/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-gl/strings.xml b/car-cluster-logging-renderer/res/values-gl/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-gl/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-gu/strings.xml b/car-cluster-logging-renderer/res/values-gu/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-gu/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-hi/strings.xml b/car-cluster-logging-renderer/res/values-hi/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-hi/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-hr/strings.xml b/car-cluster-logging-renderer/res/values-hr/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-hr/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-hu/strings.xml b/car-cluster-logging-renderer/res/values-hu/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-hu/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-hy/strings.xml b/car-cluster-logging-renderer/res/values-hy/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-hy/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-in/strings.xml b/car-cluster-logging-renderer/res/values-in/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-in/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-is/strings.xml b/car-cluster-logging-renderer/res/values-is/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-is/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-it/strings.xml b/car-cluster-logging-renderer/res/values-it/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-it/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-iw/strings.xml b/car-cluster-logging-renderer/res/values-iw/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-iw/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ja/strings.xml b/car-cluster-logging-renderer/res/values-ja/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ja/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ka/strings.xml b/car-cluster-logging-renderer/res/values-ka/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ka/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-kk/strings.xml b/car-cluster-logging-renderer/res/values-kk/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-kk/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-km/strings.xml b/car-cluster-logging-renderer/res/values-km/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-km/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-kn/strings.xml b/car-cluster-logging-renderer/res/values-kn/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-kn/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ko/strings.xml b/car-cluster-logging-renderer/res/values-ko/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ko/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ky/strings.xml b/car-cluster-logging-renderer/res/values-ky/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ky/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-lo/strings.xml b/car-cluster-logging-renderer/res/values-lo/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-lo/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-lt/strings.xml b/car-cluster-logging-renderer/res/values-lt/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-lt/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-lv/strings.xml b/car-cluster-logging-renderer/res/values-lv/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-lv/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-mk/strings.xml b/car-cluster-logging-renderer/res/values-mk/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-mk/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ml/strings.xml b/car-cluster-logging-renderer/res/values-ml/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ml/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-mn/strings.xml b/car-cluster-logging-renderer/res/values-mn/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-mn/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-mr/strings.xml b/car-cluster-logging-renderer/res/values-mr/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-mr/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ms/strings.xml b/car-cluster-logging-renderer/res/values-ms/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ms/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-my/strings.xml b/car-cluster-logging-renderer/res/values-my/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-my/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-nb/strings.xml b/car-cluster-logging-renderer/res/values-nb/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-nb/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ne/strings.xml b/car-cluster-logging-renderer/res/values-ne/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ne/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-nl/strings.xml b/car-cluster-logging-renderer/res/values-nl/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-nl/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-or/strings.xml b/car-cluster-logging-renderer/res/values-or/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-or/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-pa/strings.xml b/car-cluster-logging-renderer/res/values-pa/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-pa/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-pl/strings.xml b/car-cluster-logging-renderer/res/values-pl/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-pl/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-pt-rPT/strings.xml b/car-cluster-logging-renderer/res/values-pt-rPT/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-pt/strings.xml b/car-cluster-logging-renderer/res/values-pt/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-pt/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ro/strings.xml b/car-cluster-logging-renderer/res/values-ro/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ro/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ru/strings.xml b/car-cluster-logging-renderer/res/values-ru/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ru/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-si/strings.xml b/car-cluster-logging-renderer/res/values-si/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-si/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-sk/strings.xml b/car-cluster-logging-renderer/res/values-sk/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-sk/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-sl/strings.xml b/car-cluster-logging-renderer/res/values-sl/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-sl/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-sq/strings.xml b/car-cluster-logging-renderer/res/values-sq/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-sq/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-sr/strings.xml b/car-cluster-logging-renderer/res/values-sr/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-sr/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-sv/strings.xml b/car-cluster-logging-renderer/res/values-sv/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-sv/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-sw/strings.xml b/car-cluster-logging-renderer/res/values-sw/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-sw/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ta/strings.xml b/car-cluster-logging-renderer/res/values-ta/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ta/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-te/strings.xml b/car-cluster-logging-renderer/res/values-te/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-te/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-th/strings.xml b/car-cluster-logging-renderer/res/values-th/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-th/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-tl/strings.xml b/car-cluster-logging-renderer/res/values-tl/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-tl/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-tr/strings.xml b/car-cluster-logging-renderer/res/values-tr/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-tr/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-uk/strings.xml b/car-cluster-logging-renderer/res/values-uk/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-uk/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ur/strings.xml b/car-cluster-logging-renderer/res/values-ur/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ur/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-uz/strings.xml b/car-cluster-logging-renderer/res/values-uz/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-uz/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-vi/strings.xml b/car-cluster-logging-renderer/res/values-vi/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-vi/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-zh-rCN/strings.xml b/car-cluster-logging-renderer/res/values-zh-rCN/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-zh-rHK/strings.xml b/car-cluster-logging-renderer/res/values-zh-rHK/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-zh-rTW/strings.xml b/car-cluster-logging-renderer/res/values-zh-rTW/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-zu/strings.xml b/car-cluster-logging-renderer/res/values-zu/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-zu/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values/strings.xml b/car-cluster-logging-renderer/res/values/strings.xml
deleted file mode 100644
index f36db0d..0000000
--- a/car-cluster-logging-renderer/res/values/strings.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-<resources>
-    <string name="app_name">LOGGING_INSTRUMENT_CLUSTER_RENDERER</string>
-</resources>
diff --git a/car-cluster-logging-renderer/src/android/car/cluster/loggingrenderer/LoggingClusterRenderingService.java b/car-cluster-logging-renderer/src/android/car/cluster/loggingrenderer/LoggingClusterRenderingService.java
deleted file mode 100644
index c42ea5e..0000000
--- a/car-cluster-logging-renderer/src/android/car/cluster/loggingrenderer/LoggingClusterRenderingService.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.car.cluster.loggingrenderer;
-
-import android.car.cluster.renderer.InstrumentClusterRenderingService;
-import android.car.cluster.renderer.NavigationRenderer;
-import android.car.navigation.CarNavigationInstrumentCluster;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.util.Log;
-
-import androidx.car.cluster.navigation.NavigationState;
-import androidx.versionedparcelable.ParcelUtils;
-
-import com.google.android.collect.Lists;
-
-/**
- * Dummy implementation of {@link LoggingClusterRenderingService} to log all interaction.
- */
-public class LoggingClusterRenderingService extends InstrumentClusterRenderingService {
-    private static final String TAG = LoggingClusterRenderingService.class.getSimpleName();
-    private static final String NAV_STATE_BUNDLE_KEY = "navstate";
-    private static final int NAV_STATE_EVENT_ID = 1;
-
-    @Override
-    public NavigationRenderer getNavigationRenderer() {
-        NavigationRenderer navigationRenderer = new NavigationRenderer() {
-            @Override
-            public CarNavigationInstrumentCluster getNavigationProperties() {
-                Log.i(TAG, "getNavigationProperties");
-                CarNavigationInstrumentCluster config =
-                        CarNavigationInstrumentCluster.createCluster(1000);
-                config.getExtra().putIntegerArrayList("dummy", Lists.newArrayList(1, 2, 3, 4));
-                Log.i(TAG, "getNavigationProperties, returns: " + config);
-                return config;
-            }
-
-            @Override
-            public void onEvent(int eventType, Bundle bundle) {
-                StringBuilder bundleSummary = new StringBuilder();
-                if (eventType == NAV_STATE_EVENT_ID) {
-                    bundle.setClassLoader(ParcelUtils.class.getClassLoader());
-                    NavigationState navState = NavigationState
-                            .fromParcelable(bundle.getParcelable(NAV_STATE_BUNDLE_KEY));
-                    bundleSummary.append(navState.toString());
-
-                    // Sending broadcast for testing.
-                    Intent intent = new Intent("android.car.cluster.NAVIGATION_STATE_UPDATE");
-                    intent.putExtra(NAV_STATE_BUNDLE_KEY, bundle);
-                    sendBroadcastAsUser(intent, UserHandle.ALL);
-                } else {
-                    for (String key : bundle.keySet()) {
-                        bundleSummary.append(key);
-                        bundleSummary.append("=");
-                        bundleSummary.append(bundle.get(key));
-                        bundleSummary.append(" ");
-                    }
-                }
-                Log.i(TAG, "onEvent(" + eventType + ", " + bundleSummary + ")");
-            }
-        };
-
-        Log.i(TAG, "createNavigationRenderer, returns: " + navigationRenderer);
-        return navigationRenderer;
-    }
-}
diff --git a/car_product/build/car.mk b/car_product/build/car.mk
index 66577be..104d5d6 100644
--- a/car_product/build/car.mk
+++ b/car_product/build/car.mk
@@ -39,8 +39,7 @@
     EmbeddedKitchenSinkApp \
     VmsPublisherClientSample \
     VmsSubscriberClientSample \
-    android.car.cluster.loggingrenderer \
-    DirectRenderingClusterSample \
+    DirectRenderingCluster \
     GarageModeTestApp \
 
 # SEPolicy for test apps / services
diff --git a/service/res/values/config.xml b/service/res/values/config.xml
index c03536f..9d90a7c 100644
--- a/service/res/values/config.xml
+++ b/service/res/values/config.xml
@@ -40,7 +40,8 @@
 
     <string name="inputService" translatable="false">android.car.input.service/.DefaultInputService</string>
 
-    <string name="instrumentClusterRendererService" translatable="false">android.car.cluster.sample/.ClusterRenderingServiceImpl</string>
+    <!--  Service responsible for displaying information on the car instrument cluster. -->
+    <string name="instrumentClusterRendererService" translatable="false">android.car.cluster/.ClusterRenderingService</string>
 
     <!--  Whether to enable Activity blocking for safety. When Activity blocking is enabled,
           only whitelisted safe Activities will be allowed while car is not parked. -->
diff --git a/service/src/com/android/car/CarMediaService.java b/service/src/com/android/car/CarMediaService.java
index a4e0d6e..10d5d91 100644
--- a/service/src/com/android/car/CarMediaService.java
+++ b/service/src/com/android/car/CarMediaService.java
@@ -34,6 +34,8 @@
 import android.media.session.MediaSessionManager;
 import android.media.session.MediaSessionManager.OnActiveSessionsChangedListener;
 import android.media.session.PlaybackState;
+import android.os.Handler;
+import android.os.HandlerThread;
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
 import android.service.media.MediaBrowserService;
@@ -85,6 +87,10 @@
     private RemoteCallbackList<ICarMediaSourceListener> mMediaSourceListeners =
             new RemoteCallbackList();
 
+    // Handler to receive PlaybackState callbacks from the active media controller.
+    private Handler mHandler;
+    private HandlerThread mHandlerThread;
+
     /** The package name of the last media source that was removed while being primary. */
     private String mRemovedMediaSourcePackage;
 
@@ -128,6 +134,10 @@
         mMediaSessionManager = mContext.getSystemService(MediaSessionManager.class);
         mMediaSessionUpdater = new MediaSessionUpdater();
 
+        mHandlerThread = new HandlerThread(CarLog.TAG_MEDIA);
+        mHandlerThread.start();
+        mHandler = new Handler(mHandlerThread.getLooper());
+
         IntentFilter filter = new IntentFilter();
         filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
         filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
@@ -463,7 +473,11 @@
             if (mPrimaryMediaPackage.equals(controller.getPackageName())) {
                 mActiveUserMediaController = controller;
                 savePlaybackState(mActiveUserMediaController.getPlaybackState());
-                mActiveUserMediaController.registerCallback(mMediaControllerCallback);
+                // Specify Handler to receive callbacks on, to avoid defaulting to the calling
+                // thread; this method can be called from the MediaSessionManager callback.
+                // Using the version of this method without passing a handler causes a
+                // RuntimeException for failing to create a Handler.
+                mActiveUserMediaController.registerCallback(mMediaControllerCallback, mHandler);
                 return;
             }
         }
diff --git a/service/src/com/android/car/trust/BleManager.java b/service/src/com/android/car/trust/BleManager.java
index 61e1be6..fd319d6 100644
--- a/service/src/com/android/car/trust/BleManager.java
+++ b/service/src/com/android/car/trust/BleManager.java
@@ -54,6 +54,9 @@
     private static final int BLE_RETRY_LIMIT = 5;
     private static final int BLE_RETRY_INTERVAL_MS = 1000;
 
+    private static final int GATT_SERVER_RETRY_LIMIT = 20;
+    private static final int GATT_SERVER_RETRY_DELAY_MS = 200;
+
     // https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth
     // .service.generic_access.xml
     private static final UUID GENERIC_ACCESS_PROFILE_UUID =
@@ -71,6 +74,10 @@
     private BluetoothGattServer mGattServer;
     private BluetoothGatt mBluetoothGatt;
     private int mAdvertiserStartCount;
+    private int mGattServerRetryStartCount;
+    private BluetoothGattService mBluetoothGattService;
+    private AdvertiseCallback mAdvertiseCallback;
+    private AdvertiseData mData;
 
     BleManager(Context context) {
         mContext = context;
@@ -97,32 +104,38 @@
             return;
         }
 
+        mBluetoothGattService = service;
+        mAdvertiseCallback = advertiseCallback;
+        mData = data;
+        mGattServerRetryStartCount = 0;
+        mBluetoothManager = (BluetoothManager) mContext.getSystemService(
+            Context.BLUETOOTH_SERVICE);
+        openGattServer();
+    }
+
+    private void openGattServer() {
         // Only open one Gatt server.
-        if (mGattServer == null) {
+        if (mGattServer != null) {
             if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Opening a new GATT Server");
+                Log.d(TAG, "Gatt Server created, retry count: " + mGattServerRetryStartCount);
             }
-            mBluetoothManager = (BluetoothManager) mContext.getSystemService(
-                    Context.BLUETOOTH_SERVICE);
-            mGattServer = mBluetoothManager.openGattServer(mContext, mGattServerCallback);
-
-            if (mGattServer == null) {
-                Log.e(TAG, "Gatt Server not created");
-                return;
-            }
-        }
-
-        mGattServer.clearServices();
-        mGattServer.addService(service);
-
-        AdvertiseSettings settings = new AdvertiseSettings.Builder()
+            mGattServer.clearServices();
+            mGattServer.addService(mBluetoothGattService);
+            AdvertiseSettings settings = new AdvertiseSettings.Builder()
                 .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
                 .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
                 .setConnectable(true)
                 .build();
-
-        mAdvertiserStartCount = 0;
-        startAdvertisingInternally(settings, data, advertiseCallback);
+            mAdvertiserStartCount = 0;
+            startAdvertisingInternally(settings, mData, mAdvertiseCallback);
+            mGattServerRetryStartCount = 0;
+        } else if (mGattServerRetryStartCount < GATT_SERVER_RETRY_LIMIT) {
+            mGattServer = mBluetoothManager.openGattServer(mContext, mGattServerCallback);
+            mGattServerRetryStartCount++;
+            mHandler.postDelayed(() -> openGattServer(), GATT_SERVER_RETRY_DELAY_MS);
+        } else {
+            Log.e(TAG, "Gatt server not created - exceeded retry limit.");
+        }
     }
 
     private void startAdvertisingInternally(AdvertiseSettings settings, AdvertiseData data,
@@ -132,6 +145,9 @@
         }
 
         if (mAdvertiser != null) {
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "Advertiser created, retry count: " + mAdvertiserStartCount);
+            }
             mAdvertiser.startAdvertising(settings, data, advertiseCallback);
             mAdvertiserStartCount = 0;
         } else if (mAdvertiserStartCount < BLE_RETRY_LIMIT) {
diff --git a/service/src/com/android/car/trust/CarTrustAgentBleManager.java b/service/src/com/android/car/trust/CarTrustAgentBleManager.java
index 3e073a0..f42c1e4 100644
--- a/service/src/com/android/car/trust/CarTrustAgentBleManager.java
+++ b/service/src/com/android/car/trust/CarTrustAgentBleManager.java
@@ -401,6 +401,9 @@
         public void onStartFailure(int errorCode) {
             Log.e(TAG, "Failed to advertise, errorCode: " + errorCode);
             super.onStartFailure(errorCode);
+            if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_ALREADY_STARTED) {
+                return;
+            }
             if (Log.isLoggable(TAG, Log.DEBUG)) {
                 Log.d(TAG, "Start unlock advertising fail, retry to advertising..");
             }
diff --git a/tests/DirectRenderingClusterSample/Android.mk b/tests/DirectRenderingClusterSample/Android.mk
deleted file mode 100644
index aca5a75..0000000
--- a/tests/DirectRenderingClusterSample/Android.mk
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright (C) 2015 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.
-#
-#
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := DirectRenderingClusterSample
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-# Each update should be signed by OEMs
-LOCAL_CERTIFICATE := platform
-LOCAL_PRIVILEGED_MODULE := true
-
-LOCAL_PROGUARD_FLAG_FILES := proguard.flags
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_USE_AAPT2 := true
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_JAVA_LIBRARIES += android.car
-LOCAL_STATIC_ANDROID_LIBRARIES += \
-    androidx.legacy_legacy-support-v4 \
-    androidx-constraintlayout_constraintlayout \
-    androidx.car_car-cluster \
-    car-arch-common \
-    car-media-common \
-    car-telephony-common \
-    car-apps-common
-
-LOCAL_REQUIRED_MODULES := privapp_whitelist_android.car.cluster.sample
-
-include $(BUILD_PACKAGE)
-
-# Use the following include to make our test apk.
-ifeq (,$(ONE_SHOT_MAKEFILE))
-include $(call all-makefiles-under,$(LOCAL_PATH))
-endif
-
diff --git a/tests/DirectRenderingClusterSample/AndroidManifest.xml b/tests/DirectRenderingClusterSample/AndroidManifest.xml
deleted file mode 100644
index 12c6bba..0000000
--- a/tests/DirectRenderingClusterSample/AndroidManifest.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    package="android.car.cluster.sample"
-    android:sharedUserId="android.uid.system">
-
-    <uses-sdk android:targetSdkVersion="25" android:minSdkVersion="25"/>
-
-    <!-- We set TYPE_SYSTEM_ALERT window flag to presentation in order
-         to show it outside of activity context -->
-    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
-    <uses-permission android:name="android.permission.CONTROL_INCALL_EXPERIENCE"/>
-    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"
-        tools:ignore="ProtectedPermissions"/>
-    <uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS"/>
-    <uses-permission android:name="android.permission.INJECT_EVENTS"/>
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"/>
-    <!-- Required by 'singleUser' service attribute -->
-    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/>
-    <!-- Required by 'startActivityAsUser' -->
-    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
-    <!-- Required to detect the current user in the device -->
-    <uses-permission android:name="android.permission.MANAGE_USERS" />
-    <!-- Required to launch navigation apps -->
-    <uses-permission android:name="android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL"/>
-    <!-- Required to watch activities running on the cluster -->
-    <uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER"/>
-    <!-- Required to show car sensor data -->
-    <uses-permission android:name="android.car.permission.CAR_ENERGY"/>
-    <uses-permission android:name="android.car.permission.CAR_POWERTRAIN"/>
-    <uses-permission android:name="android.car.permission.CAR_INFO"/>
-    <uses-permission android:name="android.car.permission.CAR_SPEED"/>
-    <uses-permission android:name="android.car.permission.CAR_ENGINE_DETAILED"/>
-
-    <application android:label="@string/app_name"
-                 android:icon="@mipmap/ic_launcher"
-                 android:directBootAware="true">
-        <service android:name=".ClusterRenderingServiceImpl"
-                 android:exported="false"
-                 android:singleUser="true"
-                 android:permission="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"/>
-
-        <activity android:name=".MainClusterActivity"
-            android:exported="false"
-            android:showForAllUsers="true"
-            android:theme="@style/Theme.ClusterTheme">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.DEFAULT"/>
-            </intent-filter>
-        </activity>
-    </application>
-</manifest>
diff --git a/tests/DirectRenderingClusterSample/res/color/icon_color.xml b/tests/DirectRenderingClusterSample/res/color/icon_color.xml
deleted file mode 100644
index 1ce35ee..0000000
--- a/tests/DirectRenderingClusterSample/res/color/icon_color.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <item
-        android:color="@color/icon_selected"
-        android:state_selected="true"/>
-    <item
-        android:color="@color/icon_selected"
-        android:state_focused="true"/>
-    <item
-        android:color="@color/icon_unselected"/>
-</selector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_car_info.png b/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_car_info.png
deleted file mode 100644
index adb07d6..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_car_info.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_music.png b/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_music.png
deleted file mode 100644
index f1b2533..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_music.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_nav.png b/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_nav.png
deleted file mode 100644
index 8036b89..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_nav.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_phone.png b/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_phone.png
deleted file mode 100644
index 2daaa8e..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_phone.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_car_info.png b/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_car_info.png
deleted file mode 100644
index 9c45d3e..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_car_info.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_music.png b/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_music.png
deleted file mode 100644
index fb0671a..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_music.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_nav.png b/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_nav.png
deleted file mode 100644
index 4844c89..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_nav.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_phone.png b/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_phone.png
deleted file mode 100644
index ef50db6..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_phone.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_car_info.png b/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_car_info.png
deleted file mode 100644
index 2db5645..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_car_info.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_music.png b/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_music.png
deleted file mode 100644
index 6154079..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_music.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_nav.png b/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_nav.png
deleted file mode 100644
index f94db1e..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_nav.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_phone.png b/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_phone.png
deleted file mode 100644
index ca0be39..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_phone.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_car_info.png b/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_car_info.png
deleted file mode 100644
index f00be30..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_car_info.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_music.png b/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_music.png
deleted file mode 100644
index 8a875ad..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_music.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_nav.png b/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_nav.png
deleted file mode 100644
index 7b2b514..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_nav.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_phone.png b/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_phone.png
deleted file mode 100644
index fce6fb7..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_phone.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable/car_top_view.png b/tests/DirectRenderingClusterSample/res/drawable/car_top_view.png
deleted file mode 100644
index b19ee12..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/car_top_view.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive.xml
deleted file mode 100644
index c83d9f0..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M10,5a2,2,0,1,1,2-2a2,2,0,0,1-2,2Zm4.91284,8.35114l-4.90368-6.342839999999999l-4.903689999999999,6.342839999999999a.38659.38659,0,0,0,.40942.62354l2.95184-1.34375a.35542.35542,0,0,1,.5409600000000001.3690700000000007h-.007690000000000197v5.50006a.49992.49992,0,0,0,.4999400000000005.4999399999999987h1.00012a.49992.49992,0,0,0,.4999399999999987-.4999399999999987v-5.491760000000001h.00916a.35757.35757,0,0,1,.54242-.37738l2.95184,1.34375a.3866.3866,0,0,0,.4094200000000008-.6235300000000006Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_left.xml
deleted file mode 100644
index 3eba85d..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M3,12a2,2,0,1,1,2-2a2,2,0,0,1-2,2Zm10.00293-.96332a4.05782,4.05782,0,0,1,3.98877,4.07324h.008300000000001972v1.37775a.51232.51232,0,0,0,.5123299999999986.5123299999999986h.97534a.51232.51232,0,0,0,.5123300000000022-.5123299999999986v-1.4876700000000014h-.013850000000001472a6.05607,6.05607,0,0,0-5.9834-5.96332l-.011-.00183l.00012.02008h-.9918700000000005v-.009090000000000487a.35757.35757,0,0,1-.37738-.54242l1.34375-2.95184a.38659.38659,0,0,0-.62354-.40942l-6.342829999999999,4.90368l6.34283,4.90369a.3866.3866,0,0,0,.62354-.40942l-1.34375-2.95184a.35757.35757,0,0,1,.3773800000000005-.5424299999999977v.00909h1"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_right.xml
deleted file mode 100644
index 0401e8c..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M15,10a2,2,0,1,1,2,2a2,2,0,0,1-2-2Zm-8,1.0549300000000006h1v-.009090000000000487a.35757.35757,0,0,1,.37738.54242l-1.3437500000000009,2.9518400000000007a.3866.3866,0,0,0,.62354.40942l6.34283-4.903680000000001l-6.34283-4.90369a.38659.38659,0,0,0-.62354.40942l1.3437500000000009,2.9518500000000003a.35757.35757,0,0,1-.3773800000000005.5424199999999999v.009090000000000487h-.9918199999999997l.00011999999999989797-.020080000000000098l-.011.00183a6.05607,6.05607,0,0,0-5.98345,5.9633199999999995h-.013849999999999696v1.48767a.51232.51232,0,0,0,.51233.5123299999999986h.9753400000000001a.51232.51232,0,0,0,.51233-.5123299999999986v-1.3777500000000007h.008300000000000196a4.05782,4.05782,0,0,1,3.98877-4.07324"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_straight.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_straight.xml
deleted file mode 100644
index c83d9f0..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_straight.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M10,5a2,2,0,1,1,2-2a2,2,0,0,1-2,2Zm4.91284,8.35114l-4.90368-6.342839999999999l-4.903689999999999,6.342839999999999a.38659.38659,0,0,0,.40942.62354l2.95184-1.34375a.35542.35542,0,0,1,.5409600000000001.3690700000000007h-.007690000000000197v5.50006a.49992.49992,0,0,0,.4999400000000005.4999399999999987h1.00012a.49992.49992,0,0,0,.4999399999999987-.4999399999999987v-5.491760000000001h.00916a.35757.35757,0,0,1,.54242-.37738l2.95184,1.34375a.3866.3866,0,0,0,.4094200000000008-.6235300000000006Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_close.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_close.xml
deleted file mode 100644
index c531094..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_close.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M17.35551,4.05855l-5.589929999999999,5.589929999999999a.49713.49713,0,0,0,0,.703l5.58993,5.58993a.49713.49713,0,0,1,0,.703l-.711.711a.49713.49713,0,0,1-.703,0l-5.58993-5.58993a.49713.49713,0,0,0-.703,0l-5.590030000000002,5.590030000000002a.49713.49713,0,0,1-.703,0l-.711-.711a.49713.49713,0,0,1,0-.703l5.58993-5.58993a.49713.49713,0,0,0,0-.703l-5.589990000000002-5.590030000000002a.49713.49713,0,0,1,0-.703l.711-.711a.49713.49713,0,0,1,.703,0l5.58999,5.5898699999999995a.49713.49713,0,0,0,.703,0l5.58993-5.58993a.49713.49713,0,0,1,.703,0l.711.711a.49713.49713,0,0,1,.00010000000000331966.7030600000000002Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_continue.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_continue.xml
deleted file mode 100644
index 231dac0..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_continue.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M14.50342,8.96637l-2.9518500000000003-1.3437499999999991a.35755.35755,0,0,0-.5424100000000003.3773799999999996v9.49652a.50346.50346,0,0,1-.5034799999999997.5034799999999997h-.993a.50346.50346,0,0,1-.50348-.50348v-9.49652a.35756.35756,0,0,0-.54242-.37738l-2.9518899999999997,1.3437499999999991a.38659.38659,0,0,1-.40942-.62354l4.903689999999999-6.342829999999999l4.90369,6.34283a.3866.3866,0,0,1-.40942999999999863.6235400000000002Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_continue_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_continue_left.xml
deleted file mode 100644
index faa7027..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_continue_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M10,5.97986l.011.00183a6.06019,6.06019,0,0,1,5.989000000000001,6.07324v3.9450699999999994h-.003109999999999502l.002,1.50317a.49614.49614,0,0,1-.49620000000000175.4968299999999992h-1.0064700000000002a.49622.49622,0,0,1-.4962199999999992-.496220000000001v-5.448849999999998a4.05782,4.05782,0,0,0-3.98877-4.07324h-1.99878a.3576.3576,0,0,0-.37738.54248l1.3437500000000009,2.951830000000001a.38659.38659,0,0,1-.62354.40942l-6.34698-4.885420000000002l6.347-4.922a.38659.38659,0,0,1,.62354.40942l-1.3437700000000001,2.9518499999999994a.35757.35757,0,0,0,.37738.54242h1.9875500000000006"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_continue_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_continue_right.xml
deleted file mode 100644
index 6ef4749..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_continue_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M9.98877,7.98169a4.05782,4.05782,0,0,0-3.9887700000000006,4.07324v5.44885a.49622.49622,0,0,1-.4962200000000001.496220000000001h-1.0064700000000002a.49614.49614,0,0,1-.49615-.49683l.0019500000000007844-1.5031700000000008h-.0031100000000003902v-3.9450699999999994a6.06019,6.06019,0,0,1,5.989000000000001-6.07324l.010999999999999233-.0018299999999999983v.0018299999999999983h1.98755a.35757.35757,0,0,0,.37738-.54242l-1.3437500000000018-2.9518400000000007a.38659.38659,0,0,1,.6235300000000006-.40942999999999996l6.346990000000002,4.922000000000001l-6.347,4.88544a.38659.38659,0,0,1-.62354-.40942l1.34375-2.95184a.3576.3576,0,0,0-.37738-.54248h-1.998759999999999Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_depart.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_depart.xml
deleted file mode 100644
index 46c2408..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_depart.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M9.98172,19a2,2,0,1,1,2-2a2,2,0,0,1-2,2Zm4.912840000000001-11.65717l-4.903690000000001-6.342829999999999l-4.90368,6.34283a.38659.38659,0,0,0,.40942.62354l2.95184-1.34375a.35542.35542,0,0,1,.541.36908h-.007730000000000459v5.50006a.49992.49992,0,0,0,.49994.49994h1.00012a.49992.49992,0,0,0,.49994-.49994v-5.491760000000001h.00916a.35757.35757,0,0,1,.54242-.37738l2.95184,1.34375a.3866.3866,0,0,0,.409419999999999-.6235400000000002Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_fork_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_fork_left.xml
deleted file mode 100644
index 8ca9ced..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_fork_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M17.73611,6.57682a.30465.30465,0,0,1,.23032.10507l.649.74859a.30457.30457,0,0,1-.03369.43226l-2.06044,1.7384500000000012a5.4089,5.4089,0,0,0-1.73306,4.29459l.0047,3.60769a.29612.29612,0,0,1-.2961399999999994.2965300000000006h-1.0064700000000002a.29657.29657,0,0,1-.29623-.29622l-.00058-3.47624a6.99129,6.99129,0,0,1,2.269479999999998-5.626159999999999l2.077-1.75275a.30475.30475,0,0,1,.1962-.07182m0-.2a.50269.50269,0,0,0-.32516.119l-2.07704,1.7527300000000006a7.25157,7.25157,0,0,0-2.3398900000000005,5.794459999999999v3.46082a.49622.49622,0,0,0,.496220000000001.4961800000000025h1.0064700000000002a.49614.49614,0,0,0,.49615-.49681l-.0047-3.60767a5.2182,5.2182,0,0,1,1.665-4.14405l2.057410000000001-1.7358700000000002a.50455.50455,0,0,0,.05585-.71613l-.649-.74859a.50345.50345,0,0,0-.38147-.17406h0Zm-8.73542-.39511999999999947h-1.9875500000000006a.35757.35757,0,0,1-.37738-.54242l1.3437499999999991-2.9518400000000007a.38659.38659,0,0,0-.6235399999999993-.40942999999999996l-6.34698,4.922000000000001l6.347,4.88544a.38659.38659,0,0,0,.6235199999999992-.40943999999999825l-1.34375-2.951830000000001a.3576.3576,0,0,1,.37738-.54248h1.9987700000000013a4.05782,4.05782,0,0,1,3.98877,4.07324v5.44885a.49622.49622,0,0,0,.49622999999999884.496220000000001h1.00647a.49614.49614,0,0,0,.49615-.49683l-.001960000000000406-1.5031700000000008h.00311v-3.9450699999999994a6.06019,6.06019,0,0,0-5.989-6.07324l-.011-.00183"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_fork_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_fork_right.xml
deleted file mode 100644
index 9953608..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_fork_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M2.27386,6.57682a.30457.30457,0,0,1,.1961400000000002.07182000000000066l2.0739999999999994,1.7501800000000003a7.00218,7.00218,0,0,1,2.27186,5.644179999999999v3.46088a.29651.29651,0,0,1-.29617999999999967.29612000000000194h-1.0065a.29613.29613,0,0,1-.29618000000000055-.2965699999999991l.003790000000000404-3.5888300000000015a5.42,5.42,0,0,0-1.73517-4.316l-2.0573699999999997-1.7358600000000015a.30461.30461,0,0,1-.03372-.43226l.649-.74859a.30466.30466,0,0,1,.23035-.10507m0-.2a.50345.50345,0,0,0-.38147.17406l-.649.74859a.50458.50458,0,0,0,.05588.71613l2.0573699999999997,1.7358600000000006a5.2182,5.2182,0,0,1,1.665,4.14405l-.0046600000000003305,3.607660000000001a.49617.49617,0,0,0,.49617999999999984.4968299999999992h1.0065a.49616.49616,0,0,0,.49615-.49615v-3.4608500000000006a7.25157,7.25157,0,0,0-2.33983-5.794459999999999l-2.077-1.7527499999999998a.50264.50264,0,0,0-.32516-.119h0Zm8.73442,1.604870000000001h1.98755a.3576.3576,0,0,1,.37738.54248l-1.3437500000000018,2.951830000000001a.38659.38659,0,0,0,.62354.40942l6.34698-4.885420000000002l-6.3469999999999995-4.922000000000001a.38659.38659,0,0,0-.62354.40942l1.34375,2.95184a.35757.35757,0,0,1-.37738.54242h-1.9875299999999996v-.0018199999999986005l-.011.00183a6.06019,6.06019,0,0,0-5.989,6.07324v3.9450699999999994h.003109999999998614l-.002,1.50317a.49614.49614,0,0,0,.4962100000000005.4968299999999992h1.0064599999999997a.49622.49622,0,0,0,.49622-.49622v-5.448849999999998a4.05782,4.05782,0,0,1,3.98877-4.07324h.011229999999999407Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_merge_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_merge_left.xml
deleted file mode 100644
index b8954b8..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_merge_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M7.8,7.2v10.302520000000001a.2978.2978,0,0,1-.2974699999999997.2974800000000002h-1.0050600000000003a.2978.2978,0,0,1-.2974699999999997-.2974800000000002v-10.302520000000001h1.5999999999999996m.20000000000000018-.1999999999999993h-2v10.50252a.49747.49747,0,0,0,.49746999999999986.4974799999999995h1.0050600000000003a.49747.49747,0,0,0,.49746999999999986-.4974799999999995v-10.50252h0Zm-.018309999999999604,3v-1.9875500000000006a.3576.3576,0,0,1,.54248-.37738l2.951830000000001,1.3437500000000009a.38659.38659,0,0,0,.40942-.62354l-4.885420000000002-6.34698l-4.922,6.347a.38659.38659,0,0,0,.40942.62354l2.9518499999999994-1.3437700000000001a.35757.35757,0,0,1,.54242.37738v1.9875500000000006h-.0018299999999991101l.00183.011a6.06019,6.06019,0,0,0,6.07324,5.989000000000001h3.9450699999999994v-.003109999999999502l1.50317.002a.49614.49614,0,0,0,.4968299999999992-.49620000000000175v-1.0064700000000002a.49622.49622,0,0,0-.496220000000001-.4962199999999992h-5.448849999999998a4.05782,4.05782,0,0,1-4.07324-3.98877v-.011229999999999407Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_merge_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_merge_right.xml
deleted file mode 100644
index ab89d03..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_merge_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M13.8,7.2v10.299210000000002a.30112.30112,0,0,1-.30078.3008h-.9984300000000008a.30112.30112,0,0,1-.300790000000001-.30079999999999885v-10.299210000000002h1.6m.20000000000000107-.1999999999999993h-2v10.499210000000001a.50079.50079,0,0,0,.5007900000000003.5007899999999985h.99841a.50079.50079,0,0,0,.5007999999999999-.5007899999999985v-10.499210000000001h0Zm.01831,3v-1.9875500000000006a.35757.35757,0,0,1,.54242-.37738l2.95184,1.34375a.38659.38659,0,0,0,.4094300000000004-.6235299999999988l-4.922000000000001-6.34699l-4.88544,6.347a.38659.38659,0,0,0,.40942.62354l2.95184-1.34375a.3576.3576,0,0,1,.54248.37738v1.99878a4.05782,4.05782,0,0,1-4.0732300000000015,3.9887499999999996h-5.44885a.49622.49622,0,0,0-.4962200000000001.4962199999999992v1.00647a.49614.49614,0,0,0,.49683.49615l1.50317-.001949999999999008v.003109999999999502h3.9450700000000003a6.06019,6.06019,0,0,0,6.07324-5.989l.0018299999999999983-.010999999999999233"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_new_name_straight.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_new_name_straight.xml
deleted file mode 100644
index 231dac0..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_new_name_straight.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M14.50342,8.96637l-2.9518500000000003-1.3437499999999991a.35755.35755,0,0,0-.5424100000000003.3773799999999996v9.49652a.50346.50346,0,0,1-.5034799999999997.5034799999999997h-.993a.50346.50346,0,0,1-.50348-.50348v-9.49652a.35756.35756,0,0,0-.54242-.37738l-2.9518899999999997,1.3437499999999991a.38659.38659,0,0,1-.40942-.62354l4.903689999999999-6.342829999999999l4.90369,6.34283a.3866.3866,0,0,1-.40942999999999863.6235400000000002Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_left.xml
deleted file mode 100644
index 536fd22..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M14.5029,2.2a.29744.29744,0,0,1,.29710000000000036.2971199999999996v15.005760000000002a.29744.29744,0,0,1-.29710000000000036.2971199999999996h-1.0058000000000007a.29744.29744,0,0,1-.29710000000000036-.2971199999999996v-15.005760000000002a.29744.29744,0,0,1,.29710000000000036-.2971199999999987h1.0058m0-.2h-1.0058000000000007a.49711.49711,0,0,0-.49709999999999965.4971199999999998v15.005760000000002a.49711.49711,0,0,0,.49709999999999965.4971199999999989h1.0058a.49711.49711,0,0,0,.49709999999999965-.4971199999999989v-15.005760000000002a.49711.49711,0,0,0-.49709999999999965-.4971199999999989h0Zm-5.50212,3.9816900000000004h-1.9875500000000006a.35757.35757,0,0,1-.37738-.54242l1.3437499999999991-2.9518400000000007a.38659.38659,0,0,0-.6235399999999993-.40942999999999996l-6.34698,4.922000000000001l6.347,4.88544a.38659.38659,0,0,0,.6235199999999992-.40943999999999825l-1.34375-2.951830000000001a.3576.3576,0,0,1,.37738-.54248h1.9987700000000013a4.05782,4.05782,0,0,1,3.98877,4.07324v5.44885a.49622.49622,0,0,0,.49622999999999884.496220000000001h1.00647a.49614.49614,0,0,0,.49615-.49683l-.001960000000000406-1.5031700000000008h.00311v-3.9450699999999994a6.06019,6.06019,0,0,0-5.989-6.07324l-.011-.00183"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_right.xml
deleted file mode 100644
index 3048587..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M6.5029,2.2a.29744.29744,0,0,1,.2970999999999995.2971199999999996v15.005760000000002a.29744.29744,0,0,1-.2970999999999995.2971199999999996h-1.0058000000000007a.29744.29744,0,0,1-.2970999999999995-.2971199999999996v-15.005760000000002a.29744.29744,0,0,1,.2970999999999995-.2971199999999987h1.0058000000000007m0-.2h-1.0058000000000007a.49711.49711,0,0,0-.49709999999999965.4971199999999998v15.005760000000002a.49711.49711,0,0,0,.49709999999999965.4971199999999989h1.0058000000000007a.49711.49711,0,0,0,.49709999999999965-.4971199999999989v-15.005760000000002a.49711.49711,0,0,0-.49709999999999965-.4971199999999989h0Zm4.5054,5.98169h1.98755a.3576.3576,0,0,1,.37738.54248l-1.3437500000000018,2.951830000000001a.38659.38659,0,0,0,.62354.40942l6.34698-4.885420000000002l-6.3469999999999995-4.922000000000001a.38659.38659,0,0,0-.62354.40942l1.34375,2.95184a.35757.35757,0,0,1-.37738.54242h-1.9875299999999996v-.0018199999999986005l-.011.00183a6.06019,6.06019,0,0,0-5.989,6.07324v3.9450699999999994h.003109999999998614l-.002,1.50317a.49614.49614,0,0,0,.4962100000000005.4968299999999992h1.0064599999999997a.49622.49622,0,0,0,.49622-.49622v-5.448849999999998a4.05782,4.05782,0,0,1,3.98877-4.07324h.011229999999999407Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_left.xml
deleted file mode 100644
index 91ffc9c..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M14.5029,2.2a.29744.29744,0,0,1,.29710000000000036.2971199999999996v15.005760000000002a.29744.29744,0,0,1-.29710000000000036.2971199999999996h-1.0058000000000007a.29744.29744,0,0,1-.29710000000000036-.2971199999999996v-15.005760000000002a.29744.29744,0,0,1,.29710000000000036-.2971199999999987h1.0058m0-.2h-1.0058000000000007a.49711.49711,0,0,0-.49709999999999965.4971199999999998v15.005760000000002a.49711.49711,0,0,0,.49709999999999965.4971199999999989h1.0058a.49711.49711,0,0,0,.49709999999999965-.4971199999999989v-15.005760000000002a.49711.49711,0,0,0-.49709999999999965-.4971199999999989h0Zm-1.85684,6.24854l-2.457460000000001-2.07386a.3576.3576,0,0,1,.07019-.6571l2.9489100000000015-1.3501600000000007a.38658.38658,0,0,0-.20294-.71777l-8.004760000000001-.4496500000000001l1.58044,7.86a.38663.38663,0,0,0,.73938.09912l.9181799999999996-3.1106099999999985a.35758.35758,0,0,1,.6405-.16266l2.44818,2.06561a5.21819,5.21819,0,0,1,1.665,4.144l-.0047,3.60767a.49614.49614,0,0,0,.49624000000000024.49687000000000126h1.00653a.49621.49621,0,0,0,.49615-.49622v-3.4607799999999997a7.25157,7.25157,0,0,0-2.339839999999999-5.794459999999999Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_right.xml
deleted file mode 100644
index b549937..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M8.5029,2.2a.29744.29744,0,0,1,.29710000000000036.2971199999999996v15.005760000000002a.29744.29744,0,0,1-.29710000000000036.2971199999999996h-1.0058000000000007a.29744.29744,0,0,1-.2970999999999995-.2971199999999996v-15.005760000000002a.29744.29744,0,0,1,.2970999999999995-.2971199999999987h1.0058000000000007m0-.2h-1.0058000000000007a.49711.49711,0,0,0-.49709999999999965.4971199999999998v15.005760000000002a.49711.49711,0,0,0,.49709999999999965.4971199999999989h1.0058000000000007a.49711.49711,0,0,0,.49709999999999965-.4971199999999989v-15.005760000000002a.49711.49711,0,0,0-.49709999999999965-.4971199999999989h0Zm-1.4888000000000003,12.043v3.46082a.49621.49621,0,0,0,.4961500000000001.4961800000000025h1.0065300000000006a.49614.49614,0,0,0,.49615-.49683l-.0047-3.60767a5.21819,5.21819,0,0,1,1.665-4.144l2.44818-2.06561a.35758.35758,0,0,1,.6405.16266l.91821,3.1106a.38663.38663,0,0,0,.7394400000000001-.09915000000000163l1.5804399999999994-7.859999999999999l-8.00476.44965a.38658.38658,0,0,0-.20294.71777l2.94891,1.35016a.3576.3576,0,0,1,.07019.6571l-2.457460000000001,2.0738600000000007a7.25157,7.25157,0,0,0-2.3398399999999997,5.794459999999999Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_left.xml
deleted file mode 100644
index 65e66e2..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M9.00078,5.97986l.011.00183a6.06019,6.06019,0,0,1,5.989,6.07324v3.9450699999999994h-.0031199999999991235l.002,1.50317a.49614.49614,0,0,1-.4962.4968299999999992h-1.0064600000000006a.49622.49622,0,0,1-.49622-.49622v-5.448849999999998a4.05782,4.05782,0,0,0-3.98878-4.07324h-1.9987700000000004a.3576.3576,0,0,0-.37738.54248l1.3437499999999991,2.951830000000001a.38659.38659,0,0,1-.62354.40942l-6.346979999999999-4.885420000000002l6.347-4.922a.38659.38659,0,0,1,.62354.40942l-1.343770000000001,2.9518499999999994a.35757.35757,0,0,0,.37738.54242h1.9875500000000015"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_right.xml
deleted file mode 100644
index 1647927..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M10.99707,7.98169a4.05782,4.05782,0,0,0-3.9887700000000006,4.07324v5.44885a.49622.49622,0,0,1-.4962200000000001.496220000000001h-1.0064599999999997a.49614.49614,0,0,1-.49615-.49683l.0019399999999993867-1.5031700000000008h-.003109999999999502v-3.9450699999999994a6.06019,6.06019,0,0,1,5.989-6.07324l.011-.00183v.0018299999999999983h1.98755a.35757.35757,0,0,0,.37738-.54242l-1.34375-2.9518400000000007a.38659.38659,0,0,1,.623520000000001-.40942999999999996l6.3469999999999995,4.922000000000001l-6.347,4.88544a.38659.38659,0,0,1-.62354-.40942l1.34375-2.95184a.3576.3576,0,0,0-.37738-.54248h-1.9987599999999972Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_left.xml
deleted file mode 100644
index 83b821a..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M15.49771,18a.49779.49779,0,0,1-.49779-.49779v-12.4983l-.27979-.00635a2.56758,2.56758,0,0,0-2.0957.79l-5.39526,4.61285a.34918.34918,0,0,0,.08252.63177l2.92877,1.39331a.38658.38658,0,0,1-.21344.71472l-8.0105.33209l1.69568-7.836a.38661.38661,0,0,1,.74072-.0882l.8725,3.12372a.35757.35757,0,0,0,.638.17206l.0037800000000007827.00446999999999953l5.392099999999999-4.60909a4.46634,4.46634,0,0,1,3.38476-1.2412599999999996l.2641600000000004.0019999999999997797a1.92935,1.92935,0,0,1,1.43408.56885a2.10247,2.10247,0,0,1,.55713,1.46045l.00046999999999997044,12.47289a.49779.49779,0,0,1-.49779000000000195.4978100000000012h-1.0044Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_right.xml
deleted file mode 100644
index 3394364..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M3.49789,17.99542a.49779.49779,0,0,1-.49779-.49781l.00047000000000041453-12.472889999999998a2.10247,2.10247,0,0,1,.5571299999999999-1.4604500000000002a1.92935,1.92935,0,0,1,1.43408-.56885l.26416-.002a4.46634,4.46634,0,0,1,3.38476,1.2412599999999996l5.392099999999999,4.609089999999999l.00378-.00446a.35757.35757,0,0,0,.638-.17206l.8725-3.12372a.38661.38661,0,0,1,.74072.0882l1.69568,7.836l-8.01048-.3320899999999991a.38658.38658,0,0,1-.21344-.71472l2.92877-1.39331a.34918.34918,0,0,0,.08252-.63177l-5.395280000000001-4.612840000000001a2.56758,2.56758,0,0,0-2.0957-.79l-.27979.00635v12.4983a.49779.49779,0,0,1-.49779.49779h-1.0043999999999995Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_left.xml
deleted file mode 100644
index 385a519..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M12.9859,14.043v3.46082a.49621.49621,0,0,1-.4961500000000001.4961800000000025h-1.0065300000000015a.49614.49614,0,0,1-.49615-.49683l.0047-3.60767a5.21819,5.21819,0,0,0-1.665-4.144l-2.4482299999999997-2.0656499999999998a.35758.35758,0,0,0-.6405.16266l-.91821,3.1106a.38663.38663,0,0,1-.7393899999999993-.09910999999999959l-1.5804400000000003-7.859999999999999l8.00476.44965a.38658.38658,0,0,1,.20294.71777l-2.9489099999999997,1.3501599999999998a.3576.3576,0,0,0-.07019.6571l2.45746,2.07385a7.25157,7.25157,0,0,1,2.3398400000000024,5.7944700000000005Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_right.xml
deleted file mode 100644
index 2ee993c..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M9.35394,8.24854l2.457460000000001-2.07386a.3576.3576,0,0,0-.07019-.6571l-2.9489100000000015-1.3501600000000007a.38658.38658,0,0,1,.20294-.71777l8.004760000000001-.4496500000000001l-1.58044,7.86a.38663.38663,0,0,1-.73938.09912l-.9181799999999996-3.1106099999999985a.35758.35758,0,0,0-.6405-.16266l-2.448220000000001,2.0656099999999995a5.21819,5.21819,0,0,0-1.665,4.144l.0047,3.60767a.49614.49614,0,0,1-.4961999999999982.49687000000000126h-1.0065300000000006a.49621.49621,0,0,1-.49615-.49622v-3.4607799999999997a7.25157,7.25157,0,0,1,2.3398399999999997-5.794459999999999Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout.xml
deleted file mode 100644
index 5504491..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <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"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_left.xml
deleted file mode 100644
index e3337c5..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <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"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_right.xml
deleted file mode 100644
index c4e3de7..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <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"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_left.xml
deleted file mode 100644
index f6b3999..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <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"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_right.xml
deleted file mode 100644
index 820ddf3..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <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"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_left.xml
deleted file mode 100644
index 7891bd7..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <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"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_right.xml
deleted file mode 100644
index 028dc9f..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <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"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_straight.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_straight.xml
deleted file mode 100644
index 301ce6c..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_straight.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <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"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw.xml
deleted file mode 100644
index fe948fc..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<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
deleted file mode 100644
index 038da24..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_left.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<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
deleted file mode 100644
index a96201d..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_right.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<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
deleted file mode 100644
index da060af..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_sharp_left.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<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
deleted file mode 100644
index 91165f8..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_sharp_right.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<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
deleted file mode 100644
index 6bdd564..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_slight_left.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<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
deleted file mode 100644
index 00c0fa5..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_slight_right.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<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
deleted file mode 100644
index 0961145..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_straight.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<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_turn_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_left.xml
deleted file mode 100644
index faa7027..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M10,5.97986l.011.00183a6.06019,6.06019,0,0,1,5.989000000000001,6.07324v3.9450699999999994h-.003109999999999502l.002,1.50317a.49614.49614,0,0,1-.49620000000000175.4968299999999992h-1.0064700000000002a.49622.49622,0,0,1-.4962199999999992-.496220000000001v-5.448849999999998a4.05782,4.05782,0,0,0-3.98877-4.07324h-1.99878a.3576.3576,0,0,0-.37738.54248l1.3437500000000009,2.951830000000001a.38659.38659,0,0,1-.62354.40942l-6.34698-4.885420000000002l6.347-4.922a.38659.38659,0,0,1,.62354.40942l-1.3437700000000001,2.9518499999999994a.35757.35757,0,0,0,.37738.54242h1.9875500000000006"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_right.xml
deleted file mode 100644
index 6ef4749..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M9.98877,7.98169a4.05782,4.05782,0,0,0-3.9887700000000006,4.07324v5.44885a.49622.49622,0,0,1-.4962200000000001.496220000000001h-1.0064700000000002a.49614.49614,0,0,1-.49615-.49683l.0019500000000007844-1.5031700000000008h-.0031100000000003902v-3.9450699999999994a6.06019,6.06019,0,0,1,5.989000000000001-6.07324l.010999999999999233-.0018299999999999983v.0018299999999999983h1.98755a.35757.35757,0,0,0,.37738-.54242l-1.3437500000000018-2.9518400000000007a.38659.38659,0,0,1,.6235300000000006-.40942999999999996l6.346990000000002,4.922000000000001l-6.347,4.88544a.38659.38659,0,0,1-.62354-.40942l1.34375-2.95184a.3576.3576,0,0,0-.37738-.54248h-1.998759999999999Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_left.xml
deleted file mode 100644
index 9024be2..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M15.49771,17.99542a.49779.49779,0,0,1-.49779-.49779v-12.4983l-.2797799999999988-.006330000000000169a2.56758,2.56758,0,0,0-2.0957.79l-5.39527,4.61283a.34918.34918,0,0,0,.08252.63177l2.92877,1.39331a.38658.38658,0,0,1-.21344.71472l-8.0105.33209l1.69568-7.836a.38661.38661,0,0,1,.74072-.0882l.8725,3.12372a.35757.35757,0,0,0,.638.17206l.0037800000000007827.00446999999999953l5.392099999999999-4.609089999999999a4.46634,4.46634,0,0,1,3.38477-1.24121l.26416.002a1.92935,1.92935,0,0,1,1.43408.56885a2.10247,2.10247,0,0,1,.55713,1.46045l.000460000000000349,12.472840000000001a.49779.49779,0,0,1-.49779.49781h-1.0044Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_right.xml
deleted file mode 100644
index 3394364..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M3.49789,17.99542a.49779.49779,0,0,1-.49779-.49781l.00047000000000041453-12.472889999999998a2.10247,2.10247,0,0,1,.5571299999999999-1.4604500000000002a1.92935,1.92935,0,0,1,1.43408-.56885l.26416-.002a4.46634,4.46634,0,0,1,3.38476,1.2412599999999996l5.392099999999999,4.609089999999999l.00378-.00446a.35757.35757,0,0,0,.638-.17206l.8725-3.12372a.38661.38661,0,0,1,.74072.0882l1.69568,7.836l-8.01048-.3320899999999991a.38658.38658,0,0,1-.21344-.71472l2.92877-1.39331a.34918.34918,0,0,0,.08252-.63177l-5.395280000000001-4.612840000000001a2.56758,2.56758,0,0,0-2.0957-.79l-.27979.00635v12.4983a.49779.49779,0,0,1-.49779.49779h-1.0043999999999995Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_left.xml
deleted file mode 100644
index 431736f..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M14.9859,14.043v3.46082a.49621.49621,0,0,1-.4961600000000015.4961800000000025h-1.0065299999999997a.49614.49614,0,0,1-.49615-.49683l.0047-3.60767a5.21819,5.21819,0,0,0-1.665-4.144l-2.448220000000001-2.0656499999999998a.35758.35758,0,0,0-.6405.16266l-.91821,3.1106a.38663.38663,0,0,1-.7393899999999993-.09910999999999959l-1.5804400000000003-7.859999999999999l8.00476.44965a.38658.38658,0,0,1,.20294.71777l-2.9489199999999993,1.3501599999999998a.3576.3576,0,0,0-.07019.6571l2.45746,2.07385a7.25158,7.25158,0,0,1,2.339850000000002,5.7944700000000005Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_right.xml
deleted file mode 100644
index 0ab8aef..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M7.35395,8.24854l2.45746-2.07386a.3576.3576,0,0,0-.07019-.6571l-2.94892-1.3501600000000007a.38658.38658,0,0,1,.20294-.71777l8.004760000000001-.4496500000000001l-1.58044,7.86a.38663.38663,0,0,1-.73938.09912l-.9181799999999996-3.1106099999999985a.35758.35758,0,0,0-.6405-.16266l-2.448220000000001,2.0656099999999995a5.21819,5.21819,0,0,0-1.665,4.144l.0047,3.60767a.49614.49614,0,0,1-.49618999999999946.49687000000000126h-1.0065300000000006a.49621.49621,0,0,1-.49615-.49622v-3.4607799999999997a7.25157,7.25157,0,0,1,2.3398400000000006-5.794459999999999Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_left.xml
deleted file mode 100644
index bfb9e0c..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
-    <path android:fillColor="#FF000000"
-          android:pathData="M17,8v9.49652a.50346.50346,0,0,1-.5034799999999997.5034799999999997h-.993a.50346.50346,0,0,1-.50352-.5034799999999997v-9.49652a3.5,3.5,0,0,0-7,0v4h-.009089999999999598a.35757.35757,0,0,0,.54242.37738l2.95184-1.34375a.3866.3866,0,0,1,.40942.62354l-4.9036800000000005,6.342829999999999l-4.9037500000000005-6.342829999999999a.3866.3866,0,0,1,.40942-.62354l2.95184,1.34375a.3576.3576,0,0,0,.5424900000000008-.3773800000000005h.009089999999999598v-4a5.5,5.5,0,0,1,11,0Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_right.xml
deleted file mode 100644
index 8fc9223..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_right.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
-        android:height="20dp" android:viewportWidth="20" android:viewportHeight="20"
-        android:pivotX="10" android:scaleX="-1">
-    <group android:pivotX="10" android:scaleX="-1">
-        <path android:fillColor="#FF000000"
-              android:pathData="M17,8v9.49652a.50346.50346,0,0,1-.5034799999999997.5034799999999997h-.993a.50346.50346,0,0,1-.50352-.5034799999999997v-9.49652a3.5,3.5,0,0,0-7,0v4h-.009089999999999598a.35757.35757,0,0,0,.54242.37738l2.95184-1.34375a.3866.3866,0,0,1,.40942.62354l-4.9036800000000005,6.342829999999999l-4.9037500000000005-6.342829999999999a.3866.3866,0,0,1,.40942-.62354l2.95184,1.34375a.3576.3576,0,0,0,.5424900000000008-.3773800000000005h.009089999999999598v-4a5.5,5.5,0,0,1,11,0Z"/>
-    </group>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/focused_button_shape.xml b/tests/DirectRenderingClusterSample/res/drawable/focused_button_shape.xml
deleted file mode 100644
index 9ded30c..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/focused_button_shape.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <stroke
-        android:width="2dp"
-        android:color="#333333"/>
-    <corners
-        android:radius="7dp"/>
-    <padding
-        android:left="5dp"
-        android:top="5dp"
-        android:right="5dp"
-        android:bottom="5dp"/>
-</shape>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/gradient_bottom.xml b/tests/DirectRenderingClusterSample/res/drawable/gradient_bottom.xml
deleted file mode 100644
index 8006864..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/gradient_bottom.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <gradient
-        android:startColor="#00000000"
-        android:endColor="#FF000000"
-        android:angle="270"
-        android:dither="true"
-    />
-</shape>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/gradient_top.xml b/tests/DirectRenderingClusterSample/res/drawable/gradient_top.xml
deleted file mode 100644
index 74932ad..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/gradient_top.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <gradient
-        android:startColor="#00000000"
-        android:endColor="#FF000000"
-        android:angle="90"
-        android:dither="true"
-    />
-</shape>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/seekbar_background.xml b/tests/DirectRenderingClusterSample/res/drawable/seekbar_background.xml
deleted file mode 100644
index ec08455..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/seekbar_background.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2016, 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.
--->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <item android:id="@android:id/background">
-        <shape android:shape="line">
-            <stroke android:width="@dimen/playback_seekbar_track_height"/>
-        </shape>
-    </item>
-
-    <item android:id="@android:id/progress">
-        <clip>
-            <shape android:shape="line">
-                <stroke android:width="@dimen/playback_seekbar_track_height"/>
-            </shape>
-        </clip>
-    </item>
-
-</layer-list>
diff --git a/tests/DirectRenderingClusterSample/res/drawable/seekbar_thumb.xml b/tests/DirectRenderingClusterSample/res/drawable/seekbar_thumb.xml
deleted file mode 100644
index 1d0b4a1..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/seekbar_thumb.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2018, The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="oval">
-    <solid android:color="@color/progress_bar_thumb_color"/>
-    <size
-        android:width="@dimen/playback_seekbar_thumb_width"
-        android:height="@dimen/playback_seekbar_thumb_height"/>
-</shape>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/speedometer.xml b/tests/DirectRenderingClusterSample/res/drawable/speedometer.xml
deleted file mode 100644
index d97c54e..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/speedometer.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:aapt="http://schemas.android.com/aapt"
-        android:width="200dp"
-        android:height="200dp"
-        android:viewportHeight="64"
-        android:viewportWidth="64">
-
-    <path
-        android:pathData="M0,32
-        A32,32 0 1,1 64,32
-        A32,32 0 1,1 0,32 Z">
-        <aapt:attr name="android:fillColor">
-            <gradient
-                android:centerX="32"
-                android:centerY="32"
-                android:gradientRadius="32"
-                android:type="radial">
-                <item
-                    android:color="#FF000000"
-                    android:offset="0.0"/>
-                <item
-                    android:color="#FF000000"
-                    android:offset="0.94"/>
-                <item
-                    android:color="#00000000"
-                    android:offset="1.0"/>
-            </gradient>
-        </aapt:attr>
-    </path>
-
-    <path
-        android:fillColor="#000"
-        android:strokeWidth="0.25"
-        android:pathData="M2,32
-        A30,30 0 1,1 62,32
-        A30,30 0 1,1 2,32 Z">
-        <aapt:attr name="android:strokeColor">
-            <gradient
-                android:startX="0"
-                android:startY="10"
-                android:startColor="#000"
-                android:endX="0"
-                android:endY="150"
-                android:endColor="#000"
-                android:centerColor="#DDD"
-                android:type="linear"/>
-        </aapt:attr>
-    </path>
-
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/layout/activity_main.xml b/tests/DirectRenderingClusterSample/res/layout/activity_main.xml
deleted file mode 100644
index fa8db14..0000000
--- a/tests/DirectRenderingClusterSample/res/layout/activity_main.xml
+++ /dev/null
@@ -1,237 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/activity_main"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@android:color/background_dark"
-    android:windowIsFloating="true"
-    tools:context=".MainClusterActivity">
-
-    <androidx.constraintlayout.widget.Guideline
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:id="@+id/left_unobscured"
-        android:orientation="vertical"
-        app:layout_constraintGuide_begin="@dimen/speedometer_overlap_width"/>
-
-    <androidx.constraintlayout.widget.Guideline
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:id="@+id/right_unobscured"
-        android:orientation="vertical"
-        app:layout_constraintGuide_end="@dimen/speedometer_overlap_width"/>
-
-    <androidx.constraintlayout.widget.Guideline
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:id="@+id/gauges_top"
-        android:orientation="horizontal"
-        app:layout_constraintGuide_begin="@dimen/speedometer_top"/>
-
-    <androidx.viewpager.widget.ViewPager
-        android:id="@+id/pager"
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintBottom_toTopOf="@+id/info"/>
-
-    <LinearLayout
-        android:id="@+id/info"
-        android:layout_width="0dp"
-        android:layout_height="@dimen/info_height"
-        app:layout_constraintLeft_toRightOf="@+id/left_unobscured"
-        app:layout_constraintRight_toLeftOf="@+id/right_unobscured"
-        app:layout_constraintBottom_toBottomOf="parent"
-        android:gravity="center">
-
-        <LinearLayout
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="vertical"
-            android:gravity="start">
-
-            <TextView
-                android:layout_height="wrap_content"
-                android:layout_width="wrap_content"
-                android:includeFontPadding="false"
-                android:text="@string/info_fuel_label"
-                android:textSize="@dimen/info_label_text_size"/>
-
-            <TextView
-                android:id="@+id/info_fuel"
-                android:layout_height="wrap_content"
-                android:layout_width="wrap_content"
-                android:includeFontPadding="false"
-                android:text="@string/info_value_empty"
-                android:textSize="@dimen/info_value_text_size"/>
-
-            <TextView
-                android:layout_height="wrap_content"
-                android:layout_width="wrap_content"
-                android:includeFontPadding="false"
-                android:text="@string/info_range_label"
-                android:textSize="@dimen/info_label_text_size"/>
-
-            <TextView
-                android:id="@+id/info_range"
-                android:layout_height="wrap_content"
-                android:layout_width="wrap_content"
-                android:includeFontPadding="false"
-                android:text="@string/info_value_empty"
-                android:textSize="@dimen/info_value_text_size"/>
-        </LinearLayout>
-
-        <include
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:id="@+id/navigation_state"
-            layout="@layout/include_navigation_state"/>
-
-        <LinearLayout
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="vertical"
-            android:gravity="end">
-
-            <TextView
-                android:layout_height="wrap_content"
-                android:layout_width="wrap_content"
-                android:includeFontPadding="false"
-                android:text="@string/info_speed_label"
-                android:textSize="@dimen/info_label_text_size"/>
-
-            <TextView
-                android:id="@+id/info_speed"
-                android:layout_height="wrap_content"
-                android:layout_width="wrap_content"
-                android:includeFontPadding="false"
-                android:text="@string/info_value_empty"
-                android:textSize="@dimen/info_value_text_size"/>
-
-            <TextView
-                android:layout_height="wrap_content"
-                android:layout_width="wrap_content"
-                android:includeFontPadding="false"
-                android:text="@string/info_rpm_label"
-                android:textSize="@dimen/info_label_text_size"/>
-
-            <TextView
-                android:id="@+id/info_rpm"
-                android:layout_height="wrap_content"
-                android:layout_width="wrap_content"
-                android:includeFontPadding="false"
-                android:text="@string/info_value_empty"
-                android:textSize="@dimen/info_value_text_size"/>
-        </LinearLayout>
-    </LinearLayout>
-
-    <ImageView
-        android:id="@+id/left_gauge"
-        android:layout_width="@dimen/speedometer_width"
-        android:layout_height="@dimen/speedometer_height"
-        android:src="@drawable/speedometer"
-        android:elevation="2dp"
-        app:layout_constraintTop_toBottomOf="@+id/gauges_top"
-        app:layout_constraintRight_toLeftOf="@+id/left_unobscured"/>
-
-    <ImageView
-        android:id="@+id/right_gauge"
-        android:layout_width="@dimen/speedometer_width"
-        android:layout_height="@dimen/speedometer_height"
-        android:src="@drawable/speedometer"
-        android:elevation="2dp"
-        app:layout_constraintTop_toBottomOf="@+id/gauges_top"
-        app:layout_constraintLeft_toRightOf="@+id/right_unobscured"/>
-
-    <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:translationZ="4dp"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintBottom_toBottomOf="parent">
-
-        <Button
-            android:id="@+id/btn_nav"
-            android:layout_width="@dimen/facet_icon_size"
-            android:layout_height="@dimen/facet_icon_size"
-            android:layout_margin="@dimen/facet_icon_margin"
-            android:background="@drawable/ic_nav"
-            android:backgroundTint="@color/icon_color"
-            android:focusableInTouchMode="true" />
-        <Button
-            android:id="@+id/btn_phone"
-            android:layout_width="@dimen/facet_icon_size"
-            android:layout_height="@dimen/facet_icon_size"
-            android:layout_margin="@dimen/facet_icon_margin"
-            android:background="@drawable/ic_phone"
-            android:backgroundTint="@color/icon_color"
-            android:focusableInTouchMode="true" />
-        <Button
-            android:id="@+id/btn_music"
-            android:layout_width="@dimen/facet_icon_size"
-            android:layout_height="@dimen/facet_icon_size"
-            android:layout_margin="@dimen/facet_icon_margin"
-            android:background="@drawable/ic_music"
-            android:backgroundTint="@color/icon_color"
-            android:focusableInTouchMode="true" />
-        <Button
-            android:id="@+id/btn_car_info"
-            android:layout_width="@dimen/facet_icon_size"
-            android:layout_height="@dimen/facet_icon_size"
-            android:layout_margin="@dimen/facet_icon_margin"
-            android:background="@drawable/ic_car_info"
-            android:backgroundTint="@color/icon_color"
-            android:focusableInTouchMode="true" />
-    </LinearLayout>
-
-    <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:translationZ="4dp"
-        app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintBottom_toBottomOf="parent">
-
-        <TextView
-            android:id="@+id/gear_parked"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:layout_marginHorizontal="@dimen/gear_icon_margin"
-            android:text="@string/gear_parked"
-            android:textColor="@color/icon_color"
-            android:textSize="@dimen/gear_text_size"/>
-
-        <TextView
-            android:id="@+id/gear_reverse"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:layout_marginHorizontal="@dimen/gear_icon_margin"
-            android:text="@string/gear_reverse"
-            android:textColor="@color/icon_color"
-            android:textSize="@dimen/gear_text_size"/>
-
-        <TextView
-            android:id="@+id/gear_neutral"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:layout_marginHorizontal="@dimen/gear_icon_margin"
-            android:text="@string/gear_neutral"
-            android:textColor="@color/icon_color"
-            android:textSize="@dimen/gear_text_size"/>
-
-        <TextView
-            android:id="@+id/gear_drive"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:layout_marginHorizontal="@dimen/gear_icon_margin"
-            android:text="@string/gear_drive"
-            android:textColor="@color/icon_color"
-            android:textSize="@dimen/gear_text_size"/>
-
-    </LinearLayout>
-</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/tests/DirectRenderingClusterSample/res/layout/fragment_car_info.xml b/tests/DirectRenderingClusterSample/res/layout/fragment_car_info.xml
deleted file mode 100644
index 3a1f5ab..0000000
--- a/tests/DirectRenderingClusterSample/res/layout/fragment_car_info.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context="com.google.experiments.client.pavelm.fakeclusterux.CarInfoFragment">
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="32 psi"
-        android:layout_gravity="center_horizontal"
-        android:layout_marginLeft="-80dp"
-        />
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="33 psi"
-        android:layout_gravity="center_horizontal"
-        android:layout_marginLeft="80dp"
-        />
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="33 psi"
-        android:layout_gravity="center_horizontal|bottom"
-        android:layout_marginLeft="80dp"
-        />
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="31 psi"
-        android:layout_gravity="center_horizontal|bottom"
-        android:layout_marginLeft="-80dp"
-        />
-
-    <ImageView
-        android:layout_width="fill_parent"
-        android:layout_height="fill_parent"
-        android:src="@drawable/car_top_view"
-        android:padding="30dp"
-        android:scaleType="fitCenter" />
-
-</FrameLayout>
diff --git a/tests/DirectRenderingClusterSample/res/layout/fragment_music.xml b/tests/DirectRenderingClusterSample/res/layout/fragment_music.xml
deleted file mode 100644
index f9c72f7..0000000
--- a/tests/DirectRenderingClusterSample/res/layout/fragment_music.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2018, 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.
--->
-<androidx.cardview.widget.CardView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent"
-    app:cardElevation="0dp"
-    app:cardCornerRadius="6dp">
-
-    <com.android.car.apps.common.CrossfadeImageView
-        android:id="@+id/album_background"
-        android:foreground="?android:attr/selectableItemBackground"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:scaleType="fitStart" />
-
-    <View
-        android:id="@+id/playback_scrim"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:background="@color/album_art_scrim"
-        android:alpha="@dimen/album_art_scrim_alpha"/>
-
-    <androidx.constraintlayout.widget.ConstraintLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
-        android:id="@+id/playback_container"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-
-        <TextView
-            android:id="@+id/app_name"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="@dimen/playback_fragment_text_margin_top"
-            android:layout_marginLeft="@dimen/playback_fragment_text_margin_x"
-            android:layout_marginRight="@dimen/playback_fragment_text_margin_x"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:ellipsize="end"
-            android:maxLines="1"
-            android:includeFontPadding="false"
-            app:layout_constraintLeft_toLeftOf="parent"
-            app:layout_constraintRight_toRightOf="parent"
-            app:layout_constraintTop_toTopOf="parent"/>
-
-        <androidx.constraintlayout.widget.Guideline
-            android:id="@+id/margin_start"
-            android:layout_width="0dp"
-            android:layout_height="0dp"
-            android:orientation="vertical"
-            app:layout_constraintGuide_begin="@dimen/fragment_playback_guide_margin_x"/>
-
-        <androidx.constraintlayout.widget.Guideline
-            android:id="@+id/margin_end"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="vertical"
-            app:layout_constraintGuide_end="@dimen/fragment_playback_guide_margin_x"/>
-
-        <androidx.constraintlayout.widget.Guideline
-            android:id="@+id/margin_top"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            app:layout_constraintGuide_begin="@dimen/fragment_playback_guide_margin_top"/>
-
-        <ImageView
-            android:id="@+id/album_art"
-            android:layout_width="@dimen/playback_album_art_size_normal"
-            android:layout_height="@dimen/playback_album_art_size_normal"
-            android:layout_marginStart="@dimen/fragment_metadata_art_margin_start"
-            android:layout_marginEnd="@dimen/fragment_metadata_art_margin_end"
-            android:contentDescription="@string/album_art"
-            android:background="@color/album_art_background"
-            android:scaleType="centerCrop"
-            android:transitionName="@string/album_art"
-            app:layout_constraintTop_toTopOf="@+id/app_name"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintStart_toStartOf="@+id/margin_start"
-            tools:src="@drawable/ic_person"/>
-
-        <include
-            android:id="@+id/metadata_subcontainer"
-            layout="@layout/metadata_normal"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="@dimen/fragment_metadata_metadata_margin_start"
-            android:layout_marginEnd="@dimen/fragment_metadata_metadata_margin_end"
-            app:layout_constraintBottom_toBottomOf="@+id/album_art"
-            app:layout_constraintEnd_toEndOf="@+id/margin_end"
-            app:layout_constraintStart_toEndOf="@+id/album_art"
-            app:layout_constraintTop_toTopOf="@+id/album_art"/>
-
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
-</androidx.cardview.widget.CardView>
diff --git a/tests/DirectRenderingClusterSample/res/layout/fragment_navigation.xml b/tests/DirectRenderingClusterSample/res/layout/fragment_navigation.xml
deleted file mode 100644
index 54894c2..0000000
--- a/tests/DirectRenderingClusterSample/res/layout/fragment_navigation.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".NavigationFragment">
-
-    <SurfaceView
-        android:id="@+id/nav_surface"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"/>
-
-    <ProgressBar
-        android:id="@+id/progress_bar"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        app:layout_constraintVertical_chainStyle="packed"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintBottom_toTopOf="@+id/message"/>
-
-    <TextView
-        android:id="@+id/message"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/select_nav_app"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/progress_bar"/>
-
-    <ImageView
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/navigation_gradient_height"
-        android:src="@drawable/gradient_top"
-        app:layout_constraintTop_toTopOf="parent"/>
-
-    <ImageView
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/navigation_gradient_height"
-        android:src="@drawable/gradient_bottom"
-        app:layout_constraintBottom_toBottomOf="parent"/>
-
-</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/layout/fragment_phone.xml b/tests/DirectRenderingClusterSample/res/layout/fragment_phone.xml
deleted file mode 100644
index b7f903b..0000000
--- a/tests/DirectRenderingClusterSample/res/layout/fragment_phone.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 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.
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-
-    <FrameLayout
-        android:id="@+id/user_profile_container"
-        android:layout_width="match_parent"
-        android:gravity="center"
-        android:layout_height="0dp"
-        android:layout_weight="1">
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:gravity="center"
-            android:orientation="vertical">
-            <ImageView
-                android:id="@+id/avatar"
-                android:layout_width="@dimen/large_avatar_icon_size"
-                android:layout_height="@dimen/large_avatar_icon_size"
-                android:layout_gravity="center"
-                android:scaleType="fitCenter" />
-            <TextView
-                android:id="@+id/title"
-                android:textAppearance="?android:attr/textAppearanceLarge"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:paddingTop="@dimen/user_profile_title_padding_top"
-                android:focusable="true"
-                android:maxLines="1"
-                android:gravity="center"/>
-            <TextView
-                android:id="@+id/body"
-                android:textAppearance="?android:attr/textAppearanceSmall"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:paddingTop="@dimen/user_profile_body_padding_top"
-                android:gravity="center"
-                android:maxLines="1"/>
-        </LinearLayout>
-
-    </FrameLayout>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/layout/include_navigation_state.xml b/tests/DirectRenderingClusterSample/res/layout/include_navigation_state.xml
deleted file mode 100644
index 8f1196a..0000000
--- a/tests/DirectRenderingClusterSample/res/layout/include_navigation_state.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              android:layout_width="match_parent"
-              android:layout_height="match_parent"
-              android:orientation="horizontal">
-
-    <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"
-        android:layout_height="wrap_content"
-        android:orientation="vertical">
-
-        <LinearLayout
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_weight="1.0">
-
-            <TextView
-                android:id="@+id/distance"
-                android:layout_width="@dimen/distance_width"
-                android:layout_height="wrap_content"
-                android:maxLines="1"
-                android:textSize="@dimen/distance_text_size"/>
-
-            <android.car.cluster.sample.LaneView
-                android:id="@+id/lane"
-                android:layout_width="wrap_content"
-                android:layout_height="@dimen/laneview_height"
-                android:layout_alignParentRight="true"/>
-        </LinearLayout>
-
-        <android.car.cluster.sample.CueView
-            android:id="@+id/cue"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:maxLines="1"
-            android:textSize="@dimen/cue_text_size"/>
-
-        <LinearLayout
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal">
-
-            <TextView
-                android:id="@+id/eta"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center"
-                android:layout_marginRight="@dimen/eta_margin_right"
-                android:maxLines="1"
-                android:textSize="@dimen/eta_text_size"/>
-
-            <TextView
-                android:id="@+id/segment"
-                android:layout_height="wrap_content"
-                android:layout_width="wrap_content"
-                android:maxLines="1"
-                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/layout/metadata_normal.xml b/tests/DirectRenderingClusterSample/res/layout/metadata_normal.xml
deleted file mode 100644
index 5cb75a6..0000000
--- a/tests/DirectRenderingClusterSample/res/layout/metadata_normal.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2018, 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.
--->
-<androidx.constraintlayout.widget.ConstraintLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/metadata_subcontainer"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:focusable="false">
-
-    <TextView
-        android:id="@+id/title"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:ellipsize="end"
-        android:includeFontPadding="false"
-        android:maxLines="@integer/playback_title_text_max_lines"
-        android:textAppearance="?android:attr/textAppearanceLarge"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        tools:text="Body 1 Header"/>
-    <TextView
-        android:id="@+id/subtitle"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/metadata_normal_subtitle_margin_top"
-        android:layout_marginEnd="@dimen/metadata_normal_subtitle_margin_end"
-        android:ellipsize="end"
-        android:maxLines="@integer/playback_subtitle_text_max_lines"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toStartOf="@+id/time"
-        app:layout_constraintTop_toBottomOf="@+id/title"
-        tools:text="Body 2"/>
-    <TextView
-        android:id="@+id/time"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/metadata_normal_time_margin_top"
-        android:ellipsize="end"
-        android:maxLines="@integer/playback_subtitle_text_max_lines"
-        android:gravity="end"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/title"
-        tools:text="3:27 / 4:03"/>
-    <SeekBar
-        android:id="@+id/seek_bar"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/metadata_normal_seek_margin_top"
-        android:clickable="false"
-        android:focusable="false"
-        android:paddingEnd="@dimen/playback_seekbar_padding_end"
-        android:paddingStart="@dimen/playback_seekbar_padding_start"
-        android:progressDrawable="@drawable/seekbar_background"
-        android:thumb="@drawable/seekbar_thumb"
-        android:splitTrack="false"
-        android:progressTint="@color/progress_bar_highlight"
-        android:progressBackgroundTint="@color/progress_bar_background"
-        android:background="@null"
-        android:visibility="invisible"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/subtitle"
-        tools:progress="70"
-        tools:visibility="visible"/>
-
-</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/tests/DirectRenderingClusterSample/res/mipmap-hdpi/ic_launcher.png b/tests/DirectRenderingClusterSample/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cde69bc..0000000
--- a/tests/DirectRenderingClusterSample/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/mipmap-mdpi/ic_launcher.png b/tests/DirectRenderingClusterSample/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c133a0c..0000000
--- a/tests/DirectRenderingClusterSample/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/mipmap-xhdpi/ic_launcher.png b/tests/DirectRenderingClusterSample/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index bfa42f0..0000000
--- a/tests/DirectRenderingClusterSample/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/mipmap-xxhdpi/ic_launcher.png b/tests/DirectRenderingClusterSample/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 324e72c..0000000
--- a/tests/DirectRenderingClusterSample/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/mipmap-xxxhdpi/ic_launcher.png b/tests/DirectRenderingClusterSample/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index aee44e1..0000000
--- a/tests/DirectRenderingClusterSample/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/values-en-rUS/dimens.xml b/tests/DirectRenderingClusterSample/res/values-en-rUS/dimens.xml
deleted file mode 100644
index 05eef22..0000000
--- a/tests/DirectRenderingClusterSample/res/values-en-rUS/dimens.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <!--                                   -->
-    <!-- Sensor value conversion constants -->
-    <!--                                   -->
-    <!-- Speed: meters per second to miles per hour -->
-    <item name="speed_factor" format="float" type="dimen">2.236936</item>
-    <!-- Distance: miles to meters -->
-    <item name="distance_factor" format="float" type="dimen">1609.344</item>
-</resources>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/values-w820dp/dimens.xml b/tests/DirectRenderingClusterSample/res/values-w820dp/dimens.xml
deleted file mode 100644
index 63fc816..0000000
--- a/tests/DirectRenderingClusterSample/res/values-w820dp/dimens.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<resources>
-    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
-         (such as screen margins) for screens with more than 820dp of available width. This
-         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
-    <dimen name="activity_horizontal_margin">64dp</dimen>
-</resources>
diff --git a/tests/DirectRenderingClusterSample/res/values/colors.xml b/tests/DirectRenderingClusterSample/res/values/colors.xml
deleted file mode 100644
index c40f199..0000000
--- a/tests/DirectRenderingClusterSample/res/values/colors.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <color name="colorPrimary">#3F51B5</color>
-    <color name="colorPrimaryDark">#303F9F</color>
-    <color name="colorAccent">#FF4081</color>
-    <color name="darkBlue">#2b2b77</color>
-
-    <!-- Gear and facet icon colors -->
-    <color name="icon_selected">#6EDDFF</color>
-    <color name="icon_unselected">#1B378A</color>
-
-    <!-- LaneView highlight colors -->
-    <color name="laneDirection">#888888</color>
-    <color name="laneDirectionHighlighted">#FFFFFF</color>
-
-    <!-- Traffic colors -->
-    <color name="low_traffic">#0F9D58</color>
-    <color name="medium_traffic">#F2B300</color>
-    <color name="high_traffic">#E06055</color>
-    <color name="unknown_traffic">#4285F4</color>
-
-    <color name="album_art_background">@*android:color/car_grey_100</color>
-    <!-- Color used on the placeholder album art -->
-    <color name="album_art_placeholder_color">@*android:color/car_grey_800</color>
-    <!-- Color used on the progress bar background -->
-    <color name="progress_bar_background">@*android:color/car_seekbar_track_background</color>
-    <!-- Color used on the progress bar -->
-    <color name="progress_bar_highlight">@*android:color/car_accent</color>
-    <!-- Color used on the thumb of the progress bar -->
-    <color name="progress_bar_thumb_color">@*android:color/car_accent</color>
-</resources>
diff --git a/tests/DirectRenderingClusterSample/res/values/dimens.xml b/tests/DirectRenderingClusterSample/res/values/dimens.xml
deleted file mode 100644
index 21aec67..0000000
--- a/tests/DirectRenderingClusterSample/res/values/dimens.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<resources>
-    <!-- Default screen margins, per the Android Design guidelines. -->
-    <dimen name="activity_horizontal_margin">16dp</dimen>
-    <dimen name="activity_vertical_margin">16dp</dimen>
-    <!-- Size and position of speedometers -->
-    <dimen name="speedometer_height">600dp</dimen>
-    <dimen name="speedometer_width">600dp</dimen>
-    <dimen name="speedometer_overlap_width">90dp</dimen>
-    <dimen name="speedometer_top">20dp</dimen>
-    <!-- Navigation fragment gradients -->
-    <dimen name="navigation_gradient_height">15dp</dimen>
-    <!-- Facet buttons -->
-    <dimen name="facet_icon_size">30dp</dimen>
-    <dimen name="facet_icon_margin">5dp</dimen>
-    <!-- Gears -->
-    <dimen name="gear_text_size">28sp</dimen>
-    <dimen name="gear_icon_margin">5dp</dimen>
-    <!-- Information space -->
-    <dimen name="info_height">100dp</dimen>
-    <dimen name="info_label_text_size">10sp</dimen>
-    <dimen name="info_value_text_size">20sp</dimen>
-
-    <!--                              -->
-    <!-- Navigation state componenets -->
-    <!--                              -->
-    <dimen name="nav_state_width">170dp</dimen>
-    <!-- Maneuver -->
-    <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>
-    <!-- Segment -->
-    <dimen name="segment_text_size">15sp</dimen>
-    <!-- ETA -->
-    <dimen name="eta_margin_right">15dp</dimen>
-    <dimen name="eta_text_size">15sp</dimen>
-    <!-- Cue -->
-    <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>
-
-    <dimen name="lane_icon_offset">12.5dp</dimen>
-
-    <!--                                   -->
-    <!-- Sensor value conversion constants -->
-    <!--                                   -->
-    <!-- Speed: meters per second to kilometers per hour -->
-    <item name="speed_factor" format="float" type="dimen">3.6</item>
-    <!-- Distance: kilometers to meters -->
-    <item name="distance_factor" format="float" type="dimen">1000</item>
-
-    <!-- fragment_metadata.xml -->
-    <dimen name="fragment_metadata_queue_divider_margin">@*android:dimen/car_keyline_1</dimen>
-    <dimen name="fragment_metadata_queue_margin_top">@*android:dimen/car_padding_4</dimen>
-    <dimen name="fragment_metadata_metadata_margin_start">@*android:dimen/car_padding_4</dimen>
-    <dimen name="fragment_metadata_metadata_margin_end">@*android:dimen/car_keyline_1</dimen>
-    <dimen name="fragment_metadata_art_margin_start">@*android:dimen/car_keyline_1</dimen>
-    <dimen name="fragment_metadata_art_margin_end">@*android:dimen/car_padding_4</dimen>
-
-    <!-- metadata_normal.xml -->
-    <dimen name="metadata_normal_subtitle_margin_top">@*android:dimen/car_padding_1</dimen>
-    <dimen name="metadata_normal_time_margin_top">@*android:dimen/car_padding_1</dimen>
-    <dimen name="metadata_normal_seek_margin_top">@*android:dimen/car_padding_4</dimen>
-    <dimen name="metadata_normal_subtitle_margin_end">@*android:dimen/car_padding_3</dimen>
-
-    <!-- Size of the album art thumbnail -->
-    <dimen name="playback_album_art_size_normal">156dp</dimen>
-
-    <!-- Playback seekbar track height -->
-    <dimen name="playback_seekbar_track_height">8dp</dimen>
-
-    <!-- Paddings of playback seekbar -->
-    <dimen name="playback_seekbar_padding_start">10dp</dimen>
-    <dimen name="playback_seekbar_padding_end">10dp</dimen>
-
-    <!-- Size of the thumb in the playback seekbar -->
-    <dimen name="playback_seekbar_thumb_height">20dp</dimen>
-    <dimen name="playback_seekbar_thumb_width">20dp</dimen>
-
-    <!-- fragment_playback.xml and fragment_playback_with_queue.xml -->
-    <dimen name="fragment_playback_guide_margin_x">@*android:dimen/car_margin</dimen>
-    <dimen name="fragment_playback_guide_margin_top">@*android:dimen/car_padding_4</dimen>
-
-    <!--                     -->
-    <!-- Communication Facet -->
-    <!--                     -->
-    <dimen name="user_profile_title_padding_top">@*android:dimen/car_padding_3</dimen>
-    <dimen name="user_profile_body_padding_top">@*android:dimen/car_padding_3</dimen>
-
-    <dimen name="large_avatar_icon_size">@dimen/car_large_avatar_size</dimen>
-</resources>
diff --git a/tests/DirectRenderingClusterSample/res/values/strings.xml b/tests/DirectRenderingClusterSample/res/values/strings.xml
deleted file mode 100644
index 5ec6198..0000000
--- a/tests/DirectRenderingClusterSample/res/values/strings.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<resources>
-    <string name="app_name" translatable="false">Fake Cluster Implementation</string>
-
-    <!-- TODO: Remove or change this placeholder text -->
-    <string name="hello_blank_fragment" translatable="false">Hello blank fragment</string>
-
-    <!-- Message to show when a navigation app hasn't been selected yet. [CHAR LIMIT=100] -->
-    <string name="select_nav_app" translatable="false">Select a navigation app on the main unit.</string>
-
-    <!-- Gears texts [CHAR LIMIT=1] -->
-    <string name="gear_parked" translatable="false">P</string>
-    <string name="gear_reverse" translatable="false">R</string>
-    <string name="gear_neutral" translatable="false">N</string>
-    <string name="gear_drive" translatable="false">D</string>
-
-    <!-- Information labels (shown next to driving directions) [CHAR LIMIT=30] -->
-    <string name="info_fuel_label" translatable="false">Fuel</string>
-    <string name="info_speed_label" translatable="false">Speed</string>
-    <string name="info_range_label" translatable="false">Range</string>
-    <string name="info_rpm_label" translatable="false">RPM</string>
-    <string name="info_value_empty" translatable="false">-</string>
-
-    <!-- Marker used to insert images inside rich-text strings. This string is never shown or spoken
-         to the user. Instead a image would be rendered in its place -->
-    <string name="span_image" translatable="false">[Image]</string>
-</resources>
diff --git a/tests/DirectRenderingClusterSample/res/values/styles.xml b/tests/DirectRenderingClusterSample/res/values/styles.xml
deleted file mode 100644
index cd5f552..0000000
--- a/tests/DirectRenderingClusterSample/res/values/styles.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<resources>
-    <style name="noAnimTheme" parent="android:Theme">
-        <item name="android:windowAnimationStyle">@null</item>
-    </style>
-</resources>
diff --git a/tests/DirectRenderingClusterSample/res/values/themes.xml b/tests/DirectRenderingClusterSample/res/values/themes.xml
deleted file mode 100644
index 972a036..0000000
--- a/tests/DirectRenderingClusterSample/res/values/themes.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2018 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.
--->
-<resources>
-    <style name="Theme.ClusterTheme" parent="@android:style/Theme.Black.NoTitleBar.Fullscreen">
-        <item name="android:windowAnimationStyle">@null</item>
-    </style>
-</resources>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ActivityMonitor.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ActivityMonitor.java
deleted file mode 100644
index 6cabd69..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ActivityMonitor.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2018 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 android.car.cluster.sample;
-
-import android.annotation.Nullable;
-import android.app.ActivityManager;
-import android.app.ActivityManager.StackInfo;
-import android.app.IActivityManager;
-import android.app.IProcessObserver;
-import android.app.TaskStackListener;
-import android.content.ComponentName;
-import android.os.Handler;
-import android.os.RemoteException;
-import android.util.Log;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Top activity monitor, allows listeners to be notified when a new activity comes to the foreground
- * on a particular device.
- */
-public class ActivityMonitor {
-    private static final String TAG = "Cluster.ActivityMonitor";
-
-    /**
-     * Listener of activity changes
-     */
-    public interface ActivityListener {
-        /**
-         * Invoked when a new activity becomes the top activity on a particular display.
-         */
-        void onTopActivityChanged(int displayId, @Nullable ComponentName activity);
-    }
-
-    private IActivityManager mActivityManager;
-    // Listeners of top activity changes, indexed by the displayId they are interested on.
-    private final Map<Integer, Set<ActivityListener>> mListeners = new HashMap<>();
-    private final Handler mHandler = new Handler();
-    private final IProcessObserver.Stub mProcessObserver = new IProcessObserver.Stub() {
-        @Override
-        public void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities) {
-            notifyTopActivities();
-        }
-
-        @Override
-        public void onForegroundServicesChanged(int pid, int uid, int fgServicetypes) {
-        }
-
-        @Override
-        public void onProcessDied(int pid, int uid) {
-            notifyTopActivities();
-        }
-    };
-    private final TaskStackListener mTaskStackListener = new TaskStackListener() {
-        @Override
-        public void onTaskStackChanged() {
-            Log.i(TAG, "onTaskStackChanged");
-            notifyTopActivities();
-        }
-    };
-
-    /**
-     * Registers a new listener to receive activity updates on a particular display
-     *
-     * @param displayId identifier of the display to monitor
-     * @param listener listener to be notified
-     */
-    public void addListener(int displayId, ActivityListener listener) {
-        mListeners.computeIfAbsent(displayId, k -> new HashSet<>()).add(listener);
-    }
-
-    /**
-     * Unregisters a listener previously registered with {@link #addListener(int, ActivityListener)}
-     */
-    public void removeListener(int displayId, ActivityListener listener) {
-        mListeners.computeIfAbsent(displayId, k -> new HashSet<>()).remove(listener);
-    }
-
-    /**
-     * Starts monitoring activity changes. {@link #stop()} should be invoked to release resources.
-     */
-    public void start() {
-        mActivityManager = ActivityManager.getService();
-        // Monitoring both listeners are necessary as there are cases where one listener cannot
-        // monitor activity change.
-        try {
-            mActivityManager.registerProcessObserver(mProcessObserver);
-            mActivityManager.registerTaskStackListener(mTaskStackListener);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Cannot register activity monitoring", e);
-            throw new RuntimeException(e);
-        }
-        notifyTopActivities();
-    }
-
-    /**
-     * Stops monitoring activity changes. Should be invoked when this monitor is not longer used.
-     */
-    public void stop() {
-        if (mActivityManager == null) {
-            return;
-        }
-        try {
-            mActivityManager.unregisterProcessObserver(mProcessObserver);
-            mActivityManager.unregisterTaskStackListener(mTaskStackListener);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Cannot unregister activity monitoring. Ignoring", e);
-        }
-        mActivityManager = null;
-    }
-
-    /**
-     * Notifies listeners on changes of top activities. {@link ActivityManager} might trigger
-     * updates on threads different than UI.
-     */
-    private void notifyTopActivities() {
-        mHandler.post(() -> {
-            try {
-                List<StackInfo> infos = mActivityManager.getAllStackInfos();
-                for (StackInfo info : infos) {
-                    Set<ActivityListener> listeners = mListeners.get(info.displayId);
-                    if (listeners != null && !listeners.isEmpty()) {
-                        for (ActivityListener listener : listeners) {
-                            listener.onTopActivityChanged(info.displayId, info.topActivity);
-                        }
-                    }
-                }
-            } catch (RemoteException e) {
-                Log.e(TAG, "Cannot getTasks", e);
-            }
-        });
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/CarInfoFragment.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/CarInfoFragment.java
deleted file mode 100644
index 87d57e5..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/CarInfoFragment.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2017 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 android.car.cluster.sample;
-
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.fragment.app.Fragment;
-
-/**
- * A simple {@link Fragment} subclass.
- */
-public class CarInfoFragment extends Fragment {
-
-
-    public CarInfoFragment() {
-        // Required empty public constructor
-    }
-
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                             Bundle savedInstanceState) {
-        // Inflate the layout for this fragment
-        return inflater.inflate(R.layout.fragment_car_info, container, false);
-    }
-
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterDisplayProvider.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterDisplayProvider.java
deleted file mode 100644
index 007533c..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterDisplayProvider.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2018 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 android.car.cluster.sample;
-
-import android.annotation.Nullable;
-import android.content.Context;
-import android.hardware.display.DisplayManager;
-import android.hardware.display.DisplayManager.DisplayListener;
-import android.os.SystemProperties;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.Display;
-import android.view.DisplayAddress;
-
-/**
- * This class provides a display for instrument cluster renderer.
- * <p>
- * By default it will try to provide physical secondary display if it is connected, if secondary
- * display is not connected during creation of this class then it will start networked virtual
- * display and listens for incoming connections.
- *
- * @see {@link NetworkedVirtualDisplay}
- */
-public class ClusterDisplayProvider {
-    private static final String TAG = "Cluster.DisplayProvider";
-
-    private static final String RO_CLUSTER_DISPLAY_PORT = "ro.car.cluster.displayport";
-    private static final String PERSIST_CLUSTER_DISPLAY_PORT =
-            "persist.car.cluster.displayport";
-    private static final int NETWORKED_DISPLAY_WIDTH = 1280;
-    private static final int NETWORKED_DISPLAY_HEIGHT = 720;
-    private static final int NETWORKED_DISPLAY_DPI = 320;
-
-    private final DisplayListener mListener;
-    private final DisplayManager mDisplayManager;
-
-    private NetworkedVirtualDisplay mNetworkedVirtualDisplay;
-    private int mClusterDisplayId = -1;
-
-    ClusterDisplayProvider(Context context, DisplayListener clusterDisplayListener) {
-        mListener = clusterDisplayListener;
-        mDisplayManager = context.getSystemService(DisplayManager.class);
-
-        Display clusterDisplay = getInstrumentClusterDisplay(mDisplayManager);
-        if (clusterDisplay != null) {
-            Log.i(TAG, String.format("Found display: %s (id: %d, owner: %s)",
-                    clusterDisplay.getName(), clusterDisplay.getDisplayId(),
-                    clusterDisplay.getOwnerPackageName()));
-            mClusterDisplayId = clusterDisplay.getDisplayId();
-            clusterDisplayListener.onDisplayAdded(clusterDisplay.getDisplayId());
-            trackClusterDisplay(null /* no need to track display by name */);
-        } else {
-            Log.i(TAG, "No physical cluster display found, starting network display");
-            setupNetworkDisplay(context);
-        }
-    }
-
-    private void setupNetworkDisplay(Context context) {
-        mNetworkedVirtualDisplay = new NetworkedVirtualDisplay(context,
-                NETWORKED_DISPLAY_WIDTH, NETWORKED_DISPLAY_HEIGHT, NETWORKED_DISPLAY_DPI);
-        String displayName = mNetworkedVirtualDisplay.start();
-        trackClusterDisplay(displayName);
-    }
-
-    private void trackClusterDisplay(@Nullable String displayName) {
-        mDisplayManager.registerDisplayListener(new DisplayListener() {
-            @Override
-            public void onDisplayAdded(int displayId) {
-                boolean clusterDisplayAdded = false;
-
-                if (displayName == null && mClusterDisplayId == -1) {
-                    mClusterDisplayId = displayId;
-                    clusterDisplayAdded = true;
-                } else {
-                    Display display = mDisplayManager.getDisplay(displayId);
-                    if (display != null && TextUtils.equals(display.getName(), displayName)) {
-                        mClusterDisplayId = displayId;
-                        clusterDisplayAdded = true;
-                    }
-                }
-
-                if (clusterDisplayAdded) {
-                    mListener.onDisplayAdded(displayId);
-                }
-            }
-
-            @Override
-            public void onDisplayRemoved(int displayId) {
-                if (displayId == mClusterDisplayId) {
-                    mClusterDisplayId = -1;
-                    mListener.onDisplayRemoved(displayId);
-                }
-            }
-
-            @Override
-            public void onDisplayChanged(int displayId) {
-                if (displayId == mClusterDisplayId) {
-                    mListener.onDisplayChanged(displayId);
-                }
-            }
-
-        }, null);
-    }
-
-    private static Display getInstrumentClusterDisplay(DisplayManager displayManager) {
-        Display[] displays = displayManager.getDisplays();
-        Log.d(TAG, "There are currently " + displays.length + " displays connected.");
-
-        final int displayPortPrimary = 0;  // primary port should not be instrument cluster.
-        int displayPort = SystemProperties.getInt(PERSIST_CLUSTER_DISPLAY_PORT,
-                displayPortPrimary);
-        if (displayPort == displayPortPrimary) {
-            displayPort = SystemProperties.getInt(RO_CLUSTER_DISPLAY_PORT,
-                    displayPortPrimary);
-            if (displayPort == displayPortPrimary) {
-                return null;
-            }
-        }
-        // match port for system display ( = null getOwnerPackageName())
-        // with separate check for main display as main display should be never picked up.
-        for (Display display : displays) {
-            if (display.getDisplayId() != Display.DEFAULT_DISPLAY
-                    && display.getOwnerPackageName() == null
-                    && display.getAddress() != null
-                    && display.getAddress() instanceof DisplayAddress.Physical) {
-                final byte port = ((DisplayAddress.Physical) display.getAddress()).getPort();
-                if (displayPort == port) {
-                    return display;
-                }
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public String toString() {
-        return getClass().getSimpleName() + "{"
-                + " clusterDisplayId = " + mClusterDisplayId
-                + "}";
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterRenderingServiceImpl.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterRenderingServiceImpl.java
deleted file mode 100644
index 80a94e1..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterRenderingServiceImpl.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Copyright (C) 2017 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 android.car.cluster.sample;
-
-import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
-
-import static java.lang.Integer.parseInt;
-
-import android.annotation.Nullable;
-import android.app.ActivityOptions;
-import android.car.cluster.ClusterActivityState;
-import android.car.cluster.renderer.InstrumentClusterRenderingService;
-import android.car.cluster.renderer.NavigationRenderer;
-import android.car.navigation.CarNavigationInstrumentCluster;
-import android.content.Intent;
-import android.graphics.Rect;
-import android.hardware.display.DisplayManager.DisplayListener;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.provider.Settings.Global;
-import android.util.Log;
-import android.view.Display;
-import android.view.InputDevice;
-import android.view.KeyEvent;
-
-import androidx.car.cluster.navigation.NavigationState;
-import androidx.versionedparcelable.ParcelUtils;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.function.Consumer;
-
-/**
- * Implementation of {@link InstrumentClusterRenderingService} which renders an activity on a
- * virtual display that is transmitted to an external screen.
- */
-public class ClusterRenderingServiceImpl extends InstrumentClusterRenderingService implements
-        ImageResolver.BitmapFetcher {
-    private static final String TAG = "Cluster.SampleService";
-
-    private static final int NO_DISPLAY = -1;
-
-    static final String LOCAL_BINDING_ACTION = "local";
-    static final String NAV_STATE_BUNDLE_KEY = "navstate";
-
-    private List<ServiceClient> mClients = new ArrayList<>();
-    private ClusterDisplayProvider mDisplayProvider;
-    private int mDisplayId = NO_DISPLAY;
-    private final IBinder mLocalBinder = new LocalBinder();
-    private final ImageResolver mImageResolver = new ImageResolver(this);
-
-    public interface ServiceClient {
-        void onKeyEvent(KeyEvent keyEvent);
-        void onNavigationStateChange(NavigationState navState);
-    }
-
-    public class LocalBinder extends Binder {
-        ClusterRenderingServiceImpl getService() {
-            return ClusterRenderingServiceImpl.this;
-        }
-    }
-
-    private final DisplayListener mDisplayListener = new DisplayListener() {
-        @Override
-        public void onDisplayAdded(int displayId) {
-            Log.i(TAG, "Cluster display found, displayId: " + displayId);
-            mDisplayId = displayId;
-            launchMainActivity();
-        }
-
-        @Override
-        public void onDisplayRemoved(int displayId) {
-            Log.w(TAG, "Cluster display has been removed");
-        }
-
-        @Override
-        public void onDisplayChanged(int displayId) {
-
-        }
-    };
-
-    public void setActivityLaunchOptions(int displayId, ClusterActivityState state) {
-        ActivityOptions options = displayId != Display.INVALID_DISPLAY
-                ? ActivityOptions.makeBasic().setLaunchDisplayId(displayId)
-                : null;
-        setClusterActivityLaunchOptions(options);
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, String.format("activity options set: %s (displayeId: %d)",
-                    options, options.getLaunchDisplayId()));
-        }
-        setClusterActivityState(state);
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, String.format("activity state set: %s", state));
-        }
-    }
-
-    public void registerClient(ServiceClient client) {
-        mClients.add(client);
-    }
-
-    public void unregisterClient(ServiceClient client) {
-        mClients.remove(client);
-    }
-
-    public ImageResolver getImageResolver() {
-        return mImageResolver;
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        Log.d(TAG, "onBind, intent: " + intent);
-        return LOCAL_BINDING_ACTION.equals(intent.getAction())
-                ? mLocalBinder
-                : super.onBind(intent);
-    }
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-        Log.d(TAG, "onCreate");
-        mDisplayProvider = new ClusterDisplayProvider(this, mDisplayListener);
-    }
-
-    private void launchMainActivity() {
-        ActivityOptions options = ActivityOptions.makeBasic();
-        options.setLaunchDisplayId(mDisplayId);
-        Intent intent = new Intent(this, MainClusterActivity.class);
-        intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
-        startActivityAsUser(intent, options.toBundle(), UserHandle.SYSTEM);
-        Log.i(TAG, String.format("launching main activity: %s (display: %d)", intent, mDisplayId));
-    }
-
-    @Override
-    public void onKeyEvent(KeyEvent keyEvent) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "onKeyEvent, keyEvent: " + keyEvent);
-        }
-        broadcastClientEvent(client -> client.onKeyEvent(keyEvent));
-    }
-
-    /**
-     * Broadcasts an event to all the registered service clients
-     *
-     * @param event event to broadcast
-     */
-    private void broadcastClientEvent(Consumer<ServiceClient> event) {
-        for (ServiceClient client : mClients) {
-            event.accept(client);
-        }
-    }
-
-    @Override
-    public NavigationRenderer getNavigationRenderer() {
-        NavigationRenderer navigationRenderer = new NavigationRenderer() {
-            @Override
-            public CarNavigationInstrumentCluster getNavigationProperties() {
-                CarNavigationInstrumentCluster config =
-                        CarNavigationInstrumentCluster.createCluster(1000);
-                Log.d(TAG, "getNavigationProperties, returns: " + config);
-                return config;
-            }
-
-            @Override
-            public void onNavigationStateChanged(@Nullable Bundle bundle) {
-                try {
-                    if (bundle == null) {
-                        return;
-                    }
-                    StringBuilder bundleSummary = new StringBuilder();
-                    bundle.setClassLoader(ParcelUtils.class.getClassLoader());
-                    NavigationState navState = NavigationState
-                            .fromParcelable(bundle.getParcelable(NAV_STATE_BUNDLE_KEY));
-                    bundleSummary.append(navState.toString());
-
-                    // Update clients
-                    broadcastClientEvent(client -> client.onNavigationStateChange(navState));
-                    Log.d(TAG, "onNavigationStateChanged(" + bundleSummary + ")");
-                } catch (Exception e) {
-                    Log.e(TAG, "Error parsing event data (" + bundle + ")", e);
-                    NavigationState navState = new NavigationState.Builder().build();
-                    broadcastClientEvent(client -> client.onNavigationStateChange(navState));
-                }
-            }
-        };
-
-        Log.i(TAG, "createNavigationRenderer, returns: " + navigationRenderer);
-        return navigationRenderer;
-    }
-
-    @Override
-    protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
-        if (args != null && args.length > 0) {
-            execShellCommand(args);
-        } else {
-            super.dump(fd, writer, args);
-            writer.println("DisplayProvider: " + mDisplayProvider);
-        }
-    }
-
-    private void emulateKeyEvent(int keyCode) {
-        Log.i(TAG, "emulateKeyEvent, keyCode: " + keyCode);
-        long downTime = SystemClock.uptimeMillis();
-        long eventTime = SystemClock.uptimeMillis();
-        KeyEvent event = obtainKeyEvent(keyCode, downTime, eventTime, KeyEvent.ACTION_DOWN);
-        onKeyEvent(event);
-
-        eventTime = SystemClock.uptimeMillis();
-        event = obtainKeyEvent(keyCode, downTime, eventTime, KeyEvent.ACTION_UP);
-        onKeyEvent(event);
-    }
-
-    private KeyEvent obtainKeyEvent(int keyCode, long downTime, long eventTime, int action) {
-        int scanCode = 0;
-        if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
-            scanCode = 108;
-        } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
-            scanCode = 106;
-        }
-        return KeyEvent.obtain(
-                    downTime,
-                    eventTime,
-                    action,
-                    keyCode,
-                    0 /* repeat */,
-                    0 /* meta state */,
-                    0 /* deviceId*/,
-                    scanCode /* scancode */,
-                    KeyEvent.FLAG_FROM_SYSTEM /* flags */,
-                    InputDevice.SOURCE_KEYBOARD,
-                    null /* characters */);
-    }
-
-    private void execShellCommand(String[] args) {
-        Log.i(TAG, "execShellCommand, args: " + Arrays.toString(args));
-
-        String command = args[0];
-
-        switch (command) {
-            case "injectKey": {
-                if (args.length > 1) {
-                    emulateKeyEvent(parseInt(args[1]));
-                } else {
-                    Log.i(TAG, "Not enough arguments");
-                }
-                break;
-            }
-            case "destroyOverlayDisplay": {
-                Settings.Global.putString(getContentResolver(),
-                        Global.OVERLAY_DISPLAY_DEVICES, "");
-                break;
-            }
-
-            case "createOverlayDisplay": {
-                if (args.length > 1) {
-                    Settings.Global.putString(getContentResolver(),
-                            Global.OVERLAY_DISPLAY_DEVICES, args[1]);
-                } else {
-                    Log.i(TAG, "Not enough arguments, expected 2");
-                }
-                break;
-            }
-
-            case "setUnobscuredArea": {
-                if (args.length > 5) {
-                    Rect unobscuredArea = new Rect(parseInt(args[2]), parseInt(args[3]),
-                            parseInt(args[4]), parseInt(args[5]));
-                    setClusterActivityState(args[1],
-                            ClusterActivityState.create(true, unobscuredArea).toBundle());
-                } else {
-                    Log.i(TAG, "wrong format, expected: category left top right bottom");
-                }
-            }
-        }
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterViewModel.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterViewModel.java
deleted file mode 100644
index 1cf1b24..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterViewModel.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Copyright (C) 2018 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 android.car.cluster.sample;
-
-import android.annotation.Nullable;
-import android.app.Application;
-import android.car.Car;
-import android.car.CarAppFocusManager;
-import android.car.VehicleAreaType;
-import android.car.cluster.sample.sensors.Sensor;
-import android.car.cluster.sample.sensors.Sensors;
-import android.car.hardware.CarPropertyValue;
-import android.car.hardware.property.CarPropertyManager;
-import android.car.hardware.property.CarPropertyManager.CarPropertyEventCallback;
-import android.content.ComponentName;
-import android.content.ServiceConnection;
-import android.os.IBinder;
-import android.util.Log;
-import android.util.TypedValue;
-
-import androidx.annotation.NonNull;
-import androidx.core.util.Preconditions;
-import androidx.lifecycle.AndroidViewModel;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MutableLiveData;
-import androidx.lifecycle.Transformations;
-
-import java.text.DecimalFormat;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * {@link AndroidViewModel} for cluster information.
- */
-public class ClusterViewModel extends AndroidViewModel {
-    private static final String TAG = "Cluster.ViewModel";
-
-    private static final int PROPERTIES_REFRESH_RATE_UI = 5;
-
-    private float mSpeedFactor;
-    private float mDistanceFactor;
-
-    public enum NavigationActivityState {
-        /** No activity has been selected to be displayed on the navigation fragment yet */
-        NOT_SELECTED,
-        /** An activity has been selected, but it is not yet visible to the user */
-        LOADING,
-        /** Navigation activity is visible to the user */
-        VISIBLE,
-    }
-
-    private ComponentName mFreeNavigationActivity;
-    private ComponentName mCurrentNavigationActivity;
-    private final MutableLiveData<NavigationActivityState> mNavigationActivityStateLiveData =
-            new MutableLiveData<>();
-    private final MutableLiveData<Boolean> mNavigationFocus = new MutableLiveData<>(false);
-    private Car mCar;
-    private CarAppFocusManager mCarAppFocusManager;
-    private CarPropertyManager mCarPropertyManager;
-    private Map<Sensor<?>, MutableLiveData<?>> mSensorLiveDatas = new HashMap<>();
-
-    private ServiceConnection mCarServiceConnection = new ServiceConnection() {
-        @Override
-        public void onServiceConnected(ComponentName name, IBinder service) {
-            Log.i(TAG, "onServiceConnected, name: " + name + ", service: " + service);
-
-            registerAppFocusListener();
-            registerCarPropertiesListener();
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName name) {
-            Log.i(TAG, "onServiceDisconnected, name: " + name);
-            mCarAppFocusManager = null;
-            mCarPropertyManager = null;
-        }
-    };
-
-    private void registerAppFocusListener() {
-        mCarAppFocusManager = (CarAppFocusManager) mCar.getCarManager(
-                Car.APP_FOCUS_SERVICE);
-        if (mCarAppFocusManager != null) {
-            mCarAppFocusManager.addFocusListener(
-                    (appType, active) -> setNavigationFocus(active),
-                    CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
-        } else {
-            Log.e(TAG, "onServiceConnected: unable to obtain CarAppFocusManager");
-        }
-    }
-
-    private void registerCarPropertiesListener() {
-        Sensors sensors = Sensors.getInstance();
-        mCarPropertyManager = (CarPropertyManager) mCar.getCarManager(Car.PROPERTY_SERVICE);
-        for (Integer propertyId : sensors.getPropertyIds()) {
-            try {
-                mCarPropertyManager.registerCallback(mCarPropertyEventListener,
-                        propertyId, PROPERTIES_REFRESH_RATE_UI);
-            } catch (SecurityException ex) {
-                Log.e(TAG, "onServiceConnected: Unable to listen to car property: " + propertyId
-                        + " sensors: " + sensors.getSensorsForPropertyId(propertyId), ex);
-            }
-        }
-    }
-
-    private CarPropertyEventCallback mCarPropertyEventListener = new CarPropertyEventCallback() {
-                @Override
-                public void onChangeEvent(CarPropertyValue value) {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG,
-                                "CarProperty change: property " + value.getPropertyId() + ", area"
-                                        + value.getAreaId() + ", value: " + value.getValue());
-                    }
-                    for (Sensor<?> sensorId : Sensors.getInstance()
-                            .getSensorsForPropertyId(value.getPropertyId())) {
-                        if (sensorId.mAreaId == Sensors.GLOBAL_AREA_ID
-                                || (sensorId.mAreaId & value.getAreaId()) != 0) {
-                            setSensorValue(sensorId, value);
-                        }
-                    }
-                }
-
-                @Override
-                public void onErrorEvent(int propId, int zone) {
-                    for (Sensor<?> sensorId : Sensors.getInstance().getSensorsForPropertyId(
-                            propId)) {
-                        if (sensorId.mAreaId == VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL
-                                || (sensorId.mAreaId & zone) != 0) {
-                            setSensorValue(sensorId, null);
-                        }
-                    }
-                }
-
-                private <T> void setSensorValue(Sensor<T> id, CarPropertyValue<?> value) {
-                    T newValue = value != null ? id.mAdapter.apply(value) : null;
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Sensor " + id.mName + " = " + newValue);
-                    }
-                    getSensorMutableLiveData(id).setValue(newValue);
-                }
-            };
-
-    /**
-     * New {@link ClusterViewModel} instance
-     */
-    public ClusterViewModel(@NonNull Application application) {
-        super(application);
-        mCar = Car.createCar(application, mCarServiceConnection);
-        mCar.connect();
-
-        TypedValue tv = new TypedValue();
-        getApplication().getResources().getValue(R.dimen.speed_factor, tv, true);
-        mSpeedFactor = tv.getFloat();
-
-        getApplication().getResources().getValue(R.dimen.distance_factor, tv, true);
-        mDistanceFactor = tv.getFloat();
-    }
-
-    @Override
-    protected void onCleared() {
-        super.onCleared();
-        mCar.disconnect();
-        mCar = null;
-        mCarAppFocusManager = null;
-        mCarPropertyManager = null;
-    }
-
-    /**
-     * Returns a {@link LiveData} providing the current state of the activity displayed on the
-     * navigation fragment.
-     */
-    public LiveData<NavigationActivityState> getNavigationActivityState() {
-        return mNavigationActivityStateLiveData;
-    }
-
-    /**
-     * Returns a {@link LiveData} indicating whether navigation focus is currently being granted
-     * or not. This indicates whether a navigation application is currently providing driving
-     * directions.
-     */
-    public LiveData<Boolean> getNavigationFocus() {
-        return mNavigationFocus;
-    }
-
-    /**
-     * Returns a {@link LiveData} that tracks the value of a given car sensor. Each sensor has its
-     * own data type. The list of all supported sensors can be found at {@link Sensors}
-     *
-     * @param sensor sensor to observe
-     * @param <T>    data type of such sensor
-     */
-    @SuppressWarnings("unchecked")
-    @NonNull
-    public <T> LiveData<T> getSensor(@NonNull Sensor<T> sensor) {
-        return getSensorMutableLiveData(Preconditions.checkNotNull(sensor));
-    }
-
-    /**
-     * Returns the current value of the sensor, directly from the VHAL.
-     *
-     * @param sensor sensor to read
-     * @param <V>    VHAL data type
-     * @param <T>    data type of such sensor
-     */
-    @Nullable
-    public <T> T getSensorValue(@NonNull Sensor<T> sensor) {
-        CarPropertyValue<?> value = mCarPropertyManager
-                .getProperty(sensor.mPropertyId, sensor.mAreaId);
-        return sensor.mAdapter.apply(value);
-    }
-
-    /**
-     * Returns a {@link LiveData} that tracks the fuel level in a range from 0 to 100.
-     */
-    public LiveData<Integer> getFuelLevel() {
-        return Transformations.map(getSensor(Sensors.SENSOR_FUEL), (fuelValue) -> {
-            Float fuelCapacityValue = getSensorValue(Sensors.SENSOR_FUEL_CAPACITY);
-            if (fuelValue == null || fuelCapacityValue == null || fuelCapacityValue == 0) {
-                return null;
-            }
-            if (fuelValue < 0.0f) {
-                return 0;
-            }
-            if (fuelValue > fuelCapacityValue) {
-                return 100;
-            }
-            return Math.round(fuelValue / (fuelCapacityValue * 100f));
-        });
-    }
-
-    /**
-     * Returns a {@link LiveData} that tracks the RPM x 1000
-     */
-    public LiveData<String> getRPM() {
-        return Transformations.map(getSensor(Sensors.SENSOR_RPM), (rpmValue) -> {
-            return new DecimalFormat("#0.0").format(rpmValue / 1000f);
-        });
-    }
-
-    /**
-     * Returns a {@link LiveData} that tracks the speed in either mi/h or km/h depending on locale.
-     */
-    public LiveData<Integer> getSpeed() {
-        return Transformations.map(getSensor(Sensors.SENSOR_SPEED), (speedValue) -> {
-            return Math.round(speedValue * mSpeedFactor);
-        });
-    }
-
-    /**
-     * Returns a {@link LiveData} that tracks the range the vehicle has until it runs out of gas.
-     */
-    public LiveData<Integer> getRange() {
-        return Transformations.map(getSensor(Sensors.SENSOR_FUEL_RANGE), (rangeValue) -> {
-            return Math.round(rangeValue / mDistanceFactor);
-        });
-    }
-
-    /**
-     * Sets the activity selected to be displayed on the cluster when no driving directions are
-     * being provided.
-     */
-    public void setFreeNavigationActivity(ComponentName activity) {
-        if (!Objects.equals(activity, mFreeNavigationActivity)) {
-            mFreeNavigationActivity = activity;
-            updateNavigationActivityLiveData();
-        }
-    }
-
-    /**
-     * Sets the activity currently being displayed on the cluster.
-     */
-    public void setCurrentNavigationActivity(ComponentName activity) {
-        if (!Objects.equals(activity, mCurrentNavigationActivity)) {
-            mCurrentNavigationActivity = activity;
-            updateNavigationActivityLiveData();
-        }
-    }
-
-    /**
-     * Sets whether navigation focus is currently being granted or not.
-     */
-    public void setNavigationFocus(boolean navigationFocus) {
-        if (mNavigationFocus.getValue() == null || mNavigationFocus.getValue() != navigationFocus) {
-            mNavigationFocus.setValue(navigationFocus);
-            updateNavigationActivityLiveData();
-        }
-    }
-
-    private void updateNavigationActivityLiveData() {
-        NavigationActivityState newState = calculateNavigationActivityState();
-        if (newState != mNavigationActivityStateLiveData.getValue()) {
-            mNavigationActivityStateLiveData.setValue(newState);
-        }
-    }
-
-    private NavigationActivityState calculateNavigationActivityState() {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, String.format("Current state: current activity = '%s', free nav activity = "
-                            + "'%s', focus = %s", mCurrentNavigationActivity,
-                    mFreeNavigationActivity,
-                    mNavigationFocus.getValue()));
-        }
-        if (mNavigationFocus.getValue() != null && mNavigationFocus.getValue()) {
-            // Car service controls which activity is displayed while driving, so we assume this
-            // has already been taken care of.
-            return NavigationActivityState.VISIBLE;
-        } else if (mFreeNavigationActivity == null) {
-            return NavigationActivityState.NOT_SELECTED;
-        } else if (Objects.equals(mFreeNavigationActivity, mCurrentNavigationActivity)) {
-            return NavigationActivityState.VISIBLE;
-        } else {
-            return NavigationActivityState.LOADING;
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private <T> MutableLiveData<T> getSensorMutableLiveData(Sensor<T> sensor) {
-        return (MutableLiveData<T>) mSensorLiveDatas
-                .computeIfAbsent(sensor, x -> new MutableLiveData<>());
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/CueView.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/CueView.java
deleted file mode 100644
index d7bbf5f..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/CueView.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2018 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 android.car.cluster.sample;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
-import android.os.Handler;
-import android.text.SpannableStringBuilder;
-import android.text.style.ImageSpan;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.widget.TextView;
-
-import androidx.car.cluster.navigation.ImageReference;
-import androidx.car.cluster.navigation.RichText;
-import androidx.car.cluster.navigation.RichTextElement;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
-
-/**
- * View component that displays the Cue information on the instrument cluster display
- */
-public class CueView extends TextView {
-    private static final String TAG = "Cluster.CueView";
-
-    private String mImageSpanText;
-    private CompletableFuture<?> mFuture;
-    private Handler mHandler = new Handler();
-    private RichText mContent;
-
-    public CueView(Context context) {
-        super(context);
-    }
-
-    public CueView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public CueView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        mImageSpanText = context.getString(R.string.span_image);
-    }
-
-    public void setRichText(RichText richText, ImageResolver imageResolver) {
-        if (richText == null) {
-            setText(null);
-            return;
-        }
-
-        if (mFuture != null && !Objects.equals(richText, mContent)) {
-            mFuture.cancel(true);
-        }
-
-        List<ImageReference> imageReferences = richText.getElements().stream()
-                .filter(element -> element.getImage() != null)
-                .map(element -> element.getImage())
-                .collect(Collectors.toList());
-        mFuture = imageResolver
-                .getBitmaps(imageReferences, 0, getLineHeight())
-                .thenAccept(bitmaps -> {
-                    mHandler.post(() -> update(richText, bitmaps));
-                    mFuture = null;
-                })
-                .exceptionally(ex -> {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Unable to fetch images for cue: " + richText);
-                    }
-                    mHandler.post(() -> update(richText, Collections.emptyMap()));
-                    return null;
-                });
-        mContent = richText;
-    }
-
-    private void update(RichText richText, Map<ImageReference, Bitmap> bitmaps) {
-        SpannableStringBuilder builder = new SpannableStringBuilder();
-
-        for (RichTextElement element : richText.getElements()) {
-            if (element.getImage() != null) {
-                Bitmap bitmap = bitmaps.get(element.getImage());
-                if (bitmap != null) {
-                    String imageText = element.getText().isEmpty() ? mImageSpanText :
-                            element.getText();
-                    int start = builder.length();
-                    int end = start + imageText.length();
-                    builder.append(imageText);
-                    BitmapDrawable drawable = new BitmapDrawable(getResources(), bitmap);
-                    drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
-                    builder.setSpan(new ImageSpan(drawable), start, end, 0);
-                }
-            } else if (!element.getText().isEmpty()) {
-                builder.append(element.getText());
-            }
-        }
-
-        setText(builder);
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/HeartBeatLiveData.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/HeartBeatLiveData.java
deleted file mode 100644
index 42116b8..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/HeartBeatLiveData.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2018 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 android.car.cluster.sample;
-
-import android.os.Handler;
-import android.os.Looper;
-
-import androidx.lifecycle.LiveData;
-
-/**
- * Emits a true value in a fixed periodical pace. The first beat begins when this live data becomes
- * active.
- *
- * <p> Note that if this heart beat is shared, the time can be less than the given interval between
- * observation and first beat for the second observer.
- */
-public class HeartBeatLiveData extends LiveData<Boolean> {
-    private long mPulseRate;
-    private Handler mMainThreadHandler = new Handler(Looper.getMainLooper());
-
-    public HeartBeatLiveData(long rateInMillis) {
-        mPulseRate = rateInMillis;
-    }
-
-    @Override
-    protected void onActive() {
-        super.onActive();
-        mMainThreadHandler.post(mUpdateDurationRunnable);
-    }
-
-    @Override
-    protected void onInactive() {
-        super.onInactive();
-        mMainThreadHandler.removeCallbacks(mUpdateDurationRunnable);
-    }
-
-    private final Runnable mUpdateDurationRunnable = new Runnable() {
-        @Override
-        public void run() {
-            setValue(true);
-            mMainThreadHandler.postDelayed(this, mPulseRate);
-        }
-    };
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ImageResolver.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ImageResolver.java
deleted file mode 100644
index 5e03b9b..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ImageResolver.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (C) 2018 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 android.car.cluster.sample;
-
-import android.graphics.Bitmap;
-import android.graphics.Point;
-import android.net.Uri;
-import android.util.Log;
-import android.util.LruCache;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.car.cluster.navigation.ImageReference;
-
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
-
-/**
- * Class for retrieving bitmap images from a ContentProvider
- */
-public class ImageResolver {
-    private static final String TAG = "Cluster.ImageResolver";
-    private static final int IMAGE_CACHE_SIZE_BYTES = 4 * 1024 * 1024; /* 4 mb */
-
-    private final BitmapFetcher mFetcher;
-    private final LruCache<String, Bitmap> mCache = new LruCache<String, Bitmap>(
-            IMAGE_CACHE_SIZE_BYTES) {
-        @Override
-        protected int sizeOf(String key, Bitmap value) {
-            return value.getByteCount();
-        }
-    };
-
-    public interface BitmapFetcher {
-        Bitmap getBitmap(Uri uri);
-    }
-
-    /**
-     * Creates a resolver that delegate the image retrieval to the given fetcher.
-     */
-    public ImageResolver(BitmapFetcher fetcher) {
-        mFetcher = fetcher;
-    }
-
-    /**
-     * Returns a {@link CompletableFuture} that provides a bitmap from a {@link ImageReference}.
-     * This image would fit inside the provided size. Either width, height or both should be greater
-     * than 0.
-     *
-     * @param width required width, or 0 if width is flexible based on height.
-     * @param height required height, or 0 if height is flexible based on width.
-     */
-    @NonNull
-    public CompletableFuture<Bitmap> getBitmap(@NonNull ImageReference img, int width, int height) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, String.format("Requesting image %s (width: %d, height: %d)",
-                    img.getRawContentUri(), width, height));
-        }
-
-        return CompletableFuture.supplyAsync(() -> {
-            // Adjust the size to fit in the requested box.
-            Point adjusted = getAdjustedSize(img.getOriginalWidth(), img.getOriginalHeight(), width,
-                    height);
-            if (adjusted == null) {
-                Log.e(TAG, "The provided image has no original size: " + img.getRawContentUri());
-                return null;
-            }
-            Uri uri = img.getContentUri(adjusted.x, adjusted.y);
-            Bitmap bitmap = mCache.get(uri.toString());
-            if (bitmap == null) {
-                bitmap = mFetcher.getBitmap(uri);
-                if (bitmap == null) {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Unable to fetch image: " + uri);
-                    }
-                    return null;
-                }
-                if (bitmap.getWidth() != adjusted.x || bitmap.getHeight() != adjusted.y) {
-                    bitmap = Bitmap.createScaledBitmap(bitmap, adjusted.x, adjusted.y, true);
-                }
-                mCache.put(uri.toString(), bitmap);
-            }
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, String.format("Returning image %s (width: %d, height: %d)",
-                        img.getRawContentUri(), width, height));
-            }
-            return bitmap != null ? Bitmap.createScaledBitmap(bitmap, adjusted.x, adjusted.y, true)
-                    : null;
-        });
-    }
-
-    /**
-     * Same as {@link #getBitmap(ImageReference, int, int)} but it works on a list of images. The
-     * returning {@link CompletableFuture} will contain a map from each {@link ImageReference} to
-     * its bitmap. If any image fails to be fetched, the whole future completes exceptionally.
-     *
-     * @param width required width, or 0 if width is flexible based on height.
-     * @param height required height, or 0 if height is flexible based on width.
-     */
-    @NonNull
-    public CompletableFuture<Map<ImageReference, Bitmap>> getBitmaps(
-            @NonNull List<ImageReference> imgs, int width, int height) {
-        CompletableFuture<Map<ImageReference, Bitmap>> future = new CompletableFuture<>();
-
-        Map<ImageReference, CompletableFuture<Bitmap>> bitmapFutures = imgs.stream().collect(
-                Collectors.toMap(
-                        img -> img,
-                        img -> getBitmap(img, width, height)));
-
-        CompletableFuture.allOf(bitmapFutures.values().toArray(new CompletableFuture[0]))
-                .thenAccept(v -> {
-                    Map<ImageReference, Bitmap> bitmaps = bitmapFutures.entrySet().stream()
-                            .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry
-                                    .getValue().join()));
-                    future.complete(bitmaps);
-                })
-                .exceptionally(ex -> {
-                    future.completeExceptionally(ex);
-                    return null;
-                });
-
-        return future;
-    }
-
-    /**
-     * Returns an image size that exactly fits inside a requested box, maintaining an original size
-     * aspect ratio.
-     *
-     * @param originalWidth original width (must be != 0)
-     * @param originalHeight original height (must be != 0)
-     * @param requestedWidth required width, or 0 if width is flexible based on height.
-     * @param requestedHeight required height, or 0 if height is flexible based on width.
-     */
-    @Nullable
-    public Point getAdjustedSize(int originalWidth, int originalHeight, int requestedWidth,
-            int requestedHeight) {
-        if (originalWidth <= 0 || originalHeight <= 0) {
-            return null;
-        } else if (requestedWidth == 0 && requestedHeight == 0) {
-            throw new IllegalArgumentException("At least one of width or height must be != 0");
-        }
-        // If width is flexible or if both width and height are set and the original image is wider
-        // than the space provided, then scale the width.
-        float requiredRatio = requestedHeight > 0 ? ((float) requestedWidth) / requestedHeight : 0;
-        float imageRatio = ((float) originalWidth) / originalHeight;
-        Point res = new Point(requestedWidth, requestedHeight);
-        if (requestedWidth == 0 || (requestedHeight != 0 && imageRatio < requiredRatio)) {
-            res.x = (int) (((float) requestedHeight / originalHeight) * originalWidth);
-        } else {
-            res.y = (int) (((float) requestedWidth / originalWidth) * originalHeight);
-        }
-        return res;
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/LaneView.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/LaneView.java
deleted file mode 100644
index 1181fa2..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/LaneView.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright (C) 2018 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 android.car.cluster.sample;
-
-import android.annotation.Nullable;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.PorterDuff;
-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;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 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);
-    private final int mHeight = (int) getResources().getDimension(R.dimen.lane_height);
-    private final int mOffset = (int) getResources().getDimension(R.dimen.lane_icon_offset);
-
-    private enum Shift {
-        LEFT,
-        RIGHT,
-        BOTH
-    }
-
-    public LaneView(Context context) {
-        super(context);
-    }
-
-    public LaneView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public LaneView(Context context, AttributeSet attrs, int defStyleAttr) {
-        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());
-            imgView.setImageBitmap(bitmap);
-            imgView.setAdjustViewBounds(true);
-            addView(imgView);
-        }
-    }
-
-    private Bitmap combineBitmapFromLane(Lane lane) {
-        if (lane.getDirections().isEmpty()) {
-            return null;
-        }
-
-        Bitmap bitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
-        Canvas canvas = new Canvas(bitmap);
-
-        Shift shift = getShift(lane);
-
-        for (LaneDirection laneDir : lane.getDirections()) {
-            if (!laneDir.isHighlighted()) {
-                drawToCanvas(laneDir, canvas, false, shift);
-            }
-        }
-
-        for (LaneDirection laneDir : lane.getDirections()) {
-            if (laneDir.isHighlighted()) {
-                drawToCanvas(laneDir, canvas, true, shift);
-            }
-        }
-
-        return bitmap;
-    }
-
-    private void drawToCanvas(LaneDirection laneDir, Canvas canvas, boolean isHighlighted,
-            Shift shift) {
-        int offset = getOffset(laneDir, shift);
-        VectorDrawable icon = (VectorDrawable) getLaneIcon(laneDir);
-        icon.setBounds(offset, 0, mWidth + offset, mHeight);
-        icon.setColorFilter(new PorterDuffColorFilter(isHighlighted
-                ? getContext().getColor(R.color.laneDirectionHighlighted)
-                : getContext().getColor(R.color.laneDirection),
-                PorterDuff.Mode.SRC_ATOP));
-        icon.draw(canvas);
-    }
-
-    /**
-     * Determines the offset direction to line up overlapping lane directions.
-     */
-    private Shift getShift(Lane lane) {
-        boolean containsRight = false;
-        boolean containsLeft = false;
-        boolean containsStraight = false;
-
-        for (LaneDirection laneDir : lane.getDirections()) {
-            if (laneDir.getShape().equals(LaneDirection.Shape.NORMAL_RIGHT)
-                    || laneDir.getShape().equals(LaneDirection.Shape.SLIGHT_RIGHT)
-                    || laneDir.getShape().equals(LaneDirection.Shape.SHARP_RIGHT)
-                    || laneDir.getShape().equals(LaneDirection.Shape.U_TURN_RIGHT)) {
-                containsRight = true;
-            }
-            if (laneDir.getShape().equals(LaneDirection.Shape.NORMAL_LEFT)
-                    || laneDir.getShape().equals(LaneDirection.Shape.SLIGHT_LEFT)
-                    || laneDir.getShape().equals(LaneDirection.Shape.SHARP_LEFT)
-                    || laneDir.getShape().equals(LaneDirection.Shape.U_TURN_LEFT)) {
-                containsLeft = true;
-            }
-            if (laneDir.getShape().equals(LaneDirection.Shape.STRAIGHT)) {
-                containsStraight = true;
-            }
-        }
-
-        if (containsLeft && containsRight) {
-            //shift turns outwards
-            return Shift.BOTH;
-        } else if (containsStraight && containsRight) {
-            //shift straight lane dir to the left
-            return Shift.LEFT;
-        } else if (containsStraight && containsLeft) {
-            //shift straight lane dir to the right
-            return Shift.RIGHT;
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the offset value of the lane direction based on the given shift direction.
-     */
-    private int getOffset(LaneDirection laneDir, Shift shift) {
-        if (shift == Shift.BOTH) {
-            if (laneDir.getShape().equals(LaneDirection.Shape.NORMAL_LEFT)
-                    || laneDir.getShape().equals(LaneDirection.Shape.SLIGHT_LEFT)
-                    || laneDir.getShape().equals(LaneDirection.Shape.SHARP_LEFT)
-                    || laneDir.getShape().equals(LaneDirection.Shape.U_TURN_LEFT)) {
-                return -mOffset;
-            }
-            if (laneDir.getShape().equals(LaneDirection.Shape.NORMAL_RIGHT)
-                    || laneDir.getShape().equals(LaneDirection.Shape.SLIGHT_RIGHT)
-                    || laneDir.getShape().equals(LaneDirection.Shape.SHARP_RIGHT)
-                    || laneDir.getShape().equals(LaneDirection.Shape.U_TURN_RIGHT)) {
-                return mOffset;
-            }
-        } else if (shift == Shift.LEFT) {
-            if (laneDir.getShape().equals(LaneDirection.Shape.STRAIGHT)) {
-                return -mOffset;
-            }
-        } else if (shift == Shift.RIGHT) {
-            if (laneDir.getShape().equals(LaneDirection.Shape.STRAIGHT)) {
-                return mOffset;
-            }
-        }
-
-        return 0;
-    }
-
-    private Drawable getLaneIcon(@Nullable LaneDirection laneDir) {
-        if (laneDir == null) {
-            return null;
-        }
-        switch (laneDir.getShape()) {
-            case UNKNOWN:
-                return null;
-            case STRAIGHT:
-                return mContext.getDrawable(R.drawable.direction_continue);
-            case SLIGHT_LEFT:
-                return mContext.getDrawable(R.drawable.direction_turn_slight_left);
-            case SLIGHT_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_turn_slight_right);
-            case NORMAL_LEFT:
-                return mContext.getDrawable(R.drawable.direction_turn_left);
-            case NORMAL_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_turn_right);
-            case SHARP_LEFT:
-                return mContext.getDrawable(R.drawable.direction_turn_sharp_left);
-            case SHARP_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_turn_sharp_right);
-            case U_TURN_LEFT:
-                return mContext.getDrawable(R.drawable.direction_uturn_left);
-            case U_TURN_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_uturn_right);
-        }
-        return null;
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MainClusterActivity.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MainClusterActivity.java
deleted file mode 100644
index 0bd298c..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MainClusterActivity.java
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- * Copyright (C) 2017 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 android.car.cluster.sample;
-
-import static android.car.cluster.sample.ClusterRenderingServiceImpl.LOCAL_BINDING_ACTION;
-import static android.content.Intent.ACTION_USER_SWITCHED;
-import static android.content.Intent.ACTION_USER_UNLOCKED;
-
-import android.app.ActivityManager;
-import android.app.ActivityOptions;
-import android.car.Car;
-import android.car.cluster.ClusterActivityState;
-import android.car.cluster.sample.sensors.Sensors;
-import android.content.ActivityNotFoundException;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.ServiceConnection;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.UserHandle;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.Display;
-import android.view.InputDevice;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.Button;
-import android.widget.TextView;
-
-import androidx.car.cluster.navigation.NavigationState;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentPagerAdapter;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.ViewModelProviders;
-import androidx.viewpager.widget.ViewPager;
-
-import com.android.car.telephony.common.InMemoryPhoneBook;
-
-import java.lang.ref.WeakReference;
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Main activity displayed on the instrument cluster. This activity contains fragments for each of
- * the cluster "facets" (e.g.: navigation, communication, media and car state). Users can navigate
- * to each facet by using the steering wheel buttons.
- * <p>
- * This activity runs on "system user" (see {@link UserHandle#USER_SYSTEM}) but it is visible on
- * all users (the same activity remains active even during user switch).
- * <p>
- * This activity also launches a default navigation app inside a virtual display (which is located
- * inside {@link NavigationFragment}). This navigation app is launched when:
- * <ul>
- * <li>Virtual display for navigation apps is ready.
- * <li>After every user switch.
- * </ul>
- * This is necessary because the navigation app runs under a normal user, and different users will
- * see different instances of the same application, with their own personalized data.
- */
-public class MainClusterActivity extends FragmentActivity implements
-        ClusterRenderingServiceImpl.ServiceClient {
-    private static final String TAG = "Cluster.MainActivity";
-
-    private static final NavigationState NULL_NAV_STATE = new NavigationState.Builder().build();
-    private static final int NO_DISPLAY = -1;
-
-    private ViewPager mPager;
-    private NavStateController mNavStateController;
-    private ClusterViewModel mClusterViewModel;
-
-    private Map<View, Facet<?>> mButtonToFacet = new HashMap<>();
-    private SparseArray<Facet<?>> mOrderToFacet = new SparseArray<>();
-
-    private Map<Sensors.Gear, View> mGearsToIcon = new HashMap<>();
-    private InputMethodManager mInputMethodManager;
-    private ClusterRenderingServiceImpl mService;
-    private VirtualDisplay mPendingVirtualDisplay = null;
-
-    private static final int NAVIGATION_ACTIVITY_RETRY_INTERVAL_MS = 1000;
-
-    private UserReceiver mUserReceiver;
-    private ActivityMonitor mActivityMonitor = new ActivityMonitor();
-    private final Handler mHandler = new Handler();
-    private final Runnable mRetryLaunchNavigationActivity = this::tryLaunchNavigationActivity;
-    private int mNavigationDisplayId = NO_DISPLAY;
-
-    private int mPreviousFacet;
-
-    /**
-     * Description of a virtual display
-     */
-    public static class VirtualDisplay {
-        /** Identifier of the display */
-        public final int mDisplayId;
-        /** Rectangular area inside this display that can be viewed without obstructions */
-        public final Rect mUnobscuredBounds;
-
-        public VirtualDisplay(int displayId, Rect unobscuredBounds) {
-            mDisplayId = displayId;
-            mUnobscuredBounds = unobscuredBounds;
-        }
-    }
-
-    private final View.OnFocusChangeListener mFacetButtonFocusListener =
-            new View.OnFocusChangeListener() {
-                @Override
-                public void onFocusChange(View v, boolean hasFocus) {
-                    if (hasFocus) {
-                        mPager.setCurrentItem(mButtonToFacet.get(v).mOrder);
-                    }
-                }
-            };
-
-    private ServiceConnection mClusterRenderingServiceConnection = new ServiceConnection() {
-        @Override
-        public void onServiceConnected(ComponentName name, IBinder service) {
-            Log.i(TAG, "onServiceConnected, name: " + name + ", service: " + service);
-            mService = ((ClusterRenderingServiceImpl.LocalBinder) service).getService();
-            mService.registerClient(MainClusterActivity.this);
-            mNavStateController.setImageResolver(mService.getImageResolver());
-            if (mPendingVirtualDisplay != null) {
-                // If haven't reported the virtual display yet, do so on service connect.
-                reportNavDisplay(mPendingVirtualDisplay);
-                mPendingVirtualDisplay = null;
-            }
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName name) {
-            Log.i(TAG, "onServiceDisconnected, name: " + name);
-            mService = null;
-            mNavStateController.setImageResolver(null);
-            onNavigationStateChange(NULL_NAV_STATE);
-        }
-    };
-
-    private ActivityMonitor.ActivityListener mNavigationActivityMonitor = (displayId, activity) -> {
-        if (displayId != mNavigationDisplayId) {
-            return;
-        }
-        mClusterViewModel.setCurrentNavigationActivity(activity);
-    };
-
-    private static class UserReceiver extends BroadcastReceiver {
-        private WeakReference<MainClusterActivity> mActivity;
-
-        UserReceiver(MainClusterActivity activity) {
-            mActivity = new WeakReference<>(activity);
-        }
-
-        public void register(Context context) {
-            IntentFilter intentFilter = new IntentFilter(ACTION_USER_UNLOCKED);
-            intentFilter.addAction(ACTION_USER_SWITCHED);
-            context.registerReceiver(this, intentFilter);
-        }
-
-        public void unregister(Context context) {
-            context.unregisterReceiver(this);
-        }
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            MainClusterActivity activity = mActivity.get();
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Broadcast received: " + intent);
-            }
-            activity.tryLaunchNavigationActivity();
-        }
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        Log.d(TAG, "onCreate");
-        setContentView(R.layout.activity_main);
-
-        mInputMethodManager = getSystemService(InputMethodManager.class);
-
-        Intent intent = new Intent(this, ClusterRenderingServiceImpl.class);
-        intent.setAction(LOCAL_BINDING_ACTION);
-        bindServiceAsUser(intent, mClusterRenderingServiceConnection, 0, UserHandle.SYSTEM);
-
-        registerFacet(new Facet<>(findViewById(R.id.btn_nav), 0, NavigationFragment.class));
-        registerFacet(new Facet<>(findViewById(R.id.btn_phone), 1, PhoneFragment.class));
-        registerFacet(new Facet<>(findViewById(R.id.btn_music), 2, MusicFragment.class));
-        registerFacet(new Facet<>(findViewById(R.id.btn_car_info), 3, CarInfoFragment.class));
-        registerGear(findViewById(R.id.gear_parked), Sensors.Gear.PARK);
-        registerGear(findViewById(R.id.gear_reverse), Sensors.Gear.REVERSE);
-        registerGear(findViewById(R.id.gear_neutral), Sensors.Gear.NEUTRAL);
-        registerGear(findViewById(R.id.gear_drive), Sensors.Gear.DRIVE);
-
-        mPager = findViewById(R.id.pager);
-        mPager.setAdapter(new ClusterPageAdapter(getSupportFragmentManager()));
-        mOrderToFacet.get(0).mButton.requestFocus();
-        mNavStateController = new NavStateController(findViewById(R.id.navigation_state));
-
-        mClusterViewModel = ViewModelProviders.of(this).get(ClusterViewModel.class);
-        mClusterViewModel.getNavigationFocus().observe(this, focus -> {
-            // If focus is lost, we launch the default navigation activity again.
-            if (!focus) {
-                mNavStateController.update(null);
-                tryLaunchNavigationActivity();
-            }
-        });
-
-        mClusterViewModel.getSensor(Sensors.SENSOR_GEAR).observe(this, this::updateSelectedGear);
-
-        registerSensor(findViewById(R.id.info_fuel), mClusterViewModel.getFuelLevel());
-        registerSensor(findViewById(R.id.info_speed), mClusterViewModel.getSpeed());
-        registerSensor(findViewById(R.id.info_range), mClusterViewModel.getRange());
-        registerSensor(findViewById(R.id.info_rpm), mClusterViewModel.getRPM());
-
-        mActivityMonitor.start();
-
-        mUserReceiver = new UserReceiver(this);
-        mUserReceiver.register(this);
-
-        try {
-            InMemoryPhoneBook.get();
-        } catch (IllegalStateException ex) {
-            // Initialize if not yet initialized
-            InMemoryPhoneBook.init(this);
-        }
-
-        PhoneFragmentViewModel phoneViewModel = ViewModelProviders.of(this).get(
-                PhoneFragmentViewModel.class);
-
-        phoneViewModel.setPhoneStateCallback(new PhoneFragmentViewModel.PhoneStateCallback() {
-            @Override
-            public void onCall() {
-                mPreviousFacet = mPager.getCurrentItem();
-                mOrderToFacet.get(1).mButton.requestFocus();
-            }
-
-            @Override
-            public void onDisconnect() {
-                mOrderToFacet.get(mPreviousFacet).mButton.requestFocus();
-            }
-        });
-    }
-
-    private <V> void registerSensor(TextView textView, LiveData<V> source) {
-        String emptyValue = getString(R.string.info_value_empty);
-        source.observe(this, value -> textView.setText(value != null
-                ? value.toString() : emptyValue));
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        Log.d(TAG, "onDestroy");
-        mUserReceiver.unregister(this);
-        mActivityMonitor.stop();
-        if (mService != null) {
-            mService.unregisterClient(this);
-            mService = null;
-        }
-        unbindService(mClusterRenderingServiceConnection);
-    }
-
-    @Override
-    public void onKeyEvent(KeyEvent event) {
-        Log.i(TAG, "onKeyEvent, event: " + event);
-
-        // This is a hack. We use SOURCE_CLASS_POINTER here because this type of input is associated
-        // with the display. otherwise this event will be ignored in ViewRootImpl because injecting
-        // KeyEvent w/o activity being focused is useless.
-        event.setSource(event.getSource() | InputDevice.SOURCE_CLASS_POINTER);
-        mInputMethodManager.dispatchKeyEventFromInputMethod(getCurrentFocus(), event);
-    }
-
-    @Override
-    public void onNavigationStateChange(NavigationState state) {
-        Log.d(TAG, "onNavigationStateChange: " + state);
-        if (mNavStateController != null) {
-            mNavStateController.update(state);
-        }
-    }
-
-    public void updateNavDisplay(VirtualDisplay virtualDisplay) {
-        // Starting the default navigation activity. This activity will be shown when navigation
-        // focus is not taken.
-        startNavigationActivity(virtualDisplay.mDisplayId);
-        // Notify the service (so it updates display properties on car service)
-        if (mService == null) {
-            // Service is not bound yet. Hold the information and notify when the service is bound.
-            mPendingVirtualDisplay = virtualDisplay;
-            return;
-        } else {
-            reportNavDisplay(virtualDisplay);
-        }
-    }
-
-    private void reportNavDisplay(VirtualDisplay virtualDisplay) {
-        mService.setActivityLaunchOptions(virtualDisplay.mDisplayId, ClusterActivityState
-                .create(virtualDisplay.mDisplayId != Display.INVALID_DISPLAY,
-                        virtualDisplay.mUnobscuredBounds));
-    }
-
-    public class ClusterPageAdapter extends FragmentPagerAdapter {
-        public ClusterPageAdapter(FragmentManager fm) {
-            super(fm);
-        }
-
-        @Override
-        public int getCount() {
-            return mButtonToFacet.size();
-        }
-
-        @Override
-        public Fragment getItem(int position) {
-            return mOrderToFacet.get(position).getOrCreateFragment();
-        }
-    }
-
-    private <T> void registerFacet(Facet<T> facet) {
-        mOrderToFacet.append(facet.mOrder, facet);
-        mButtonToFacet.put(facet.mButton, facet);
-
-        facet.mButton.setOnFocusChangeListener(mFacetButtonFocusListener);
-    }
-
-    private static class Facet<T> {
-        Button mButton;
-        Class<T> mClazz;
-        int mOrder;
-
-        Facet(Button button, int order, Class<T> clazz) {
-            this.mButton = button;
-            this.mOrder = order;
-            this.mClazz = clazz;
-        }
-
-        private Fragment mFragment;
-
-        Fragment getOrCreateFragment() {
-            if (mFragment == null) {
-                try {
-                    mFragment = (Fragment) mClazz.getConstructors()[0].newInstance();
-                } catch (InstantiationException | IllegalAccessException
-                        | InvocationTargetException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-            return mFragment;
-        }
-    }
-
-    private void startNavigationActivity(int displayId) {
-        mActivityMonitor.removeListener(mNavigationDisplayId, mNavigationActivityMonitor);
-        mActivityMonitor.addListener(displayId, mNavigationActivityMonitor);
-        mNavigationDisplayId = displayId;
-        tryLaunchNavigationActivity();
-    }
-
-    /**
-     * Tries to start a default navigation activity in the cluster. During system initialization
-     * launching user activities might fail due the system not being ready or {@link PackageManager}
-     * not being able to resolve the implicit intent. It is also possible that the system doesn't
-     * have a default navigation activity selected yet.
-     */
-    private void tryLaunchNavigationActivity() {
-        if (mNavigationDisplayId == NO_DISPLAY) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, String.format("Launch activity ignored (no display yet)"));
-            }
-            // Not ready to launch yet.
-            return;
-        }
-        mHandler.removeCallbacks(mRetryLaunchNavigationActivity);
-
-        ComponentName navigationActivity = getNavigationActivity();
-        mClusterViewModel.setFreeNavigationActivity(navigationActivity);
-
-        try {
-            if (navigationActivity == null) {
-                throw new ActivityNotFoundException();
-            }
-            Intent intent = new Intent(Intent.ACTION_MAIN).addCategory(Car.CAR_CATEGORY_NAVIGATION)
-                    .setPackage(navigationActivity.getPackageName())
-                    .setComponent(navigationActivity)
-                    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            Log.d(TAG, "Launching: " + intent + " on display: " + mNavigationDisplayId);
-            Bundle activityOptions = ActivityOptions.makeBasic()
-                    .setLaunchDisplayId(mNavigationDisplayId)
-                    .toBundle();
-
-            startActivityAsUser(intent, activityOptions, UserHandle.CURRENT);
-        } catch (ActivityNotFoundException ex) {
-            // Some activities might not be available right on startup. We will retry.
-            mHandler.postDelayed(mRetryLaunchNavigationActivity,
-                    NAVIGATION_ACTIVITY_RETRY_INTERVAL_MS);
-        } catch (Exception ex) {
-            Log.e(TAG, "Unable to start navigation activity: " + navigationActivity, ex);
-        }
-    }
-
-    /**
-     * Returns a default navigation activity to show in the cluster.
-     * In the current implementation we search for an activity with the
-     * {@link Car#CAR_CATEGORY_NAVIGATION} category from the same navigation app
-     * selected from CarLauncher (see CarLauncher#getMapsIntent()).
-     * Alternatively, other implementations could:
-     * <ul>
-     * <li>Read this package from a resource (having a OEM default activity to show)
-     * <li>Let the user select one from settings.
-     * </ul>
-     */
-    private ComponentName getNavigationActivity() {
-        PackageManager pm = getPackageManager();
-        int userId = ActivityManager.getCurrentUser();
-
-        // Get currently selected navigation app.
-        Intent intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN,
-                Intent.CATEGORY_APP_MAPS);
-        ResolveInfo navigationApp = pm.resolveActivityAsUser(intent,
-                PackageManager.MATCH_DEFAULT_ONLY, userId);
-
-        // Get all possible cluster activities
-        intent = new Intent(Intent.ACTION_MAIN).addCategory(Car.CAR_CATEGORY_NAVIGATION);
-        List<ResolveInfo> candidates = pm.queryIntentActivitiesAsUser(intent, 0, userId);
-
-        // If there is a select navigation app, try finding a matching auxiliary navigation activity
-        if (navigationApp != null) {
-            for (ResolveInfo candidate : candidates) {
-                if (candidate.activityInfo.packageName.equals(navigationApp.activityInfo
-                        .packageName)) {
-                    Log.d(TAG, "Found activity: " + candidate);
-                    return new ComponentName(candidate.activityInfo.packageName,
-                            candidate.activityInfo.name);
-                }
-            }
-        }
-
-        // During initialization implicit intents might not provided a result. We will just
-        // retry until we find one, or we exhaust the retries.
-        Log.d(TAG, "No default activity found (it might not be available yet).");
-        return null;
-    }
-
-    private void registerGear(View view, Sensors.Gear gear) {
-        mGearsToIcon.put(gear, view);
-    }
-
-    private void updateSelectedGear(Sensors.Gear gear) {
-        for (Map.Entry<Sensors.Gear, View> entry : mGearsToIcon.entrySet()) {
-            entry.getValue().setSelected(entry.getKey() == gear);
-        }
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MusicFragment.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MusicFragment.java
deleted file mode 100644
index 25739e2..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MusicFragment.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 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 android.car.cluster.sample;
-
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-import androidx.lifecycle.ViewModelProviders;
-
-import com.android.car.apps.common.BackgroundImageView;
-import com.android.car.media.common.playback.PlaybackViewModel;
-import com.android.car.media.common.source.MediaSourceViewModel;
-
-/**
- * Displays information on the current media item selected.
- */
-public class MusicFragment extends Fragment {
-    private static final String TAG = "MusicFragment";
-
-    public MusicFragment() {
-        // Required empty public constructor
-    }
-
-    @Nullable
-    @Override
-    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
-            Bundle savedInstanceState) {
-        FragmentActivity activity = requireActivity();
-        PlaybackViewModel playbackViewModel = PlaybackViewModel.get(activity.getApplication());
-        MediaSourceViewModel mMediaSourceViewModel = MediaSourceViewModel.get(
-                activity.getApplication());
-
-        MusicFragmentViewModel innerViewModel = ViewModelProviders.of(activity).get(
-                MusicFragmentViewModel.class);
-        innerViewModel.init(mMediaSourceViewModel, playbackViewModel);
-
-        View view = inflater.inflate(R.layout.fragment_music, container, false);
-
-        TextView appName = view.findViewById(R.id.app_name);
-        innerViewModel.getAppName().observe(getViewLifecycleOwner(), appName::setText);
-
-        TextView title = view.findViewById(R.id.title);
-        innerViewModel.getTitle().observe(getViewLifecycleOwner(), title::setText);
-
-        TextView subtitle = view.findViewById(R.id.subtitle);
-        innerViewModel.getSubtitle().observe(getViewLifecycleOwner(), subtitle::setText);
-
-        SeekBar seekBar = view.findViewById(R.id.seek_bar);
-        innerViewModel.getMaxProgress().observe(getViewLifecycleOwner(),
-                maxProgress -> seekBar.setMax(maxProgress != null ? maxProgress.intValue() : 0));
-        innerViewModel.getProgress().observe(getViewLifecycleOwner(),
-                progress -> seekBar.setProgress((int) progress.getProgress()));
-        innerViewModel.hasTime().observe(getViewLifecycleOwner(),
-                hasTime -> seekBar.setVisibility(hasTime ? View.VISIBLE : View.INVISIBLE));
-
-        TextView time = view.findViewById(R.id.time);
-
-        innerViewModel.getTimeText().observe(getViewLifecycleOwner(),
-                timeText -> time.setText(timeText));
-
-        BackgroundImageView albumBackground = view.findViewById(R.id.album_background);
-        ImageView albumIcon = view.findViewById(R.id.album_art);
-        innerViewModel.getAlbumArt().observe(getViewLifecycleOwner(), albumArt -> {
-            albumBackground.setBackgroundImage(albumArt, true);
-            if (albumArt == null) {
-                albumIcon.setImageDrawable(getContext().getDrawable(R.drawable.ic_person));
-            } else {
-                albumIcon.setImageBitmap(albumArt);
-            }
-        });
-
-        return view;
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MusicFragmentViewModel.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MusicFragmentViewModel.java
deleted file mode 100644
index 81a87df..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MusicFragmentViewModel.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 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 android.car.cluster.sample;
-
-import static androidx.lifecycle.Transformations.map;
-
-import static com.android.car.arch.common.LiveDataFunctions.combine;
-import static com.android.car.arch.common.LiveDataFunctions.mapNonNull;
-
-import android.annotation.SuppressLint;
-import android.app.Application;
-import android.graphics.Bitmap;
-import android.media.session.PlaybackState;
-
-import androidx.lifecycle.AndroidViewModel;
-import androidx.lifecycle.LiveData;
-
-import com.android.car.media.common.MediaItemMetadata;
-import com.android.car.media.common.playback.AlbumArtLiveData;
-import com.android.car.media.common.playback.PlaybackProgress;
-import com.android.car.media.common.playback.PlaybackViewModel;
-import com.android.car.media.common.source.MediaSource;
-import com.android.car.media.common.source.MediaSourceViewModel;
-
-import com.bumptech.glide.request.target.Target;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * View model for {@link MusicFragment}
- */
-public final class MusicFragmentViewModel extends AndroidViewModel {
-
-    private LiveData<MediaSource> mMediaSource;
-    private LiveData<CharSequence> mAppName;
-    private LiveData<Bitmap> mAppIcon;
-    private LiveData<CharSequence> mTitle;
-    private LiveData<CharSequence> mSubtitle;
-    private LiveData<Bitmap> mAlbumArt;
-    private LiveData<PlaybackProgress> mProgress;
-    private LiveData<Long> mMaxProgress;
-    private LiveData<CharSequence> mTimeText;
-    private LiveData<Boolean> mHasTime;
-
-    private PlaybackViewModel mPlaybackViewModel;
-    private MediaSourceViewModel mMediaSourceViewModel;
-
-    public MusicFragmentViewModel(Application application) {
-        super(application);
-    }
-
-    void init(MediaSourceViewModel mediaSourceViewModel, PlaybackViewModel playbackViewModel) {
-        if (mMediaSourceViewModel == mediaSourceViewModel
-                && mPlaybackViewModel == playbackViewModel) {
-            return;
-        }
-        mPlaybackViewModel = playbackViewModel;
-        mMediaSourceViewModel = mediaSourceViewModel;
-        mMediaSource = mMediaSourceViewModel.getPrimaryMediaSource();
-        mAppName = mapNonNull(mMediaSource, MediaSource::getName);
-        mAppIcon = mapNonNull(mMediaSource, MediaSource::getRoundPackageIcon);
-        mTitle = mapNonNull(playbackViewModel.getMetadata(), MediaItemMetadata::getTitle);
-        mSubtitle = mapNonNull(playbackViewModel.getMetadata(), MediaItemMetadata::getSubtitle);
-        mAlbumArt = AlbumArtLiveData.getAlbumArt(getApplication(),
-                Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL, false,
-                playbackViewModel.getMetadata());
-        mProgress = playbackViewModel.getProgress();
-        mMaxProgress = map(playbackViewModel.getPlaybackStateWrapper(),
-                state -> state != null ? state.getMaxProgress() : 0L);
-        mTimeText = combine(mProgress, mMaxProgress, (progress, maxProgress) -> {
-            boolean showHours = TimeUnit.MILLISECONDS.toHours(maxProgress) > 0;
-            return String.format("%s / %s",
-                    formatTime(progress.getProgress(), showHours),
-                    formatTime(maxProgress, showHours));
-        });
-        mHasTime = combine(mProgress, mMaxProgress, (progress, maxProgress) ->
-                maxProgress > 0
-                        && progress.getProgress() != PlaybackState.PLAYBACK_POSITION_UNKNOWN);
-    }
-
-    LiveData<CharSequence> getAppName() {
-        return mAppName;
-    }
-
-    LiveData<Bitmap> getAppIcon() {
-        return mAppIcon;
-    }
-
-    LiveData<CharSequence> getTitle() {
-        return mTitle;
-    }
-
-    LiveData<CharSequence> getSubtitle() {
-        return mSubtitle;
-    }
-
-    LiveData<Bitmap> getAlbumArt() {
-        return mAlbumArt;
-    }
-
-    LiveData<PlaybackProgress> getProgress() {
-        return mProgress;
-    }
-
-    LiveData<Long> getMaxProgress() {
-        return mMaxProgress;
-    }
-
-    LiveData<CharSequence> getTimeText() {
-        return mTimeText;
-    }
-
-    LiveData<Boolean> hasTime() {
-        return mHasTime;
-    }
-
-    @SuppressLint("DefaultLocale")
-    private static String formatTime(long millis, boolean showHours) {
-        long hours = TimeUnit.MILLISECONDS.toHours(millis);
-        long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % TimeUnit.HOURS.toMinutes(1);
-        long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % TimeUnit.MINUTES.toSeconds(1);
-        if (showHours) {
-            return String.format("%d:%02d:%02d", hours, minutes, seconds);
-        } else {
-            return String.format("%d:%02d", minutes, seconds);
-        }
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavStateController.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavStateController.java
deleted file mode 100644
index bb39e63..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavStateController.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright (C) 2018 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 android.car.cluster.sample;
-
-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;
-import android.widget.TextView;
-
-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;
-import androidx.car.cluster.navigation.Step;
-
-import java.time.Duration;
-import java.time.ZonedDateTime;
-
-/**
- * View controller for navigation state rendering.
- */
-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;
-    private CueView mCue;
-    private Context mContext;
-    private ImageResolver mImageResolver;
-
-    /**
-     * Creates a controller to coordinate updates to the views displaying navigation state
-     * data.
-     *
-     * @param container {@link View} containing the navigation state views
-     */
-    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);
-        mCue = container.findViewById(R.id.cue);
-
-        mContext = container.getContext();
-    }
-
-    public void setImageResolver(@Nullable ImageResolver imageResolver) {
-        mImageResolver = imageResolver;
-    }
-
-    /**
-     * Updates views to reflect the provided navigation state
-     */
-    public void update(@Nullable NavigationState state) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Updating nav state: " + state);
-        }
-        Step step = state != null && state.getSteps().size() > 0 ? state.getSteps().get(0) : null;
-        Destination destination = state != null && !state.getDestinations().isEmpty()
-                ? state.getDestinations().get(0) : null;
-        ZonedDateTime eta = destination != null ? destination.getEta() : null;
-        Traffic traffic = destination != null ? destination.getTraffic() : null;
-
-        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);
-        }
-    }
-
-
-    private int getTrafficColor(@Nullable Traffic traffic) {
-        if (traffic == Traffic.LOW) {
-            return mContext.getColor(R.color.low_traffic);
-        } else if (traffic == Traffic.MEDIUM) {
-            return mContext.getColor(R.color.medium_traffic);
-        } else if (traffic == Traffic.HIGH) {
-            return mContext.getColor(R.color.high_traffic);
-        }
-
-        return mContext.getColor(R.color.unknown_traffic);
-    }
-
-    private String formatEta(@Nullable ZonedDateTime eta) {
-        ZonedDateTime now = ZonedDateTime.now();
-        Duration duration = Duration.between(now, eta);
-        long seconds = duration.getSeconds();
-
-        // TODO: move formatting into common lib somewhere
-        long minutes = (seconds / 60) % 60;
-        long hours = (seconds / 3600) % 24;
-        long days = seconds / (3600 * 24);
-
-        if (days > 0) {
-            return String.format("%d d %d hr", days, hours);
-        } else if (hours > 0) {
-            return String.format("%d hr %d min", hours, minutes);
-        } else {
-            return String.format("%d min", minutes);
-        }
-    }
-
-    private String getSegmentString(Segment segment) {
-        if (segment != null) {
-            return segment.getName();
-        }
-
-        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;
-        }
-        switch (maneuver.getType()) {
-            case UNKNOWN:
-                return null;
-            case DEPART:
-                return mContext.getDrawable(R.drawable.direction_depart);
-            case NAME_CHANGE:
-                return mContext.getDrawable(R.drawable.direction_new_name_straight);
-            case KEEP_LEFT:
-                return mContext.getDrawable(R.drawable.direction_continue_left);
-            case KEEP_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_continue_right);
-            case TURN_SLIGHT_LEFT:
-                return mContext.getDrawable(R.drawable.direction_turn_slight_left);
-            case TURN_SLIGHT_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_turn_slight_right);
-            case TURN_NORMAL_LEFT:
-                return mContext.getDrawable(R.drawable.direction_turn_left);
-            case TURN_NORMAL_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_turn_right);
-            case TURN_SHARP_LEFT:
-                return mContext.getDrawable(R.drawable.direction_turn_sharp_left);
-            case TURN_SHARP_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_turn_sharp_right);
-            case U_TURN_LEFT:
-                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:
-                return mContext.getDrawable(R.drawable.direction_on_ramp_slight_left);
-            case ON_RAMP_SLIGHT_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_on_ramp_slight_right);
-            case ON_RAMP_NORMAL_LEFT:
-                return mContext.getDrawable(R.drawable.direction_on_ramp_left);
-            case ON_RAMP_NORMAL_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_on_ramp_right);
-            case ON_RAMP_SHARP_LEFT:
-                return mContext.getDrawable(R.drawable.direction_on_ramp_sharp_left);
-            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_left);
-            case ON_RAMP_U_TURN_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_uturn_right);
-            case OFF_RAMP_SLIGHT_LEFT:
-                return mContext.getDrawable(R.drawable.direction_off_ramp_slight_left);
-            case OFF_RAMP_SLIGHT_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_off_ramp_slight_right);
-            case OFF_RAMP_NORMAL_LEFT:
-                return mContext.getDrawable(R.drawable.direction_off_ramp_left);
-            case OFF_RAMP_NORMAL_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_off_ramp_right);
-            case FORK_LEFT:
-                return mContext.getDrawable(R.drawable.direction_fork_left);
-            case FORK_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_fork_right);
-            case MERGE_LEFT:
-                return mContext.getDrawable(R.drawable.direction_merge_left);
-            case MERGE_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_merge_right);
-            case ROUNDABOUT_ENTER:
-                return mContext.getDrawable(R.drawable.direction_roundabout);
-            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_cw_sharp_right);
-            case ROUNDABOUT_ENTER_AND_EXIT_CW_NORMAL_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_cw_slight_right);
-            case ROUNDABOUT_ENTER_AND_EXIT_CW_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_cw_sharp_left);
-            case ROUNDABOUT_ENTER_AND_EXIT_CW_NORMAL_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_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_ccw_sharp_right);
-            case ROUNDABOUT_ENTER_AND_EXIT_CCW_NORMAL_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_ccw_slight_right);
-            case ROUNDABOUT_ENTER_AND_EXIT_CCW_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_ccw_sharp_left);
-            case ROUNDABOUT_ENTER_AND_EXIT_CCW_NORMAL_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_ccw_slight_left);
-            case ROUNDABOUT_ENTER_AND_EXIT_CCW_U_TURN:
-                return mContext.getDrawable(R.drawable.direction_uturn_left);
-            case STRAIGHT:
-                return mContext.getDrawable(R.drawable.direction_continue);
-            case FERRY_BOAT:
-                return mContext.getDrawable(R.drawable.direction_close);
-            case FERRY_TRAIN:
-                return mContext.getDrawable(R.drawable.direction_close);
-            case DESTINATION:
-                return mContext.getDrawable(R.drawable.direction_arrive);
-            case DESTINATION_STRAIGHT:
-                return mContext.getDrawable(R.drawable.direction_arrive_straight);
-            case DESTINATION_LEFT:
-                return mContext.getDrawable(R.drawable.direction_arrive_left);
-            case DESTINATION_RIGHT:
-                return mContext.getDrawable(R.drawable.direction_arrive_right);
-        }
-        return null;
-    }
-
-    private String formatDistance(@Nullable Distance distance) {
-        if (distance == null || distance.getDisplayUnit() == Distance.Unit.UNKNOWN) {
-            return null;
-        }
-
-        String unit = "";
-
-        switch (distance.getDisplayUnit()) {
-            case METERS:
-                unit = "m";
-                break;
-            case KILOMETERS:
-                unit = "km";
-                break;
-            case MILES:
-                unit = "mi";
-                break;
-            case YARDS:
-                unit = "yd";
-                break;
-            case FEET:
-                unit = "ft";
-                break;
-        }
-        return String.format("In %s %s", distance.getDisplayValue(), unit);
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavigationFragment.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavigationFragment.java
deleted file mode 100644
index d35ba02..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavigationFragment.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2017 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 android.car.cluster.sample;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.hardware.display.DisplayManager;
-import android.hardware.display.DisplayManager.DisplayListener;
-import android.hardware.display.VirtualDisplay;
-import android.os.Bundle;
-import android.os.Handler;
-import android.util.Log;
-import android.view.Display;
-import android.view.LayoutInflater;
-import android.view.Surface;
-import android.view.SurfaceHolder;
-import android.view.SurfaceHolder.Callback;
-import android.view.SurfaceView;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import androidx.fragment.app.Fragment;
-import androidx.lifecycle.ViewModelProvider;
-import androidx.lifecycle.ViewModelProviders;
-
-public class NavigationFragment extends Fragment {
-    private static final String TAG = "Cluster.NavFragment";
-
-    private SurfaceView mSurfaceView;
-    private DisplayManager mDisplayManager;
-    private Rect mUnobscuredBounds;
-    private MainClusterActivity mMainClusterActivity;
-    private ClusterViewModel mViewModel;
-    private ProgressBar mProgressBar;
-    private TextView mMessage;
-
-
-    // Static because we want to keep alive this virtual display when navigating through
-    // ViewPager (this fragment gets dynamically destroyed and created)
-    private static VirtualDisplay mVirtualDisplay;
-    private static int mRegisteredNavDisplayId = Display.INVALID_DISPLAY;
-    private boolean mNavigationDisplayUpdatePending = false;
-
-    public NavigationFragment() {
-        // Required empty public constructor
-    }
-
-
-    private final DisplayListener mDisplayListener = new DisplayListener() {
-        @Override
-        public void onDisplayAdded(int displayId) {
-            int navDisplayId = getVirtualDisplayId();
-            Log.i(TAG, "onDisplayAdded, displayId: " + displayId
-                    + ", navigation display id: " + navDisplayId);
-
-            if (navDisplayId == displayId) {
-                mRegisteredNavDisplayId = displayId;
-                updateNavigationDisplay();
-            }
-        }
-
-        @Override
-        public void onDisplayRemoved(int displayId) {
-            if (mRegisteredNavDisplayId == displayId) {
-                mRegisteredNavDisplayId = Display.INVALID_DISPLAY;
-                updateNavigationDisplay();
-            }
-        }
-
-        @Override
-        public void onDisplayChanged(int displayId) {}
-    };
-
-    private void updateNavigationDisplay() {
-        if (mMainClusterActivity == null) {
-            // Not attached to the activity yet. Let's wait.
-            mNavigationDisplayUpdatePending = true;
-            return;
-        }
-
-        mNavigationDisplayUpdatePending = false;
-        mMainClusterActivity.updateNavDisplay(new MainClusterActivity.VirtualDisplay(
-                mRegisteredNavDisplayId, mUnobscuredBounds));
-    }
-
-    @Override
-    public void onAttach(Context context) {
-        super.onAttach(context);
-        mMainClusterActivity = (MainClusterActivity) context;
-        if (mNavigationDisplayUpdatePending) {
-            updateNavigationDisplay();
-        }
-    }
-
-    @Override
-    public void onDetach() {
-        mMainClusterActivity = null;
-        super.onDetach();
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                             Bundle savedInstanceState) {
-        Log.i(TAG, "onCreateView");
-        ViewModelProvider provider = ViewModelProviders.of(requireActivity());
-        mViewModel = provider.get(ClusterViewModel.class);
-
-        mDisplayManager = getActivity().getSystemService(DisplayManager.class);
-        mDisplayManager.registerDisplayListener(mDisplayListener, new Handler());
-
-        // Inflate the layout for this fragment
-        View root = inflater.inflate(R.layout.fragment_navigation, container, false);
-
-        mSurfaceView = root.findViewById(R.id.nav_surface);
-        mSurfaceView.getHolder().addCallback(new Callback() {
-            @Override
-            public void surfaceCreated(SurfaceHolder holder) {
-                Log.i(TAG, "surfaceCreated, holder: " + holder);
-            }
-
-            @Override
-            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
-                Log.i(TAG, "surfaceChanged, holder: " + holder + ", size:" + width + "x" + height
-                        + ", format:" + format);
-
-                // Create dummy unobscured area to report to navigation activity.
-                int obscuredWidth = (int) getResources()
-                        .getDimension(R.dimen.speedometer_overlap_width);
-                int obscuredHeight = (int) getResources()
-                        .getDimension(R.dimen.navigation_gradient_height);
-                mUnobscuredBounds = new Rect(
-                        obscuredWidth,          /* left: size of gauge */
-                        obscuredHeight,         /* top: gradient */
-                        width - obscuredWidth,  /* right: size of the display - size of gauge */
-                        height - obscuredHeight /* bottom: size of display - gradient */
-                );
-
-                if (mVirtualDisplay == null) {
-                    mVirtualDisplay = createVirtualDisplay(holder.getSurface(), width, height);
-                } else {
-                    mVirtualDisplay.setSurface(holder.getSurface());
-                }
-            }
-
-            @Override
-            public void surfaceDestroyed(SurfaceHolder holder) {
-                Log.i(TAG, "surfaceDestroyed, holder: " + holder + ", detaching surface from"
-                        + " display, surface: " + holder.getSurface());
-                // detaching surface is similar to turning off the display
-                mVirtualDisplay.setSurface(null);
-            }
-        });
-        mProgressBar = root.findViewById(R.id.progress_bar);
-        mMessage = root.findViewById(R.id.message);
-
-        mViewModel.getNavigationActivityState().observe(this, state -> {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "State: " + state);
-            }
-            mProgressBar.setVisibility(state == ClusterViewModel.NavigationActivityState.LOADING
-                    ? View.VISIBLE : View.INVISIBLE);
-            mMessage.setVisibility(state == ClusterViewModel.NavigationActivityState.NOT_SELECTED
-                    ? View.VISIBLE : View.INVISIBLE);
-        });
-
-        return root;
-    }
-
-    private VirtualDisplay createVirtualDisplay(Surface surface, int width, int height) {
-        Log.i(TAG, "createVirtualDisplay, surface: " + surface + ", width: " + width
-                + "x" + height);
-        return mDisplayManager.createVirtualDisplay("Cluster-App-VD", width, height, 160, surface,
-                DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY);
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        Log.i(TAG, "onDestroy");
-    }
-
-    private int getVirtualDisplayId() {
-        return (mVirtualDisplay != null && mVirtualDisplay.getDisplay() != null)
-                ? mVirtualDisplay.getDisplay().getDisplayId() : Display.INVALID_DISPLAY;
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java
deleted file mode 100644
index ba64ce5..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- * Copyright (C) 2018 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 android.car.cluster.sample;
-
-import android.annotation.NonNull;
-import android.content.Context;
-import android.hardware.display.DisplayManager;
-import android.hardware.display.DisplayManager.DisplayListener;
-import android.hardware.display.VirtualDisplay;
-import android.media.MediaCodec;
-import android.media.MediaCodec.BufferInfo;
-import android.media.MediaCodec.CodecException;
-import android.media.MediaCodecInfo;
-import android.media.MediaCodecInfo.CodecProfileLevel;
-import android.media.MediaFormat;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.Message;
-import android.util.Log;
-import android.view.Display;
-import android.view.Surface;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.RandomAccessFile;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.nio.ByteBuffer;
-import java.util.UUID;
-
-/**
- * This class encapsulates all work related to managing networked virtual display.
- * <p>
- * It opens a socket and listens on port {@code PORT} for connections, or the emulator pipe. Once
- * connection is established it creates virtual display and media encoder and starts streaming video
- * to that socket.  If the receiving part is disconnected, it will keep port open and virtual
- * display won't be destroyed.
- */
-public class NetworkedVirtualDisplay {
-    private static final String TAG = "Cluster." + NetworkedVirtualDisplay.class.getSimpleName();
-
-    private final String mUniqueId =  UUID.randomUUID().toString();
-
-    private final DisplayManager mDisplayManager;
-    private final int mWidth;
-    private final int mHeight;
-    private final int mDpi;
-
-    private static final int FPS = 25;
-    private static final int BITRATE = 6144000;
-    private static final String MEDIA_FORMAT_MIMETYPE = MediaFormat.MIMETYPE_VIDEO_AVC;
-
-    public static final int MSG_START = 0;
-    public static final int MSG_STOP = 1;
-    public static final int MSG_SEND_FRAME = 2;
-
-    private static final String PIPE_NAME = "pipe:qemud:carCluster";
-    private static final String PIPE_DEVICE = "/dev/qemu_pipe";
-
-    // Constants shared with emulator in car-cluster-widget.cpp
-    public static final int PIPE_START = 1;
-    public static final int PIPE_STOP = 2;
-
-    private static final int PORT = 5151;
-
-    private SenderThread mActiveThread;
-    private HandlerThread mBroadcastThread = new HandlerThread("BroadcastThread");
-
-    private VirtualDisplay mVirtualDisplay;
-    private MediaCodec mVideoEncoder;
-    private Handler mHandler;
-    private byte[] mBuffer = null;
-    private int mLastFrameLength = 0;
-
-    private final DebugCounter mCounter = new DebugCounter();
-
-    NetworkedVirtualDisplay(Context context, int width, int height, int dpi) {
-        mDisplayManager = context.getSystemService(DisplayManager.class);
-        mWidth = width;
-        mHeight = height;
-        mDpi = dpi;
-
-        DisplayListener displayListener = new DisplayListener() {
-            @Override
-            public void onDisplayAdded(int i) {
-                final Display display = mDisplayManager.getDisplay(i);
-                if (display != null && getDisplayName().equals(display.getName())) {
-                    onVirtualDisplayReady(display);
-                }
-            }
-
-            @Override
-            public void onDisplayRemoved(int i) {}
-
-            @Override
-            public void onDisplayChanged(int i) {}
-        };
-
-        mDisplayManager.registerDisplayListener(displayListener, new Handler());
-    }
-
-    /**
-     * Opens socket and creates virtual display asynchronously once connection established.  Clients
-     * of this class may subscribe to
-     * {@link android.hardware.display.DisplayManager#registerDisplayListener(
-     * DisplayListener, Handler)} to be notified when virtual display is created.
-     * Note, that this method should be called only once.
-     *
-     * @return Unique display name associated with the instance of this class.
-     *
-     * @see {@link Display#getName()}
-     *
-     * @throws IllegalStateException thrown if networked display already started
-     */
-    public String start() {
-        if (mBroadcastThread.isAlive()) {
-            throw new IllegalStateException("Already started");
-        }
-
-        mBroadcastThread.start();
-        mHandler = new BroadcastThreadHandler(mBroadcastThread.getLooper());
-        mHandler.sendMessage(Message.obtain(mHandler, MSG_START));
-        return getDisplayName();
-    }
-
-    public void release() {
-        mHandler.sendMessage(Message.obtain(mHandler, MSG_STOP));
-        mBroadcastThread.quitSafely();
-
-        if (mVirtualDisplay != null) {
-            mVirtualDisplay.setSurface(null);
-            mVirtualDisplay.release();
-            mVirtualDisplay = null;
-        }
-    }
-
-    private String getDisplayName() {
-        return "Cluster-" + mUniqueId;
-    }
-
-    private VirtualDisplay createVirtualDisplay() {
-        Log.i(TAG, "createVirtualDisplay " + mWidth + "x" + mHeight +"@" + mDpi);
-        return mDisplayManager.createVirtualDisplay(getDisplayName(), mWidth, mHeight, mDpi,
-                null, 0 /* flags */, null, null );
-    }
-
-    private void onVirtualDisplayReady(Display display) {
-        Log.i(TAG, "onVirtualDisplayReady, display: " + display);
-    }
-
-    private void startCasting(Handler handler) {
-        Log.i(TAG, "Start casting...");
-        if (mVideoEncoder != null) {
-            Log.i(TAG, "Already started casting");
-            return;
-        }
-        mVideoEncoder = createVideoStream(handler);
-
-        if (mVirtualDisplay == null) {
-            mVirtualDisplay = createVirtualDisplay();
-        }
-
-        mVirtualDisplay.setSurface(mVideoEncoder.createInputSurface());
-        mVideoEncoder.start();
-        Log.i(TAG, "Video encoder started");
-    }
-
-    private MediaCodec createVideoStream(Handler handler) {
-        MediaCodec encoder;
-        try {
-            encoder = MediaCodec.createEncoderByType(MEDIA_FORMAT_MIMETYPE);
-        } catch (IOException e) {
-            Log.e(TAG, "Failed to create video encoder for " + MEDIA_FORMAT_MIMETYPE, e);
-            return null;
-        }
-
-        encoder.setCallback(new MediaCodec.Callback() {
-            @Override
-            public void onInputBufferAvailable(@NonNull MediaCodec codec, int index) {
-                // Nothing to do
-            }
-
-            @Override
-            public void onOutputBufferAvailable(@NonNull MediaCodec codec, int index,
-                    @NonNull BufferInfo info) {
-                mCounter.outputBuffers++;
-                doOutputBufferAvailable(index, info);
-            }
-
-            @Override
-            public void onError(@NonNull MediaCodec codec, @NonNull CodecException e) {
-                Log.e(TAG, "onError, codec: " + codec, e);
-                mCounter.bufferErrors++;
-                stopCasting();
-                startCasting(handler);
-            }
-
-            @Override
-            public void onOutputFormatChanged(@NonNull MediaCodec codec,
-                    @NonNull MediaFormat format) {
-                Log.i(TAG, "onOutputFormatChanged, codec: " + codec + ", format: " + format);
-
-            }
-        }, handler);
-
-        configureVideoEncoder(encoder, mWidth, mHeight);
-        return encoder;
-    }
-
-    private void doOutputBufferAvailable(int index, @NonNull BufferInfo info) {
-        mHandler.removeMessages(MSG_SEND_FRAME);
-
-        ByteBuffer encodedData = mVideoEncoder.getOutputBuffer(index);
-        if (encodedData == null) {
-            throw new RuntimeException("couldn't fetch buffer at index " + index);
-        }
-
-        if (info.size != 0) {
-            encodedData.position(info.offset);
-            encodedData.limit(info.offset + info.size);
-            mLastFrameLength = encodedData.remaining();
-            if (mBuffer == null || mBuffer.length < mLastFrameLength) {
-                Log.i(TAG, "Allocating new buffer: " + mLastFrameLength);
-                mBuffer = new byte[mLastFrameLength];
-            }
-            encodedData.get(mBuffer, 0, mLastFrameLength);
-            mVideoEncoder.releaseOutputBuffer(index, false);
-
-            // Send this frame asynchronously (avoiding blocking on the socket). We might miss
-            // frames if the consumer is not fast enough, but this is acceptable.
-            sendFrameAsync(0);
-        } else {
-            Log.e(TAG, "Skipping empty buffer");
-            mVideoEncoder.releaseOutputBuffer(index, false);
-        }
-    }
-
-    private void sendFrameAsync(long delayMs) {
-        Message msg = mHandler.obtainMessage(MSG_SEND_FRAME);
-        mHandler.sendMessageDelayed(msg, delayMs);
-    }
-
-    private void sendFrame(byte[] buf, int len) {
-        if (mActiveThread != null) {
-            mActiveThread.send(buf, len);
-        }
-    }
-
-    private void stopCasting() {
-        Log.i(TAG, "Stopping casting...");
-
-        if (mVirtualDisplay != null) {
-            Surface surface = mVirtualDisplay.getSurface();
-            if (surface != null) surface.release();
-        }
-
-        if (mVideoEncoder != null) {
-            // Releasing encoder as stop/start didn't work well (couldn't create or reuse input
-            // surface).
-            try {
-                mVideoEncoder.stop();
-                mVideoEncoder.release();
-            } catch (IllegalStateException e) {
-                // do nothing, already released
-            }
-            mVideoEncoder = null;
-        }
-        Log.i(TAG, "Casting stopped");
-    }
-
-    private class BroadcastThreadHandler extends Handler {
-        private static final int MAX_FAIL_COUNT = 10;
-        private int mFailConnectCounter;
-
-        BroadcastThreadHandler(Looper looper) {
-            super(looper);
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            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();
-                    }
-                    if (mActiveThread == null) {
-                        mActiveThread = tryNetworkConnect();
-                    }
-                    if (mActiveThread == null) {
-                        // When failed attempt limit is reached, clean up and quit this thread.
-                        mFailConnectCounter++;
-                        if (mFailConnectCounter >= MAX_FAIL_COUNT) {
-                            Log.e(TAG, "Too many failed connection attempts; aborting");
-                            release();
-                            throw new RuntimeException("Abort after failed connection attempts");
-                        }
-                        mHandler.sendMessage(Message.obtain(mHandler, MSG_START));
-                        break;
-                    }
-
-                    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:
-                    Log.i(TAG, "Received stop message");
-                    stopCasting();
-                    mCounter.clientsDisconnected++;
-                    if (mActiveThread != null) {
-                        mActiveThread.close();
-                        try {
-                            mActiveThread.join();
-                        } catch (InterruptedException e) {
-                            Log.e(TAG, "Waiting for active thread to close failed", e);
-                        }
-                        mActiveThread = null;
-                    }
-                    break;
-
-                case MSG_SEND_FRAME:
-                    if (mActiveThread == null) {
-                        // Stop the chaining signal if there's no client to send to
-                        break;
-                    }
-                    sendFrame(mBuffer, mLastFrameLength);
-                    // We will keep sending last frame every second as a heartbeat.
-                    sendFrameAsync(1000L);
-                    break;
-            }
-        }
-
-        // Returns null if can't establish pipe connection
-        // Otherwise returns the corresponding client thread
-        private PipeThread tryPipeConnect() {
-            try {
-                RandomAccessFile pipe = new RandomAccessFile(PIPE_DEVICE, "rw");
-                byte[] temp = new byte[PIPE_NAME.length() + 1];
-                temp[PIPE_NAME.length()] = 0;
-                System.arraycopy(PIPE_NAME.getBytes(), 0, temp, 0, PIPE_NAME.length());
-                pipe.write(temp);
-
-                // At this point, the pipe exists, so we will just wait for a start signal
-                // This is in case pipe still sends leftover stops from last instantiation
-                int signal = pipe.read();
-                while (signal != PIPE_START) {
-                    Log.i(TAG, "Received non-start signal: " + signal);
-                    signal = pipe.read();
-                }
-                return new PipeThread(mHandler, pipe);
-            } catch (IOException e) {
-                Log.e(TAG, "Failed to establish pipe connection", e);
-                return null;
-            }
-        }
-
-        // Returns null if can't establish network connection
-        // Otherwise returns the corresponding client thread
-        private SocketThread tryNetworkConnect() {
-            try {
-                ServerSocket serverSocket = new ServerSocket(PORT);
-                Log.i(TAG, "Server socket opened");
-                Socket socket = serverSocket.accept();
-                socket.setTcpNoDelay(true);
-                socket.setKeepAlive(true);
-                socket.setSoLinger(true, 0);
-
-                InputStream inputStream = socket.getInputStream();
-                OutputStream outputStream = socket.getOutputStream();
-
-                return new SocketThread(mHandler, serverSocket, inputStream, outputStream);
-            } catch (IOException e) {
-                Log.e(TAG, "Failed to establish network connection", e);
-                return null;
-            }
-        }
-    }
-
-    private static void configureVideoEncoder(MediaCodec codec, int width, int height) {
-        MediaFormat format = MediaFormat.createVideoFormat(MEDIA_FORMAT_MIMETYPE, width, height);
-
-        format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
-                MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
-        format.setInteger(MediaFormat.KEY_BIT_RATE, BITRATE);
-        format.setInteger(MediaFormat.KEY_FRAME_RATE, FPS);
-        format.setInteger(MediaFormat.KEY_CAPTURE_RATE, FPS);
-        format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
-        format.setFloat(MediaFormat.KEY_I_FRAME_INTERVAL, 1); // 1 second between I-frames
-        format.setInteger(MediaFormat.KEY_LEVEL, CodecProfileLevel.AVCLevel31);
-        format.setInteger(MediaFormat.KEY_PROFILE,
-                MediaCodecInfo.CodecProfileLevel.AVCProfileBaseline);
-
-        codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
-    }
-
-    @Override
-    public String toString() {
-        return getClass() + "{"
-                + ", receiver connected: " + (mActiveThread != null)
-                + ", encoder: " + mVideoEncoder
-                + ", virtualDisplay" + mVirtualDisplay
-                + "}";
-    }
-
-    private static class DebugCounter {
-        long outputBuffers;
-        long bufferErrors;
-        long clientsConnected;
-        long clientsDisconnected;
-
-        @Override
-        public String toString() {
-            return getClass().getSimpleName() + "{"
-                    + "outputBuffers=" + outputBuffers
-                    + ", bufferErrors=" + bufferErrors
-                    + ", clientsConnected=" + clientsConnected
-                    + ", clientsDisconnected= " + clientsDisconnected
-                    + "}";
-        }
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PhoneFragment.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PhoneFragment.java
deleted file mode 100644
index c546f9d..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PhoneFragment.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 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 android.car.cluster.sample;
-
-import android.os.Bundle;
-import android.telephony.TelephonyManager;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-import androidx.lifecycle.ViewModelProviders;
-
-import com.android.car.telephony.common.TelecomUtils;
-
-/**
- * Displays ongoing call information.
- */
-public class PhoneFragment extends Fragment {
-    private View mUserProfileContainerView;
-
-    private PhoneFragmentViewModel mViewModel;
-
-    public PhoneFragment() {
-        // Required empty public constructor
-    }
-
-    @Nullable
-    @Override
-    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
-            Bundle savedInstanceState) {
-        FragmentActivity activity = requireActivity();
-        mViewModel = ViewModelProviders.of(activity).get(
-                PhoneFragmentViewModel.class);
-
-        View fragmentView = inflater.inflate(R.layout.fragment_phone, container, false);
-        mUserProfileContainerView = fragmentView.findViewById(R.id.user_profile_container);
-
-        TextView body = mUserProfileContainerView.findViewById(R.id.body);
-        ImageView avatar = mUserProfileContainerView.findViewById(R.id.avatar);
-        TextView nameView = mUserProfileContainerView.findViewById(R.id.title);
-
-        mViewModel.getContactInfo().observe(getViewLifecycleOwner(), (contactInfo) -> {
-            nameView.setText(contactInfo.getDisplayName());
-            TelecomUtils.setContactBitmapAsync(getContext(),
-                    avatar, contactInfo.getContact(), contactInfo.getNumber());
-        });
-        mViewModel.getBody().observe(getViewLifecycleOwner(), body::setText);
-        mViewModel.getState().observe(getViewLifecycleOwner(), (state) -> {
-            if (state == TelephonyManager.CALL_STATE_IDLE) {
-                mUserProfileContainerView.setVisibility(View.GONE);
-            } else {
-                mUserProfileContainerView.setVisibility(View.VISIBLE);
-            }
-        });
-
-        return fragmentView;
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PhoneFragmentViewModel.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PhoneFragmentViewModel.java
deleted file mode 100644
index dd955e1..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PhoneFragmentViewModel.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 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 android.car.cluster.sample;
-
-import static androidx.lifecycle.Transformations.map;
-
-import android.app.Application;
-import android.content.Context;
-import android.telephony.PhoneStateListener;
-import android.telephony.TelephonyManager;
-
-import androidx.lifecycle.AndroidViewModel;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MutableLiveData;
-
-import com.android.car.telephony.common.Contact;
-import com.android.car.telephony.common.InMemoryPhoneBook;
-import com.android.car.telephony.common.TelecomUtils;
-
-/**
- * View model for {@link PhoneFragment}
- */
-public final class PhoneFragmentViewModel extends AndroidViewModel {
-    private MutableLiveData<Long> mConnectTime = new MutableLiveData<>();
-    private MutableLiveData<Integer> mState = new MutableLiveData<>();
-    private MutableLiveData<String> mNumber = new MutableLiveData<>();
-    private LiveData<String> mBody;
-    private LiveData<ContactInfo> mContactInfo;
-
-    private PhoneStateCallback mCallback;
-
-    public PhoneFragmentViewModel(Application application) {
-        super(application);
-
-        TelephonyManager telephonyManager = (TelephonyManager) application.getSystemService(
-                Context.TELEPHONY_SERVICE);
-        telephonyManager.listen(new ClusterPhoneStateListener(),
-                PhoneStateListener.LISTEN_CALL_STATE);
-
-        mBody = new SelfRefreshDescriptionLiveData(getApplication(), mState, mNumber, mConnectTime);
-
-        mContactInfo = map(mNumber, (number) -> {
-            return new ContactInfo(number);
-        });
-    }
-
-    public interface PhoneStateCallback {
-        void onCall();
-
-        void onDisconnect();
-    }
-
-    public LiveData<Integer> getState() {
-        return mState;
-    }
-
-    public LiveData<String> getBody() {
-        return mBody;
-    }
-
-    public LiveData<ContactInfo> getContactInfo() {
-        return mContactInfo;
-    }
-
-    public void setPhoneStateCallback(PhoneStateCallback callback) {
-        mCallback = callback;
-    }
-
-    /**
-     * Listens to phone state changes
-     */
-    private class ClusterPhoneStateListener extends PhoneStateListener {
-        ClusterPhoneStateListener() {
-        }
-
-        @Override
-        public void onCallStateChanged(int state, String incomingNumber) {
-            super.onCallStateChanged(state, incomingNumber);
-
-            mState.setValue(state);
-            mNumber.setValue(incomingNumber);
-
-            if (state == TelephonyManager.CALL_STATE_IDLE) {
-                if (mCallback != null) {
-                    mCallback.onDisconnect();
-                }
-            } else if (state == TelephonyManager.CALL_STATE_RINGING) {
-                if (mCallback != null) {
-                    mCallback.onCall();
-                }
-            } else if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
-                mConnectTime.setValue(System.currentTimeMillis());
-                if (mCallback != null) {
-                    mCallback.onCall();
-                }
-            }
-        }
-    }
-
-    public class ContactInfo {
-        private String mNumber;
-        private String mDisplayName;
-        private Contact mContact;
-
-        public ContactInfo(String number) {
-            mNumber = number;
-            mDisplayName = TelecomUtils.getDisplayNameAndAvatarUri(getApplication(), number).first;
-            mContact = InMemoryPhoneBook.get().lookupContactEntry(number);
-        }
-
-        public String getNumber() {
-            return mNumber;
-        }
-
-        public String getDisplayName() {
-            return mDisplayName;
-        }
-
-        public Contact getContact() {
-            return mContact;
-        }
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PipeThread.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PipeThread.java
deleted file mode 100644
index c96f482..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PipeThread.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2018 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 android.car.cluster.sample;
-import android.os.Handler;
-import android.util.Log;
-
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Thread that can send data to the emulator using a qemud service.
- */
-public class PipeThread extends SenderThread {
-    private static final String TAG = "Cluster." + PipeThread.class.getSimpleName();
-
-    private RandomAccessFile mPipe;
-
-    /**
-     * Creates instance of pipe thread that can write to given pipe file.
-     *
-     * @param handler {@link Handler} used to message broadcaster.
-     * @param pipe {@link RandomAccessFile} file already connected to pipe.
-     */
-    PipeThread(Handler handler, RandomAccessFile pipe) {
-        super(handler);
-        mPipe = pipe;
-    }
-
-    public void run() {
-        try {
-            int signal = mPipe.read();
-            while (signal != NetworkedVirtualDisplay.PIPE_STOP) {
-                Log.i(TAG, "Received non-stop signal: " + signal);
-                signal = mPipe.read();
-            }
-            restart();
-        } catch (IOException e) {
-            Log.e(TAG, "Failed to read from pipe");
-            restart();
-        }
-    }
-
-    @Override
-    public void send(byte[] buf, int len) {
-        try {
-            // First sends the size prior to sending the data, since receiving side only sees
-            // the size of the buffer, which could be significant larger than the actual data.
-            mPipe.write(ByteBuffer.allocate(4)
-                          .order(ByteOrder.LITTLE_ENDIAN).putInt(len).array());
-            mPipe.write(buf);
-        } catch (IOException e) {
-            Log.e(TAG, "Write to pipe failed");
-            restart();
-        }
-    }
-
-    @Override
-    public void close() {
-        try {
-            mPipe.close();
-        } catch (IOException e) {
-            Log.e(TAG, "Failed to close pipe", e);
-        }
-    }
-}
-
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SelfRefreshDescriptionLiveData.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SelfRefreshDescriptionLiveData.java
deleted file mode 100644
index 79122c4..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SelfRefreshDescriptionLiveData.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 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 android.car.cluster.sample;
-
-import android.content.Context;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.text.format.DateUtils;
-
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MediatorLiveData;
-
-import com.android.car.telephony.common.TelecomUtils;
-
-/**
- * Emits the description for the body in {@link PhoneFragmentViewModel}.
- *
- * This description may be the current duration of the call, call state, call type,
- * or a combination of them.
- *
- * Possible strings:
- * "Ringing"
- * "1:05"
- * "Mobile · Dialing"
- * "Mobile · 1:05"
- */
-public class SelfRefreshDescriptionLiveData extends MediatorLiveData<String> {
-    private final LiveData<Long> mConnectTimeLiveData;
-    private final LiveData<String> mNumberLiveData;
-    private final LiveData<Integer> mStateLiveData;
-    private final Context mContext;
-
-    /**
-     * @param stateLiveData       LiveData holding the {@link TelephonyManager} call state
-     * @param numberLiveData      LiveData holding the call number
-     * @param connectTimeLiveData LiveData holding the starting timestamp of the call
-     */
-    public SelfRefreshDescriptionLiveData(Context context,
-            LiveData<Integer> stateLiveData,
-            LiveData<String> numberLiveData,
-            LiveData<Long> connectTimeLiveData) {
-        mContext = context;
-        mNumberLiveData = numberLiveData;
-        mStateLiveData = stateLiveData;
-        mConnectTimeLiveData = connectTimeLiveData;
-
-        HeartBeatLiveData heartBeatLiveData = new HeartBeatLiveData(DateUtils.SECOND_IN_MILLIS);
-
-        addSource(stateLiveData, (trigger) -> updateDescription());
-        addSource(heartBeatLiveData, (trigger) -> updateDescription());
-        addSource(mNumberLiveData, (trigger) -> updateDescription());
-        addSource(mConnectTimeLiveData, (trigger) -> updateDescription());
-    }
-
-    private void updateDescription() {
-        String number = mNumberLiveData.getValue();
-        Integer callState = mStateLiveData.getValue();
-        Long connectTime = mConnectTimeLiveData.getValue();
-        if (callState != null) {
-            String newDescription = getCallInfoText(mContext, callState, number,
-                    connectTime != null ? connectTime : 0);
-
-            String oldDescription = getValue();
-            if (!newDescription.equals(oldDescription)) {
-                setValue(newDescription);
-            }
-        } else {
-            setValue("");
-        }
-    }
-
-    /**
-     * @return A formatted string that has information about the phone call
-     * Possible strings:
-     * "Mobile · Dialing"
-     * "Mobile · 1:05"
-     */
-    private String getCallInfoText(Context context, Integer callState, String number,
-            Long connectTime) {
-        CharSequence label = TelecomUtils.getTypeFromNumber(context, number);
-        String text = "";
-        if (callState == TelephonyManager.CALL_STATE_OFFHOOK) {
-            long duration = connectTime > 0 ? System.currentTimeMillis()
-                    - connectTime : 0;
-            String durationString = DateUtils.formatElapsedTime(duration / 1000);
-            if (!TextUtils.isEmpty(durationString) && !TextUtils.isEmpty(label)) {
-                text = context.getString(R.string.phone_label_with_info, label,
-                        durationString);
-            } else if (!TextUtils.isEmpty(durationString)) {
-                text = durationString;
-            } else if (!TextUtils.isEmpty(label)) {
-                text = (String) label;
-            }
-        } else {
-            String state = callStateToUiString(context, callState);
-            if (!TextUtils.isEmpty(label)) {
-                text = context.getString(R.string.phone_label_with_info, label, state);
-            } else {
-                text = state;
-            }
-        }
-
-        return text;
-    }
-
-    /**
-     * @return A string representation of the call state that can be presented to a user.
-     */
-    private String callStateToUiString(Context context, int state) {
-        switch (state) {
-            case TelephonyManager.CALL_STATE_IDLE:
-                return context.getString(R.string.call_state_call_ended);
-            case TelephonyManager.CALL_STATE_RINGING:
-                return context.getString(R.string.call_state_call_ringing);
-            case TelephonyManager.CALL_STATE_OFFHOOK:
-                return context.getString(R.string.call_state_call_active);
-            default:
-                return "";
-        }
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java
deleted file mode 100644
index 9def7ee..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2018 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 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) {
-        mHandler = handler;
-    }
-
-    abstract void send(byte[] buf, int len);
-    abstract void close();
-
-    /**
-     * 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.
-     */
-    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/DirectRenderingClusterSample/src/android/car/cluster/sample/SocketThread.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SocketThread.java
deleted file mode 100644
index a5215b0..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SocketThread.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2018 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 android.car.cluster.sample;
-import android.os.Handler;
-import android.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.ServerSocket;
-
-/**
- * The thread that will send data on an opened socket.
- */
-public class SocketThread extends SenderThread {
-    private static final String TAG = "Cluster." + SocketThread.class.getSimpleName();
-    private ServerSocket mServerSocket;
-    private OutputStream mOutputStream;
-    private InputStream mInputStream;
-
-    /**
-     * Create instance of thread that can write to given open socket.
-     *
-     * @param handler {@link Handler} used to message the broadcaster.
-     * @param serverSocket {@link ServerSocket} should be already opened.
-     * @param inputStream {@link InputStream} corresponding to opened socket.
-     * @param outputStream {@link OutputStream} corresponding to opened socket.
-     */
-    SocketThread(Handler handler, ServerSocket serverSocket, InputStream inputStream,
-                    OutputStream outputStream) {
-        super(handler);
-        mServerSocket = serverSocket;
-        mInputStream = inputStream;
-        mOutputStream = outputStream;
-    }
-
-    public void run() {
-        try {
-            // This read should block until something disconnects (or something
-            // similar) which should cause an exception, in which case we should
-            // try to setup again and reconnect
-            mInputStream.read();
-        } catch (IOException e) {
-            Log.e(TAG, "Socket thread disconnected.");
-        }
-        restart();
-    }
-
-    @Override
-    public void send(byte[] buf, int len) {
-        try {
-            mOutputStream.write(buf, 0, len);
-        } catch (IOException e) {
-            Log.e(TAG, "Failed to write data to socket, retrying connection");
-            restart();
-        }
-    }
-
-    @Override
-    public void close() {
-        if (mServerSocket != null) {
-            try {
-                mServerSocket.close();
-            } catch (IOException e) {
-                Log.w(TAG, "Failed to close server socket, ignoring");
-            }
-            mServerSocket = null;
-        }
-        mInputStream = null;
-        mOutputStream = null;
-    }
-}
-
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensor.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensor.java
deleted file mode 100644
index 8f01cd7..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensor.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2018 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 android.car.cluster.sample.sensors;
-
-import android.car.VehiclePropertyType;
-import android.car.hardware.CarPropertyValue;
-
-import java.util.function.Function;
-
-/**
- * Description of a car sensor. It can be used as identifier at
- * {@link android.car.cluster.sample.ClusterViewModel#getSensor(Sensor)} to obtain a
- * {@link androidx.lifecycle.LiveData} to track values of this sensor. The sensor description is
- * used to process and decode the information reported by the car.
- * <p>
- * All instances of this class must be obtained from {@link Sensors}.
- *
- * @param <T> data type used by this sensor.
- */
-public class Sensor<T> {
-    /** Name of the sensor (for debugging) */
-    public final String mName;
-    /** VHAL identifier of this sensor */
-    public final int mPropertyId;
-    /** VHAL area associated with this sensor (each area is reported as an independent sensor) */
-    public final int mAreaId;
-    /**
-     * Data type expected to be reported by the VHAL. If the values received don't match with the
-     * expected ones, we warn about it and ignore the value.
-     */
-    @VehiclePropertyType.Enum
-    public final int mExpectedPropertyType;
-    /** VHAL Area associated with this sensor. */
-    public final Function<CarPropertyValue<?>, T> mAdapter;
-
-    /**
-     * Creates a new sensor. Only {@link Sensors} should use this constructor.
-     */
-    Sensor(String name, int propertyId, int areaId, int expectedPropertyType,
-            Function<CarPropertyValue<?>, T> adapter) {
-        mName = name;
-        mPropertyId = propertyId;
-        mAreaId = areaId;
-        mExpectedPropertyType = expectedPropertyType;
-        mAdapter = adapter;
-    }
-
-    @Override
-    public String toString() {
-        return mName;
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensors.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensors.java
deleted file mode 100644
index 90d6350..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensors.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2018 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 android.car.cluster.sample.sensors;
-
-import android.car.VehiclePropertyIds;
-import android.car.VehiclePropertyType;
-import android.car.hardware.CarPropertyValue;
-import android.car.hardware.CarSensorEvent;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Function;
-
-/**
- * The collection of all sensors supported by this application.
- */
-public class Sensors {
-    /** Area identifier used for sensors corresponding to global VHAL properties */
-    public static final int GLOBAL_AREA_ID = -1;
-
-    private static Sensors sInstance;
-    private static List<Sensor<?>> sSensors = new ArrayList<>();
-    private Map<Integer, List<Sensor<?>>> mSensorsByPropertyId = new HashMap<>();
-
-    /** Possible values of the {@link #SENSOR_GEAR} sensor */
-    public enum Gear {
-        NEUTRAL,
-        REVERSE,
-        DRIVE,
-        PARK,
-    }
-
-    /** Fuel of the car, measured in millimeters */
-    public static final Sensor<Float> SENSOR_FUEL = registerSensor(
-            "Fuel", VehiclePropertyIds.FUEL_LEVEL, GLOBAL_AREA_ID, VehiclePropertyType.FLOAT,
-            value -> (Float) value.getValue());
-    /** Fuel capacity of the car, measured in millimeters */
-    public static final Sensor<Float> SENSOR_FUEL_CAPACITY = registerSensor(
-            "Fuel Capacity", VehiclePropertyIds.INFO_FUEL_CAPACITY, GLOBAL_AREA_ID,
-            VehiclePropertyType.FLOAT,
-            value -> (Float) value.getValue());
-    /** RPMs */
-    public static final Sensor<Float> SENSOR_RPM = registerSensor(
-            "RPM", VehiclePropertyIds.ENGINE_RPM, GLOBAL_AREA_ID,
-            VehiclePropertyType.FLOAT,
-            value -> (Float) value.getValue());
-    /** Fuel range in meters */
-    public static final Sensor<Float> SENSOR_FUEL_RANGE = registerSensor(
-            "Fuel Range", VehiclePropertyIds.RANGE_REMAINING, GLOBAL_AREA_ID,
-            VehiclePropertyType.FLOAT,
-            value -> (Float) value.getValue());
-    /** Speed in meters per second */
-    public static final Sensor<Float> SENSOR_SPEED = registerSensor(
-            "Speed", VehiclePropertyIds.PERF_VEHICLE_SPEED, GLOBAL_AREA_ID,
-            VehiclePropertyType.FLOAT,
-            value -> (Float) value.getValue());
-    /** Current gear of the car */
-    public static final Sensor<Gear> SENSOR_GEAR = registerSensor(
-            "Gear", VehiclePropertyIds.GEAR_SELECTION, GLOBAL_AREA_ID, VehiclePropertyType.INT32,
-            value -> {
-                if (value == null) {
-                    return null;
-                }
-                Integer gear = (Integer) value.getValue();
-                if ((gear & CarSensorEvent.GEAR_REVERSE) != 0) {
-                    return Gear.REVERSE;
-                } else if ((gear & CarSensorEvent.GEAR_NEUTRAL) != 0) {
-                    return Gear.NEUTRAL;
-                } else if ((gear & CarSensorEvent.GEAR_DRIVE) != 0) {
-                    return Gear.DRIVE;
-                } else if ((gear & CarSensorEvent.GEAR_PARK) != 0) {
-                    return Gear.PARK;
-                } else {
-                    return null;
-                }
-            });
-
-    private static <T> Sensor<T> registerSensor(String propertyName, int propertyId, int areaId,
-            int expectedPropertyType, Function<CarPropertyValue<?>, T> adapter) {
-        Sensor<T> sensor = new Sensor<>(propertyName, propertyId, areaId, expectedPropertyType,
-                adapter);
-        sSensors.add(sensor);
-        return sensor;
-    }
-
-    /**
-     * Obtains the singleton instance of this class
-     */
-    public static Sensors getInstance() {
-        if (sInstance == null) {
-            sInstance = new Sensors();
-        }
-        return sInstance;
-    }
-
-    private Sensors() {
-        initializeSensorsMap();
-    }
-
-    private void initializeSensorsMap() {
-        for (Sensor<?> sensorId : getSensors()) {
-            mSensorsByPropertyId
-                    .computeIfAbsent(sensorId.mPropertyId, (id) -> new ArrayList<>())
-                    .add(sensorId);
-        }
-    }
-
-    /**
-     * Returns all sensors.
-     */
-    public List<Sensor<?>> getSensors() {
-        return sSensors;
-    }
-
-    /**
-     * Returns all sensors associated to the given VHAL property id.
-     */
-    public List<Sensor<?>> getSensorsForPropertyId(int propertyId) {
-        return mSensorsByPropertyId.get(propertyId);
-    }
-
-    /**
-     * Returns all property ids we care about.
-     */
-    public Set<Integer> getPropertyIds() {
-        return mSensorsByPropertyId.keySet();
-    }
-}
diff --git a/tests/DirectRenderingClusterSample/tests/Android.mk b/tests/DirectRenderingClusterSample/tests/Android.mk
deleted file mode 100644
index 9f0a4e8..0000000
--- a/tests/DirectRenderingClusterSample/tests/Android.mk
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (C) 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.
-
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-# Include all makefiles in subdirectories
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/DirectRenderingClusterSample/tests/robotests/Android.mk b/tests/DirectRenderingClusterSample/tests/robotests/Android.mk
deleted file mode 100644
index 4dd6b7a..0000000
--- a/tests/DirectRenderingClusterSample/tests/robotests/Android.mk
+++ /dev/null
@@ -1,46 +0,0 @@
-#############################################
-# Messenger Robolectric test target. #
-#############################################
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := DirectRenderingClusterSampleTests
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_RESOURCE_DIR := \
-    $(LOCAL_PATH)/res
-
-LOCAL_JAVA_LIBRARIES := \
-    robolectric_android-all-stub \
-    Robolectric_all-target \
-    mockito-robolectric-prebuilt \
-    truth-prebuilt 
-
-LOCAL_INSTRUMENTATION_FOR := DirectRenderingClusterSample
-
-LOCAL_MODULE_TAGS := optional
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-#############################################################
-# Messenger runner target to run the previous target. #
-#############################################################
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := RunDirectRenderingClusterSampleTests
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
-    DirectRenderingClusterSampleTests
-
-LOCAL_TEST_PACKAGE := DirectRenderingClusterSample
-
-LOCAL_INSTRUMENT_SOURCE_DIRS := $(dir $(LOCAL_PATH))../src
-
-include prebuilts/misc/common/robolectric/3.6.1/run_robotests.mk
-
-
-
-
diff --git a/tests/DirectRenderingClusterSample/tests/robotests/AndroidManifest.xml b/tests/DirectRenderingClusterSample/tests/robotests/AndroidManifest.xml
deleted file mode 100644
index ad22fc2..0000000
--- a/tests/DirectRenderingClusterSample/tests/robotests/AndroidManifest.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (C) 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.
-  -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="android.car.cluster.sample.robotests">
-    <application/>
-
-</manifest>
diff --git a/tests/DirectRenderingClusterSample/tests/robotests/readme.md b/tests/DirectRenderingClusterSample/tests/robotests/readme.md
deleted file mode 100644
index 97cff08..0000000
--- a/tests/DirectRenderingClusterSample/tests/robotests/readme.md
+++ /dev/null
@@ -1,6 +0,0 @@
-Unit test suite for RenderingClusterSample using Robolectric.
-
-```
-$ croot
-$ make RunDirectRenderingClusterSampleTests -j96
-```
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/tests/robotests/src/android/car/cluster/sample/ImageResolverTest.java b/tests/DirectRenderingClusterSample/tests/robotests/src/android/car/cluster/sample/ImageResolverTest.java
deleted file mode 100644
index 0d1cece..0000000
--- a/tests/DirectRenderingClusterSample/tests/robotests/src/android/car/cluster/sample/ImageResolverTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 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 android.car.cluster.sample;
-
-import static org.junit.Assert.assertEquals;
-
-import android.graphics.Point;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.internal.DoNotInstrument;
-
-@RunWith(RobolectricTestRunner.class)
-@DoNotInstrument
-public class ImageResolverTest {
-    private ImageResolver mImageResolver;
-
-    @Before
-    public void setup() {
-        mImageResolver = new ImageResolver((uri) -> null);
-    }
-
-    @Test
-    public void adjustedSize_widerImageInSquareBox() {
-        assertEquals(new Point(20, 10), mImageResolver.getAdjustedSize(40, 20, 20, 20));
-    }
-
-    @Test
-    public void adjustedSize_tallerImageInSquareBox() {
-        assertEquals(new Point(10, 20), mImageResolver.getAdjustedSize(20, 40, 20, 20));
-    }
-
-    @Test
-    public void adjustedSize_narrowerImageInSquareBox() {
-        assertEquals(new Point(10, 20), mImageResolver.getAdjustedSize(5, 10, 20, 20));
-    }
-
-    @Test
-    public void adjustedSize_shorterImageInSquareBox() {
-        assertEquals(new Point(20, 8), mImageResolver.getAdjustedSize(5, 2, 20, 20));
-    }
-
-    @Test
-    public void adjustedSize_widerImageInTallRectangle() {
-        assertEquals(new Point(20, 10), mImageResolver.getAdjustedSize(40, 20, 20, 40));
-    }
-
-    @Test
-    public void adjustedSize_tallerImageInTallRectangle() {
-        assertEquals(new Point(20, 40), mImageResolver.getAdjustedSize(5, 10, 20, 40));
-    }
-
-    @Test
-    public void adjustedSize_widerImageInWideRectangle() {
-        assertEquals(new Point(40, 20), mImageResolver.getAdjustedSize(10, 5, 40, 20));
-    }
-
-    @Test
-    public void adjustedSize_tallerImageInWideRectangle() {
-        assertEquals(new Point(10, 20), mImageResolver.getAdjustedSize(5, 10, 40, 20));
-    }
-
-    @Test
-    public void adjustedSize_nullIfNoOriginalWidth() {
-        assertEquals(null, mImageResolver.getAdjustedSize(0, 10, 40, 20));
-    }
-
-    @Test
-    public void adjustedSize_nullIfNoOriginalHeight() {
-        assertEquals(null, mImageResolver.getAdjustedSize(5, 0, 40, 20));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void adjustedSize_exceptionIfRequestedWidthAndHeightNoProvided() {
-        assertEquals(null, mImageResolver.getAdjustedSize(5, 10, 0, 0));
-    }
-
-    @Test
-    public void adjustedSize_flexibleWidth() {
-        assertEquals(new Point(20, 30), mImageResolver.getAdjustedSize(40, 60, 0, 30));
-    }
-
-    @Test
-    public void adjustedSize_flexibleHeight() {
-        assertEquals(new Point(20, 20), mImageResolver.getAdjustedSize(40, 40, 20, 0));
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/Android.mk b/tests/InstrumentClusterRendererSample/Android.mk
deleted file mode 100644
index fc00dfa..0000000
--- a/tests/InstrumentClusterRendererSample/Android.mk
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright (C) 2016 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.
-#
-#
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := InstrumentClusterRendererSampleImpl
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-# Each update should be signed by OEMs
-LOCAL_CERTIFICATE := platform
-LOCAL_PRIVILEGED_MODULE := true
-
-LOCAL_PROGUARD_FLAG_FILES := proguard.flags
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_JAVA_LIBRARIES += android.car
-
-LOCAL_USE_AAPT2 := true
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_STATIC_ANDROID_LIBRARIES += androidx.legacy_legacy-support-v4
-
-include $(BUILD_PACKAGE)
diff --git a/tests/InstrumentClusterRendererSample/AndroidManifest.xml b/tests/InstrumentClusterRendererSample/AndroidManifest.xml
deleted file mode 100644
index 6231220..0000000
--- a/tests/InstrumentClusterRendererSample/AndroidManifest.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="com.android.car.cluster.sample"
-      android:sharedUserId="android.uid.system">
-
-    <uses-sdk android:targetSdkVersion="23" android:minSdkVersion="23"/>
-
-    <!-- We set TYPE_SYSTEM_ALERT window flag to presentation in order
-         to show it outside of activity context -->
-    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
-
-    <uses-permission android:name="android.permission.CONTROL_INCALL_EXPERIENCE"/>
-
-    <application android:label="@string/app_name"
-                 android:icon="@drawable/ic_launcher"
-                 android:process="android.car.service"
-                 android:directBootAware="true">
-        <service android:name="com.android.car.cluster.sample.ClusterInCallService"
-                 android:permission="android.permission.BIND_INCALL_SERVICE"
-                 android:exported="false">
-            <meta-data android:name="android.telecom.METADATA_IN_CALL_UI"
-                       android:value="false" />
-            <intent-filter>
-                <action android:name="android.telecom.InCallService"/>
-            </intent-filter>
-        </service>
-
-        <service android:name="com.android.car.cluster.sample.StatusBarNotificationListener"
-                 android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
-                 android:exported="false">
-            <intent-filter>
-                <action android:name="android.service.notification.NotificationListenerService" />
-            </intent-filter>
-        </service>
-
-        <service android:name="com.android.car.cluster.sample.InstrumentClusterRenderingServiceImpl"
-                 android:exported="false"
-                 android:permission="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"
-        />
-    </application>
-</manifest>
diff --git a/tests/InstrumentClusterRendererSample/res/anim/icon_switcher_in.xml b/tests/InstrumentClusterRendererSample/res/anim/icon_switcher_in.xml
deleted file mode 100644
index 1c27b63..0000000
--- a/tests/InstrumentClusterRendererSample/res/anim/icon_switcher_in.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<alpha xmlns:android="http://schemas.android.com/apk/res/android"
-       android:interpolator="@android:interpolator/linear"
-       android:fromAlpha="0.0" android:toAlpha="1.0"
-       android:duration="@android:integer/config_longAnimTime" />
diff --git a/tests/InstrumentClusterRendererSample/res/anim/icon_switcher_out.xml b/tests/InstrumentClusterRendererSample/res/anim/icon_switcher_out.xml
deleted file mode 100644
index 6039c48..0000000
--- a/tests/InstrumentClusterRendererSample/res/anim/icon_switcher_out.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<set>
-    <!-- We hide this image only when a new one if fully visible, otherwise we may
-         be in the state when we have 2 images semi-transparent, and even combined together they
-         will look like semi-transparent it looks ugly when we have something underneath, e.g.
-         when phone is answered.
-      -->
-    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
-           android:interpolator="@android:interpolator/linear"
-           android:fromAlpha="1.0"
-           android:toAlpha="0"
-           android:startOffset="@android:integer/config_longAnimTime"
-           android:duration="@android:integer/config_longAnimTime"/>
-</set>
diff --git a/tests/InstrumentClusterRendererSample/res/anim/slide_in_bottom.xml b/tests/InstrumentClusterRendererSample/res/anim/slide_in_bottom.xml
deleted file mode 100644
index 5739277..0000000
--- a/tests/InstrumentClusterRendererSample/res/anim/slide_in_bottom.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <translate android:fromYDelta="50%p" android:toYDelta="0"
-               android:duration="@android:integer/config_mediumAnimTime"/>
-    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
-           android:duration="@android:integer/config_mediumAnimTime" />
-</set>
diff --git a/tests/InstrumentClusterRendererSample/res/anim/slide_out_top.xml b/tests/InstrumentClusterRendererSample/res/anim/slide_out_top.xml
deleted file mode 100644
index 2a92e26..0000000
--- a/tests/InstrumentClusterRendererSample/res/anim/slide_out_top.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <translate android:fromYDelta="0" android:toYDelta="-50%p"
-               android:duration="@android:integer/config_mediumAnimTime"/>
-    <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
-           android:duration="@android:integer/config_mediumAnimTime" />
-</set>
diff --git a/tests/InstrumentClusterRendererSample/res/drawable-ldpi/ic_launcher.png b/tests/InstrumentClusterRendererSample/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 9923872..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/cloud_154_shadow.png b/tests/InstrumentClusterRendererSample/res/drawable/cloud_154_shadow.png
deleted file mode 100644
index 7275874..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/cloud_154_shadow.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/cloud_192.png b/tests/InstrumentClusterRendererSample/res/drawable/cloud_192.png
deleted file mode 100644
index 4fb90d3..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/cloud_192.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/cloud_384.png b/tests/InstrumentClusterRendererSample/res/drawable/cloud_384.png
deleted file mode 100644
index e74a3c6..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/cloud_384.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/cloud_96_shadow.png b/tests/InstrumentClusterRendererSample/res/drawable/cloud_96_shadow.png
deleted file mode 100644
index e73899c..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/cloud_96_shadow.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/gas_station_36.png b/tests/InstrumentClusterRendererSample/res/drawable/gas_station_36.png
deleted file mode 100644
index a766a2b..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/gas_station_36.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/hangouts_icon.png b/tests/InstrumentClusterRendererSample/res/drawable/hangouts_icon.png
deleted file mode 100644
index f7683f5..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/hangouts_icon.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/line_empty_divider.xml b/tests/InstrumentClusterRendererSample/res/drawable/line_empty_divider.xml
deleted file mode 100644
index cbaf65d..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/line_empty_divider.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <size android:height="5px" android:width="0dp"/>
-</shape>
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/phone.png b/tests/InstrumentClusterRendererSample/res/drawable/phone.png
deleted file mode 100644
index d4fb6fc..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/phone.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/phone_active.png b/tests/InstrumentClusterRendererSample/res/drawable/phone_active.png
deleted file mode 100644
index 8c941bb..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/phone_active.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/sun_154.png b/tests/InstrumentClusterRendererSample/res/drawable/sun_154.png
deleted file mode 100644
index 0103438..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/sun_154.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/unknown_contact_480.png b/tests/InstrumentClusterRendererSample/res/drawable/unknown_contact_480.png
deleted file mode 100644
index 9f864ca..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/unknown_contact_480.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/layout/call_card.xml b/tests/InstrumentClusterRendererSample/res/layout/call_card.xml
deleted file mode 100644
index 8c024f3..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/call_card.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-    <LinearLayout android:id="@+id/phone_text_panel"
-                  android:layout_width="@dimen/card_message_panel_width"
-                  android:layout_height="wrap_content"
-                  android:orientation="vertical"
-                  android:layout_centerVertical="true">
-        <TextView android:id="@+id/call_status"
-                  android:layout_width="match_parent"
-                  android:layout_height="wrap_content"
-                  android:text="@string/incoming_call"
-                  android:textColor="@color/cluster_font_secondary"
-                  android:fontFamily="@string/font_family_secondary"
-                  android:textSize="@dimen/font_size_large"/>
-        <TextView android:id="@+id/contact_name"
-                  android:layout_width="match_parent"
-                  android:layout_height="wrap_content"
-                  android:textColor="@color/cluster_font_primary"
-                  android:textSize="@dimen/font_size_large"
-                  android:fontFamily="@string/font_family_primary"/>
-        <LinearLayout android:id="@+id/call_duration_panel"
-                      android:layout_width="wrap_content"
-                      android:layout_height="wrap_content"
-                      android:orientation="horizontal">
-            <Chronometer android:id="@+id/call_duration"
-                         android:layout_width="wrap_content"
-                         android:layout_height="wrap_content"
-                         android:textColor="@color/cluster_font_secondary"
-                         android:fontFamily="@string/font_family_secondary"
-                         android:textSize="@dimen/font_size_large"/>
-            <TextView android:layout_width="wrap_content"
-                      android:layout_height="wrap_content"
-                      android:text="@string/dummy_call_type"
-                      android:textColor="@color/cluster_font_secondary"
-                      android:fontFamily="@string/font_family_secondary"
-                      android:textSize="@dimen/font_size_large"
-                      android:layout_marginLeft="@dimen/word_spacing"/>
-        </LinearLayout>
-    </LinearLayout>
-</merge>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/card_view.xml b/tests/InstrumentClusterRendererSample/res/layout/card_view.xml
deleted file mode 100644
index 14fbd9d..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/card_view.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-                android:layout_width="@dimen/card_width"
-                android:layout_height="@dimen/card_height">
-
-    <ImageView android:id="@+id/image_background"
-               android:layout_width="match_parent"
-               android:layout_height="match_parent"
-               android:layout_alignParentRight="true"
-               android:layout_centerVertical="true"
-               android:scaleType="centerCrop"
-               android:visibility="gone"/>
-
-    <include layout="@layout/icon_switcher" android:id="@+id/left_icon_switcher"/>
-    <include layout="@layout/icon_switcher" android:id="@+id/right_icon_switcher"/>
-</RelativeLayout>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/cluster_view.xml b/tests/InstrumentClusterRendererSample/res/layout/cluster_view.xml
deleted file mode 100644
index b6d192c..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/cluster_view.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<LinearLayout android:id="@+id/root"
-              android:layout_width="match_parent"
-              android:layout_height="match_parent"
-              android:keepScreenOn="true"
-              android:orientation="horizontal"
-              android:background="@color/cluster_background"
-              xmlns:android="http://schemas.android.com/apk/res/android">
-    <View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1"/>
-    <com.android.car.cluster.sample.CardPanel
-            android:id="@+id/card_panel"
-            android:layout_width="@dimen/card_width"
-            android:layout_height="@dimen/card_height">
-
-    </com.android.car.cluster.sample.CardPanel>
-</LinearLayout>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/hangout_layout.xml b/tests/InstrumentClusterRendererSample/res/layout/hangout_layout.xml
deleted file mode 100644
index fbd4f0d..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/hangout_layout.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-    <LinearLayout android:id="@+id/msg_text_panel"
-                  android:layout_width="@dimen/card_message_panel_width"
-                  android:layout_height="wrap_content"
-                  android:orientation="vertical"
-                  android:layout_centerVertical="true"
-                  android:showDividers="middle"
-                  android:divider="@drawable/line_empty_divider">
-        <TextView android:id="@+id/msg_card_status"
-                  android:layout_width="match_parent"
-                  android:layout_height="wrap_content"
-                  android:text="@string/incoming_message"
-                  android:fontFamily="@string/font_family_secondary"
-                  android:textColor="@color/cluster_font_secondary"
-                  android:textSize="@dimen/font_size_large"/>
-        <TextView android:id="@+id/msg_card_contact_name"
-                  android:layout_width="match_parent"
-                  android:layout_height="wrap_content"
-                  android:textColor="@color/cluster_font_primary"
-                  android:fontFamily="@string/font_family_primary"
-                  android:text="@string/unknown"
-                  android:textSize="@dimen/font_size_large"/>
-    </LinearLayout>
-</merge>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/icon_switcher.xml b/tests/InstrumentClusterRendererSample/res/layout/icon_switcher.xml
deleted file mode 100644
index 9bc4c5d..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/icon_switcher.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android"
-              android:id="@+id/left_icon_switcher"
-              android:layout_width="@dimen/card_icon_size"
-              android:layout_height="@dimen/card_icon_size"
-              android:layout_alignParentLeft="true"
-              android:layout_centerVertical="true"
-              android:inAnimation="@anim/icon_switcher_in"
-              android:outAnimation="@anim/icon_switcher_out">
-    <ImageView android:layout_width="match_parent"
-               android:layout_height="match_parent"
-               android:background="@android:color/transparent"
-               android:scaleType="centerCrop"/>
-    <ImageView android:layout_width="match_parent"
-               android:layout_height="match_parent"
-               android:background="@android:color/transparent"
-               android:scaleType="centerCrop"/>
-</ViewSwitcher>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/media_card.xml b/tests/InstrumentClusterRendererSample/res/layout/media_card.xml
deleted file mode 100644
index 62a574c..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/media_card.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-    <!-- Panel will be shown for media -->
-    <LinearLayout android:id="@+id/message_panel"
-                  android:layout_width="@dimen/card_message_panel_width"
-                  android:layout_height="wrap_content"
-                  android:orientation="vertical"
-                  android:layout_centerVertical="true"
-                  android:showDividers="middle"
-                  android:divider="@drawable/line_empty_divider">
-        <TextView android:id="@+id/media_title"
-                  android:layout_width="@dimen/card_message_panel_width"
-                  android:layout_height="wrap_content"
-                  android:textColor="@color/cluster_font_primary"
-                  android:textSize="@dimen/font_size_medium"
-                  android:fontFamily="sans-serif-medium"
-                  android:singleLine="false"/>
-        <TextView android:id="@+id/media_subtitle"
-                  android:layout_width="@dimen/card_message_panel_width"
-                  android:layout_height="wrap_content"
-                  android:textColor="@color/cluster_font_secondary"
-                  android:textSize="@dimen/font_size_small"
-                  android:fontFamily="sans-serif-regular"
-                  android:singleLine="false"/>
-        <ProgressBar
-                android:id="@+id/progress_bar"
-                android:progress="80"
-                style="?android:attr/progressBarStyleHorizontal"
-                android:layout_width="@dimen/media_card_progress_width"
-                android:layout_height="@dimen/media_card_progress_height"
-                android:layout_marginTop="@dimen/media_card_progress_margin_top"
-                android:background="#3cf5f5f5"
-                android:max="100"/>
-    </LinearLayout>
-</merge>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/nav_card.xml b/tests/InstrumentClusterRendererSample/res/layout/nav_card.xml
deleted file mode 100644
index adee49c..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/nav_card.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-    <ViewSwitcher android:id="@+id/nav_directions_switcher"
-                  android:layout_width="@dimen/card_message_panel_width"
-                  android:layout_height="wrap_content"
-                  android:layout_centerVertical="true"
-                  android:inAnimation="@anim/slide_in_bottom"
-                  android:outAnimation="@anim/slide_out_top">
-    </ViewSwitcher>
-</merge>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/nav_card_maneuver_description.xml b/tests/InstrumentClusterRendererSample/res/layout/nav_card_maneuver_description.xml
deleted file mode 100644
index ca5ec3e..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/nav_card_maneuver_description.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              android:id="@+id/nav_directions"
-              android:layout_width="@dimen/card_message_panel_width"
-              android:layout_height="wrap_content"
-              android:layout_centerVertical="true"
-              android:orientation="vertical">
-    <!-- First line contains distance and units, e.g. 200 ft -->
-    <LinearLayout android:layout_width="wrap_content"
-                  android:layout_height="wrap_content"
-                  android:orientation="horizontal">
-        <TextView android:id="@+id/nav_distance"
-                  android:layout_width="wrap_content"
-                  android:layout_height="wrap_content"
-                  android:textSize="@dimen/font_size_nav_distance"
-                  android:textColor="@color/cluster_font_primary"
-                  android:fontFamily="@string/font_family_primary"/>
-        <TextView android:id="@+id/nav_distance_units"
-                  android:layout_marginLeft="@dimen/word_spacing"
-                  android:layout_width="wrap_content"
-                  android:layout_height="wrap_content"
-                  android:textSize="@dimen/font_size_medium"
-                  android:textColor="@color/cluster_font_dark_gray"
-                  android:fontFamily="@string/font_family_secondary"
-                  android:text="@string/nav_distance_units_ft"/>
-    </LinearLayout>
-
-    <!-- Second line for street name -->
-    <TextView android:id="@+id/nav_street"
-              android:layout_width="wrap_content"
-              android:layout_height="wrap_content"
-              android:textSize="@dimen/font_size_medium"
-              android:textColor="@color/cluster_font_secondary"
-              android:fontFamily="@string/font_family_secondary"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/weather_card.xml b/tests/InstrumentClusterRendererSample/res/layout/weather_card.xml
deleted file mode 100644
index da01ffc..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/weather_card.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <ImageView android:id="@+id/weather_near_cloud"
-               android:layout_width="@dimen/weather_card_near_cloud"
-               android:layout_height="@dimen/weather_card_near_cloud"
-               android:layout_alignParentBottom="true"
-               android:layout_alignParentRight="true"
-               android:src="@drawable/cloud_384"
-               android:scaleType="fitXY"
-               android:translationY="@dimen/weather_card_cloud_vertical_margin"
-               android:layout_marginRight="@dimen/weather_card_near_margin_right"/>
-    <ImageView android:id="@+id/weather_far_cloud"
-               android:layout_width="@dimen/weather_card_far_cloud"
-               android:layout_height="@dimen/weather_card_far_cloud"
-               android:layout_centerHorizontal="true"
-               android:layout_alignParentTop="true"
-               android:src="@drawable/cloud_192"
-               android:scaleType="fitXY"
-               android:translationY="@dimen/weather_card_cloud_vertical_margin"/>
-
-    <!-- Panel shown for the weather -->
-    <LinearLayout android:id="@+id/weather_panel"
-                  android:layout_width="wrap_content"
-                  android:layout_height="wrap_content"
-                  android:layout_centerVertical="true"
-                  android:orientation="horizontal">
-        <TextView android:id="@+id/weather_temperature"
-                  android:layout_width="wrap_content"
-                  android:layout_height="wrap_content"
-                  android:layout_gravity="center"
-                  android:fontFamily="sans-serif-light"
-                  android:textColor="@color/cluster_font_primary"
-                  android:text="@string/dummy_weather_temperature"
-                  android:textSize="@dimen/speedo_speed_min_font_size"/>
-        <LinearLayout android:layout_width="wrap_content"
-                      android:layout_height="wrap_content"
-                      android:orientation="vertical"
-                      android:layout_gravity="center"
-                      android:paddingLeft="@dimen/weather_card_text_left_padding">
-            <TextView android:id="@+id/weather_forecast"
-                      android:layout_width="wrap_content"
-                      android:layout_height="wrap_content"
-                      android:textSize="@dimen/font_size_large"
-                      android:textColor="@color/cluster_font_primary"
-                      android:text="@string/dummy_weather_forecast"
-                      android:translationY="6px"/>
-            <TextView android:id="@+id/weather_location"
-                      android:layout_width="wrap_content"
-                      android:layout_height="wrap_content"
-                      android:textSize="@dimen/font_size_large"
-                      android:textColor="@color/cluster_font_secondary"
-                      android:fontFamily="@string/font_family_secondary"
-                      android:text="@string/dummy_weather_location"/>
-        </LinearLayout>
-    </LinearLayout>
-</merge>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/mipmap-hdpi/ic_launcher.png b/tests/InstrumentClusterRendererSample/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cde69bc..0000000
--- a/tests/InstrumentClusterRendererSample/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/mipmap-mdpi/ic_launcher.png b/tests/InstrumentClusterRendererSample/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c133a0c..0000000
--- a/tests/InstrumentClusterRendererSample/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/mipmap-xhdpi/ic_launcher.png b/tests/InstrumentClusterRendererSample/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index bfa42f0..0000000
--- a/tests/InstrumentClusterRendererSample/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/mipmap-xxhdpi/ic_launcher.png b/tests/InstrumentClusterRendererSample/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 324e72c..0000000
--- a/tests/InstrumentClusterRendererSample/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/mipmap-xxxhdpi/ic_launcher.png b/tests/InstrumentClusterRendererSample/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index aee44e1..0000000
--- a/tests/InstrumentClusterRendererSample/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/values/attrs.xml b/tests/InstrumentClusterRendererSample/res/values/attrs.xml
deleted file mode 100644
index 9386437..0000000
--- a/tests/InstrumentClusterRendererSample/res/values/attrs.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<resources>
-</resources>
diff --git a/tests/InstrumentClusterRendererSample/res/values/colors.xml b/tests/InstrumentClusterRendererSample/res/values/colors.xml
deleted file mode 100644
index 2b7698b..0000000
--- a/tests/InstrumentClusterRendererSample/res/values/colors.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<resources>
-    <color name="colorPrimary">#3F51B5</color>
-    <color name="colorPrimaryDark">#303F9F</color>
-    <color name="colorAccent">#FF4081</color>
-
-    <color name="black_overlay">#66000000</color>
-
-    <color name="cluster_background">#172026</color>
-    <color name="speedo_inner_circle_shade">#770c1013</color>
-    <color name="cluster_active_area_background">#ff141c21</color>
-    <color name="cluster_black">#ff0c1013</color>
-    <color name="cluster_font_primary">#fff5f5f5</color>
-    <color name="cluster_font_secondary">#8af5f5f5</color>
-    <!-- Speed unit -->
-    <color name="cluster_font_light_gray">#ffd8d9da</color>
-    <!-- Phone call duration / album -->
-    <color name="cluster_font_dark_gray">#ffa6a9ab</color>
-
-    <color name="media_icon_foreground">#ff202020</color>
-
-    <color name="media_background">#ff444444</color>
-    <color name="media_background_dark">#ff303030</color>
-
-    <color name="phone_background">#ff01579b</color>
-    <color name="phone_background_dark">#ff014174</color>
-    <color name="phone_icon_background">#ff0277bd</color>
-    <color name="phone_font_incoming_call">#ffa3c1d9</color>
-
-    <color name="maps_background">#ff0d904f</color>
-
-    <color name="speedo_minute_arm_color_begin">#ffffcbbb</color>
-    <color name="speedo_minute_arm_color_mid">#ffffcbbb</color>
-    <color name="speedo_minute_arm_color_end">#ffffcbbb</color>
-    <color name="speedo_minute_arm_color_border">#77ffcbbb</color>
-    <color name="speedo_clock_nail">#ffffcbbb</color>
-
-    <color name="speedo_clock_nail_shadow_start">#33000000</color>
-    <color name="speedo_clock_nail_shadow_mid">#22000000</color>
-    <color name="speedo_clock_nail_shadow_end">#00000000</color>
-    <color name="speedo_clock_nail_shadow">#33000000</color>
-
-    <color name="speedo_hour_arm_color_mid">@color/cluster_font_primary</color>
-    <color name="speedo_hour_arm_color_start">@color/cluster_font_primary</color>
-    <color name="speedo_hour_arm_color_end">@color/cluster_font_primary</color>
-    <color name="speedo_hour_arm_color_border">#77f5f5f5</color>
-
-    <color name="weather_blue_sky">#ff4385f4</color>
-    <color name="weather_sun">#fffdbf2d</color>
-    <color name="weather_cloud">#fffffeff</color>
-    <color name="weather_location_text">#ffb2d1ff</color>
-
-    <color name="hangout_background">#ff086934</color>
-    <color name="hangout_icon_background">#ff086934</color>
-    <color name="hangout_incoming_message_font_color">#ffa5c7b5</color>
-    <color name="hangout_background_dark">#ff054422</color>
-
-</resources>
diff --git a/tests/InstrumentClusterRendererSample/res/values/dimens.xml b/tests/InstrumentClusterRendererSample/res/values/dimens.xml
deleted file mode 100644
index 66d54de..0000000
--- a/tests/InstrumentClusterRendererSample/res/values/dimens.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<resources>
-    <dimen name="cluster_width">1920px</dimen>
-    <dimen name="cluster_height">720px</dimen>
-
-    <dimen name="fuel_panel_width">360px</dimen>
-
-    <dimen name="speedo_margin_top">43px</dimen>
-    <dimen name="speed_units_margin_from_center">165px</dimen>
-    <dimen name="speedo_outer_circle_diameter">651px</dimen>
-    <dimen name="speedo_inner_circle_min_diameter">232px</dimen>
-    <dimen name="speedo_speed_min_font_size">@dimen/font_size_xlarge</dimen>
-    <dimen name="speedo_speed_max_font_size">@dimen/font_size_xxlarge</dimen>
-
-    <dimen name="speedo_inner_circle_max_diameter">540px</dimen>
-    <dimen name="speedo_minute_arm_width">232px</dimen>
-    <dimen name="speedo_minute_arm_width_half">116px</dimen>
-    <dimen name="speedo_hour_arm_width">160px</dimen>
-    <dimen name="speedo_hour_arm_width_half">80px</dimen>
-    <dimen name="speedo_clock_nail">52px</dimen>
-    <dimen name="speedo_border_width">1px</dimen>
-
-    <dimen name="speedo_arm_height">8px</dimen>
-    <dimen name="speedo_arm_center">4px</dimen>
-
-
-    <dimen name="card_width">909px</dimen>
-    <dimen name="card_height">@dimen/cluster_height</dimen>
-    <dimen name="card_icon_size">154px</dimen>
-    <dimen name="card_background_image_width">780px</dimen>
-    <dimen name="card_message_panel_width">500px</dimen>
-    <dimen name="card_content_left_padding">40px</dimen>
-
-    <dimen name="word_spacing">10px</dimen>
-
-    <dimen name="font_size_nav_distance">56px</dimen>
-
-    <dimen name="font_size_xxlarge">152px</dimen>
-    <dimen name="font_size_xlarge">120px</dimen>
-    <dimen name="font_size_large">45px</dimen>
-    <dimen name="font_size_medium">36px</dimen>
-    <dimen name="font_size_small">26px</dimen>
-    <dimen name="font_size_xsmall">22px</dimen>
-
-    <dimen name="font_size_drive_state">@dimen/font_size_large</dimen>
-
-    <dimen name="weather_card_near_cloud">384px</dimen>
-    <dimen name="weather_card_near_margin_right">60px</dimen>
-    <dimen name="weather_card_far_cloud">192px</dimen>
-    <dimen name="weather_card_cloud_vertical_margin">40px</dimen>
-    <dimen name="weather_card_text_left_padding">20px</dimen>
-
-    <dimen name="media_card_progress_width">210px</dimen>
-    <dimen name="media_card_progress_height">2px</dimen>
-    <dimen name="media_card_progress_margin_top">12px</dimen>
-
-    <dimen name="drive_state_size">144px</dimen>
-    <dimen name="drive_state_inner_diameter">84px</dimen>
-
-    <dimen name="fuel_indicator_width">@dimen/drive_state_size</dimen>
-    <dimen name="fuel_indicator_radius">72px</dimen>  <!-- fuel_indicator_width / 2 -->
-    <dimen name="fuel_indicator_height">224px</dimen>
-    <dimen name="fuel_indicator_inner_padding">30px</dimen> <!-- (width - inner_diameter) / 2 -->
-    <dimen name="fuel_indicator_inner_padding_half">15px</dimen> <!-- padding / 2 -->
-    <dimen name="fuel_indicator_inner_height">168px</dimen> <!-- height - padding * 2 -->
-    <dimen name="fuel_indicator_inner_width">@dimen/drive_state_inner_diameter</dimen>
-    <dimen name="fuel_indicator_inner_radius">42px</dimen>  <!-- fuel_indicator_inner_diameter / 2 -->
-    <dimen name="fuel_indicator_border_width">1px</dimen>
-    <dimen name="fuel_panel_margin_right">40px</dimen>
-</resources>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/values/strings.xml b/tests/InstrumentClusterRendererSample/res/values/strings.xml
deleted file mode 100644
index 2666619..0000000
--- a/tests/InstrumentClusterRendererSample/res/values/strings.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<resources xmlns:xliff="http://schemas.android.com/tools">
-    <string name="app_name" translatable="false">InstrumentClusterRendererImpl</string>
-
-    <string name="incoming_call" translatable="false">Incoming call</string>
-    <string name="dialing" translatable="false">Dialing</string>
-    <string name="dummy_call_type" translatable="false">• Mobile</string>
-
-    <string name="font_family_primary" translatable="false">sans-serif-medium</string>
-    <string name="font_family_secondary" translatable="false">sans-serif-regular</string>
-
-    <string name="dummy_weather_forecast" translatable="false">Partly cloudy</string>
-    <string name="dummy_weather_location" translatable="false">Mountain View, CA</string>
-    <string name="dummy_weather_temperature" translatable="false">82°</string>
-
-    <string name="nav_distance_units_ft" translatable="false">ft</string>
-    <string name="nav_distance_units_meters" translatable="false">m</string>
-    <string name="nav_distance_units_kilometers" translatable="false">km</string>
-    <string name="nav_distance_units_miles" translatable="false">mi</string>
-    <string name="nav_distance_units_yards" translatable="false">yd</string>
-
-    <string name="incoming_message" translatable="false">Incoming message</string>
-
-    <string name="unknown" translatable="false">Unknown</string>
-    <string name="voicemail" translatable="false">Voicemail</string>
-    <string name="phone_label_with_info" translatable="false">
-        <xliff:g id="label" example="Mobile">%1$s</xliff:g>
-        " \u00B7 "
-        <xliff:g id="duration" example="1:20">%2$s</xliff:g>
-    </string>
-    <!-- Status label for phone state [CHAR LIMIT=20] -->
-    <string name="call_state_connecting" translatable="false">Connecting</string>
-    <!-- Status label for phone state [CHAR LIMIT=20] -->
-    <string name="call_state_dialing" translatable="false">Dialing</string>
-    <!-- Status label for phone state [CHAR LIMIT=20] -->
-    <string name="call_state_hold" translatable="false">On Hold</string>
-    <!-- Status label for phone state [CHAR LIMIT=20] -->
-    <string name="call_state_call_ended" translatable="false">Call Ended</string>
-    <!-- Status label for phone state [CHAR LIMIT=20] -->
-    <string name="call_state_call_active" translatable="false">Connected</string>
-    <!-- Status label for phone state [CHAR LIMIT=20] -->
-    <string name="call_state_call_ringing" translatable="false">Ringing</string>
-    <!-- Status label for phone state [CHAR LIMIT=20] -->
-    <string name="call_state_call_ending" translatable="false">Disconnecting</string>
-
-</resources>
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/BitmapUtils.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/BitmapUtils.java
deleted file mode 100644
index 430bf35..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/BitmapUtils.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample;
-
-import static android.graphics.Color.blue;
-import static android.graphics.Color.green;
-import static android.graphics.Color.red;
-
-import android.graphics.Bitmap;
-import android.graphics.Bitmap.Config;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.Rect;
-import android.graphics.RectF;
-
-/**
- * Utility functions to work with bitmaps.
- */
-public class BitmapUtils {
-
-    // Non-transparent color to crop images using Xfermode.
-    private static final int OPAQUE_COLOR = 0xff424242;
-
-    /**
-     * Scales a bitmap while preserving the proportions such that both dimensions are the smallest
-     * values possible that are equal to or larger than the given dimensions.
-     *
-     * This function can be a few times as expensive as Bitmap.createScaledBitmap with
-     * filtering when downscaling, but it produces much nicer results.
-     *
-     * @param bm The bitmap to scale.
-     * @param width The desired width.
-     * @param height The desired height.
-     * @return The scaled bitmap, or the original bitmap if scaling was not necessary.
-     */
-    public static Bitmap scaleBitmap(Bitmap bm, int width, int height) {
-        if (bm == null || (bm.getHeight() == height && bm.getWidth() == width)) {
-            return bm;
-        }
-
-        float heightScale = (float) height / bm.getHeight();
-        float widthScale = (float) width / bm.getWidth();
-
-        float scale = heightScale > widthScale ? heightScale : widthScale;
-        int scaleWidth = (int) Math.ceil(bm.getWidth() * scale);
-        int scaleHeight = (int) Math.ceil(bm.getHeight() * scale);
-
-        Bitmap scaledBm = bm;
-        // If you try to scale an image down too much in one go, you can end up with discontinuous
-        // interpolation. Therefore, if necessary, we scale the image to twice the desired size
-        // and do a second scaling to the desired size, which smooths jaggedness from the first go.
-        if (scale < .5f) {
-            scaledBm = Bitmap.createScaledBitmap(scaledBm, scaleWidth * 2, scaleHeight * 2, true);
-        }
-
-        if (scale != 1f) {
-            Bitmap newScaledBitmap = Bitmap
-                    .createScaledBitmap(scaledBm, scaleWidth, scaleHeight, true);
-            if (scaledBm != bm) {
-                scaledBm.recycle();
-            }
-            scaledBm = newScaledBitmap;
-        }
-        return scaledBm;
-    }
-
-    public static Bitmap squareCropBitmap(Bitmap bitmap) {
-        if (bitmap.getWidth() == bitmap.getHeight()) {
-            return bitmap;
-        }
-
-        int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
-
-        Bitmap output = Bitmap.createBitmap(size,
-                size, Config.ARGB_8888);
-        Canvas canvas = new Canvas(output);
-
-        int x = size < bitmap.getWidth() ? (bitmap.getWidth() - size ) / 2 : 0;
-        int y = size < bitmap.getHeight() ? (bitmap.getHeight() - size ) / 2 : 0;
-        Rect srcRect = new Rect(x, y, x + size, y + size);
-        Rect dstRect = new Rect(0, 0, output.getWidth(), output.getHeight());
-
-        canvas.drawBitmap(bitmap, srcRect, dstRect, null);
-        return output;
-    }
-
-    public static Bitmap circleCropBitmap(Bitmap bitmap) {
-        bitmap = squareCropBitmap(bitmap);
-        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
-                bitmap.getHeight(), Config.ARGB_8888);
-        Canvas canvas = new Canvas(output);
-
-        Paint paint = new Paint();
-        Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
-
-        paint.setAntiAlias(true);
-        canvas.drawARGB(0, 0, 0, 0);
-        paint.setColor(OPAQUE_COLOR);
-        canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2,
-                bitmap.getWidth() / 2, paint);
-        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
-        canvas.drawBitmap(bitmap, rect, rect, paint);
-        return output;
-    }
-
-    public static Bitmap generateNavManeuverIcon(int size, int bgColor, Bitmap maneuver) {
-        Bitmap bm = Bitmap.createBitmap(size, size, Config.ARGB_8888);
-        Canvas canvas = new Canvas(bm);
-        drawCircle(canvas, bgColor);
-
-        canvas.drawBitmap(maneuver,
-                (bm.getWidth() - maneuver.getWidth()) / 2,
-                (bm.getHeight() - maneuver.getHeight()) / 2,
-                new Paint(Paint.ANTI_ALIAS_FLAG));
-        return bm;
-    }
-
-    public static Bitmap generateMediaIcon(int size, int bgColor, int fgColor) {
-        final float goldenRatio = 1.618f;
-
-        Bitmap bm = Bitmap.createBitmap(size, size, Config.ARGB_8888);
-        Canvas canvas = new Canvas(bm);
-        drawCircle(canvas, bgColor);
-
-        // Calculate column parameters relative to the size.
-        int bottom = (int) (size / goldenRatio);
-        int columnWidth = size / 17;
-        int columnSpace = columnWidth / 2;
-        int allColumnsWidth = columnWidth * 3 + columnSpace * 2;
-        int left = size / 2 - (allColumnsWidth) / 2;
-
-        Paint columnPaint = new Paint();
-        columnPaint.setColor(fgColor);
-        columnPaint.setAntiAlias(true);
-        canvas.drawRect(new RectF(left, bottom - columnWidth * 2, left + columnWidth, bottom),
-                columnPaint);
-
-        left += columnWidth + columnSpace;
-        canvas.drawRect(new RectF(left, bottom - columnWidth * 4, left + columnWidth, bottom),
-                columnPaint);
-
-        left += columnWidth + columnSpace;
-        canvas.drawRect(new RectF(left, bottom - columnWidth * 3, left + columnWidth, bottom),
-                columnPaint);
-
-        return bm;
-    }
-
-    private static Canvas drawCircle(Canvas canvas, int bgColor) {
-        int size = canvas.getWidth();
-        Paint p = new Paint();
-        p.setAntiAlias(true);
-        p.setColor(bgColor);
-        canvas.drawCircle(size / 2, size / 2, (size / 2) - 1, p);
-        return canvas;
-    }
-
-    public static int[] getBaseColors(int color) {
-        return new int[] {red(color), green(color), blue(color)};
-    }
-
-    /**
-     * Scales colors for given bitmap. This could be used as color filter for example.
-     */
-    public static Bitmap scaleBitmapColors(Bitmap original, int minColor, int maxColor) {
-        int[] pixels = new int[original.getWidth() * original.getHeight()];
-        original.getPixels(pixels, 0, original.getWidth(), 0, 0,
-                original.getWidth(), original.getHeight());
-
-        int[] min = getBaseColors(minColor);
-        int[] max = getBaseColors(maxColor);
-
-        for (int i = 0; i < pixels.length; i++) {
-            int pixel = pixels[i];
-            int[] colors = new int[] {red(pixel), green(pixel), blue(pixel)};
-
-            for (int j = 0; j < 3; j++) {
-                colors[j] = (int)((colors[j] / 255.0) * (max[j] - min[j]) + min[j]);
-            }
-
-            pixels[i] = Color.rgb(colors[0], colors[1], colors[2]);
-        }
-
-        Bitmap bmp = Bitmap.createBitmap(original.getWidth(), original.getHeight(), Config.ARGB_8888);
-        bmp.setPixels(pixels, 0, original.getWidth(), 0, 0, original.getWidth(),
-                original.getHeight());
-        return bmp;
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/CardPanel.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/CardPanel.java
deleted file mode 100644
index 88c2aba..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/CardPanel.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.View;
-import android.widget.FrameLayout;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Panel that responsible of holding cards.
- */
-public class CardPanel extends FrameLayout {
-    private final static String TAG = DebugUtil.getTag(CardPanel.class);
-
-    private final List<View> mOrderedChildren = new ArrayList<>(10);
-    private final Set<View> mViewsToBeRemoved = new HashSet<>();
-
-    public CardPanel(Context context) {
-        this(context, null);
-    }
-
-    public CardPanel(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public CardPanel(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-
-        setChildrenDrawingOrderEnabled(true);
-    }
-
-    @Override
-    public void addView(View child, int index) {
-        super.addView(child, index);
-        if (index < 0) {
-            mOrderedChildren.add(child);
-        } else {
-            mOrderedChildren.add(index, child);
-        }
-    }
-
-    @Override
-    public void removeView(View view) {
-        super.removeView(view);
-
-        mOrderedChildren.remove(view);
-        mViewsToBeRemoved.remove(view);
-    }
-
-    /**
-     * If we are removing view with animation, we do not want to treat this view as visible.
-     */
-    public void markViewToBeRemoved(View view) {
-        mViewsToBeRemoved.add(view);
-    }
-
-
-    public boolean childViewExists(View child) {
-        return indexOfChild(child) >= 0 && !mViewsToBeRemoved.contains(child);
-    }
-
-    /** Moves given child behind the top card */
-    public void moveChildBehindTheTop(View child) {
-        if (mOrderedChildren.size() <= 1) {
-            return;
-        }
-
-        int newIndex = mOrderedChildren.size() - 2;
-        int oldIndex = mOrderedChildren.indexOf(child);
-        if (oldIndex == -1) {
-            Log.e(TAG, "Child: " + child + " not found in "
-                    + Arrays.toString(mOrderedChildren.toArray()));
-            return;
-        }
-        if (newIndex == oldIndex) {
-            return;
-        }
-
-        // Swap children.
-        View tmpChild = mOrderedChildren.get(newIndex);
-        mOrderedChildren.set(newIndex, child);
-        mOrderedChildren.set(oldIndex, tmpChild);
-    }
-
-    public View getTopVisibleChild() {
-        for (int i = mOrderedChildren.size() - 1; i >= 0; i--) {
-            View child = mOrderedChildren.get(i);
-            if (child.getVisibility() == VISIBLE && !mViewsToBeRemoved.contains(child)) {
-                return child;
-            }
-        }
-        return null;
-    }
-
-    @SuppressWarnings("unchecked")
-    public <E> E getChildOrNull(Class<E> clazz) {
-        for (int i = 0; i < getChildCount(); i++) {
-            View child = getChildAt(i);
-            if (clazz.isInstance(child) && !mViewsToBeRemoved.contains(child)) {
-                return (E) child;
-            }
-        }
-        return null;
-    }
-
-    @SuppressWarnings("unchecked")
-    public <E> E getVisibleChildOrNull(Class<E> clazz) {
-        for (int i = 0; i < getChildCount(); i++) {
-            View child = getChildAt(i);
-            if (clazz.isInstance(child) && !mViewsToBeRemoved.contains(child)
-                    && child.getVisibility() == VISIBLE) {
-                return (E) child;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    protected int getChildDrawingOrder(int childCount, int i) {
-        return indexOfChild(mOrderedChildren.get(i));
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ClusterInCallService.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ClusterInCallService.java
deleted file mode 100644
index 8348a2b..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ClusterInCallService.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample;
-
-import static com.android.car.cluster.sample.DebugUtil.DEBUG;
-
-import android.content.Intent;
-import android.os.Binder;
-import android.os.IBinder;
-import android.telecom.Call;
-import android.telecom.Call.Callback;
-import android.telecom.InCallService;
-import android.util.Log;
-
-import java.lang.ref.WeakReference;
-
-/**
- * Monitors call state and reports it to the listeners that was registered using
- * {@link #registerListener} method.
- */
-public class ClusterInCallService extends InCallService {
-
-    private static final String TAG = DebugUtil.getTag(ClusterInCallService.class);
-
-    static final String ACTION_LOCAL_BINDING = "local_binding";
-
-    private final PhoneCallback mPhoneCallback = new PhoneCallback(this);
-    private volatile Callback mListener;
-
-    @Override
-    public void onCallAdded(Call call) {
-        if (DEBUG) {
-            Log.d(TAG, "onCallAdded");
-        }
-        call.registerCallback(mPhoneCallback);
-        mPhoneCallback.onStateChanged(call, call.getState());
-    }
-
-    @Override
-    public void onCallRemoved(Call call) {
-        if (DEBUG) {
-            Log.d(TAG, "onCallRemoved");
-        }
-        call.unregisterCallback(mPhoneCallback);
-    }
-
-    private void doStateChanged(Call call, int state) {
-        if (DEBUG) {
-            Log.d(TAG, "doStateChanged, call: " + call + ", state: " + state);
-        }
-        if (mListener != null) {
-            mListener.onStateChanged(call, state);
-        }
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        Log.d(TAG, "onBind, intent:" + intent);
-        return ACTION_LOCAL_BINDING.equals(intent.getAction())
-            ? new LocalBinder() : super.onBind(intent);
-    }
-
-    public class LocalBinder extends Binder {
-        ClusterInCallService getService() {
-            return ClusterInCallService.this;
-        }
-    }
-
-    public void registerListener(Callback listener) {
-        Log.d(TAG, "registerListener, listener: " + listener);
-        mListener = listener;
-    }
-
-    private static class PhoneCallback extends Callback {
-        private final WeakReference<ClusterInCallService> mServiceRef;
-
-        private PhoneCallback(ClusterInCallService service) {
-            mServiceRef = new WeakReference<>(service);
-        }
-
-        @Override
-        public void onStateChanged(Call call, int state) {
-            Log.d(TAG, "PhoneCallback#onStateChanged, call: " + call + ", state: " + state);
-            ClusterInCallService service = mServiceRef.get();
-            if (service != null) {
-                service.doStateChanged(call, state);
-            }
-        }
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ClusterView.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ClusterView.java
deleted file mode 100644
index 7b4255c..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ClusterView.java
+++ /dev/null
@@ -1,644 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample;
-
-import static com.android.car.cluster.sample.BitmapUtils.generateMediaIcon;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.os.Handler;
-import android.os.Looper;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewAnimationUtils;
-import android.view.ViewGroup;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.AlphaAnimation;
-import android.view.animation.Animation;
-import android.view.animation.Animation.AnimationListener;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.Interpolator;
-import android.view.animation.Transformation;
-import android.view.animation.TranslateAnimation;
-import android.widget.FrameLayout;
-import android.widget.RelativeLayout;
-
-import com.android.car.cluster.sample.cards.CallCard;
-import com.android.car.cluster.sample.cards.CallCard.CallStatus;
-import com.android.car.cluster.sample.cards.CardView;
-import com.android.car.cluster.sample.cards.CardView.CardType;
-import com.android.car.cluster.sample.cards.MessageCard;
-import com.android.car.cluster.sample.cards.MediaCard;
-import com.android.car.cluster.sample.cards.NavCard;
-import com.android.car.cluster.sample.cards.WeatherCard;
-
-import java.util.PriorityQueue;
-
-/**
- * Class that represents cluster view. It is responsible of ranking cards and play animations
- * during card transitions.
- */
-public class ClusterView extends FrameLayout implements CardView.PriorityChangedListener{
-    private static final String TAG = DebugUtil.getTag(ClusterView.class);
-
-    private CardPanel mCardPanel;
-
-    private final Handler mHandler = new Handler(Looper.getMainLooper());
-    private final PriorityQueue<CardView> mQueue = new PriorityQueue<>(8);
-
-    public ClusterView(Context context) {
-        this(context, null);
-    }
-
-    public ClusterView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-
-        inflate(getContext(), R.layout.cluster_view, this);
-        mCardPanel = (CardPanel) findViewById(R.id.card_panel);
-    }
-
-    private <E extends CardView> E createCard(@CardType int cardType) {
-        CardView card;
-        switch (cardType)
-        {
-            case CardType.WEATHER:
-                card = new WeatherCard(getContext(), this /* priority listener */);
-                break;
-            case CardType.MEDIA:
-                card = new MediaCard(getContext(), this /* priority listener */);
-                break;
-            case CardType.PHONE_CALL:
-                card = new CallCard(getContext(), this /* priority listener */);
-                break;
-            case CardType.NAV:
-                card = new NavCard(getContext(), this /* priority listener */);
-                break;
-            case CardType.HANGOUT:
-                card = new MessageCard(getContext(), this /* priority listener */);
-                break;
-            default:
-                card = new CardView(getContext(), cardType, this /* priority listener */);
-        }
-        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
-        card.setLayoutParams(params);
-        return (E) card;
-    }
-
-    public void handleIncomingCall(Bitmap contactImage, String contactName) {
-        if (contactImage == null) {
-            contactImage = BitmapFactory.decodeResource(getResources(),
-                    R.drawable.unknown_contact_480);
-        }
-        CardView card = createIncomingCallCard(contactImage, contactName);
-        enqueueCard(card);
-    }
-
-    public void handleDialingCall(Bitmap contactImage, String contactName) {
-        if (contactImage == null) {
-            contactImage = BitmapFactory.decodeResource(getResources(),
-                    R.drawable.unknown_contact_480);
-        }
-        CardView card = createDialingCallCard(contactImage, contactName);
-        enqueueCard(card);
-    }
-
-    public void handleUpdateContactName(String contactName) {
-        CallCard card = getCallCard();
-        if (card != null) {
-            card.setContactName(contactName);
-        }
-    }
-
-    public void handleUpdateContactImage(Bitmap image) {
-        CallCard card = getCallCard();
-        if (card != null) {
-            updateContactImage(card, image);
-        }
-    }
-
-    public void handleHangoutMessage(Bitmap contactImage, String contactName) {
-        if (getCardOrNull(MessageCard.class) != null) {
-            return; // Deduplicate.
-        }
-
-        if (contactImage == null) {
-            contactImage = BitmapFactory.decodeResource(getResources(),
-                    R.drawable.unknown_contact_480);
-        }
-        MessageCard card = createCard(CardType.HANGOUT);
-        card.setContactName(contactName);
-
-        int c = getResources().getColor(R.color.hangout_background, null);
-        card.setBackgroundColor(c);
-        card.setLeftIcon(BitmapUtils.circleCropBitmap(contactImage));
-
-        enqueueCard(card);
-    }
-
-    public void handleCallConnected(long connectedTimestamp) {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "handleCallConnected, connectedTimestamp: " + connectedTimestamp);
-        }
-        CallCard card = getCallCard();
-        if (card != null) {
-            if (DebugUtil.DEBUG) {
-                Log.d(TAG, "handleCallConnected, call status: " + card.getCallStatus());
-            }
-
-            if (card.getCallStatus() == CallStatus.INCOMING_OR_DIALING) {
-                card.animateCallConnected(connectedTimestamp);
-            }
-        }
-    }
-
-    public void handleCallDisconnected() {
-        final CallCard callCard = getCallCard();
-        if (callCard != null) {
-            if (DebugUtil.DEBUG) {
-                Log.d(TAG, "handleCallDisconnected, callCard status: " + callCard.getCallStatus());
-            }
-
-            if (callCard == getCurrentCard()
-                    && callCard.getCallStatus() == CallStatus.ACTIVE) {
-                callCard.animateCallDisconnected();
-            } else {
-                removeCard(callCard);
-            }
-        }
-    }
-
-    public void runDelayed(long delay, final Runnable task) {
-        mHandler.postDelayed(task, delay);
-    }
-
-    public MediaCard createMediaCard(Bitmap albumCover, String title, String subtitle,
-            int appColor) {
-        MediaCard card = createCard(CardType.MEDIA);
-        int iconSize = card.getIconSize();
-
-        if (albumCover != null) {
-            Bitmap albumIcon = BitmapUtils.scaleBitmap(albumCover, iconSize, iconSize);
-            albumIcon = BitmapUtils.circleCropBitmap(albumIcon);
-            card.setLeftIcon(albumIcon);
-
-            Bitmap backgroundImage = BitmapUtils.scaleBitmapColors(albumCover,
-                    getResources().getColor(R.color.media_background_dark, null),
-                    getResources().getColor(R.color.media_background, null));
-
-            backgroundImage = BitmapUtils.scaleBitmap(backgroundImage,
-                    (int) (getResources().getDimension(R.dimen.card_width)),
-                    (int) getResources().getDimension(R.dimen.card_height));
-
-            int c = getResources().getColor(R.color.phone_background, null);
-            card.setBackground(backgroundImage, c);
-        }
-
-        Bitmap mediaApp = generateMediaIcon(iconSize,
-                appColor,
-                getResources().getColor(R.color.media_icon_foreground, null));
-        card.setRightIcon(mediaApp);
-        card.setProgressColor(appColor);
-        card.setTitle(title);
-        card.setSubtitle(subtitle);
-        return card;
-    }
-
-    public CardView getCurrentCard() {
-        return (CardView) mCardPanel.getTopVisibleChild();
-    }
-
-    public CardView createWeatherCard() {
-        CardView card;
-        card = createCard(CardType.WEATHER);
-        card.setBackgroundColor(getResources().getColor(R.color.weather_blue_sky, null));
-        return card;
-    }
-
-    public CallCard createIncomingCallCard(Bitmap contactImage, String contactName) {
-        CallCard card = createCard(CardType.PHONE_CALL);
-        updateContactImage(card, contactImage);
-        card.setContactName(contactName);
-        card.setStatusLabel(getContext().getString(R.string.incoming_call));
-        return card;
-    }
-
-    public CallCard createDialingCallCard(Bitmap contactImage, String contactName) {
-        CallCard card = createCard(CardType.PHONE_CALL);
-
-        updateContactImage(card, contactImage);
-        card.setContactName(contactName);
-        card.setStatusLabel(getContext().getString(R.string.dialing));
-        return card;
-    }
-
-    public NavCard createNavCard() {
-        return createCard(CardType.NAV);
-    }
-
-    private void updateContactImage(CardView card, Bitmap contactImage) {
-        int iconSize = (int)getResources().getDimension(R.dimen.card_icon_size);
-        Bitmap contactImageCircle = BitmapUtils.circleCropBitmap(
-                BitmapUtils.scaleBitmap(contactImage, iconSize, iconSize));
-        card.setLeftIcon(contactImageCircle);
-
-        contactImage = BitmapUtils.scaleBitmapColors(contactImage,
-                getResources().getColor(R.color.phone_background_dark, null),
-                getResources().getColor(R.color.phone_background, null));
-
-        contactImage = BitmapUtils.scaleBitmap(contactImage,
-                (int) getResources().getDimension(R.dimen.card_width),
-                (int) getResources().getDimension(R.dimen.card_height));
-
-        int c = getResources().getColor(R.color.phone_background, null);
-        card.setBackground(contactImage, c);
-    }
-
-    public boolean cardExists(CardView card) {
-        return mCardPanel.childViewExists(card);
-    }
-
-    public void removeCard(final CardView card) {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "removeCard, card: " + card);
-        }
-        final CardView currentlyShownCard = getCurrentCard();
-        if (currentlyShownCard == card) {
-            // Card is on the screen, play nice animation and then remove it.
-            mQueue.remove(card);
-            mCardPanel.markViewToBeRemoved(card);
-            CardView cardToShow = mQueue.peek();
-            if (cardToShow != null) {
-                Animation animation = cardToShow.getAnimation();
-                if (DebugUtil.DEBUG) {
-                    Log.d(TAG, "card to show: " + cardToShow + ", animation: " + animation);
-                }
-                if (animation != null) {
-                    cardToShow.getAnimation().cancel();
-                }
-
-                cardToShow.setVisibility(VISIBLE);
-                mCardPanel.moveChildBehindTheTop(cardToShow);
-            }
-            playUnrevealAnimation(card, new Runnable() {
-                @Override
-                public void run() {
-                    removeCardInternal(card);
-                }
-            });
-        } else {
-            // Card is not on the screen, just remove it.
-            if (DebugUtil.DEBUG) {
-                Log.d(TAG, "removeCard, card is not on the screen, remove it immediately");
-                removeCardInternal(card);
-            }
-        }
-    }
-
-    public void enqueueCard(final CardView card) {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "enqueueCard, card: " + card);
-        }
-        final CardView currentCard = getCurrentCard();
-        boolean cardIsOnTheScreen = card == currentCard;
-
-        boolean cardExisted = mQueue.remove(card);
-        mQueue.offer(card);
-
-        CardView activeCard = mQueue.peek();
-        boolean shouldDisplayCard = activeCard == card;
-
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "enqueueCard, card: " + card + ", onScreen: "
-                    + cardIsOnTheScreen + ", cardExisted: " + cardExisted + ", shouldDisplayCard: "
-                    + shouldDisplayCard + ", activeCard: " + activeCard
-                    + ", currentCard: " + currentCard);
-        }
-
-        if (cardIsOnTheScreen) {
-            if (!shouldDisplayCard) {
-                // Card priority was decreased, but it still active. Need to reverse reveal
-                // animation and show underlying card.
-                showCardWithFadeoutAnimation(activeCard);
-            }
-        } else {
-            // Card is not on the screen right now.
-            if (cardExisted) {
-                if (shouldDisplayCard) {
-                    // Card was created in the past and is in the queue, need to show
-                    // this card using unreveal animation.
-                    showCardWithUnrevealAnimation(card);
-                }
-            } else {
-                if (shouldDisplayCard) {
-                    // Card doesn't exist, but we want to show it.
-                    showCardWithRevealAnimation(card);
-                } else {
-                    // We want to add the card to the panel, but do not want to show it.
-                    if (DebugUtil.DEBUG) {
-                        Log.d(TAG, "Adding hidden card");
-                    }
-                    card.setVisibility(GONE);
-                    mCardPanel.addView(card, 0);
-                }
-            }
-        }
-
-        removeInvisibleDuplicatedCard(card);  // Remove invisible cards with the same card type.
-
-        dumpCardsToLog();
-    }
-
-    private void showCardWithRevealAnimation(final CardView cardToShow) {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "showCardWithRevealAnimation, card: " + cardToShow);
-        }
-
-        removeInvisibleDuplicatedCard(cardToShow);
-
-        CardView currentCard = getCurrentCard();
-        mCardPanel.addView(cardToShow);
-        playRevealAnimation(cardToShow, currentCard, new RemoveOrHideCard(this, currentCard));
-    }
-
-    private void removeInvisibleDuplicatedCard(CardView card) {
-        Log.d(TAG, "removeInvisibleDuplicatedCard, card: " + card);
-        // Remove cards that has the same card type and not visible on the screen.
-        for (int i = mCardPanel.getChildCount() - 1; i >= 0; i--) {
-            CardView child = (CardView) mCardPanel.getChildAt(i);
-            if (child.getCardType() == card.getCardType()
-                    && child != card
-                    && child.getVisibility() != VISIBLE) {
-                Log.d(TAG, "removeInvisibleDuplicatedCard, found dup: " + child);
-                removeCardInternal(child);
-            }
-        }
-    }
-
-    private void showCardWithFadeoutAnimation(final CardView cardToShow) {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "showCardWithFadeoutAnimation, card: " + cardToShow);
-        }
-        // Place card behind the top card, it will become visible once fade out animation for the
-        // top card starts to play.
-        mCardPanel.moveChildBehindTheTop(cardToShow);
-        cardToShow.setVisibility(VISIBLE);
-
-        // Hide top card with animation.
-        playFadeOutAndSlideOutAnimation((CardView) mCardPanel.getTopVisibleChild());
-    }
-
-    private void showCardWithUnrevealAnimation(CardView cardToShow) {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "showCardWithUnrevealAnimation, card: " + cardToShow);
-        }
-        final CardView currentCard = (CardView) mCardPanel.getTopVisibleChild();
-        // Card was created in the past and is in the queue, need to show reverse reveal
-        // animation to unreveal this card.
-        mCardPanel.moveChildBehindTheTop(cardToShow);
-        cardToShow.setVisibility(VISIBLE);
-        playUnrevealAnimation(currentCard, new RemoveOrHideCard(this, currentCard));
-    }
-
-    private static class RemoveOrHideCard implements Runnable {
-        private final CardView mCard;
-
-        private final ClusterView mClusterView;
-
-        RemoveOrHideCard(ClusterView clusterView, CardView card) {
-            mCard = card;
-            mClusterView = clusterView;
-        }
-
-        @Override
-        public void run() {
-            if (DebugUtil.DEBUG) {
-                Log.d(TAG, "RemoveOrHideCard: " + mCard);
-            }
-
-            mClusterView.removeInvisibleDuplicatedCard(mCard);
-
-            if (mCard.isGarbage()) {
-                if (DebugUtil.DEBUG) {
-                    Log.d(TAG, "RemoveOrHideCard, card has garbage priority");
-                }
-                mClusterView.removeCardInternal(mCard);
-            } else {
-                if (DebugUtil.DEBUG) {
-                    Log.d(TAG, "RemoveOrHideCard, hiding card: " + mCard);
-                }
-                mCard.setVisibility(GONE);
-                mCard.setAlpha(1);  // Restore alpha after fade-out animation, it's gone anyway.
-                mClusterView.dumpCardsToLog();
-            }
-        }
-    }
-
-    private void removeCardInternal(CardView card) {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "removeCardInternal, card: " + card);
-        }
-        mCardPanel.removeView(card);
-        mQueue.remove(card);
-
-        dumpCardsToLog();
-    }
-
-    @Override
-    public void onPriorityChanged(CardView card, int priority) {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "onPriorityChanged, card: " + card + ", priority: " + priority);
-        }
-        if (cardExists(card)) {
-            enqueueCard(card);
-        }
-    }
-
-    private void playRevealAnimation(final CardView cardToShow, final CardView currentCard,
-            final Runnable oldCardDissapearedAction) {
-
-        if (currentCard == cardToShow) {
-            return;
-        }
-
-        if (currentCard != null) {
-            playAlphaAnimation(currentCard,
-                    0,    // Target alpha
-                    400,  // Duration
-                    new DecelerateInterpolator(0.5f),
-                    oldCardDissapearedAction);
-        }
-
-        cardToShow.addOnLayoutChangeListener(new OnLayoutChangeListener() {
-            @Override
-            public void onLayoutChange(View v, int left, int top, int right, int bottom,
-                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
-                cardToShow.removeOnLayoutChangeListener(this);  // Just need it once.
-
-                createRevealAnimator(cardToShow, new DecelerateInterpolator(1f), true)
-                        .start();
-            }
-        });
-        cardToShow.onPlayRevealAnimation();
-    }
-
-    private void playAlphaAnimation(final CardView card, float targetAlpha, long duration,
-            Interpolator interpolator, final Runnable endAction) {
-        Animation animation = new AlphaAnimation(card.getAlpha(), targetAlpha);
-        animation.setDuration(duration * DebugUtil.ANIMATION_FACTOR);
-        animation.setInterpolator(interpolator);
-
-        animation.setAnimationListener(new AnimationListener() {
-            @Override
-            public void onAnimationStart(Animation animation) { }
-
-            @Override
-            public void onAnimationEnd(Animation animation) {
-                // For some reason, cancelled animation hasEnded() == true here.
-                // Check for start time instead.
-                if (endAction != null && animation.getStartTime() != Long.MIN_VALUE) {
-                    endAction.run();
-                }
-            }
-
-            @Override
-            public void onAnimationRepeat(Animation animation) { }
-        });
-        card.setAnimation(animation);
-        animation.start();
-    }
-
-    private static boolean isAnimationCancelled(Animation animation) {
-        return (animation.getStartTime() == Long.MIN_VALUE) || (!animation.hasEnded());
-    }
-
-    private void playFadeOutAndSlideOutAnimation(final CardView card) {
-        Animation animation = new TranslateAnimation(0, card.getWidth(), 0, 0) {
-            private final float mFromAlpha = card.getAlpha();
-            private final float mToAlpha = 0;
-
-            @Override
-            protected void applyTransformation(float interpolatedTime, Transformation t) {
-                super.applyTransformation(interpolatedTime, t);
-
-                final float alpha = mFromAlpha;
-                t.setAlpha(alpha + ((mToAlpha - alpha) * interpolatedTime));
-            }
-        };
-        animation.setDuration(600 * DebugUtil.ANIMATION_FACTOR);
-        animation.setAnimationListener(new AnimationListener() {
-            @Override
-            public void onAnimationStart(Animation animation) { }
-
-            @Override
-            public void onAnimationEnd(Animation animation) {
-                if (DebugUtil.DEBUG) {
-                    Log.d(TAG, "playFadeOutAndSlideOutAnimation, onAnimationEnd " + animation
-                            + ", startTime: " + animation.getStartTime());
-                }
-                if (!isAnimationCancelled(animation)) {
-                    new RemoveOrHideCard(ClusterView.this, card)
-                            .run();
-                }
-                // Reset X position.
-                card.setTranslationX(0);
-            }
-
-            @Override
-            public void onAnimationRepeat(Animation animation) { }
-        });
-        card.setAnimation(animation);
-        animation.start();
-    }
-
-    /** Hides given card and reveals underlying card */
-    private void playUnrevealAnimation(final CardView card, final Runnable unrevealCompleteAction) {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "playUnrevealAnimation, card: " + card);
-        }
-
-        final Animator anim = createRevealAnimator(card,
-                new AccelerateInterpolator(2f), false /* hide */);
-
-        anim.addListener(new AnimatorListenerAdapter() {
-            private boolean cancelled = false;
-
-            @Override
-            public void onAnimationCancel(Animator animation) {
-                if (DebugUtil.DEBUG) {
-                    Log.d(TAG, "onAnimationCancel, animation: " + animation);
-                }
-                cancelled = true;
-            }
-
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                if (cancelled) {
-                    return;
-                }
-
-                if (DebugUtil.DEBUG) {
-                    Log.d(TAG, "onAnimationEnd, animation: " + animation);
-                }
-                unrevealCompleteAction.run();
-            }
-        });
-
-        anim.start();
-        card.onPlayUnrevealAnimation();
-    }
-
-    private Animator createRevealAnimator(CardView card, Interpolator interpolator, boolean show) {
-        int cardWidth = (int) getResources().getDimension(R.dimen.card_width);
-        int radius = (int) (cardWidth * 1.2f);
-        int centerY = (int) (getResources().getDimension(R.dimen.card_height) / 2);
-
-        Animator anim = ViewAnimationUtils.createCircularReveal(card, radius, centerY,
-                show ? 0 : radius /* start radius */,
-                show ? radius : 0 /* end radius */);
-
-        anim.setInterpolator(interpolator);
-        anim.setDuration(600 * DebugUtil.ANIMATION_FACTOR);
-        return anim;
-    }
-
-    public <E> E getCardOrNull(Class<E> clazz) {
-        return mCardPanel.getChildOrNull(clazz);
-    }
-
-    public <E> E getVisibleCardOrNull(Class<E> clazz) {
-        return mCardPanel.getVisibleChildOrNull(clazz);
-    }
-
-    private CallCard getCallCard() {
-        return getCardOrNull(CallCard.class);
-    }
-
-    private void dumpCardsToLog() {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "Cards in layout: " + mCardPanel.getChildCount() + ", cards in queue: "
-                    + mQueue.size());
-            for (int i = 0; i < mCardPanel.getChildCount(); i++) {
-                Log.d(TAG, "child: " + mCardPanel.getChildAt(i));
-            }
-        }
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/DebugUtil.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/DebugUtil.java
deleted file mode 100644
index c42fe14..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/DebugUtil.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample;
-
-/**
- * Utility functions / constants that make sense for debugging.
- */
-public final class DebugUtil {
-    /** The default factor is 1, increasing this number results in slowing down animation */
-    public static final long ANIMATION_FACTOR = 1;
-
-    public static final String TAG = "CLUSTER";
-
-    public static final boolean DEBUG = true;
-
-    public static String getTag(Class clazz) {
-        return TAG + "." + clazz.getSimpleName();
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterController.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterController.java
deleted file mode 100644
index fbfa8de..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterController.java
+++ /dev/null
@@ -1,594 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample;
-
-import static com.android.car.cluster.sample.DebugUtil.DEBUG;
-
-import android.annotation.Nullable;
-import android.app.Presentation;
-import android.car.cluster.renderer.NavigationRenderer;
-import android.car.navigation.CarNavigationInstrumentCluster;
-import android.car.navigation.CarNavigationStatusManager;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Color;
-import android.hardware.display.DisplayManager;
-import android.media.MediaDescription;
-import android.media.MediaMetadata;
-import android.media.session.PlaybackState;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.telecom.Call;
-import android.telecom.GatewayInfo;
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.Display;
-
-import com.android.car.cluster.sample.MediaStateMonitor.MediaStateListener;
-import com.android.car.cluster.sample.cards.MediaCard;
-import com.android.car.cluster.sample.cards.NavCard;
-
-import java.text.DecimalFormatSymbols;
-import java.text.NumberFormat;
-import java.util.Locale;
-import java.util.Objects;
-import java.util.Timer;
-import java.util.TimerTask;
-
-/**
- * This class is responsible for subscribing to system events (such as call status, media status,
- * etc.) and updating accordingly UI component {@link ClusterView}.
- */
-/*package*/ class InstrumentClusterController {
-
-    private final static String TAG = DebugUtil.getTag(InstrumentClusterController.class);
-
-    private final Context mContext;
-    private final NavigationRenderer mNavigationRenderer;
-
-    private ClusterView mClusterView;
-    private MediaStateMonitor mMediaStateMonitor;
-    private MediaStateListenerImpl mMediaStateListener;
-    private ClusterInCallService mInCallService;
-    private MessagingNotificationHandler mNotificationHandler;
-    private StatusBarNotificationListener mNotificationListener;
-    private RetriableServiceBinder mInCallServiceRetriableBinder;
-    private RetriableServiceBinder mNotificationServiceRetriableBinder;
-
-    InstrumentClusterController(Context context) {
-        mContext = context;
-        mNavigationRenderer = new NavigationRendererImpl(this);
-
-        init();
-    }
-
-    private void init() {
-        grantNotificationListenerPermissionsIfNecessary(mContext);
-
-        final Display display = getInstrumentClusterDisplay(mContext);
-        if (DEBUG) {
-            Log.d(TAG, "Instrument cluster display: " + display);
-        }
-        if (display == null) {
-            return;
-        }
-
-        mClusterView = new ClusterView(mContext);
-        Presentation presentation = new InstrumentClusterPresentation(mContext, display);
-        presentation.setContentView(mClusterView);
-
-        // To handle incoming messages
-        mNotificationHandler = new MessagingNotificationHandler(mClusterView);
-
-        mMediaStateListener = new MediaStateListenerImpl(this);
-        mMediaStateMonitor = new MediaStateMonitor(mContext, mMediaStateListener);
-
-        mInCallServiceRetriableBinder = new RetriableServiceBinder(
-                new Handler(Looper.getMainLooper()),
-                mContext,
-                ClusterInCallService.class,
-                ClusterInCallService.ACTION_LOCAL_BINDING,
-                mInCallServiceConnection);
-        mInCallServiceRetriableBinder.attemptToBind();
-
-        mNotificationServiceRetriableBinder = new RetriableServiceBinder(
-                new Handler(Looper.getMainLooper()),
-                mContext,
-                StatusBarNotificationListener.class,
-                StatusBarNotificationListener.ACTION_LOCAL_BINDING,
-                mNotificationListenerConnection);
-        mNotificationServiceRetriableBinder.attemptToBind();
-
-        // Show default card - weather
-        mClusterView.enqueueCard(mClusterView.createWeatherCard());
-
-        presentation.show();
-    }
-
-    NavigationRenderer getNavigationRenderer() {
-        return mNavigationRenderer;
-    }
-
-    private final ServiceConnection mInCallServiceConnection = new ServiceConnection() {
-        @Override
-        public void onServiceConnected(ComponentName name, IBinder binder) {
-            if (DEBUG) {
-                Log.d(TAG, "onServiceConnected, name: " + name + ", binder: " + binder);
-            }
-
-            mInCallService = ((ClusterInCallService.LocalBinder) binder).getService();
-            mInCallService.registerListener(mCallServiceListener);
-
-            // The InCallServiceImpl could be bound when we already have some active calls, let's
-            // notify UI about these calls.
-            for (Call call : mInCallService.getCalls()) {
-                mCallServiceListener.onStateChanged(call, call.getState());
-            }
-            mInCallServiceRetriableBinder = null;
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName name) {
-            if (DEBUG) {
-                Log.d(TAG, "onServiceDisconnected, name: " + name);
-            }
-        }
-    };
-
-    private final ServiceConnection mNotificationListenerConnection = new ServiceConnection() {
-        @Override
-        public void onServiceConnected(ComponentName name, IBinder binder) {
-            if (DEBUG) {
-                Log.d(TAG, "onServiceConnected, name: " + name + ", binder: " + binder);
-            }
-
-            mNotificationListener = ((StatusBarNotificationListener.LocalBinder) binder)
-                    .getService();
-            mNotificationListener.setHandler(mNotificationHandler);
-
-            mNotificationServiceRetriableBinder = null;
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName name) {
-            if (DEBUG) {
-                Log.d(TAG, "onServiceDisconnected, name: "+ name);
-            }
-        }
-    };
-
-    private final Call.Callback mCallServiceListener = new Call.Callback() {
-        @Override
-        public void onStateChanged(Call call, int state) {
-            if (DEBUG) {
-                Log.d(TAG, "onCallStateChanged, call: " + call + ", state: " + state);
-            }
-
-            runOnMain(() -> InstrumentClusterController.this.onCallStateChanged(call, state));
-        }
-    };
-
-    private String extractPhoneNumber(Call call) {
-        String number = "";
-        Call.Details details = call.getDetails();
-        if (details != null) {
-            GatewayInfo gatewayInfo = details.getGatewayInfo();
-
-            if (gatewayInfo != null) {
-                number = gatewayInfo.getOriginalAddress().getSchemeSpecificPart();
-            } else if (details.getHandle() != null) {
-                number = details.getHandle().getSchemeSpecificPart();
-            }
-        } else {
-            number = mContext.getResources().getString(R.string.unknown);
-        }
-
-        return number;
-    }
-
-    private void onCallStateChanged(Call call, int state) {
-        if (DEBUG) {
-            Log.d(TAG, "onCallStateChanged, call: " + call + ", state: " + state);
-        }
-
-        switch (state) {
-            case Call.STATE_ACTIVE: {
-                Call.Details details = call.getDetails();
-                if (details != null) {
-                    long duration = System.currentTimeMillis() - details.getConnectTimeMillis();
-                    mClusterView.handleCallConnected(SystemClock.elapsedRealtime() - duration);
-                }
-            } break;
-            case Call.STATE_CONNECTING: {
-
-            } break;
-            case Call.STATE_DISCONNECTING: {
-                mClusterView.handleCallDisconnected();
-            } break;
-            case Call.STATE_DIALING: {
-                String phoneNumber = extractPhoneNumber(call);
-                String displayName = TelecomUtils.getDisplayName(mContext, phoneNumber);
-                Bitmap image = TelecomUtils
-                        .getContactPhotoFromNumber(mContext.getContentResolver(), phoneNumber);
-                mClusterView.handleDialingCall(image, displayName);
-            } break;
-            case Call.STATE_DISCONNECTED: {
-                mClusterView.handleCallDisconnected();
-            } break;
-            case Call.STATE_HOLDING:
-                break;
-            case Call.STATE_NEW:
-                break;
-            case Call.STATE_RINGING: {
-                String phoneNumber = extractPhoneNumber(call);
-                String displayName = TelecomUtils.getDisplayName(mContext, phoneNumber);
-                Bitmap image = TelecomUtils
-                        .getContactPhotoFromNumber(mContext.getContentResolver(), phoneNumber);
-                if (image != null) {
-                    if (DEBUG) {
-                        Log.d(TAG, "Incoming call, contact image size: " + image.getWidth()
-                                + "x" + image.getHeight());
-                    }
-                }
-                mClusterView.handleIncomingCall(image, displayName);
-            } break;
-            default:
-                Log.w(TAG, "Unexpected call state: " + state + ", call : " + call);
-        }
-    }
-
-    private static void grantNotificationListenerPermissionsIfNecessary(Context context) {
-        ComponentName componentName = new ComponentName(context,
-                StatusBarNotificationListener.class);
-        String componentFlatten = componentName.flattenToString();
-
-        ContentResolver resolver = context.getContentResolver();
-        String grantedComponents = Settings.Secure.getString(resolver,
-                Settings.Secure.ENABLED_NOTIFICATION_LISTENERS);
-
-        if (grantedComponents != null) {
-            String[] allowed = grantedComponents.split(":");
-            for (String s : allowed) {
-                if (s.equals(componentFlatten)) {
-                    if (DEBUG) {
-                        Log.d(TAG, "Notification listener permission granted.");
-                    }
-                    return;  // Permission already granted.
-                }
-            }
-        }
-
-        if (DEBUG) {
-            Log.d(TAG, "Granting notification listener permission.");
-        }
-        Settings.Secure.putString(resolver,
-                Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
-                grantedComponents + ":" + componentFlatten);
-
-    }
-
-    /* package */ void onDestroy() {
-        if (mMediaStateMonitor != null) {
-            mMediaStateMonitor.release();
-            mMediaStateMonitor = null;
-        }
-        if (mMediaStateListener != null) {
-            mMediaStateListener.release();
-            mMediaStateListener = null;
-        }
-        if (mInCallService != null) {
-            mContext.unbindService(mInCallServiceConnection);
-            mInCallService = null;
-        }
-        if (mNotificationListener != null) {
-            mContext.unbindService(mNotificationListenerConnection);
-            mNotificationListener = null;
-        }
-        if (mInCallServiceRetriableBinder != null) {
-            mInCallServiceRetriableBinder.release();
-            mInCallServiceRetriableBinder = null;
-        }
-        if (mNotificationServiceRetriableBinder != null) {
-            mNotificationServiceRetriableBinder.release();
-            mNotificationServiceRetriableBinder = null;
-        }
-    }
-
-    private static Display getInstrumentClusterDisplay(Context context) {
-        DisplayManager displayManager = context.getSystemService(DisplayManager.class);
-        Display[] displays = displayManager.getDisplays();
-
-        if (DEBUG) {
-            Log.d(TAG, "There are currently " + displays.length + " displays connected.");
-            for (Display display : displays) {
-                Log.d(TAG, "  " + display);
-            }
-        }
-
-        if (displays.length > 1) {
-            // TODO: Put this into settings?
-            return displays[displays.length - 1];
-        }
-        return null;
-    }
-
-    private static void runOnMain(Runnable runnable) {
-        new Handler(Looper.getMainLooper()).post(runnable);
-    }
-
-    private static class MediaStateListenerImpl implements MediaStateListener {
-        private final Timer mTimer = new Timer("ClusterMediaProgress");
-        private final ClusterView mClusterView;
-
-        private MediaData mCurrentMedia;
-        private MediaAppInfo mMediaAppInfo;
-        private MediaCard mCard;
-        private PlaybackState mPlaybackState;
-        private TimerTask mTimerTask;
-
-        MediaStateListenerImpl(InstrumentClusterController renderer) {
-            mClusterView = renderer.mClusterView;
-        }
-
-        void release() {
-            if (mTimerTask != null) {
-                mTimerTask.cancel();
-                mTimerTask = null;
-            }
-        }
-
-        @Override
-        public void onPlaybackStateChanged(final PlaybackState playbackState) {
-            if (DEBUG) {
-                Log.d(TAG, "onPlaybackStateChanged, playbackState: " + playbackState);
-            }
-
-            if (mTimerTask != null) {
-                mTimerTask.cancel();
-                mTimerTask = null;
-            }
-
-            if (playbackState != null) {
-                if ((playbackState.getState() == PlaybackState.STATE_PLAYING
-                            || playbackState.getState() == PlaybackState.STATE_BUFFERING)) {
-                    mPlaybackState = playbackState;
-
-                    if (mCurrentMedia != null) {
-                        showMediaCardIfNecessary(mCurrentMedia);
-
-                        if (mCurrentMedia.duration > 0) {
-                            startTrackProgressTimer();
-                        }
-                    }
-                } else if (playbackState.getState() == PlaybackState.STATE_STOPPED
-                        || playbackState.getState() == PlaybackState.STATE_ERROR
-                        || playbackState.getState() == PlaybackState.STATE_NONE) {
-                    hideMediaCard();
-                }
-            } else {
-                hideMediaCard();
-            }
-
-        }
-
-        private void startTrackProgressTimer() {
-            mTimerTask = new TimerTask() {
-                @Override
-                public void run() {
-                    runOnMain(() -> {
-                        if (mPlaybackState == null || mCard == null) {
-                            return;
-                        }
-                        long trackStarted = mPlaybackState.getLastPositionUpdateTime()
-                                - mPlaybackState.getPosition();
-                        long trackDuration = mCurrentMedia == null ? 0 : mCurrentMedia.duration;
-
-                        long currentTime = SystemClock.elapsedRealtime();
-                        long progressMs = (currentTime - trackStarted);
-                        if (trackDuration > 0) {
-                            mCard.setProgress((int)((progressMs * 100) / trackDuration));
-                        }
-                    });
-                }
-            };
-
-            mTimer.scheduleAtFixedRate(mTimerTask, 0, 1000);
-        }
-
-
-        @Override
-        public void onMetadataChanged(MediaMetadata metadata) {
-            if (DEBUG) {
-                Log.d(TAG, "onMetadataChanged: " + metadata);
-            }
-            MediaData data = MediaData.createFromMetadata(metadata);
-            if (data == null) {
-                hideMediaCard();
-            }
-            mCurrentMedia = data;
-        }
-
-        private void hideMediaCard() {
-            if (DEBUG) {
-                Log.d(TAG, "hideMediaCard");
-            }
-
-            if (mCard != null) {
-                mClusterView.removeCard(mCard);
-                mCard = null;
-            }
-
-            // Remove all existing media cards if any.
-            MediaCard mediaCard;
-            do {
-                mediaCard = mClusterView.getCardOrNull(MediaCard.class);
-                if (mediaCard != null) {
-                    mClusterView.removeCard(mediaCard);
-                }
-            } while (mediaCard != null);
-        }
-
-        private void showMediaCardIfNecessary(MediaData data) {
-            if (!needToCreateMediaCard(data)) {
-                return;
-            }
-
-            int accentColor = mMediaAppInfo == null
-                    ? Color.GRAY : mMediaAppInfo.getMediaClientAccentColor();
-
-            mCard = mClusterView.createMediaCard(
-                    data.albumCover, data.title, data.subtitle, accentColor);
-            if (data.duration <= 0) {
-                mCard.setProgress(100); // unknown position
-            } else {
-                mCard.setProgress(0);
-            }
-            mClusterView.enqueueCard(mCard);
-        }
-
-        private boolean needToCreateMediaCard(MediaData data) {
-            return (mCard == null)
-                    || !Objects.equals(mCard.getTitle(), data.title)
-                    || !Objects.equals(mCard.getSubtitle(), data.subtitle);
-        }
-
-        @Override
-        public void onMediaAppChanged(MediaAppInfo mediaAppInfo) {
-            mMediaAppInfo = mediaAppInfo;
-        }
-
-        private static class MediaData {
-            final Bitmap albumCover;
-            final String subtitle;
-            final String title;
-            final long duration;
-
-            private MediaData(MediaMetadata metadata) {
-                MediaDescription mediaDescription = metadata.getDescription();
-                title = charSequenceToString(mediaDescription.getTitle());
-                subtitle = charSequenceToString(mediaDescription.getSubtitle());
-                albumCover = mediaDescription.getIconBitmap();
-                duration = metadata.getLong(MediaMetadata.METADATA_KEY_DURATION);
-            }
-
-            static MediaData createFromMetadata(MediaMetadata metadata) {
-                return  metadata == null ? null : new MediaData(metadata);
-            }
-
-            private static String charSequenceToString(@Nullable CharSequence cs) {
-                return cs == null ? null : String.valueOf(cs);
-            }
-
-            @Override
-            public String toString() {
-                return "MediaData{" +
-                        "albumCover=" + albumCover +
-                        ", subtitle='" + subtitle + '\'' +
-                        ", title='" + title + '\'' +
-                        ", duration=" + duration +
-                        '}';
-            }
-        }
-    }
-
-    private static class NavigationRendererImpl extends NavigationRenderer {
-
-        private final InstrumentClusterController mController;
-
-        private ClusterView mClusterView;
-        private Resources mResources;
-
-        private NavCard mNavCard;
-
-        NavigationRendererImpl(InstrumentClusterController controller) {
-            mController = controller;
-        }
-
-        @Override
-        public CarNavigationInstrumentCluster getNavigationProperties() {
-            if (DEBUG) {
-                Log.d(TAG, "getNavigationProperties");
-            }
-            return CarNavigationInstrumentCluster.createCustomImageCluster(
-                    1000, /* 1 Hz*/
-                    64,   /* image width */
-                    64,   /* image height */
-                    32);  /* color depth */
-        }
-
-        @Override
-        public void onEvent(int eventType, Bundle bundle) {
-            if (DEBUG) {
-                Log.d(TAG, "onEvent");
-            }
-            // Implement this.
-        }
-    }
-
-    /**
-     * Services might not be ready for binding. This class will retry binding after short interval
-     * if previous binding failed.
-     */
-    private static class RetriableServiceBinder {
-        private static final long RETRY_INTERVAL_MS = 500;
-        private static final long MAX_RETRY = 30;
-
-        private Handler mHandler;
-        private final Context mContext;
-        private final Intent mIntent;
-        private final ServiceConnection mConnection;
-
-        private long mAttemptsLeft = MAX_RETRY;
-
-        private final Runnable mBindRunnable = () -> attemptToBind();
-
-        RetriableServiceBinder(Handler handler, Context context, Class<?> cls, String action,
-                ServiceConnection connection) {
-            mHandler = handler;
-            mContext = context;
-            mIntent = new Intent(mContext, cls);
-            mIntent.setAction(action);
-            mConnection = connection;
-        }
-
-        void release() {
-            mHandler.removeCallbacks(mBindRunnable);
-        }
-
-        void attemptToBind() {
-            boolean bound = mContext.bindServiceAsUser(mIntent,
-                    mConnection, Context.BIND_AUTO_CREATE, UserHandle.CURRENT_OR_SELF);
-
-            if (!bound && --mAttemptsLeft > 0) {
-                mHandler.postDelayed(mBindRunnable, RETRY_INTERVAL_MS);
-            } else if (!bound) {
-                Log.e(TAG, "Gave up to bind to a service: " + mIntent.getComponent() + " after "
-                        + MAX_RETRY + " retries.");
-            }
-        }
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterPresentation.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterPresentation.java
deleted file mode 100644
index 3a3068e..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterPresentation.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample;
-
-import android.app.Presentation;
-import android.content.Context;
-import android.view.Display;
-import android.view.WindowManager;
-
-/**
- * Presentation class.
- */
-public class InstrumentClusterPresentation extends Presentation {
-    public InstrumentClusterPresentation(Context outerContext, Display display) {
-        super(outerContext, display);
-        // To allow presentation from the service.
-        getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterRenderingServiceImpl.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterRenderingServiceImpl.java
deleted file mode 100644
index 066072e..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterRenderingServiceImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample;
-
-import android.car.cluster.renderer.InstrumentClusterRenderingService;
-import android.car.cluster.renderer.NavigationRenderer;
-import android.view.KeyEvent;
-
-/**
- * Service for {@link InstrumentClusterController}. This is entry-point of the instrument cluster
- * renderer. This service will be bound from Car Service.
- */
-public class InstrumentClusterRenderingServiceImpl extends InstrumentClusterRenderingService {
-
-    private InstrumentClusterController mController;
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-
-        mController = new InstrumentClusterController(this /* context */);
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-
-        if (mController != null) {
-            mController.onDestroy();
-            mController = null;
-        }
-    }
-
-    @Override
-    public NavigationRenderer getNavigationRenderer() {
-        return mController.getNavigationRenderer();
-    }
-
-    @Override
-    public void onKeyEvent(KeyEvent keyEvent) {
-        // No need to handle key events in this implementation.
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ManeuverPanel.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ManeuverPanel.java
deleted file mode 100644
index 835b9ed..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ManeuverPanel.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.FrameLayout;
-import android.widget.TextView;
-
-import com.android.car.cluster.sample.cards.NavCard;
-
-/**
- * Contains text information about next maneuver. This panel is used in {@link NavCard}.
- */
-public class ManeuverPanel extends FrameLayout {
-
-    private TextView mDistance;
-    private TextView mDistanceUnits;
-    private TextView mStreet;
-
-    public ManeuverPanel(Context context) {
-        this(context, null);
-    }
-
-    public ManeuverPanel(Context context, AttributeSet attrs) {
-        super(context, attrs);
-
-        inflate(context, R.layout.nav_card_maneuver_description, this);
-
-        mDistance = (TextView) findViewById(R.id.nav_distance);
-        mDistanceUnits = (TextView) findViewById(R.id.nav_distance_units);
-        mStreet = (TextView) findViewById(R.id.nav_street);
-    }
-
-    public void setDistanceToNextManeuver(String distance, String units) {
-        mDistance.setText(distance);
-        mDistanceUnits.setText(units);
-    }
-
-    public void setStreet(CharSequence street) {
-        mStreet.setText(street);
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MediaAppInfo.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MediaAppInfo.java
deleted file mode 100644
index 3f1e004..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MediaAppInfo.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2016, 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.cluster.sample;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.util.Log;
-
-/**
- * An immutable class which hold the the information about the currently connected media app.
- */
-public class MediaAppInfo {
-    private static final String TAG = DebugUtil.getTag(MediaAppInfo.class);
-
-    private int mAccentColor;
-
-    public MediaAppInfo(Context context, String packageName) {
-        try {
-            PackageManager packageManager = context.getPackageManager();
-            ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName,
-                    PackageManager.GET_META_DATA);
-
-            fetchAppColors(packageName, appInfo.theme, context);
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.e(TAG, "Got a component that doesn't exist (" + packageName + ")");
-        }
-    }
-
-    public int getMediaClientAccentColor() {
-        return mAccentColor;
-    }
-
-    private void fetchAppColors(String packageName, int appTheme, Context context) {
-        TypedArray ta = null;
-        try {
-            Context packageContext = context.createPackageContext(packageName, 0);
-            packageContext.setTheme(appTheme);
-            Resources.Theme theme = packageContext.getTheme();
-            ta = theme.obtainStyledAttributes(new int[]{ android.R.attr.colorAccent });
-            mAccentColor = ta.getColor(1,
-                    context.getResources().getColor(android.R.color.holo_green_light));
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.e(TAG, "Unable to update media client package attributes.", e);
-        } finally {
-            if (ta != null) {
-                ta.recycle();
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MediaStateMonitor.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MediaStateMonitor.java
deleted file mode 100644
index 2b68d07..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MediaStateMonitor.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample;
-
-import static com.android.car.cluster.sample.DebugUtil.DEBUG;
-
-import android.content.Context;
-import android.media.MediaMetadata;
-import android.media.session.MediaController;
-import android.media.session.MediaSessionManager;
-import android.media.session.MediaSessionManager.OnActiveSessionsChangedListener;
-import android.media.session.PlaybackState;
-import android.util.Log;
-
-import java.lang.ref.WeakReference;
-import java.util.List;
-
-/**
- * Reports current media status to instrument cluster renderer through {@link MediaStateListener}
- */
-public class MediaStateMonitor {
-
-    private final static String TAG = DebugUtil.getTag(MediaStateMonitor.class);
-
-    private final Context mContext;
-    private final MediaListener mMediaListener;
-    private MediaController mPrimaryMediaController;
-    private OnActiveSessionsChangedListener mActiveSessionsChangedListener;
-    private MediaSessionManager mMediaSessionManager;
-    private MediaStateListener mListener;
-
-    public MediaStateMonitor(Context context, MediaStateListener listener) {
-        mListener = listener;
-        mContext = context;
-        mMediaListener = new MediaListener(this);
-        mActiveSessionsChangedListener = controllers -> onActiveSessionsChanged(controllers);
-        mMediaSessionManager = mContext.getSystemService(MediaSessionManager.class);
-        mMediaSessionManager.addOnActiveSessionsChangedListener(
-                mActiveSessionsChangedListener, null);
-
-        onActiveSessionsChanged(mMediaSessionManager.getActiveSessions(null));
-    }
-
-    private void onActiveSessionsChanged(List<MediaController> controllers) {
-        if (DEBUG) {
-            Log.d(TAG, "onActiveSessionsChanged, controllers found:  " + controllers.size());
-        }
-        MediaController newPrimaryController = null;
-        if (!controllers.isEmpty()) {
-            newPrimaryController = controllers.get(0);
-            if (mPrimaryMediaController == newPrimaryController) {
-                // Primary media controller has not been changed.
-                return;
-            }
-        }
-
-        releasePrimaryMediaController();
-
-        if (newPrimaryController != null) {
-            mPrimaryMediaController = newPrimaryController;
-            mPrimaryMediaController.registerCallback(mMediaListener);
-            mListener.onMediaAppChanged(
-                    new MediaAppInfo(mContext, mPrimaryMediaController.getPackageName()));
-        }
-        updateRendererMediaStatusIfAvailable();
-    }
-
-    public void release() {
-        releasePrimaryMediaController();
-        if (mActiveSessionsChangedListener != null) {
-            mMediaSessionManager.removeOnActiveSessionsChangedListener(
-                    mActiveSessionsChangedListener);
-            mActiveSessionsChangedListener = null;
-        }
-        mMediaSessionManager = null;
-    }
-
-    private void releasePrimaryMediaController() {
-        if (mPrimaryMediaController != null) {
-            mPrimaryMediaController.unregisterCallback(mMediaListener);
-            mPrimaryMediaController = null;
-        }
-    }
-
-    private void updateRendererMediaStatusIfAvailable() {
-        mListener.onMetadataChanged(
-                mPrimaryMediaController == null ? null : mPrimaryMediaController.getMetadata());
-        mListener.onPlaybackStateChanged(
-                mPrimaryMediaController == null
-                ? null : mPrimaryMediaController.getPlaybackState());
-    }
-
-    private void onPlaybackStateChanged(PlaybackState state) {
-        mListener.onPlaybackStateChanged(state);
-    }
-
-    private void onMetadataChanged(MediaMetadata metadata) {
-        mListener.onMetadataChanged(metadata);
-    }
-
-    public interface MediaStateListener {
-        void onPlaybackStateChanged(PlaybackState playbackState);
-        void onMetadataChanged(MediaMetadata metadata);
-        void onMediaAppChanged(MediaAppInfo mediaAppPackage);
-    }
-
-    private static class MediaListener extends MediaController.Callback {
-        private final WeakReference<MediaStateMonitor> mServiceRef;
-
-        MediaListener(MediaStateMonitor service) {
-            mServiceRef = new WeakReference<>(service);
-        }
-
-        @Override
-        public void onPlaybackStateChanged(PlaybackState state) {
-            MediaStateMonitor service = mServiceRef.get();
-            if (service != null) {
-                service.onPlaybackStateChanged(state);
-            }
-        }
-
-        @Override
-        public void onMetadataChanged(MediaMetadata metadata) {
-            MediaStateMonitor service = mServiceRef.get();
-            if (service != null) {
-                service.onMetadataChanged(metadata);
-            }
-        }
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MessagingConverter.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MessagingConverter.java
deleted file mode 100644
index eddeec7..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MessagingConverter.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample;
-
-import android.app.Notification;
-import android.graphics.Bitmap;
-import android.service.notification.StatusBarNotification;
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.core.app.NotificationCompat.CarExtender;
-import androidx.core.app.NotificationCompat.CarExtender.UnreadConversation;
-
-/**
- * Convert a {@link CarExtender} notification into a {@link MessageContactDetails}
- */
-public class MessagingConverter {
-    private static final String TAG = DebugUtil.getTag(MessagingConverter.class);
-
-    public static boolean canConvert(StatusBarNotification sbn) {
-        Notification notification = sbn.getNotification();
-        if (notification == null) {
-            if (DebugUtil.DEBUG) {
-                Log.d(TAG, "Notification is empty.");
-            }
-            return false;
-        }
-        CarExtender ce = new CarExtender(sbn.getNotification());
-        if (ce.getUnreadConversation() == null) {
-            if (DebugUtil.DEBUG) {
-                Log.d(TAG, "Notification with no messaging component.");
-            }
-            return false;
-        }
-
-        CarExtender.UnreadConversation uc = ce.getUnreadConversation();
-        String[] messages = uc.getMessages();
-        if (messages == null || messages.length == 0) {
-            Log.w(TAG, "Car message notification with no messages.");
-            return false;
-        }
-
-        if (TextUtils.isEmpty(uc.getParticipant())) {
-            Log.w(TAG, "Car message notification with no participant.");
-            return false;
-        }
-
-        if (uc.getReplyPendingIntent() == null) {
-            Log.w(TAG, "Car message notification with no reply intent.");
-            return false;
-        }
-
-        for (String m : messages) {
-            if (m == null) {
-                Log.w(TAG, "Car message with null text.");
-                return false;
-            }
-        }
-        return true;
-    }
-
-    public static MessageContactDetails convert(StatusBarNotification sbn) {
-        CarExtender ce = new CarExtender(sbn.getNotification());
-        UnreadConversation uc = ce.getUnreadConversation();
-
-        Bitmap largeIcon = ce.getLargeIcon();
-        if (largeIcon == null) {
-            largeIcon = sbn.getNotification().largeIcon;
-        }
-        String name = uc.getParticipant();
-
-        return new MessageContactDetails(largeIcon, name);
-    }
-
-    public static class MessageContactDetails {
-        private final Bitmap mContactImage;
-        private final String mContactName;
-
-        private MessageContactDetails(Bitmap contactImage, String contactName) {
-            mContactImage = contactImage;
-            mContactName = contactName;
-        }
-
-        public Bitmap getContactImage() {
-            return mContactImage;
-        }
-
-        public String getContactName() {
-            return mContactName;
-        }
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MessagingNotificationHandler.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MessagingNotificationHandler.java
deleted file mode 100644
index e88ee46..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MessagingNotificationHandler.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample;
-
-import static com.android.car.cluster.sample.DebugUtil.DEBUG;
-
-import android.app.Notification;
-import android.os.Handler;
-import android.os.Message;
-import android.service.notification.StatusBarNotification;
-import android.util.Log;
-
-import com.android.car.cluster.sample.MessagingConverter.MessageContactDetails;
-
-/**
- * Handles messaging {@link StatusBarNotification}.
- */
-class MessagingNotificationHandler extends Handler {
-    private static final String TAG = DebugUtil.getTag(MessagingNotificationHandler.class);
-
-    private final ClusterView mClusterView;
-
-    MessagingNotificationHandler(ClusterView cluster) {
-        mClusterView = cluster;
-    }
-
-    @Override
-    public void handleMessage(Message msg) {
-        if (DEBUG) {
-            Log.d(TAG, "NotificationHandler, handleMessage: " + msg);
-        }
-        if (msg.obj instanceof StatusBarNotification) {
-            StatusBarNotification sbn = (StatusBarNotification) msg.obj;
-            Notification notification = sbn.getNotification();
-            if (notification != null) {
-                if (DEBUG) {
-                    Log.d(TAG, "NotificationHandler, notification extras: "
-                            + notification.extras.toString());
-                }
-                if (MessagingConverter.canConvert(sbn)) {
-                    MessageContactDetails data = MessagingConverter.convert(sbn);
-                    mClusterView.handleHangoutMessage(
-                            data.getContactImage(), data.getContactName());
-                } else {
-                    Log.w(TAG, "Can't convert message: " + sbn);
-                }
-            }
-        } else {
-            Log.w(TAG, "Unexpected message with object: " + msg.obj);
-        }
-    }
-}
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/StatusBarNotificationListener.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/StatusBarNotificationListener.java
deleted file mode 100644
index 8758766..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/StatusBarNotificationListener.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample;
-
-import android.content.Intent;
-import android.os.Binder;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.service.notification.NotificationListenerService;
-import android.service.notification.StatusBarNotification;
-import android.util.Log;
-
-/**
- * Listens to status bar notifications and passes it to the listener.
- */
-public class StatusBarNotificationListener extends NotificationListenerService {
-
-    private static final String TAG = DebugUtil.getTag(StatusBarNotificationListener.class);
-
-    static final String ACTION_LOCAL_BINDING = "local_binding";
-
-    private Handler mHandler;
-
-    @Override
-    public void onNotificationPosted(StatusBarNotification sbn) {
-        if (MessagingConverter.canConvert(sbn) && mHandler != null) {
-            Message msg = Message.obtain(mHandler);
-            msg.obj = sbn;
-            mHandler.sendMessage(msg);
-        }
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        Log.d(TAG, "onBind, intent:" + intent);
-
-        return ACTION_LOCAL_BINDING.equals(intent.getAction())
-                ? new LocalBinder() : super.onBind(intent);
-    }
-
-    public void setHandler(Handler handler) {
-        mHandler = handler;
-    }
-
-    public class LocalBinder extends Binder {
-        public StatusBarNotificationListener getService() {
-            return StatusBarNotificationListener.this;
-        }
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/TelecomUtils.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/TelecomUtils.java
deleted file mode 100644
index dfe7cb7..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/TelecomUtils.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample;
-
-/**
- * Utility class to retrieve contact information.
- */
-import android.annotation.Nullable;
-import android.annotation.WorkerThread;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.Context;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.BitmapFactory.Options;
-import android.graphics.Rect;
-import android.net.Uri;
-import android.provider.ContactsContract;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.LruCache;
-
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Locale;
-
-public class TelecomUtils {
-
-    private final static String TAG = DebugUtil.getTag(TelecomUtils.class);
-
-    private static final String[] CONTACT_ID_PROJECTION = new String[] {
-            ContactsContract.PhoneLookup.DISPLAY_NAME,
-            ContactsContract.PhoneLookup.TYPE,
-            ContactsContract.PhoneLookup.LABEL,
-            ContactsContract.PhoneLookup._ID
-    };
-
-    private static LruCache<String, Bitmap> sContactPhotoNumberCache;
-    private static LruCache<Long, Bitmap> sContactPhotoIdCache;
-    private static HashMap<String, Integer> sContactIdCache;
-    private static HashMap<String, String> sFormattedNumberCache;
-    private static HashMap<String, String> sDisplayNameCache;
-    private static HashMap<String, String> sContactNameCache;
-    private static String sVoicemailNumber;
-    private static TelephonyManager sTelephonyManager;
-
-    /**
-     * Fetch contact photo by number from local cache.
-     *
-     * @param number
-     * @return Contact photo if it's in the cache, otherwise null.
-     */
-    @Nullable
-    public static Bitmap getCachedContactPhotoFromNumber(String number) {
-        if (number == null) {
-            return null;
-        }
-
-        if (sContactPhotoNumberCache == null) {
-            sContactPhotoNumberCache = new LruCache<String, Bitmap>(4194304 /** 4 mb **/) {
-                @Override
-                protected int sizeOf(String key, Bitmap value) {
-                    return value.getByteCount();
-                }
-            };
-        } else if (sContactPhotoNumberCache.get(number) != null) {
-            return sContactPhotoNumberCache.get(number);
-        }
-
-        return null;
-    }
-
-    @WorkerThread
-    public static Bitmap getContactPhotoFromNumber(ContentResolver contentResolver, String number) {
-        if (number == null) {
-            return null;
-        }
-
-        Bitmap photo = getCachedContactPhotoFromNumber(number);
-        if (photo != null) {
-            return photo;
-        }
-
-        int id = getContactIdFromNumber(contentResolver, number);
-        if (id == 0) {
-            return null;
-        }
-        photo = getContactPhotoFromId(contentResolver, id);
-        if (photo != null) {
-            sContactPhotoNumberCache.put(number, photo);
-        }
-        return photo;
-    }
-
-    /**
-     * Return the contact id for the given contact id
-     * @param id the contact id to get the photo for
-     * @return the contact photo if it is found, null otherwise.
-     */
-    public static Bitmap getContactPhotoFromId(ContentResolver contentResolver, long id) {
-        if (sContactPhotoIdCache == null) {
-            sContactPhotoIdCache = new LruCache<Long, Bitmap>(4194304 /** 4 mb **/) {
-                @Override
-                protected int sizeOf(Long key, Bitmap value) {
-                    return value.getByteCount();
-                }
-            };
-        } else if (sContactPhotoIdCache.get(id) != null) {
-            return sContactPhotoIdCache.get(id);
-        }
-
-        Uri photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
-        InputStream photoDataStream = ContactsContract.Contacts.openContactPhotoInputStream(
-                contentResolver, photoUri, true);
-
-        Options options = new Options();
-        options.inPreferQualityOverSpeed = true;
-        // Scaling will be handled by later. We shouldn't scale multiple times to avoid
-        // quality lost due to multiple potential scaling up and down.
-        options.inScaled = false;
-
-        Rect nullPadding = null;
-        Bitmap photo = BitmapFactory.decodeStream(photoDataStream, nullPadding, options);
-        if (photo != null) {
-            photo.setDensity(Bitmap.DENSITY_NONE);
-            sContactPhotoIdCache.put(id, photo);
-        }
-        return photo;
-    }
-
-    /**
-     * Return the contact id for the given phone number.
-     * @param number Caller phone number
-     * @return the contact id if it is found, 0 otherwise.
-     */
-    public static int getContactIdFromNumber(ContentResolver cr, String number) {
-        if (number == null || number.isEmpty()) {
-            return 0;
-        }
-        if (sContactIdCache == null) {
-            sContactIdCache = new HashMap<>();
-        } else if (sContactIdCache.containsKey(number)) {
-            return sContactIdCache.get(number);
-        }
-
-
-        Uri uri = Uri.withAppendedPath(
-                ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
-                Uri.encode(number));
-        Cursor cursor = cr.query(uri, CONTACT_ID_PROJECTION, null, null, null);
-
-        try {
-            if (cursor != null && cursor.moveToFirst()) {
-                int id = cursor.getInt(cursor.getColumnIndex(ContactsContract.PhoneLookup._ID));
-                sContactIdCache.put(number, id);
-                return id;
-            }
-        }
-        finally {
-            if (cursor != null) {
-                cursor.close();
-            }
-        }
-        return 0;
-    }
-
-    public static String getVoicemailNumber(Context context) {
-        if (sVoicemailNumber == null) {
-            sVoicemailNumber = getTelephonyManager(context).getVoiceMailNumber();
-        }
-        return sVoicemailNumber;
-    }
-
-    public static TelephonyManager getTelephonyManager(Context context) {
-        if (sTelephonyManager == null) {
-            sTelephonyManager =
-                    (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
-        }
-        return sTelephonyManager;
-    }
-
-    public static String getFormattedNumber(Context context, String number) {
-        Log.d(TAG, "getFormattedNumber: " + number);
-        if (number == null) {
-            return "";
-        }
-
-        if (sFormattedNumberCache == null) {
-            sFormattedNumberCache = new HashMap<>();
-        } else {
-            if (sFormattedNumberCache.containsKey(number)) {
-                return sFormattedNumberCache.get(number);
-            }
-        }
-
-        String countryIso = getTelephonyManager(context).getSimCountryIso().toUpperCase(Locale.US);
-        if (countryIso.length() != 2) {
-            countryIso = Locale.getDefault().getCountry();
-            if (countryIso == null || countryIso.length() != 2) {
-                countryIso = "US";
-            }
-        }
-        Log.d(TAG, "PhoneNumberUtils.formatNumberToE16, number: "
-                + number + ", country: " + countryIso);
-        String e164 = PhoneNumberUtils.formatNumberToE164(number, countryIso);
-        String formattedNumber = PhoneNumberUtils.formatNumber(number, e164, countryIso);
-        formattedNumber = TextUtils.isEmpty(formattedNumber) ? number : formattedNumber;
-        sFormattedNumberCache.put(number, formattedNumber);
-        Log.d(TAG, "getFormattedNumber, result: " + formattedNumber);
-        return formattedNumber;
-    }
-
-    public static String getDisplayName(Context context, String number) {
-        return getDisplayName(context, number, null);
-    }
-
-    private static String getDisplayName(Context context, String number, Uri gatewayOriginalAddress) {
-        Log.d(TAG, "getDisplayName: " + number
-                + ", gatewayOriginalAddress: " + gatewayOriginalAddress);
-        if (sDisplayNameCache == null) {
-            sDisplayNameCache = new HashMap<>();
-        } else {
-            if (sDisplayNameCache.containsKey(number)) {
-                return sDisplayNameCache.get(number);
-            }
-        }
-
-        if (TextUtils.isEmpty(number)) {
-            return context.getString(R.string.unknown);
-        }
-        ContentResolver cr = context.getContentResolver();
-        String name;
-        if (number.equals(getVoicemailNumber(context))) {
-            name = context.getResources().getString(R.string.voicemail);
-        } else {
-            name = getContactNameFromNumber(cr, number);
-        }
-
-        if (name == null) {
-            name = getFormattedNumber(context, number);
-        }
-        if (name == null && gatewayOriginalAddress != null) {
-            name = gatewayOriginalAddress.getSchemeSpecificPart();
-        }
-        if (name == null) {
-            name = context.getString(R.string.unknown);
-        }
-        sDisplayNameCache.put(number, name);
-        return name;
-    }
-
-    private static String getContactNameFromNumber(ContentResolver cr, String number) {
-        if (sContactNameCache == null) {
-            sContactNameCache = new HashMap<>();
-        } else if (sContactNameCache.containsKey(number)) {
-            return sContactNameCache.get(number);
-        }
-
-        Uri uri = Uri.withAppendedPath(
-                ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
-
-        Cursor cursor = null;
-        String name = null;
-        try {
-            cursor = cr.query(uri,
-                    new String[] {ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
-            if (cursor != null && cursor.moveToFirst()) {
-                name = cursor.getString(0);
-                sContactNameCache.put(number, name);
-            }
-        } finally {
-            if (cursor != null) {
-                cursor.close();
-            }
-        }
-        return name;
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/CallCard.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/CallCard.java
deleted file mode 100644
index 4ca58e6..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/CallCard.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample.cards;
-
-import android.animation.TimeInterpolator;
-import android.content.Context;
-import android.graphics.BitmapFactory;
-import android.util.Log;
-import android.view.ViewTreeObserver;
-import android.view.ViewTreeObserver.OnGlobalLayoutListener;
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.widget.Chronometer;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.android.car.cluster.sample.DebugUtil;
-import com.android.car.cluster.sample.R;
-
-/**
- * Card responsible to display current call status.
- */
-public class CallCard extends CardView {
-
-    private final static String TAG = DebugUtil.getTag(CallCard.class);
-
-    private LinearLayout mPhonePanel;
-    private Chronometer mCallDuration;
-    private TextView mContactName;
-    private TextView mCallStatusTextView;
-    private LinearLayout mCallDurationPanel;
-
-    private int mIncomingCallTextHeight;
-    private int mCallDurationTextHeight;
-
-    public int getCallStatus() {
-        return mCallStatus;
-    }
-
-    public @interface CallStatus {
-        int INCOMING_OR_DIALING = 1;
-        int ACTIVE = 2;
-        int DISCONNECTED = 4;
-    }
-
-    @CallStatus
-    private int mCallStatus;
-
-    public CallCard(Context context, PriorityChangedListener listener) {
-        super(context, CardType.PHONE_CALL, listener);
-    }
-
-    @Override
-    protected void init() {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "init");
-        }
-        mCallStatus = CallStatus.INCOMING_OR_DIALING;
-        mPriority = PRIORITY_CALL_INCOMING;
-
-        inflate(R.layout.call_card);
-
-        mPhonePanel = viewById(R.id.phone_text_panel);
-        mCallStatusTextView = viewById(R.id.call_status);
-        mCallDuration = viewById(R.id.call_duration);
-        mContactName = viewById(R.id.contact_name);
-        mCallDurationPanel = viewById(R.id.call_duration_panel);
-        mDetailsPanel = mPhonePanel;
-
-        mLeftIconSwitcher.setVisibility(GONE);
-        mCallDurationPanel.setVisibility(INVISIBLE);
-
-        setRightIcon(
-                BitmapFactory.decodeResource(getResources(), R.drawable.phone), true);
-
-        final ViewTreeObserver observer = mPhonePanel.getViewTreeObserver();
-        // Make sure to get dimensions after layout has been created.
-        observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
-            @Override
-            public void onGlobalLayout() {
-                mPhonePanel.getViewTreeObserver().removeOnGlobalLayoutListener(this);
-                mIncomingCallTextHeight = mCallStatusTextView.getHeight();
-                mCallDurationTextHeight = mCallDuration.getHeight();
-
-                // Call duration is hidden when call is not answered, adjust panel Y pos.
-                mPhonePanel.setTranslationY(mCallDurationTextHeight / 2);
-            }
-        });
-    }
-
-    public void setContactName(String contactName) {
-        mContactName.setText(contactName);
-    }
-
-    public void setStatusLabel(String status) {
-        mCallStatusTextView.setText(status);
-    }
-
-    public void animateCallConnected(long connectedTimestamp) {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "animateCallConnected, current status: " + mCallStatus);
-        }
-        if (mCallStatus == CallStatus.INCOMING_OR_DIALING) {
-            mCallStatus = CallStatus.ACTIVE;
-
-            // Decrease priority after call is answered.
-            runDelayed(3000, new Runnable() {
-                @Override
-                public void run() {
-                    setPriority(PRIORITY_CALL_ACTIVE);
-                }
-            });
-
-            final long duration = 500 * DebugUtil.ANIMATION_FACTOR;
-
-            TimeInterpolator interpolator =
-                    new AccelerateDecelerateInterpolator(getContext(), null);
-
-            mCallDuration.setBase(connectedTimestamp);
-            mCallDuration.start();
-
-            mBackgroundImage.animate()
-                    .alpha(0f)
-                    .setDuration(duration);
-
-            mLeftIconSwitcher.setTranslationX(mLeftPadding);
-            mLeftIconSwitcher.setVisibility(VISIBLE);
-            mRightIconSwitcher.animate()
-                    .translationX(mLeftPadding + mIconsOverlap)
-                    .setInterpolator(interpolator)
-                    .setDuration(duration);
-            setRightIcon(
-                    BitmapFactory.decodeResource(getResources(), R.drawable.phone_active), true);
-            mDetailsPanel.animate()
-                    .translationX(
-                            mLeftPadding + mIconsOverlap + mIconSize + mLeftPadding)
-                    .setInterpolator(interpolator)
-                    .setDuration(duration);
-
-            mCallStatusTextView.animate()
-                    .alpha(0f)
-                    .setDuration(duration);
-
-            mCallDurationPanel.setAlpha(0);
-            mCallDurationPanel.setVisibility(VISIBLE);
-            mCallDurationPanel.animate()
-                    .setDuration(duration)
-                    .alpha(1);
-
-            mPhonePanel.animate()
-                    .translationYBy(-(mIncomingCallTextHeight + mCallDurationTextHeight) / 2)
-                    .setDuration(duration);
-        }
-    }
-
-    public void animateCallDisconnected() {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "animateCallConnected, current status: " + mCallStatus);
-        }
-        if (mCallStatus == CallStatus.ACTIVE) {
-            mCallStatus = CallStatus.DISCONNECTED;
-
-            runDelayed(2000, new Runnable() {
-                @Override
-                public void run() {
-                    setPriority(PRIORITY_GARBAGE);
-                }
-            });
-
-            mCallDuration.stop();
-            final int duration = 500;
-
-            TimeInterpolator interpolator =
-                    new AccelerateDecelerateInterpolator(getContext(), null);
-
-            setRightIcon(
-                    BitmapFactory.decodeResource(getResources(), R.drawable.phone), true);
-            mRightIconSwitcher.animate()
-                    .translationX(mLeftPadding)
-                    .setInterpolator(interpolator)
-                    .setDuration(duration * DebugUtil.ANIMATION_FACTOR)
-                    .withEndAction(new Runnable() {
-                        @Override
-                        public void run() {
-                            mLeftIconSwitcher.setVisibility(GONE);
-                        }
-                    });
-            mDetailsPanel.animate()
-                    .translationX(mLeftPadding + mIconSize + mLeftPadding)
-                    .setInterpolator(interpolator)
-                    .setDuration(duration * DebugUtil.ANIMATION_FACTOR);
-        }
-    }
-
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/CardView.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/CardView.java
deleted file mode 100644
index 06c9fcc..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/CardView.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample.cards;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Bitmap.Config;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Paint.Style;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.PorterDuffXfermode;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.SystemClock;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.ViewGroup;
-import android.view.animation.DecelerateInterpolator;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
-import android.widget.ViewSwitcher;
-
-import com.android.car.cluster.sample.DebugUtil;
-import com.android.car.cluster.sample.R;
-
-/**
- * View that responsible for displaying cards in instrument cluster (including media, phone and
- * maps).
- */
-public class CardView extends FrameLayout implements Comparable<CardView> {
-
-    private final static String TAG = DebugUtil.getTag(CardView.class);
-
-    protected final static long SHOW_ANIMATION_DURATION = 1000 * DebugUtil.ANIMATION_FACTOR;
-
-    protected ImageView mBackgroundImage;
-    protected ViewGroup mDetailsPanel;
-    protected ViewSwitcher mLeftIconSwitcher;
-    protected ViewSwitcher mRightIconSwitcher;
-
-    private Bitmap mBitmap = Bitmap.createBitmap(1, 1, Config.ARGB_8888);
-
-    protected long mLastUpdated = SystemClock.elapsedRealtime();
-
-    private Canvas mCanvas = new Canvas();
-    private final Paint mBackgroundCirclePaint;
-
-    private final static Handler mHandler = new Handler(Looper.getMainLooper());
-
-    protected final int mCardWidth;
-    protected final int mCardHeight;
-    protected final int mCurveRadius;
-    protected final int mTextPanelWidth;
-    protected final float mLeftPadding;
-    protected final float mIconSize;
-    protected final float mIconsOverlap;
-
-    protected int mPriority = 9;
-
-    protected final static int PRIORITY_GARBAGE = 10;
-
-    protected final static int PRIORITY_CALL_INCOMING = 3;
-    protected final static int PRIORITY_CALL_ACTIVE = 5;
-    protected final static int PRIORITY_MEDIA_NOTIFICATION = 3;
-    protected final static int PRIORITY_MEDIA_ACTIVE = 6;
-    protected final static int PRIORITY_WEATHER_CARD = 9;
-    protected final static int PRIORITY_NAVIGATION_ACTIVE = 3;
-    protected final static int PRIORITY_HANGOUT_NOTIFICATION = 3;
-
-    @CardType
-    private int mCardType;
-    private final PriorityChangedListener mPriorityChangedListener;
-
-    public @interface CardType {
-        int WEATHER = 1;
-        int MEDIA = 2;
-        int PHONE_CALL = 3;
-        int NAV = 4;
-        int HANGOUT = 5;
-    }
-
-    public CardView(Context context, @CardType int cardType, PriorityChangedListener listener) {
-        this(context, null, cardType, listener);
-    }
-
-    public CardView(Context context, AttributeSet attrs, @CardType int cardType,
-            PriorityChangedListener listener) {
-        super(context, attrs);
-        mPriorityChangedListener = listener;
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "ctor");
-        }
-        mCardType = cardType;
-
-        setWillNotDraw(false);  // This will trigger onDraw method.
-
-        mBackgroundCirclePaint = createBackgroundCirclePaint();
-        mCardWidth = (int)getResources().getDimension(R.dimen.card_width);
-        mCardHeight = (int) getResources().getDimension(R.dimen.card_height);
-        mTextPanelWidth = (int)getResources().getDimension(R.dimen.card_message_panel_width);
-        mLeftPadding = getResources().getDimension(R.dimen.card_content_left_padding);
-        mIconSize = getResources().getDimension(R.dimen.card_icon_size);
-        mIconsOverlap = mIconSize - mLeftPadding;
-        mCurveRadius = (int)(mCardWidth * 0.643f);
-
-        inflate(getContext(), R.layout.card_view, this);
-
-        if (this.isInEditMode()) {
-            return;
-        }
-
-        mLeftIconSwitcher = viewById(R.id.left_icon_switcher);
-        mRightIconSwitcher = viewById(R.id.right_icon_switcher);
-        mBackgroundImage = viewById(R.id.image_background);
-
-        init();
-    }
-
-    protected void inflate(int layoutId) {
-        inflate(getContext(), layoutId, (ViewGroup) getChildAt(0));
-    }
-
-    protected void init() {
-    }
-
-    @CardType
-    public int getCardType() {
-        return mCardType;
-    }
-
-    public void setLeftIcon(Bitmap bitmap) {
-        setLeftIcon(bitmap, false /* animated */);
-    }
-
-    public void setLeftIcon(Bitmap bitmap, boolean animated) {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "setLeftIcon, bitmap: " + bitmap);
-        }
-        switchImageViewBitmpa(bitmap, mLeftIconSwitcher, animated);
-    }
-
-
-    public void setRightIcon(Bitmap bitmap) {
-        setRightIcon(bitmap, false /* animated */);
-    }
-
-    /**
-     * @param bitmap if null, the image won't be displayed and message panel will be placed
-     * accordingly.
-     */
-    public void setRightIcon(Bitmap bitmap, boolean animated) {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "setRightIcon, bitmap: " + bitmap);
-        }
-        if (bitmap == null && mRightIconSwitcher.getVisibility() == VISIBLE) {
-            mRightIconSwitcher.setVisibility(GONE);
-        } else if (bitmap != null && mRightIconSwitcher.getVisibility() == GONE) {
-            mRightIconSwitcher.setVisibility(VISIBLE);
-        }
-
-        switchImageViewBitmpa(bitmap, mRightIconSwitcher, animated);
-    }
-
-    private void switchImageViewBitmpa(Bitmap bitmap, ViewSwitcher switcher, boolean animated) {
-        ImageView icon = (ImageView) (animated
-                ? switcher.getNextView() : switcher.getCurrentView());
-
-        icon.setBackground(null);
-        icon.setImageBitmap(bitmap);
-
-        if (animated) {
-            switcher.showNext();
-        }
-    }
-
-    /** Called by {@code ClusterView} when card should go away using unreveal animation */
-    public void onPlayUnrevealAnimation() {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "onPlayUnrevealAnimation");
-        }
-    }
-
-    public void onPlayRevealAnimation() {
-        if (DebugUtil.DEBUG) {
-            Log.d(TAG, "onPlayRevealAnimation");
-        }
-
-        if (mLeftIconSwitcher.getVisibility() == VISIBLE) {
-            mLeftIconSwitcher.setTranslationX(mCardWidth / 2);
-            mLeftIconSwitcher.animate()
-                    .translationX(getLeftIconTargetX())
-                    .setDuration(SHOW_ANIMATION_DURATION)
-                    .setInterpolator(getDecelerateInterpolator());
-        }
-
-        if (mRightIconSwitcher.getVisibility() == VISIBLE) {
-            mRightIconSwitcher.setTranslationX( mCardWidth - mTextPanelWidth / 2 - mIconSize);
-            mRightIconSwitcher.animate()
-                    .translationX(getRightIconTargetX())
-                    .setDuration(SHOW_ANIMATION_DURATION)
-                    .setInterpolator(getDecelerateInterpolator());
-        }
-
-        showDetailsPanelAnimation(getDetailsPanelTargetX());
-    }
-
-    protected float getLeftIconTargetX() {
-        return mLeftIconSwitcher.getVisibility() == VISIBLE ? mLeftPadding : 0;
-    }
-
-    protected float getRightIconTargetX() {
-        if (mRightIconSwitcher.getVisibility() != VISIBLE) {
-            return 0;
-        }
-        float x = mLeftPadding;
-        if (mLeftIconSwitcher.getVisibility() == VISIBLE) {
-            x += mIconsOverlap;
-        }
-        return  x;
-    }
-
-    protected float getDetailsPanelTargetX() {
-        return Math.max(getLeftIconTargetX(), getRightIconTargetX()) + mIconSize + mLeftPadding;
-    }
-
-    protected void showDetailsPanelAnimation(float textX) {
-        if (mDetailsPanel != null) {
-            mDetailsPanel.setTranslationX(mCardWidth - mTextPanelWidth / 2);
-            mDetailsPanel.animate()
-                    .translationX(textX)
-                    .setDuration(SHOW_ANIMATION_DURATION)
-                    .setInterpolator(getDecelerateInterpolator());
-        }
-    }
-
-    protected DecelerateInterpolator getDecelerateInterpolator() {
-        return new DecelerateInterpolator(2f);
-    }
-
-    public void setBackground(Bitmap bmpPicture, int backgroundColor) {
-        Bitmap bmpBackground = Bitmap.createBitmap(
-                mCardWidth,
-                (int)getResources().getDimension(R.dimen.card_height),
-                Config.ARGB_8888);
-        Canvas canvas = new Canvas(bmpBackground);
-        //clear previous drawings
-        canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
-
-        Paint p = new Paint();
-        p.setColor(backgroundColor);
-        p.setAntiAlias(true);
-        p.setStyle(Style.FILL);
-        // Draw curved background.
-        canvas.drawCircle(mCurveRadius, (int)getResources().getDimension(
-                R.dimen.card_height) / 2,
-                mCurveRadius, p);
-
-        // Draw image respecting curved background.
-        p.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
-        float x = canvas.getWidth() - bmpPicture.getWidth();
-        float y = canvas.getHeight() - bmpPicture.getHeight();
-        if (y < 0) {
-            y = y / 2; // Center image if it is not fitting.
-        }
-        canvas.drawBitmap(bmpPicture, x, y, p);
-
-        mBackgroundImage.setScaleType(ScaleType.CENTER_CROP);
-        mBackgroundImage.setImageBitmap(bmpBackground);
-        if (mBackgroundImage.getVisibility() != VISIBLE) {
-            mBackgroundImage.setVisibility(VISIBLE);
-        }
-    }
-
-    public void setBackgroundColor(int color) {
-        mBackgroundCirclePaint.setColor(color);
-    }
-
-    private Paint createBackgroundCirclePaint() {
-        Paint p = new Paint();
-        p.setAntiAlias(true);
-        p.setXfermode(new PorterDuffXfermode(Mode.ADD));
-        p.setStyle(Style.FILL);
-        p.setColor(getResources().getColor(R.color.cluster_active_area_background, null));
-        return p;
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-
-        if(mBitmap.isRecycled() || mBitmap.getWidth() != canvas.getWidth()
-                || mBitmap.getHeight() != canvas.getHeight()) {
-            Log.d(TAG, "creating bitmap...");
-            mBitmap.recycle();
-            mBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Config.ARGB_8888);
-            mCanvas.setBitmap(mBitmap);
-        }
-
-        //clear previous drawings
-        mCanvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
-
-        mCanvas.drawCircle(mCurveRadius, getHeight() / 2, mCurveRadius, mBackgroundCirclePaint);
-
-        canvas.drawBitmap(mBitmap, 0, 0, null);
-    }
-
-    public int getIconSize() {
-        return (int)mIconSize;
-    }
-
-    public static void runDelayed(long delay, final Runnable task) {
-        mHandler.postDelayed(task, delay);
-    }
-
-    public void setPriority(int priority) {
-        mPriority = priority;
-        mPriorityChangedListener.onPriorityChanged(this, priority);
-    }
-
-    /**
-     * Should return number from 0 to 9. 0 - is most important, 9 is less important.
-     */
-    public int getPriority() {
-        return mPriority;
-    }
-
-    public boolean isGarbage() {
-        return getPriority() == PRIORITY_GARBAGE;
-    }
-
-    public void removeGracefully() {
-        setPriority(PRIORITY_GARBAGE);
-    }
-
-    @Override
-    public int compareTo(CardView another) {
-        int res = this.getPriority() - another.getPriority();
-        if (res == 0) {
-            // If objects have the same priorities, check the last time they were updated.
-            res = this.mLastUpdated > another.mLastUpdated ? -1 : 1;
-            if (DebugUtil.DEBUG) {
-                Log.d(TAG, "Found card with the same priority: " + this + " and " + another + ","
-                        + "this.mLastUpdated: " + mLastUpdated
-                        + ", another.mLastUpdated:" + another.mLastUpdated + ", res: " + res);
-
-            }
-        }
-        return res;
-    }
-
-    @SuppressWarnings("unchecked")
-    protected <E> E viewById(int id) {
-        return (E) findViewById(id);
-    }
-
-    public interface PriorityChangedListener {
-        void onPriorityChanged(CardView cardView, int newPriority);
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/MediaCard.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/MediaCard.java
deleted file mode 100644
index a20dffe..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/MediaCard.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample.cards;
-
-import android.animation.TimeInterpolator;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.PorterDuff;
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.widget.LinearLayout;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import com.android.car.cluster.sample.DebugUtil;
-import com.android.car.cluster.sample.R;
-
-/**
- * Card responsible to display media content.
- */
-public class MediaCard extends CardView {
-
-    private LinearLayout mMediaPanel;
-    private ProgressBar mProgressBar;
-    private TextView mTitle;
-    private TextView mSubtitle;
-
-    public MediaCard(Context context, PriorityChangedListener listener) {
-        super(context, CardType.MEDIA, listener);
-    }
-
-    @Override
-    protected void init() {
-        inflate(R.layout.media_card);
-
-        mPriority = PRIORITY_MEDIA_NOTIFICATION;
-
-        mMediaPanel = viewById(R.id.message_panel);
-        mProgressBar = viewById(R.id.progress_bar);
-        mTitle = viewById(R.id.media_title);
-        mSubtitle = viewById(R.id.media_subtitle);
-
-        mDetailsPanel = mMediaPanel;
-        mLeftIconSwitcher.setVisibility(GONE);
-    }
-
-    @Override
-    public void onPlayRevealAnimation() {
-        super.onPlayRevealAnimation();
-
-        // Decrease priority once notification animation is complete.
-        runDelayed(3000, new Runnable() {
-            @Override
-            public void run() {
-                setPriority(PRIORITY_MEDIA_ACTIVE);
-            }
-        });
-
-        if (mBackgroundImage.getVisibility() != GONE) {
-            runDelayed(SHOW_ANIMATION_DURATION + 3000, new Runnable() {
-                @Override
-                public void run() {
-                    animateBackgroundFadeOut();
-                }
-            });
-        }
-    }
-
-    private void animateBackgroundFadeOut() {
-        TimeInterpolator interpolator =
-                new AccelerateDecelerateInterpolator(getContext(), null);
-
-        long duration = 500 * DebugUtil.ANIMATION_FACTOR;
-
-        mBackgroundImage.animate()
-                .alpha(0f)
-                .setDuration(duration);
-
-        mLeftIconSwitcher.setTranslationX(mLeftPadding);
-        mLeftIconSwitcher.setVisibility(VISIBLE);
-        mRightIconSwitcher.animate()
-                .translationX(mLeftPadding + mIconsOverlap)
-                .setInterpolator(interpolator)
-                .setDuration(duration);
-
-        mDetailsPanel.animate()
-                .translationX(
-                        mLeftPadding + mIconsOverlap + mIconSize + mLeftPadding)
-                .setInterpolator(interpolator)
-                .setDuration(duration);
-
-    }
-
-    public void setProgressColor(int color) {
-        mProgressBar.getIndeterminateDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
-        mProgressBar.setProgressTintList(ColorStateList.valueOf(color));
-    }
-
-    public void setProgress(int progress) {
-        if (progress == -1) {
-            mProgressBar.setIndeterminate(true);
-            return;
-        } else {
-            mProgressBar.setIndeterminate(false);
-        }
-
-        if (progress > 100) {
-            progress = 100;
-        }
-        if (progress < 0) {
-            progress = 0;
-        }
-        mProgressBar.setProgress(progress);
-    }
-
-    public void setTitle(String album) {
-        mTitle.setText(album);
-    }
-
-    public void setSubtitle(String track) {
-        mSubtitle.setText(track);
-    }
-
-    public String getTitle() {
-        return mTitle.getText() == null ? null : String.valueOf(mTitle.getText());
-    }
-
-    public String getSubtitle() {
-        return mSubtitle.getText() == null ? null : String.valueOf(mSubtitle.getText());
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/MessageCard.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/MessageCard.java
deleted file mode 100644
index 7a878da..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/MessageCard.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample.cards;
-
-import android.content.Context;
-import android.graphics.BitmapFactory;
-import android.util.AttributeSet;
-import android.widget.TextView;
-
-import com.android.car.cluster.sample.R;
-
-/**
- * Card that represents hangout notification.
- */
-public class MessageCard extends CardView {
-
-    private TextView mContactName;
-
-    public MessageCard(Context context, PriorityChangedListener listener) {
-        this(context, null, CardType.HANGOUT, listener);
-    }
-
-    public MessageCard(Context context, AttributeSet attrs, @CardType int cardType,
-            PriorityChangedListener listener) {
-        super(context, attrs, cardType, listener);
-    }
-
-    @Override
-    protected void init() {
-        super.init();
-
-        inflate(R.layout.hangout_layout);
-
-        mDetailsPanel = viewById(R.id.msg_text_panel);
-        mContactName = viewById(R.id.msg_card_contact_name);
-        setRightIcon(BitmapFactory.decodeResource(getResources(), R.drawable.hangouts_icon));
-
-        mPriority = PRIORITY_HANGOUT_NOTIFICATION;
-
-        // Remove this notification in 5 seconds.
-        runDelayed(5000, new Runnable() {
-            @Override
-            public void run() {
-                removeGracefully();
-            }
-        });
-    }
-
-    public void setContactName(String contactName) {
-        mContactName.setText(contactName);
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/NavCard.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/NavCard.java
deleted file mode 100644
index 0253184..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/NavCard.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample.cards;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.ViewSwitcher;
-import android.widget.ViewSwitcher.ViewFactory;
-
-import com.android.car.cluster.sample.ManeuverPanel;
-import com.android.car.cluster.sample.R;
-
-/**
- * Card responsible for showing navigation.
- */
-public class NavCard extends CardView {
-
-    private ViewSwitcher mDirectionsSwitcher;
-
-    public NavCard(Context context, PriorityChangedListener listener) {
-        this(context, null, CardType.NAV, listener);
-    }
-
-    public NavCard(Context context, AttributeSet attrs, @CardType int cardType,
-            PriorityChangedListener listener) {
-        super(context, attrs, cardType, listener);
-
-    }
-
-    @Override
-    protected void init() {
-        inflate(R.layout.nav_card);
-
-        mPriority = PRIORITY_NAVIGATION_ACTIVE;
-
-        mDirectionsSwitcher = viewById(R.id.nav_directions_switcher);
-        mDetailsPanel = mDirectionsSwitcher;
-
-        mDirectionsSwitcher.setFactory(new ViewFactory() {
-            @Override
-            public View makeView() {
-                return new ManeuverPanel(getContext());
-            }
-        });
-
-        setRightIcon(null);  // To hide it.
-    }
-
-    public void setDistanceToNextManeuver(String distance, String units) {
-        ManeuverPanel maneuver = (ManeuverPanel) mDirectionsSwitcher.getCurrentView();
-        maneuver.setDistanceToNextManeuver(distance, units);
-    }
-
-    public void setStreet(CharSequence street) {
-        ManeuverPanel maneuver = (ManeuverPanel) mDirectionsSwitcher.getNextView();
-        maneuver.setStreet(street);
-        mDirectionsSwitcher.showNext();
-    }
-
-    public void setManeuverImage(Bitmap maneuverImage) {
-        setLeftIcon(maneuverImage, true /* animated */);
-    }
-
-    @Override
-    public void onPlayRevealAnimation() {
-        super.onPlayRevealAnimation();
-    }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/WeatherCard.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/WeatherCard.java
deleted file mode 100644
index 8ab6b24..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/WeatherCard.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2016 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.cluster.sample.cards;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.view.animation.DecelerateInterpolator;
-import android.widget.ImageView;
-
-import com.android.car.cluster.sample.DebugUtil;
-import com.android.car.cluster.sample.R;
-
-/**
- * Sample card responsible for displaying weather content.
- */
-public class WeatherCard extends CardView {
-
-    private ImageView mFarCloudImage;
-    private ImageView mNearCloudImage;
-
-    public WeatherCard(Context context, PriorityChangedListener listener) {
-        super(context, CardType.WEATHER, listener);
-    }
-
-    @Override
-    protected void init() {
-        inflate(R.layout.weather_card);
-
-        mPriority = PRIORITY_WEATHER_CARD;
-        mFarCloudImage = viewById(R.id.weather_far_cloud);
-        mNearCloudImage = viewById(R.id.weather_near_cloud);
-
-        mDetailsPanel = viewById(R.id.weather_panel);;
-        Bitmap theSun = BitmapFactory.decodeResource(getResources(), R.drawable.sun_154);
-        setLeftIcon(theSun);
-        mLeftIconSwitcher.setVisibility(VISIBLE);
-        ((ImageView)mRightIconSwitcher.getCurrentView()).setImageDrawable(
-                getResources().getDrawable(R.drawable.cloud_154_shadow, null));
-        mRightIconSwitcher.setVisibility(VISIBLE);
-    }
-
-    @Override
-    public void onPlayRevealAnimation() {
-        super.onPlayRevealAnimation();
-        long duration = SHOW_ANIMATION_DURATION * DebugUtil.ANIMATION_FACTOR;
-
-        mNearCloudImage.setTranslationX(400);
-        mNearCloudImage.animate()
-                .translationX(0)
-                .setDuration(duration)
-                .setInterpolator(new DecelerateInterpolator(2f));
-
-        // Far cloud needs to travel less in screen coordinates so it will make it slower.
-        mFarCloudImage.setTranslationX(100);
-        mFarCloudImage.animate()
-                .translationX(0)
-                .setDuration(duration)
-                .setInterpolator(new DecelerateInterpolator(2f));
-    }
-
-    @Override
-    protected float getRightIconTargetX() {
-        return super.getRightIconTargetX() - 22;
-    }
-
-    @Override
-    protected float getDetailsPanelTargetX() {
-        return super.getDetailsPanelTargetX() - 70;
-    }
-}
diff --git a/tests/carservice_test/src/com/android/car/MockedVmsTestBase.java b/tests/carservice_test/src/com/android/car/MockedVmsTestBase.java
index 2028958..7214f8b 100644
--- a/tests/carservice_test/src/com/android/car/MockedVmsTestBase.java
+++ b/tests/carservice_test/src/com/android/car/MockedVmsTestBase.java
@@ -41,6 +41,8 @@
 import com.android.car.vehiclehal.VehiclePropValueBuilder;
 import com.android.car.vehiclehal.test.MockedVehicleHal;
 
+import org.junit.Before;
+
 import java.util.List;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.CountDownLatch;
@@ -76,10 +78,8 @@
                 .addAreaConfig(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL, 0, 0);
     }
 
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-
+    @Before
+    public void setUpVms() throws Exception {
         // Trigger VmsClientManager to bind to the MockPublisherClient
         getContext().sendBroadcastAsUser(new Intent(Intent.ACTION_USER_UNLOCKED), UserHandle.ALL);
 
@@ -125,16 +125,12 @@
         return mVmsSubscriberManager;
     }
 
-    Pair<VmsLayer, byte[]> receiveDataMessage() throws InterruptedException {
-        return receiveWithTimeout(mSubscriberClient.mMessages);
-    }
-
-    VmsAvailableLayers receiveLayerAvailability() throws InterruptedException {
-        return receiveWithTimeout(mSubscriberClient.mAvailableLayers);
-    }
-
-    MockPublisherClient getMockPublisherClient() throws InterruptedException {
-        sPublisherIsReady.await(2L, TimeUnit.SECONDS);
+    MockPublisherClient getMockPublisherClient() {
+        try {
+            sPublisherIsReady.await(2L, TimeUnit.SECONDS);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
         return sPublisherClient;
     }
 
@@ -163,7 +159,7 @@
             mSubscriptionState.add(subscriptionState);
         }
 
-        VmsSubscriptionState receiveSubscriptionState() throws InterruptedException {
+        VmsSubscriptionState receiveSubscriptionState() {
             return receiveWithTimeout(mSubscriptionState);
         }
     }
@@ -184,11 +180,11 @@
             mAvailableLayers.add(availableLayers);
         }
 
-        Pair<VmsLayer, byte[]> receiveMessage() throws InterruptedException {
+        Pair<VmsLayer, byte[]> receiveMessage() {
             return receiveWithTimeout(mMessages);
         }
 
-        VmsAvailableLayers receiveLayerAvailability() throws InterruptedException {
+        VmsAvailableLayers receiveLayerAvailability() {
             return receiveWithTimeout(mAvailableLayers);
         }
     }
@@ -219,12 +215,16 @@
                             .build());
         }
 
-        VehiclePropValue receiveMessage() throws InterruptedException {
+        VehiclePropValue receiveMessage() {
             return receiveWithTimeout(mMessages);
         }
     }
 
-    private static <T> T receiveWithTimeout(BlockingQueue<T> queue) throws InterruptedException {
-        return queue.poll(2L, TimeUnit.SECONDS);
+    private static <T> T receiveWithTimeout(BlockingQueue<T> queue) {
+        try {
+            return queue.poll(2L, TimeUnit.SECONDS);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
     }
 }
diff --git a/tests/carservice_test/src/com/android/car/VmsPublisherSubscriberTest.java b/tests/carservice_test/src/com/android/car/VmsPublisherSubscriberTest.java
index 82b89ec..87cf1b8 100644
--- a/tests/carservice_test/src/com/android/car/VmsPublisherSubscriberTest.java
+++ b/tests/carservice_test/src/com/android/car/VmsPublisherSubscriberTest.java
@@ -18,107 +18,582 @@
 
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 
 import android.car.vms.VmsAssociatedLayer;
 import android.car.vms.VmsAvailableLayers;
 import android.car.vms.VmsLayer;
 import android.car.vms.VmsLayerDependency;
 import android.car.vms.VmsLayersOffering;
+import android.car.vms.VmsSubscriberManager;
+import android.car.vms.VmsSubscriptionState;
 import android.util.Pair;
 
 import androidx.test.filters.MediumTest;
 
+import org.junit.Before;
 import org.junit.Test;
 
-import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
+import java.util.function.Supplier;
+import java.util.function.ToIntFunction;
 
 @MediumTest
 public class VmsPublisherSubscriberTest extends MockedVmsTestBase {
-    private static final int LAYER_ID = 88;
-    private static final int LAYER_VERSION = 19;
-    private static final int LAYER_SUBTYPE = 55;
-    private static final String TAG = "VmsPubSubTest";
+    private static final VmsLayer SUBSCRIPTION_LAYER = new VmsLayer(1, 1, 1);
+    private static final VmsLayer SUBSCRIPTION_LAYER_OTHER = new VmsLayer(2, 1, 1);
 
-    // The expected publisher ID is 0 since it the expected assigned ID from the VMS core.
-    public static final int EXPECTED_PUBLISHER_ID = 0;
-    public static final VmsLayer LAYER = new VmsLayer(LAYER_ID, LAYER_SUBTYPE, LAYER_VERSION);
-    public static final VmsAssociatedLayer ASSOCIATED_LAYER =
-            new VmsAssociatedLayer(LAYER, new HashSet<>(Arrays.asList(EXPECTED_PUBLISHER_ID)));
-    public static final byte[] PAYLOAD = new byte[]{2, 3, 5, 7, 11, 13, 17};
+    private static final byte[] PAYLOAD = {0xa, 0xb};
+    private static final byte[] PAYLOAD_OTHER = {0xb, 0xc};
 
-    private static final List<VmsAssociatedLayer> AVAILABLE_ASSOCIATED_LAYERS =
-            new ArrayList<>(Arrays.asList(ASSOCIATED_LAYER));
-    private static final VmsAvailableLayers AVAILABLE_LAYERS_WITH_SEQ =
-            new VmsAvailableLayers(
-                    new HashSet(AVAILABLE_ASSOCIATED_LAYERS), 1);
+    private static final byte[] PUBLISHER_INFO = {0x0};
+    private static final byte[] PUBLISHER_INFO_OTHER = {0x1};
 
+    private static final int UNKNOWN_PUBLISHER = 99999;
 
-    private static final int SUBSCRIBED_LAYER_ID = 89;
-    public static final VmsLayer SUBSCRIBED_LAYER =
-            new VmsLayer(SUBSCRIBED_LAYER_ID, LAYER_SUBTYPE, LAYER_VERSION);
-    public static final VmsAssociatedLayer ASSOCIATED_SUBSCRIBED_LAYER =
-            new VmsAssociatedLayer(SUBSCRIBED_LAYER,
-                    new HashSet<>(Arrays.asList(EXPECTED_PUBLISHER_ID)));
-    private static final List<VmsAssociatedLayer>
-            AVAILABLE_ASSOCIATED_LAYERS_WITH_SUBSCRIBED_LAYER =
-            new ArrayList<>(Arrays.asList(ASSOCIATED_LAYER, ASSOCIATED_SUBSCRIBED_LAYER));
-    private static final VmsAvailableLayers AVAILABLE_LAYERS_WITH_SUBSCRIBED_LAYER_WITH_SEQ =
-            new VmsAvailableLayers(
-                    new HashSet(AVAILABLE_ASSOCIATED_LAYERS_WITH_SUBSCRIBED_LAYER), 1);
+    private MockPublisherClient mPublisher;
+    private VmsSubscriberManager mSubscriber;
+    private MockSubscriberClient mSubscriberClient;
 
-    /*
-     * This test method subscribes to a layer and triggers
-     * VmsPublisherClientMockService.onVmsSubscriptionChange. In turn, the mock service will publish
-     * a message, which is validated in this test.
-     */
-    @Test
-    public void testPublisherToSubscriber() throws Exception {
-        getSubscriberManager().subscribe(LAYER);
-
-        int publisherId = getMockPublisherClient().getPublisherId(PAYLOAD);
-        getMockPublisherClient().publish(LAYER, publisherId, PAYLOAD);
-
-        Pair<VmsLayer, byte[]> dataMessage = receiveDataMessage();
-        assertEquals(LAYER, dataMessage.first);
-        assertArrayEquals(PAYLOAD, dataMessage.second);
+    @Before
+    public void setUpClients() {
+        mPublisher = getMockPublisherClient();
+        mSubscriber = getSubscriberManager();
+        mSubscriberClient = getMockSubscriberClient();
     }
 
-    /**
-     * The Mock service will get a publisher ID by sending its information when it will get
-     * ServiceReady as well as on SubscriptionChange. Since clients are not notified when
-     * publishers are assigned IDs, this test waits until the availability is changed which
-     * indicates
-     * that the Mock service has gotten its ServiceReady and publisherId.
-     */
     @Test
-    public void testPublisherInfo() throws Exception {
-        int publisherId = getMockPublisherClient().getPublisherId(PAYLOAD);
-        byte[] info = getSubscriberManager().getPublisherInfo(publisherId);
-        assertArrayEquals(PAYLOAD, info);
+    public void testPublisherInfo_Unregistered() {
+        assertEquals(0, mSubscriber.getPublisherInfo(UNKNOWN_PUBLISHER).length);
     }
 
-    /*
-     * The Mock service offers all the subscribed layers as available layers.
-     * In this test the client subscribes to a layer and verifies that it gets the
-     * notification that it is available.
-     */
     @Test
-    public void testAvailabilityWithSubscription() throws Exception {
-        int publisherId = getMockPublisherClient().getPublisherId(PAYLOAD);
-        getMockPublisherClient().setLayersOffering(new VmsLayersOffering(
-                new HashSet<>(Arrays.asList(
-                        new VmsLayerDependency(LAYER),
-                        new VmsLayerDependency(SUBSCRIBED_LAYER))),
+    public void testPublisherInfo_Registered() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        assertArrayEquals(PUBLISHER_INFO, mSubscriber.getPublisherInfo(publisherId));
+    }
+
+    @Test
+    public void testPublisherId_AlreadyRegistered() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO);
+        assertEquals(publisherId, publisherId2);
+    }
+
+    @Test
+    public void testPublisherId_MultiplePublishers() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+        assertNotEquals(publisherId, publisherId2);
+        assertArrayEquals(PUBLISHER_INFO, mSubscriber.getPublisherInfo(publisherId));
+        assertArrayEquals(PUBLISHER_INFO_OTHER, mSubscriber.getPublisherInfo(publisherId2));
+    }
+
+    @Test
+    public void testLayerAvailability_Default() {
+        VmsAvailableLayers availableLayers = mSubscriber.getAvailableLayers();
+        assertEquals(Collections.emptySet(), availableLayers.getAssociatedLayers());
+        assertEquals(0, availableLayers.getSequence());
+    }
+
+    @Test
+    public void testLayerAvailability() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+                new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
+
+        assertLayerAvailability(1,
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)));
+    }
+
+    @Test
+    public void testLayerAvailability_Overwrite() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+                new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
+        mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+                new VmsLayerDependency(SUBSCRIPTION_LAYER_OTHER, Collections.emptySet())),
                 publisherId));
 
-        Set<VmsAssociatedLayer> associatedLayers =
-                AVAILABLE_LAYERS_WITH_SUBSCRIBED_LAYER_WITH_SEQ.getAssociatedLayers();
-        assertEquals(associatedLayers, receiveLayerAvailability().getAssociatedLayers());
-        assertEquals(associatedLayers,
-                getSubscriberManager().getAvailableLayers().getAssociatedLayers());
+        assertLayerAvailability(2,
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
+                        Collections.singleton(publisherId)));
+    }
+
+    @Test
+    public void testLayerAvailability_MultiplePublishers_SameLayer() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+        mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+                new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
+        mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+                new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId2));
+
+        assertLayerAvailability(2,
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER,
+                        new HashSet<>(Arrays.asList(publisherId, publisherId2))));
+    }
+
+    @Test
+    public void testLayerAvailability_MultiplePublishers_MultipleLayers() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+        mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+                new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
+        mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+                new VmsLayerDependency(SUBSCRIPTION_LAYER_OTHER, Collections.emptySet())),
+                publisherId2));
+
+        assertLayerAvailability(2,
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)),
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
+                        Collections.singleton(publisherId2)));
+    }
+
+    @Test
+    public void testLayerAvailability_MultiplePublishers_Remove() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+        mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+                new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
+        mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+                new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId2));
+
+        mPublisher.setLayersOffering(new VmsLayersOffering(Collections.emptySet(), publisherId2));
+
+        assertLayerAvailability(3,
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)));
+    }
+
+    @Test
+    public void testLayerAvailability_MultiplePublishers_Overwrite() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+        mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+                new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
+        mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+                new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId2));
+
+        mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+                new VmsLayerDependency(SUBSCRIPTION_LAYER_OTHER, Collections.emptySet())),
+                publisherId2));
+
+        assertLayerAvailability(3,
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)),
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
+                        Collections.singleton(publisherId2)));
+    }
+
+    @Test
+    public void testStartMonitoring() {
+        mSubscriber.startMonitoring();
+        assertNull(mPublisher.receiveSubscriptionState());
+
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+    }
+
+    @Test
+    public void testStartMonitoring_AfterPublish() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+
+        mSubscriber.startMonitoring();
+        assertNull(mSubscriberClient.receiveMessage());
+    }
+
+    @Test
+    public void testStartMonitoring_MultipleLayers() {
+        mSubscriber.startMonitoring();
+
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+        mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId, PAYLOAD_OTHER);
+        assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
+    }
+
+    @Test
+    public void testStartMonitoring_MultiplePublishers() {
+        mSubscriber.startMonitoring();
+
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+        int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId2, PAYLOAD_OTHER);
+        assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD_OTHER);
+    }
+
+    @Test
+    public void testStopMonitoring() {
+        mSubscriber.startMonitoring();
+        mSubscriber.stopMonitoring();
+        assertNull(mPublisher.receiveSubscriptionState());
+
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertNull(mSubscriberClient.receiveMessage());
+    }
+
+    @Test
+    public void testSubscribe() {
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+        assertSubscriptionState(1, SUBSCRIPTION_LAYER);
+
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+    }
+
+    @Test
+    public void testSubscribe_AfterPublish() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+
+        assertSubscriptionState(1, SUBSCRIPTION_LAYER);
+        assertNull(mSubscriberClient.receiveMessage());
+    }
+
+    @Test
+    public void testSubscribe_MultipleLayers() {
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER);
+        assertSubscriptionState(2, SUBSCRIPTION_LAYER, SUBSCRIPTION_LAYER_OTHER);
+
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+        mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId, PAYLOAD_OTHER);
+        assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
+    }
+
+    @Test
+    public void testSubscribe_MultiplePublishers() {
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+        assertSubscriptionState(1, SUBSCRIPTION_LAYER);
+
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+        int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId2, PAYLOAD_OTHER);
+        assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD_OTHER);
+    }
+
+    @Test
+    public void testSubscribe_MultipleLayers_MultiplePublishers() {
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER);
+        assertSubscriptionState(2, SUBSCRIPTION_LAYER, SUBSCRIPTION_LAYER_OTHER);
+
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+        int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+        mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId2, PAYLOAD_OTHER);
+        assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
+    }
+
+    @Test
+    public void testSubscribe_ClearCallback() {
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+        mSubscriber.clearVmsSubscriberClientCallback();
+
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertNull(mSubscriberClient.receiveMessage());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void testSubscribe_NoCallback() {
+        mSubscriber.clearVmsSubscriberClientCallback();
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+    }
+
+    @Test
+    public void testUnsubscribe() {
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+        mSubscriber.unsubscribe(SUBSCRIPTION_LAYER);
+        assertSubscriptionState(2, Collections.emptySet(), Collections.emptySet());
+
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertNull(mSubscriberClient.receiveMessage());
+    }
+
+    @Test
+    public void testUnsubscribe_MultipleLayers() {
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER);
+        mSubscriber.unsubscribe(SUBSCRIPTION_LAYER);
+        assertSubscriptionState(3, SUBSCRIPTION_LAYER_OTHER);
+
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertNull(mSubscriberClient.receiveMessage());
+
+        mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId, PAYLOAD_OTHER);
+        assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
+    }
+
+    @Test
+    public void testUnsubscribe_MultiplePublishers() {
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER);
+        mSubscriber.unsubscribe(SUBSCRIPTION_LAYER);
+        assertSubscriptionState(3, SUBSCRIPTION_LAYER_OTHER);
+
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertNull(mSubscriberClient.receiveMessage());
+
+        int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId2, PAYLOAD_OTHER);
+        assertNull(mSubscriberClient.receiveMessage());
+    }
+
+    @Test
+    public void testUnsubscribe_NotSubscribed() {
+        mSubscriber.unsubscribe(SUBSCRIPTION_LAYER);
+        assertNull(mPublisher.receiveSubscriptionState());
+
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertNull(mSubscriberClient.receiveMessage());
+    }
+
+    @Test
+    public void testSubscribeToPublisher() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+        assertSubscriptionState(1,
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)));
+
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+    }
+
+    @Test
+    public void testSubscribeToPublisher_AfterPublish() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+
+        assertSubscriptionState(1,
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)));
+
+        assertNull(mSubscriberClient.receiveMessage());
+    }
+
+    @Test
+    public void testSubscribeToPublisher_MultipleLayers() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER, publisherId);
+
+        assertSubscriptionState(2,
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)),
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
+                        Collections.singleton(publisherId)));
+
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+        mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId, PAYLOAD_OTHER);
+        assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
+    }
+
+    @Test
+    public void testSubscribeToPublisher_MultiplePublishers() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+        assertSubscriptionState(1,
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)));
+
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId2, PAYLOAD_OTHER);
+        assertNull(mSubscriberClient.receiveMessage());
+    }
+
+    @Test
+    public void testSubscribeToPublisher_MultipleLayers_MultiplePublishers() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER, publisherId2);
+        assertSubscriptionState(2,
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)),
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
+                        Collections.singleton(publisherId2)));
+
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+        mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId2, PAYLOAD_OTHER);
+        assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
+    }
+
+    @Test
+    public void testSubscribeToPublisher_UnknownPublisher() {
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER, UNKNOWN_PUBLISHER);
+
+        assertSubscriptionState(1,
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER,
+                        Collections.singleton(UNKNOWN_PUBLISHER)));
+    }
+
+    @Test
+    public void testSubscribeToPublisher_ClearCallback() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+        mSubscriber.clearVmsSubscriberClientCallback();
+
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertNull(mSubscriberClient.receiveMessage());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void testSubscribeToPublisher_NoCallback() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+        mSubscriber.clearVmsSubscriberClientCallback();
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+    }
+
+    @Test
+    public void testUnsubscribeToPublisher() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+        mSubscriber.unsubscribe(SUBSCRIPTION_LAYER, publisherId);
+        assertSubscriptionState(2, Collections.emptySet(), Collections.emptySet());
+
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertNull(mSubscriberClient.receiveMessage());
+    }
+
+    @Test
+    public void testUnsubscribeToPublisher_MultipleLayers() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER, publisherId);
+        mSubscriber.unsubscribe(SUBSCRIPTION_LAYER, publisherId);
+        assertSubscriptionState(3,
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
+                        Collections.singleton(publisherId)));
+
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertNull(mSubscriberClient.receiveMessage());
+
+        mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId, PAYLOAD_OTHER);
+        assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
+    }
+
+    @Test
+    public void testUnsubscribeToPublisher_MultiplePublishers() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+        int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+        mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId2);
+        mSubscriber.unsubscribe(SUBSCRIPTION_LAYER, publisherId);
+        assertSubscriptionState(3,
+                new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId2)));
+
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertNull(mSubscriberClient.receiveMessage());
+
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId2, PAYLOAD_OTHER);
+        assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD_OTHER);
+    }
+
+    @Test
+    public void testUnsubscribeToPublisher_NotSubscribed() {
+        int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+        mSubscriber.unsubscribe(SUBSCRIPTION_LAYER, publisherId);
+        assertNull(mPublisher.receiveSubscriptionState());
+
+        mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+        assertNull(mSubscriberClient.receiveMessage());
+    }
+
+    @Test
+    public void testUnsubscribeToPublisher_UnknownPublisher() {
+        mSubscriber.unsubscribe(SUBSCRIPTION_LAYER, UNKNOWN_PUBLISHER);
+        assertNull(mPublisher.receiveSubscriptionState());
+    }
+
+    private void assertLayerAvailability(int sequenceNumber,
+            VmsAssociatedLayer... associatedLayers) {
+        VmsAvailableLayers availableLayers = receiveWithSequence(
+                getMockSubscriberClient()::receiveLayerAvailability,
+                VmsAvailableLayers::getSequence,
+                sequenceNumber);
+        assertEquals(availableLayers, mSubscriber.getAvailableLayers());
+        assertEquals(new HashSet<>(Arrays.asList(associatedLayers)),
+                availableLayers.getAssociatedLayers());
+    }
+
+    private void assertSubscriptionState(int sequenceNumber, VmsLayer... layers) {
+        assertSubscriptionState(sequenceNumber, new HashSet<>(Arrays.asList(layers)),
+                Collections.emptySet());
+    }
+
+    private void assertSubscriptionState(int sequenceNumber,
+            VmsAssociatedLayer... associatedLayers) {
+        assertSubscriptionState(sequenceNumber, Collections.emptySet(),
+                new HashSet<>(Arrays.asList(associatedLayers)));
+    }
+
+    private void assertSubscriptionState(int sequenceNumber, Set<VmsLayer> layers,
+            Set<VmsAssociatedLayer> associatedLayers) {
+        VmsSubscriptionState subscriptionState = receiveWithSequence(
+                mPublisher::receiveSubscriptionState,
+                VmsSubscriptionState::getSequenceNumber,
+                sequenceNumber);
+        assertEquals(layers, subscriptionState.getLayers());
+        assertEquals(associatedLayers, subscriptionState.getAssociatedLayers());
+    }
+
+    private static <T> T receiveWithSequence(Supplier<T> supplierFunction,
+            ToIntFunction<T> sequenceNumberFn, int sequenceNumber) {
+        T obj = null;
+        for (int seq = 1; seq <= sequenceNumber; seq++) {
+            obj = supplierFunction.get();
+            assertNotNull(obj);
+            assertEquals(seq, sequenceNumberFn.applyAsInt(obj));
+        }
+        return obj;
+    }
+
+    private void assertDataMessage(VmsLayer layer, byte[] payload) {
+        Pair<VmsLayer, byte[]> message = mSubscriberClient.receiveMessage();
+        assertEquals(layer, message.first);
+        assertArrayEquals(payload, message.second);
     }
 }