diff --git a/androidx-car/Android.bp b/androidx-car/Android.bp
deleted file mode 100644
index ec9738f..0000000
--- a/androidx-car/Android.bp
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-// Copyright (C) 2020 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package {
-    default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-android_library_import {
-    name: "androidx.car_car-resources-partially-dejetified-nodeps",
-    aars: ["androidx-car-resources.aar"],
-    sdk_version: "current",
-    static_libs: [
-        "com.google.android.material_material",
-        "androidx.appcompat_appcompat",
-        "androidx.cardview_cardview",
-        "androidx.recyclerview_recyclerview",
-        "androidx.gridlayout_gridlayout",
-        "androidx.preference_preference",
-        "androidx-constraintlayout_constraintlayout",
-    ],
-}
-android_library {
-    name: "androidx.car_car-resources-partially-dejetified",
-    sdk_version: "current",
-    min_sdk_version: "21",
-    manifest: "AndroidManifest.xml",
-    static_libs: [
-        "androidx.car_car-resources-partially-dejetified-nodeps",
-        "com.google.android.material_material",
-        "androidx.appcompat_appcompat",
-        "androidx.cardview_cardview",
-        "androidx.recyclerview_recyclerview",
-        "androidx.gridlayout_gridlayout",
-        "androidx.preference_preference",
-        "androidx-constraintlayout_constraintlayout",
-    ],
-    java_version: "1.7",
-}
diff --git a/androidx-car/AndroidManifest.xml b/androidx-car/AndroidManifest.xml
deleted file mode 100644
index 87ef2c9..0000000
--- a/androidx-car/AndroidManifest.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2020 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="androidx.car" >
-
-    <uses-sdk
-        android:minSdkVersion="21"
-        android:targetSdkVersion="28" />
-
-</manifest>
diff --git a/androidx-car/androidx-car-resources.aar b/androidx-car/androidx-car-resources.aar
deleted file mode 100755
index 8f8aeaf..0000000
--- a/androidx-car/androidx-car-resources.aar
+++ /dev/null
Binary files differ
diff --git a/car-assist-client-lib/Android.bp b/car-assist-client-lib/Android.bp
deleted file mode 100644
index 465254e..0000000
--- a/car-assist-client-lib/Android.bp
+++ /dev/null
@@ -1,37 +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 {
-    default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-android_library {
-    name: "car-assist-client-lib",
-
-    srcs: ["src/**/*.java"],
-
-    resource_dirs: ["res"],
-
-    optimize: {
-        enabled: false,
-    },
-
-    static_libs: [
-        "androidx.legacy_legacy-support-v4",
-        "car-assist-lib",
-    ],
-
-}
diff --git a/car-assist-client-lib/AndroidManifest.xml b/car-assist-client-lib/AndroidManifest.xml
deleted file mode 100644
index 62d2f4d..0000000
--- a/car-assist-client-lib/AndroidManifest.xml
+++ /dev/null
@@ -1,19 +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="com.android.car.assist.client">
-</manifest>
diff --git a/car-assist-client-lib/OWNERS b/car-assist-client-lib/OWNERS
deleted file mode 100644
index 185f5c6..0000000
--- a/car-assist-client-lib/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-# People who can approve changes for submission.
-igorr@google.com
-uokoye@google.com
diff --git a/car-assist-client-lib/res/values-af/strings.xml b/car-assist-client-lib/res/values-af/strings.xml
deleted file mode 100644
index d6e54fe..0000000
--- a/car-assist-client-lib/res/values-af/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Kon nie handeling deur Assistent versoek nie!"</string>
-    <string name="says" msgid="8575666015622916107">"sê"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-am/strings.xml b/car-assist-client-lib/res/values-am/strings.xml
deleted file mode 100644
index 2f0855b..0000000
--- a/car-assist-client-lib/res/values-am/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"ከረዳት እርምጃ መጠየቅ አልተቻለም!"</string>
-    <string name="says" msgid="8575666015622916107">"እንዲህ ይላሉ"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-ar/strings.xml b/car-assist-client-lib/res/values-ar/strings.xml
deleted file mode 100644
index 8252183..0000000
--- a/car-assist-client-lib/res/values-ar/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"تعذَّر طلَب إجراء من \"مساعد Google\"."</string>
-    <string name="says" msgid="8575666015622916107">"يقول"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-as/strings.xml b/car-assist-client-lib/res/values-as/strings.xml
deleted file mode 100644
index eec6ebd..0000000
--- a/car-assist-client-lib/res/values-as/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Assistantএ কামটো কৰিব নোৱাৰিলে!"</string>
-    <string name="says" msgid="8575666015622916107">"এ কৈছে"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-az/strings.xml b/car-assist-client-lib/res/values-az/strings.xml
deleted file mode 100644
index 386d253..0000000
--- a/car-assist-client-lib/res/values-az/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Assistentdən əməliyyat sorğulamaq mümkün olmadı!"</string>
-    <string name="says" msgid="8575666015622916107">"deyir"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-b+sr+Latn/strings.xml b/car-assist-client-lib/res/values-b+sr+Latn/strings.xml
deleted file mode 100644
index eaa8a69..0000000
--- a/car-assist-client-lib/res/values-b+sr+Latn/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Slanje zahteva za radnju Pomoćnika nije uspelo!"</string>
-    <string name="says" msgid="8575666015622916107">"kaže"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-be/strings.xml b/car-assist-client-lib/res/values-be/strings.xml
deleted file mode 100644
index a35d999..0000000
--- a/car-assist-client-lib/res/values-be/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Не ўдалося папрасіць Памочніка выканаць дзеянне."</string>
-    <string name="says" msgid="8575666015622916107">"гаворыць"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-bg/strings.xml b/car-assist-client-lib/res/values-bg/strings.xml
deleted file mode 100644
index 26f63a4..0000000
--- a/car-assist-client-lib/res/values-bg/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Не можа да се заяви действие от Асистент!"</string>
-    <string name="says" msgid="8575666015622916107">"казва"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-bn/strings.xml b/car-assist-client-lib/res/values-bn/strings.xml
deleted file mode 100644
index 22ac99f..0000000
--- a/car-assist-client-lib/res/values-bn/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"নির্দেশ অনুসারে Assistant কাজ করতে পারেনি!"</string>
-    <string name="says" msgid="8575666015622916107">"বলেছেন"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-bs/strings.xml b/car-assist-client-lib/res/values-bs/strings.xml
deleted file mode 100644
index 8f87241..0000000
--- a/car-assist-client-lib/res/values-bs/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Nije zatražena akcija Asistenta!"</string>
-    <string name="says" msgid="8575666015622916107">"kaže"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-ca/strings.xml b/car-assist-client-lib/res/values-ca/strings.xml
deleted file mode 100644
index 78437cb..0000000
--- a/car-assist-client-lib/res/values-ca/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"No s\'ha pogut sol·licitar l\'acció a l\'Assistent."</string>
-    <string name="says" msgid="8575666015622916107">"diu"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-cs/strings.xml b/car-assist-client-lib/res/values-cs/strings.xml
deleted file mode 100644
index 8f54a84..0000000
--- a/car-assist-client-lib/res/values-cs/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Nebylo možné požádat Asistenta o akci."</string>
-    <string name="says" msgid="8575666015622916107">"říká"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-da/strings.xml b/car-assist-client-lib/res/values-da/strings.xml
deleted file mode 100644
index 38dc862..0000000
--- a/car-assist-client-lib/res/values-da/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Handlingen kunne ikke håndteres af Assistent."</string>
-    <string name="says" msgid="8575666015622916107">"siger"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-de/strings.xml b/car-assist-client-lib/res/values-de/strings.xml
deleted file mode 100644
index 8f553cb..0000000
--- a/car-assist-client-lib/res/values-de/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Aktion konnte nicht vom Assistant angefordert werden."</string>
-    <string name="says" msgid="8575666015622916107">"sagt"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-el/strings.xml b/car-assist-client-lib/res/values-el/strings.xml
deleted file mode 100644
index 9bdc6ee..0000000
--- a/car-assist-client-lib/res/values-el/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Δεν ήταν δυνατό το αίτημα για ενέργεια στον Βοηθό!"</string>
-    <string name="says" msgid="8575666015622916107">"λέει"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-en-rAU/strings.xml b/car-assist-client-lib/res/values-en-rAU/strings.xml
deleted file mode 100644
index 2f5a3b7..0000000
--- a/car-assist-client-lib/res/values-en-rAU/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Could not request action from Assistant!"</string>
-    <string name="says" msgid="8575666015622916107">"says"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-en-rCA/strings.xml b/car-assist-client-lib/res/values-en-rCA/strings.xml
deleted file mode 100644
index 2f5a3b7..0000000
--- a/car-assist-client-lib/res/values-en-rCA/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Could not request action from Assistant!"</string>
-    <string name="says" msgid="8575666015622916107">"says"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-en-rGB/strings.xml b/car-assist-client-lib/res/values-en-rGB/strings.xml
deleted file mode 100644
index 2f5a3b7..0000000
--- a/car-assist-client-lib/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Could not request action from Assistant!"</string>
-    <string name="says" msgid="8575666015622916107">"says"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-en-rIN/strings.xml b/car-assist-client-lib/res/values-en-rIN/strings.xml
deleted file mode 100644
index 2f5a3b7..0000000
--- a/car-assist-client-lib/res/values-en-rIN/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Could not request action from Assistant!"</string>
-    <string name="says" msgid="8575666015622916107">"says"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-en-rXC/strings.xml b/car-assist-client-lib/res/values-en-rXC/strings.xml
deleted file mode 100644
index d6611c0..0000000
--- a/car-assist-client-lib/res/values-en-rXC/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‎‏‎‎‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‏‏‎‏‏‎‎‎‎‎‏‏‏‎‏‎‎‏‎‎‎‎‎‏‎‎Could not request action from Assistant!‎‏‎‎‏‎"</string>
-    <string name="says" msgid="8575666015622916107">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‏‏‏‎‎‎‏‎‏‏‎‏‏‎‎‏‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‏‏‎says‎‏‎‎‏‎"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-es-rUS/strings.xml b/car-assist-client-lib/res/values-es-rUS/strings.xml
deleted file mode 100644
index 307e7ec..0000000
--- a/car-assist-client-lib/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"No se pudo solicitar la acción del Asistente"</string>
-    <string name="says" msgid="8575666015622916107">"dice"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-es/strings.xml b/car-assist-client-lib/res/values-es/strings.xml
deleted file mode 100644
index e4e7e97..0000000
--- a/car-assist-client-lib/res/values-es/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"No se ha podido solicitar la acción al Asistente."</string>
-    <string name="says" msgid="8575666015622916107">"dice"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-et/strings.xml b/car-assist-client-lib/res/values-et/strings.xml
deleted file mode 100644
index 91363e6..0000000
--- a/car-assist-client-lib/res/values-et/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Assistendilt ei õnnestunud toimingut taotleda."</string>
-    <string name="says" msgid="8575666015622916107">"ütleb"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-eu/strings.xml b/car-assist-client-lib/res/values-eu/strings.xml
deleted file mode 100644
index 10bdbe1..0000000
--- a/car-assist-client-lib/res/values-eu/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Ezin izan da eskatu Laguntzailea zerbitzuaren ekintza!"</string>
-    <string name="says" msgid="8575666015622916107">"kontaktuak hau dio:"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-fa/strings.xml b/car-assist-client-lib/res/values-fa/strings.xml
deleted file mode 100644
index 00c7f18..0000000
--- a/car-assist-client-lib/res/values-fa/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"نمی‌توانید از «دستیار» بخواهید کاری انجام دهد!"</string>
-    <string name="says" msgid="8575666015622916107">"می‌گوید"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-fi/strings.xml b/car-assist-client-lib/res/values-fi/strings.xml
deleted file mode 100644
index 613428a..0000000
--- a/car-assist-client-lib/res/values-fi/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Toiminnon pyytäminen Assistantilta epäonnistui."</string>
-    <string name="says" msgid="8575666015622916107">"sanoo"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-fr-rCA/strings.xml b/car-assist-client-lib/res/values-fr-rCA/strings.xml
deleted file mode 100644
index 5791a4b..0000000
--- a/car-assist-client-lib/res/values-fr-rCA/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Impossible de demander à l\'Assistant Google d\'effectuer une action!"</string>
-    <string name="says" msgid="8575666015622916107">"dit"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-fr/strings.xml b/car-assist-client-lib/res/values-fr/strings.xml
deleted file mode 100644
index 7004545..0000000
--- a/car-assist-client-lib/res/values-fr/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Impossible de demander à l\'Assistant d\'effectuer cette action."</string>
-    <string name="says" msgid="8575666015622916107">"dit"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-gl/strings.xml b/car-assist-client-lib/res/values-gl/strings.xml
deleted file mode 100644
index baec894..0000000
--- a/car-assist-client-lib/res/values-gl/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Non se puido solicitar a acción ao Asistente."</string>
-    <string name="says" msgid="8575666015622916107">"di"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-gu/strings.xml b/car-assist-client-lib/res/values-gu/strings.xml
deleted file mode 100644
index 63e313c..0000000
--- a/car-assist-client-lib/res/values-gu/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"આસિસ્ટંટને ક્રિયાની વિનંતી કરી શક્યાં નથી!"</string>
-    <string name="says" msgid="8575666015622916107">"કહે છે કે"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-hi/strings.xml b/car-assist-client-lib/res/values-hi/strings.xml
deleted file mode 100644
index ba7afeb..0000000
--- a/car-assist-client-lib/res/values-hi/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Assistant से कार्रवाई का अनुरोध नहीं किया जा सका!"</string>
-    <string name="says" msgid="8575666015622916107">"कहा है कि"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-hr/strings.xml b/car-assist-client-lib/res/values-hr/strings.xml
deleted file mode 100644
index 2da146b..0000000
--- a/car-assist-client-lib/res/values-hr/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Nije bilo moguće zatražiti radnju od Asisitenta!"</string>
-    <string name="says" msgid="8575666015622916107">"kaže"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-hu/strings.xml b/car-assist-client-lib/res/values-hu/strings.xml
deleted file mode 100644
index faa43e0..0000000
--- a/car-assist-client-lib/res/values-hu/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Nem sikerült a Segéd-művelet kérése!"</string>
-    <string name="says" msgid="8575666015622916107">"azt mondja, hogy"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-hy/strings.xml b/car-assist-client-lib/res/values-hy/strings.xml
deleted file mode 100644
index 219b14b..0000000
--- a/car-assist-client-lib/res/values-hy/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Չհաջողվեց Օգնականին խնդրել գործողություն կատարել"</string>
-    <string name="says" msgid="8575666015622916107">"օգտատերն ասում է."</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-in/strings.xml b/car-assist-client-lib/res/values-in/strings.xml
deleted file mode 100644
index cedc390..0000000
--- a/car-assist-client-lib/res/values-in/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Tidak dapat meminta tindakan dari Asisten!"</string>
-    <string name="says" msgid="8575666015622916107">"mengatakan"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-is/strings.xml b/car-assist-client-lib/res/values-is/strings.xml
deleted file mode 100644
index 1162c77..0000000
--- a/car-assist-client-lib/res/values-is/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Ekki tókst að biðja hjálparann um aðgerð!"</string>
-    <string name="says" msgid="8575666015622916107">"segir"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-it/strings.xml b/car-assist-client-lib/res/values-it/strings.xml
deleted file mode 100644
index 4bac32b..0000000
--- a/car-assist-client-lib/res/values-it/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Impossibile richiedere l\'azione all\'assistente"</string>
-    <string name="says" msgid="8575666015622916107">"dice"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-iw/strings.xml b/car-assist-client-lib/res/values-iw/strings.xml
deleted file mode 100644
index dc96640..0000000
--- a/car-assist-client-lib/res/values-iw/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"לא ניתן לבקש מ-Assistant לבצע פעולה!"</string>
-    <string name="says" msgid="8575666015622916107">"רוצה להודיע כי"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-ja/strings.xml b/car-assist-client-lib/res/values-ja/strings.xml
deleted file mode 100644
index 2065208..0000000
--- a/car-assist-client-lib/res/values-ja/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"アシスタント アクションをリクエストできませんでした"</string>
-    <string name="says" msgid="8575666015622916107">"さんからのメッセージです"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-ka/strings.xml b/car-assist-client-lib/res/values-ka/strings.xml
deleted file mode 100644
index 8076df9..0000000
--- a/car-assist-client-lib/res/values-ka/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"ასისტენტისგან ქმედების მოთხოვნა ვერ მოხერხდა"</string>
-    <string name="says" msgid="8575666015622916107">"ამბობს"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-kk/strings.xml b/car-assist-client-lib/res/values-kk/strings.xml
deleted file mode 100644
index b96f97f..0000000
--- a/car-assist-client-lib/res/values-kk/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Assistant әрекетін сұрау мүмкін болмады."</string>
-    <string name="says" msgid="8575666015622916107">"былай дейді:"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-km/strings.xml b/car-assist-client-lib/res/values-km/strings.xml
deleted file mode 100644
index 64d1004..0000000
--- a/car-assist-client-lib/res/values-km/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"មិនអាចស្នើសុំ​សកម្មភាពពី​ជំនួយការបានទេ!"</string>
-    <string name="says" msgid="8575666015622916107">"និយាយថា"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-kn/strings.xml b/car-assist-client-lib/res/values-kn/strings.xml
deleted file mode 100644
index 561840e..0000000
--- a/car-assist-client-lib/res/values-kn/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Assistant ನಿಂದ ಕ್ರಿಯೆಯನ್ನು ವಿನಂತಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ!"</string>
-    <string name="says" msgid="8575666015622916107">"ಹೇಳುತ್ತಾರೆ"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-ko/strings.xml b/car-assist-client-lib/res/values-ko/strings.xml
deleted file mode 100644
index e0bc7e8..0000000
--- a/car-assist-client-lib/res/values-ko/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"어시스턴트에서 요청 작업을 찾을 수 없습니다."</string>
-    <string name="says" msgid="8575666015622916107">"님의 메시지:"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-ky/strings.xml b/car-assist-client-lib/res/values-ky/strings.xml
deleted file mode 100644
index f278353..0000000
--- a/car-assist-client-lib/res/values-ky/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Жардамчы бул аракетти аткара албайт!"</string>
-    <string name="says" msgid="8575666015622916107">"төмөнкүнү айтты:"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-lo/strings.xml b/car-assist-client-lib/res/values-lo/strings.xml
deleted file mode 100644
index 80c7d53..0000000
--- a/car-assist-client-lib/res/values-lo/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"ບໍ່ສາມາດຂໍການດຳເນີນການຈາກຜູ້ຊ່ວຍໄດ້!"</string>
-    <string name="says" msgid="8575666015622916107">"ເວົ້າ"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-lt/strings.xml b/car-assist-client-lib/res/values-lt/strings.xml
deleted file mode 100644
index 87374c1..0000000
--- a/car-assist-client-lib/res/values-lt/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Nepavyko pateikti Padėjėjui veiksmo užklausos!"</string>
-    <string name="says" msgid="8575666015622916107">"sako"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-lv/strings.xml b/car-assist-client-lib/res/values-lv/strings.xml
deleted file mode 100644
index 3223c67..0000000
--- a/car-assist-client-lib/res/values-lv/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Nevarēja pieprasīt darbību no Asistenta."</string>
-    <string name="says" msgid="8575666015622916107">"saka"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-mk/strings.xml b/car-assist-client-lib/res/values-mk/strings.xml
deleted file mode 100644
index 08f56ac..0000000
--- a/car-assist-client-lib/res/values-mk/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Не може да се побара дејство од „Помошникот“!"</string>
-    <string name="says" msgid="8575666015622916107">"вели"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-ml/strings.xml b/car-assist-client-lib/res/values-ml/strings.xml
deleted file mode 100644
index 641ae11..0000000
--- a/car-assist-client-lib/res/values-ml/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Assistant-ൽ നിന്ന് പ്രവർത്തനം അഭ്യർത്ഥിക്കാനായില്ല!"</string>
-    <string name="says" msgid="8575666015622916107">"പറയുന്നു"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-mn/strings.xml b/car-assist-client-lib/res/values-mn/strings.xml
deleted file mode 100644
index 3050b61..0000000
--- a/car-assist-client-lib/res/values-mn/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Туслахаас үйлдэл хийхийг хүсэж чадсангүй!"</string>
-    <string name="says" msgid="8575666015622916107">"хэлэхдээ"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-mr/strings.xml b/car-assist-client-lib/res/values-mr/strings.xml
deleted file mode 100644
index a896ce6..0000000
--- a/car-assist-client-lib/res/values-mr/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"असिस्टंटकडे क्रियेची विनंती करता आली नाही!"</string>
-    <string name="says" msgid="8575666015622916107">"म्हणाले"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-ms/strings.xml b/car-assist-client-lib/res/values-ms/strings.xml
deleted file mode 100644
index aa8192b..0000000
--- a/car-assist-client-lib/res/values-ms/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Tidak dapat meminta tindakan daripada Assistant!"</string>
-    <string name="says" msgid="8575666015622916107">"berkata"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-my/strings.xml b/car-assist-client-lib/res/values-my/strings.xml
deleted file mode 100644
index 54ac60f..0000000
--- a/car-assist-client-lib/res/values-my/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Assistant မှ လုပ်ဆောင်ချက်ကို တောင်းဆို၍မရပါ။"</string>
-    <string name="says" msgid="8575666015622916107">"ဆိုထားသည်မှာ"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-nb/strings.xml b/car-assist-client-lib/res/values-nb/strings.xml
deleted file mode 100644
index 279b16b..0000000
--- a/car-assist-client-lib/res/values-nb/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Kunne ikke forespørre handlinger fra assistenten!"</string>
-    <string name="says" msgid="8575666015622916107">"sier"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-ne/strings.xml b/car-assist-client-lib/res/values-ne/strings.xml
deleted file mode 100644
index d20a73a..0000000
--- a/car-assist-client-lib/res/values-ne/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"सहायकलाई कारबाही गर्ने अनुरोध गर्न सकिएन!"</string>
-    <string name="says" msgid="8575666015622916107">"भन्नुहुन्छ"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-nl/strings.xml b/car-assist-client-lib/res/values-nl/strings.xml
deleted file mode 100644
index aca2bb7..0000000
--- a/car-assist-client-lib/res/values-nl/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Kan actie niet aanvragen bij de Assistent."</string>
-    <string name="says" msgid="8575666015622916107">"zegt"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-or/strings.xml b/car-assist-client-lib/res/values-or/strings.xml
deleted file mode 100644
index 81480e1..0000000
--- a/car-assist-client-lib/res/values-or/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"ଆସିଷ୍ଟାଣ୍ଟ ଠାରୁ କାର୍ଯ୍ୟ ଅନୁରୋଧ କରାଯାଇପାରିଲା ନାହିଁ!"</string>
-    <string name="says" msgid="8575666015622916107">"କୁହେ"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-pa/strings.xml b/car-assist-client-lib/res/values-pa/strings.xml
deleted file mode 100644
index 9b01451..0000000
--- a/car-assist-client-lib/res/values-pa/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Assistant ਤੋਂ ਕਾਰਵਾਈ ਦੀ ਬੇਨਤੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ!"</string>
-    <string name="says" msgid="8575666015622916107">"ਕਿਹਾ"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-pl/strings.xml b/car-assist-client-lib/res/values-pl/strings.xml
deleted file mode 100644
index 4ccfa00..0000000
--- a/car-assist-client-lib/res/values-pl/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Nie udało się wysłać prośby do Asystenta."</string>
-    <string name="says" msgid="8575666015622916107">"mówi"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-pt-rPT/strings.xml b/car-assist-client-lib/res/values-pt-rPT/strings.xml
deleted file mode 100644
index bb902ea..0000000
--- a/car-assist-client-lib/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Não foi possível solicitar a ação do Assistente."</string>
-    <string name="says" msgid="8575666015622916107">"diz"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-pt/strings.xml b/car-assist-client-lib/res/values-pt/strings.xml
deleted file mode 100644
index bb902ea..0000000
--- a/car-assist-client-lib/res/values-pt/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Não foi possível solicitar a ação do Assistente."</string>
-    <string name="says" msgid="8575666015622916107">"diz"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-ro/strings.xml b/car-assist-client-lib/res/values-ro/strings.xml
deleted file mode 100644
index 45cfcb6..0000000
--- a/car-assist-client-lib/res/values-ro/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Nu s-a putut solicita acțiunea de la Asistent!"</string>
-    <string name="says" msgid="8575666015622916107">"spune"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-ru/strings.xml b/car-assist-client-lib/res/values-ru/strings.xml
deleted file mode 100644
index 7c668c1..0000000
--- a/car-assist-client-lib/res/values-ru/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Не удалось выполнить действие с помощью Ассистента"</string>
-    <string name="says" msgid="8575666015622916107">"говорит:"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-si/strings.xml b/car-assist-client-lib/res/values-si/strings.xml
deleted file mode 100644
index 0a233a0..0000000
--- a/car-assist-client-lib/res/values-si/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"සහායකගෙන් ක්‍රියාව ඉල්ලීමට නොහැකි විය!"</string>
-    <string name="says" msgid="8575666015622916107">"කියයි"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-sk/strings.xml b/car-assist-client-lib/res/values-sk/strings.xml
deleted file mode 100644
index 8043b1e..0000000
--- a/car-assist-client-lib/res/values-sk/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Vyžiadanie akcie od Asistenta zlyhalo."</string>
-    <string name="says" msgid="8575666015622916107">"hovorí"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-sl/strings.xml b/car-assist-client-lib/res/values-sl/strings.xml
deleted file mode 100644
index ab58a0a..0000000
--- a/car-assist-client-lib/res/values-sl/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Ni bilo mogoče zahtevati dejanja Pomočnika."</string>
-    <string name="says" msgid="8575666015622916107">"pravi"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-sq/strings.xml b/car-assist-client-lib/res/values-sq/strings.xml
deleted file mode 100644
index acc0431..0000000
--- a/car-assist-client-lib/res/values-sq/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Nuk mund të kërkohet veprim nga \"Asistenti\"!"</string>
-    <string name="says" msgid="8575666015622916107">"thotë"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-sr/strings.xml b/car-assist-client-lib/res/values-sr/strings.xml
deleted file mode 100644
index 7d73ea8..0000000
--- a/car-assist-client-lib/res/values-sr/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Слање захтева за радњу Помоћника није успело!"</string>
-    <string name="says" msgid="8575666015622916107">"каже"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-sv/strings.xml b/car-assist-client-lib/res/values-sv/strings.xml
deleted file mode 100644
index d22371e..0000000
--- a/car-assist-client-lib/res/values-sv/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Det gick inte att begära åtgärden från assistenten."</string>
-    <string name="says" msgid="8575666015622916107">"säger"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-sw/strings.xml b/car-assist-client-lib/res/values-sw/strings.xml
deleted file mode 100644
index dcbddff..0000000
--- a/car-assist-client-lib/res/values-sw/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Imeshndwa kuomba kitendo kutoka kwenye programu ya Mratibu wa Google!"</string>
-    <string name="says" msgid="8575666015622916107">"anasema"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-ta/strings.xml b/car-assist-client-lib/res/values-ta/strings.xml
deleted file mode 100644
index 9317977..0000000
--- a/car-assist-client-lib/res/values-ta/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Assistantடிடம் இருந்து உதவியைக் கோர இயலவில்லை!"</string>
-    <string name="says" msgid="8575666015622916107">"கூறுகிறார்"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-te/strings.xml b/car-assist-client-lib/res/values-te/strings.xml
deleted file mode 100644
index 4d0ad26..0000000
--- a/car-assist-client-lib/res/values-te/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"ఈ చర్యను Assistant నుండి రిక్వెస్ట్ చేయడం సాధ్యపడలేదు!"</string>
-    <string name="says" msgid="8575666015622916107">"ఇలా చెప్పారు"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-th/strings.xml b/car-assist-client-lib/res/values-th/strings.xml
deleted file mode 100644
index d88bdb1..0000000
--- a/car-assist-client-lib/res/values-th/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"การขอให้ Assistant ดำเนินการไม่สำเร็จ"</string>
-    <string name="says" msgid="8575666015622916107">"พูดว่า"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-tl/strings.xml b/car-assist-client-lib/res/values-tl/strings.xml
deleted file mode 100644
index 2bcb098..0000000
--- a/car-assist-client-lib/res/values-tl/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Hindi makahiling ng pagkilos mula sa Assistant!"</string>
-    <string name="says" msgid="8575666015622916107">"ay nagsabing"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-tr/strings.xml b/car-assist-client-lib/res/values-tr/strings.xml
deleted file mode 100644
index 6ef140b..0000000
--- a/car-assist-client-lib/res/values-tr/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"İşlem Asistan\'dan istenemedi!"</string>
-    <string name="says" msgid="8575666015622916107">"der ki:"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-uk/strings.xml b/car-assist-client-lib/res/values-uk/strings.xml
deleted file mode 100644
index 8ba7886..0000000
--- a/car-assist-client-lib/res/values-uk/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Не вдалося надіслати запит на дію Асистента."</string>
-    <string name="says" msgid="8575666015622916107">"говорить"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-ur/strings.xml b/car-assist-client-lib/res/values-ur/strings.xml
deleted file mode 100644
index 5e248a8..0000000
--- a/car-assist-client-lib/res/values-ur/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"\'اسسٹنٹ\' کی طرف سے کارروائی کی درخواست نہیں کی جا سکی!"</string>
-    <string name="says" msgid="8575666015622916107">"کہ رہا ہے"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-uz/strings.xml b/car-assist-client-lib/res/values-uz/strings.xml
deleted file mode 100644
index 3b89e4e..0000000
--- a/car-assist-client-lib/res/values-uz/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Assistent orqali amal soʻrovi yuborilmadi!"</string>
-    <string name="says" msgid="8575666015622916107">"dedi:"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-vi/strings.xml b/car-assist-client-lib/res/values-vi/strings.xml
deleted file mode 100644
index 4832f26..0000000
--- a/car-assist-client-lib/res/values-vi/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Không thể yêu cầu hành động từ Trợ lý!"</string>
-    <string name="says" msgid="8575666015622916107">"nói"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-zh-rCN/strings.xml b/car-assist-client-lib/res/values-zh-rCN/strings.xml
deleted file mode 100644
index 637124f..0000000
--- a/car-assist-client-lib/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"无法从 Google 助理请求操作！"</string>
-    <string name="says" msgid="8575666015622916107">"说"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-zh-rHK/strings.xml b/car-assist-client-lib/res/values-zh-rHK/strings.xml
deleted file mode 100644
index 1c22eee..0000000
--- a/car-assist-client-lib/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"「Google 助理」無法執行要求的操作！"</string>
-    <string name="says" msgid="8575666015622916107">"話"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-zh-rTW/strings.xml b/car-assist-client-lib/res/values-zh-rTW/strings.xml
deleted file mode 100644
index 2b73ccf..0000000
--- a/car-assist-client-lib/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"無法要求 Google 助理執行動作！"</string>
-    <string name="says" msgid="8575666015622916107">"說"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values-zu/strings.xml b/car-assist-client-lib/res/values-zu/strings.xml
deleted file mode 100644
index 1fcd4cc..0000000
--- a/car-assist-client-lib/res/values-zu/strings.xml
+++ /dev/null
@@ -1,21 +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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="assist_action_failed_toast" msgid="3250146468076483714">"Ayikwazanga ukucela isenzo kusuka kumsizi!"</string>
-    <string name="says" msgid="8575666015622916107">"ithi"</string>
-</resources>
diff --git a/car-assist-client-lib/res/values/config.xml b/car-assist-client-lib/res/values/config.xml
deleted file mode 100644
index 16ceea5..0000000
--- a/car-assist-client-lib/res/values/config.xml
+++ /dev/null
@@ -1,20 +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.
--->
-<resources>
-    <!-- Whether FallbackAssistant is enabled. -->
-    <bool name="config_enableFallbackAssistant">false</bool>
-</resources>
diff --git a/car-assist-client-lib/res/values/strings.xml b/car-assist-client-lib/res/values/strings.xml
deleted file mode 100644
index 261c8bc..0000000
--- a/car-assist-client-lib/res/values/strings.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.
--->
-<resources>
-    <!-- The toast message shown on Assistant action failures [CHAR_LIMIT=NONE]-->
-    <string name="assist_action_failed_toast">Could not request action from Assistant!</string>
-    <!-- The verb meaning "to speak". Used when FallbackAssistant is reading out messages from
-     a sender. (i.e. <Sender_name> says <Message>) [CHAR_LIMIT=NONE]-->
-    <string name="says">says</string>
-</resources>
diff --git a/car-assist-client-lib/src/com/android/car/assist/client/BundleBuilder.java b/car-assist-client-lib/src/com/android/car/assist/client/BundleBuilder.java
deleted file mode 100644
index 9428247..0000000
--- a/car-assist-client-lib/src/com/android/car/assist/client/BundleBuilder.java
+++ /dev/null
@@ -1,78 +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 com.android.car.assist.client;
-
-import static com.android.car.assist.CarVoiceInteractionSession.KEY_ACTION;
-import static com.android.car.assist.CarVoiceInteractionSession.KEY_EXCEPTION;
-import static com.android.car.assist.CarVoiceInteractionSession.KEY_FALLBACK_ASSISTANT_ENABLED;
-import static com.android.car.assist.CarVoiceInteractionSession.KEY_NOTIFICATION;
-import static com.android.car.assist.CarVoiceInteractionSession.VOICE_ACTION_HANDLE_EXCEPTION;
-import static com.android.car.assist.CarVoiceInteractionSession.VOICE_ACTION_READ_NOTIFICATION;
-import static com.android.car.assist.CarVoiceInteractionSession.VOICE_ACTION_REPLY_NOTIFICATION;
-
-import android.os.Bundle;
-import android.service.notification.StatusBarNotification;
-
-import com.android.car.assist.CarVoiceInteractionSession.ExceptionValue;
-
-/**
- * Helper class for building Bundle arguments. Used by {@link CarAssistUtils}.
- */
-class BundleBuilder {
-    /**
-     * Returns a {@link Bundle} to be delivered to Assistant to indicate that the notification
-     * should be read out.
-     *
-     * @param notification The notification that will be added to the bundle.
-     * @return The bundle that can be sent to Assistant.
-     */
-    static Bundle buildAssistantReadBundle(StatusBarNotification notification) {
-        Bundle args = new Bundle();
-        args.putString(KEY_ACTION, VOICE_ACTION_READ_NOTIFICATION);
-        args.putParcelable(KEY_NOTIFICATION, notification);
-        return args;
-    }
-
-    /**
-     * Returns a {@link Bundle} to be delivered to Assistant to indicate that the notification
-     * should be replied to.
-     *
-     * @param notification The notification that will be added to the bundle.
-     * @return The bundle that can be sent to Assistant.
-     */
-    static Bundle buildAssistantReplyBundle(StatusBarNotification notification) {
-        Bundle args = new Bundle();
-        args.putString(KEY_ACTION, VOICE_ACTION_REPLY_NOTIFICATION);
-        args.putParcelable(KEY_NOTIFICATION, notification);
-        return args;
-    }
-
-    /**
-     * Returns a {@link Bundle} to be delivered to Assistant to indicate that it should handle
-     * the specified {@input exception}.
-     *
-     * @return The bundle that can be sent to Assistant.
-     */
-    static Bundle buildAssistantHandleExceptionBundle(
-            @ExceptionValue String exception,
-            boolean fallbackAssistantEnabled) {
-        Bundle args = new Bundle();
-        args.putString(KEY_ACTION, VOICE_ACTION_HANDLE_EXCEPTION);
-        args.putString(KEY_EXCEPTION, exception);
-        args.putBoolean(KEY_FALLBACK_ASSISTANT_ENABLED, fallbackAssistantEnabled);
-        return args;
-    }
-}
diff --git a/car-assist-client-lib/src/com/android/car/assist/client/CarAssistUtils.java b/car-assist-client-lib/src/com/android/car/assist/client/CarAssistUtils.java
deleted file mode 100644
index de2871a..0000000
--- a/car-assist-client-lib/src/com/android/car/assist/client/CarAssistUtils.java
+++ /dev/null
@@ -1,466 +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 com.android.car.assist.client;
-
-import static android.app.Notification.Action.SEMANTIC_ACTION_MARK_AS_READ;
-import static android.app.Notification.Action.SEMANTIC_ACTION_REPLY;
-import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_NOTIFICATION;
-
-import static com.android.car.assist.CarVoiceInteractionSession.EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING;
-
-import android.annotation.Nullable;
-import android.app.ActivityManager;
-import android.app.Notification;
-import android.app.RemoteInput;
-import android.content.Context;
-import android.os.Bundle;
-import android.provider.Settings;
-import android.service.notification.StatusBarNotification;
-import android.util.Log;
-
-import androidx.annotation.StringDef;
-import androidx.core.app.NotificationCompat;
-import androidx.core.app.NotificationCompat.Action;
-
-import com.android.car.assist.CarVoiceInteractionSession;
-import com.android.internal.app.AssistUtils;
-import com.android.internal.app.IVoiceActionCheckCallback;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * Util class providing helper methods to interact with the current active voice service,
- * while ensuring that the active voice service has the required permissions.
- */
-public class CarAssistUtils {
-    public static final String TAG = "CarAssistUtils";
-    private static final List<Integer> REQUIRED_SEMANTIC_ACTIONS = Collections.unmodifiableList(
-            Arrays.asList(
-                    SEMANTIC_ACTION_MARK_AS_READ
-            )
-    );
-
-    private static final List<Integer> SUPPORTED_SEMANTIC_ACTIONS = Collections.unmodifiableList(
-            Arrays.asList(
-                    SEMANTIC_ACTION_MARK_AS_READ,
-                    SEMANTIC_ACTION_REPLY
-            )
-    );
-
-    private final Context mContext;
-    private final AssistUtils mAssistUtils;
-    @Nullable
-    private final FallbackAssistant mFallbackAssistant;
-    private final String mErrorMessage;
-    private final boolean mIsFallbackAssistantEnabled;
-
-    /** Interface used to receive callbacks from voice action requests. */
-    public interface ActionRequestCallback {
-        /**
-         * The action was successfully completed either by the active or fallback assistant.
-         **/
-        String RESULT_SUCCESS = "SUCCESS";
-
-        /**
-         * The action was not successfully completed, but the active assistant has been prompted to
-         * alert the user of this error and handle it. The caller of this callback is recommended
-         * to NOT alert the user of this error again.
-         */
-        String RESULT_FAILED_WITH_ERROR_HANDLED = "FAILED_WITH_ERROR_HANDLED";
-
-        /**
-         * The action has not been successfully completed, and the error has not been handled.
-         **/
-        String RESULT_FAILED = "FAILED";
-
-        /**
-         * The list of result states.
-         */
-        @StringDef({RESULT_FAILED, RESULT_FAILED_WITH_ERROR_HANDLED, RESULT_SUCCESS})
-        @interface ResultState {
-        }
-
-        /** Callback containing the result of completing the voice action request. */
-        void onResult(@ResultState String state);
-    }
-
-    public CarAssistUtils(Context context) {
-        mContext = context;
-        mAssistUtils = new AssistUtils(context);
-        mErrorMessage = context.getString(R.string.assist_action_failed_toast);
-
-        mIsFallbackAssistantEnabled =
-                context.getResources().getBoolean(R.bool.config_enableFallbackAssistant);
-        mFallbackAssistant = mIsFallbackAssistantEnabled ? new FallbackAssistant(context) : null;
-    }
-
-    /**
-     * @return {@code true} if there is an active assistant.
-     */
-    public boolean hasActiveAssistant() {
-        return mAssistUtils.getActiveServiceComponentName() != null;
-    }
-
-    /**
-     * Returns {@code true} if the fallback assistant is enabled.
-     */
-    public boolean isFallbackAssistantEnabled() {
-        return mIsFallbackAssistantEnabled;
-    }
-
-    /**
-     * Returns true if the current active assistant has notification listener permissions.
-     */
-    public boolean assistantIsNotificationListener() {
-        if (!hasActiveAssistant()) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "No active assistant was found.");
-            }
-            return false;
-        }
-        final String activeComponent = mAssistUtils.getActiveServiceComponentName()
-                .flattenToString();
-        int slashIndex = activeComponent.indexOf("/");
-        final String activePackage = activeComponent.substring(0, slashIndex);
-
-        final String listeners = Settings.Secure.getStringForUser(mContext.getContentResolver(),
-                Settings.Secure.ENABLED_NOTIFICATION_LISTENERS, ActivityManager.getCurrentUser());
-
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Current user: " + ActivityManager.getCurrentUser()
-                    + " has active voice service: " + activePackage + " and enabled notification "
-                    + " listeners: " + listeners);
-        }
-
-        if (listeners != null) {
-            for (String listener : Arrays.asList(listeners.split(":"))) {
-                if (listener.contains(activePackage)) {
-                    return true;
-                }
-            }
-        }
-        Log.w(TAG, "No notification listeners found for assistant: " + activeComponent);
-        return false;
-    }
-
-    /**
-     * Checks whether the notification is a car-compatible messaging notification.
-     *
-     * @param sbn The notification being checked.
-     * @return true if the notification is a car-compatible messaging notification.
-     */
-    public static boolean isCarCompatibleMessagingNotification(StatusBarNotification sbn) {
-        Notification notification = sbn.getNotification();
-        return hasMessagingStyle(notification)
-                && hasRequiredAssistantCallbacks(notification)
-                && ((getReplyAction(notification) == null)
-                    || replyCallbackHasRemoteInput(notification))
-                && assistantCallbacksShowNoUi(notification);
-    }
-
-    /** Returns true if the semantic action provided can be supported. */
-    public static boolean isSupportedSemanticAction(int semanticAction) {
-        return SUPPORTED_SEMANTIC_ACTIONS.contains(semanticAction);
-    }
-
-    /**
-     * Returns true if the notification has a messaging style.
-     * <p/>
-     * This is the case if the notification in question was provided an instance of
-     * {@link Notification.MessagingStyle} (or an instance of
-     * {@link NotificationCompat.MessagingStyle} if {@link NotificationCompat} was used).
-     */
-    private static boolean hasMessagingStyle(Notification notification) {
-        return NotificationCompat.MessagingStyle
-                .extractMessagingStyleFromNotification(notification) != null;
-    }
-
-    /**
-     * Returns true if the notification has the required Assistant callbacks to be considered
-     * a car-compatible messaging notification. The callbacks must be unambiguous, therefore false
-     * is returned if multiple callbacks exist for any semantic action that is supported.
-     */
-    private static boolean hasRequiredAssistantCallbacks(Notification notification) {
-        List<Integer> semanticActionList = getAllActions(notification)
-                .stream()
-                .map(NotificationCompat.Action::getSemanticAction)
-                .filter(REQUIRED_SEMANTIC_ACTIONS::contains)
-                .collect(Collectors.toList());
-        Set<Integer> semanticActionSet = new HashSet<>(semanticActionList);
-        return semanticActionList.size() == semanticActionSet.size()
-                && semanticActionSet.containsAll(REQUIRED_SEMANTIC_ACTIONS);
-    }
-
-    /** Retrieves visible and invisible {@link Action}s from the {@link Notification}. */
-    public static List<Action> getAllActions(Notification notification) {
-        List<Action> actions = new ArrayList<>(
-                NotificationCompat.getInvisibleActions(notification)
-        );
-        int visibleActionCount = NotificationCompat.getActionCount(notification);
-        for (int i = 0; i < visibleActionCount; i++) {
-            actions.add(NotificationCompat.getAction(notification, i));
-        }
-        return actions;
-    }
-
-    /**
-     * Retrieves the {@link NotificationCompat.Action} containing the
-     * {@link NotificationCompat.Action#SEMANTIC_ACTION_MARK_AS_READ} semantic action.
-     */
-    @Nullable
-    public static NotificationCompat.Action getMarkAsReadAction(Notification notification) {
-        for (NotificationCompat.Action action : getAllActions(notification)) {
-            if (action.getSemanticAction()
-                    == NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ) {
-                return action;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Retrieves the {@link NotificationCompat.Action} containing the
-     * {@link NotificationCompat.Action#SEMANTIC_ACTION_MUTE semantic action.
-     */
-    @Nullable
-    public static NotificationCompat.Action getMuteAction(Notification notification) {
-        for (NotificationCompat.Action action : getAllActions(notification)) {
-            if (action.getSemanticAction() == Action.SEMANTIC_ACTION_MUTE) {
-                return action;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Retrieves the {@link NotificationCompat.Action} containing the
-     * {@link NotificationCompat.Action#SEMANTIC_ACTION_REPLY} semantic action.
-     */
-    @Nullable
-    private static NotificationCompat.Action getReplyAction(Notification notification) {
-        for (NotificationCompat.Action action : getAllActions(notification)) {
-            if (action.getSemanticAction()
-                    == NotificationCompat.Action.SEMANTIC_ACTION_REPLY) {
-                return action;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns true if the reply callback has at least one {@link RemoteInput}.
-     * <p/>
-     * Precondition: There exists only one reply callback.
-     */
-    private static boolean replyCallbackHasRemoteInput(Notification notification) {
-        return getAllActions(notification)
-                .stream()
-                .filter(action -> action.getSemanticAction() == SEMANTIC_ACTION_REPLY)
-                .map(NotificationCompat.Action::getRemoteInputs)
-                .filter(Objects::nonNull)
-                .anyMatch(remoteInputs -> remoteInputs.length > 0);
-    }
-
-    /** Returns true if all Assistant callbacks indicate that they show no UI, false otherwise. */
-    private static boolean assistantCallbacksShowNoUi(final Notification notification) {
-        return getAllActions(notification)
-                .stream()
-                .filter(Objects::nonNull)
-                .filter(action -> SUPPORTED_SEMANTIC_ACTIONS.contains(action.getSemanticAction()))
-                .noneMatch(NotificationCompat.Action::getShowsUserInterface);
-    }
-
-    /**
-     * Requests a given action from the current active Assistant.
-     *
-     * @param sbn         the notification payload to deliver to assistant
-     * @param voiceAction must be a valid {@link CarVoiceInteractionSession} VOICE_ACTION
-     * @param callback    the callback to issue on success/error
-     */
-    public void requestAssistantVoiceAction(StatusBarNotification sbn, String voiceAction,
-            ActionRequestCallback callback) {
-        if (!isCarCompatibleMessagingNotification(sbn)) {
-            Log.w(TAG, "Assistant action requested for non-compatible notification.");
-            callback.onResult(ActionRequestCallback.RESULT_FAILED);
-            return;
-        }
-
-        switch (voiceAction) {
-            case CarVoiceInteractionSession.VOICE_ACTION_READ_NOTIFICATION:
-                readMessageNotification(sbn, callback);
-                return;
-            case CarVoiceInteractionSession.VOICE_ACTION_REPLY_NOTIFICATION:
-                replyMessageNotification(sbn, callback);
-                return;
-            default:
-                Log.w(TAG, "Requested Assistant action for unsupported semantic action.");
-                callback.onResult(ActionRequestCallback.RESULT_FAILED);
-                return;
-        }
-    }
-
-    /**
-     * Requests a read action for the notification from the current active Assistant.
-     * If the Assistant cannot handle the request, a fallback implementation will attempt to
-     * handle it.
-     *
-     * @param sbn      the notification to deliver as the payload
-     * @param callback the callback to issue on success/error
-     */
-    private void readMessageNotification(StatusBarNotification sbn,
-            ActionRequestCallback callback) {
-        Bundle args = BundleBuilder.buildAssistantReadBundle(sbn);
-        String action = CarVoiceInteractionSession.VOICE_ACTION_READ_NOTIFICATION;
-
-        requestAction(action, sbn, args, callback);
-    }
-
-    /**
-     * Requests a reply action for the notification from the current active Assistant.
-     * If the Assistant cannot handle the request, a fallback implementation will attempt to
-     * handle it.
-     *
-     * @param sbn      the notification to deliver as the payload
-     * @param callback the callback to issue on success/error
-     */
-    private void replyMessageNotification(StatusBarNotification sbn,
-            ActionRequestCallback callback) {
-        Bundle args = BundleBuilder.buildAssistantReplyBundle(sbn);
-        String action = CarVoiceInteractionSession.VOICE_ACTION_REPLY_NOTIFICATION;
-
-        requestAction(action, sbn, args, callback);
-    }
-
-    private void requestAction(String action, StatusBarNotification sbn, Bundle payloadArguments,
-            ActionRequestCallback callback) {
-
-        if (!hasActiveAssistant()) {
-            if (mIsFallbackAssistantEnabled) {
-                handleFallback(sbn, action, callback);
-            } else {
-                // If there is no active assistant, and fallback assistant is not enabled, then
-                // there is nothing for us to do.
-                callback.onResult(ActionRequestCallback.RESULT_FAILED);
-            }
-            return;
-        }
-
-        if (!assistantIsNotificationListener()) {
-            if (mIsFallbackAssistantEnabled) {
-                handleFallback(sbn, action, callback);
-            } else {
-                // If there is an active assistant, alert them to request permissions.
-                Bundle handleExceptionBundle = BundleBuilder
-                        .buildAssistantHandleExceptionBundle(
-                                EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING,
-                                /* fallbackAssistantEnabled */ false);
-                fireAssistantAction(CarVoiceInteractionSession.VOICE_ACTION_HANDLE_EXCEPTION,
-                        handleExceptionBundle, callback);
-            }
-            return;
-        }
-
-        fireAssistantAction(action, payloadArguments, callback);
-    }
-
-    private void fireAssistantAction(String action, Bundle payloadArguments,
-            ActionRequestCallback callback) {
-        IVoiceActionCheckCallback actionCheckCallback = new IVoiceActionCheckCallback.Stub() {
-            @Override
-            public void onComplete(List<String> supportedActions) {
-                String resultState = ActionRequestCallback.RESULT_FAILED;
-                if (supportedActions != null && supportedActions.contains(action)) {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Launching active Assistant for action: " + action);
-                    }
-                    if (mAssistUtils.showSessionForActiveService(payloadArguments,
-                            SHOW_SOURCE_NOTIFICATION, null, null)) {
-                        resultState = ActionRequestCallback.RESULT_SUCCESS;
-                    }
-                } else {
-                    Log.w(TAG, "Active Assistant does not support voice action: " + action);
-                }
-                callback.onResult(resultState);
-            }
-        };
-
-        Set<String> actionSet = new HashSet<>(Collections.singletonList(action));
-        mAssistUtils.getActiveServiceSupportedActions(actionSet, actionCheckCallback);
-    }
-
-    private void handleFallback(StatusBarNotification sbn, String action,
-            ActionRequestCallback callback) {
-        if (mFallbackAssistant == null) {
-            return;
-        }
-
-        FallbackAssistant.Listener listener = new FallbackAssistant.Listener() {
-            @Override
-            public void onMessageRead(boolean hasError) {
-                // Tracks if the FallbackAssistant successfully handled the action.
-                final String fallbackActionResult = hasError ? ActionRequestCallback.RESULT_FAILED
-                        : ActionRequestCallback.RESULT_SUCCESS;
-                if (hasActiveAssistant()) {
-                    // If there is an active assistant, alert them to request permissions.
-                    Bundle handleExceptionBundle = BundleBuilder
-                            .buildAssistantHandleExceptionBundle(
-                                    EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING,
-                                    /* fallbackAssistantEnabled */ true);
-                    fireAssistantAction(CarVoiceInteractionSession.VOICE_ACTION_HANDLE_EXCEPTION,
-                            handleExceptionBundle, new ActionRequestCallback() {
-                                @Override
-                                public void onResult(String requestActionFromAssistantResult) {
-                                    if (fallbackActionResult.equals(
-                                            ActionRequestCallback.RESULT_FAILED)
-                                            && requestActionFromAssistantResult
-                                            == ActionRequestCallback.RESULT_SUCCESS) {
-                                        // Only change the callback.ResultState if fallback failed,
-                                        // and assistant session is shown.
-                                        callback.onResult(
-                                                ActionRequestCallback
-                                                        .RESULT_FAILED_WITH_ERROR_HANDLED);
-                                    } else {
-                                        callback.onResult(fallbackActionResult);
-                                    }
-                                }
-                            });
-                } else {
-                    callback.onResult(fallbackActionResult);
-                }
-            }
-        };
-
-        switch (action) {
-            case CarVoiceInteractionSession.VOICE_ACTION_READ_NOTIFICATION:
-                mFallbackAssistant.handleReadAction(sbn, listener);
-                break;
-            case CarVoiceInteractionSession.VOICE_ACTION_REPLY_NOTIFICATION:
-                mFallbackAssistant.handleErrorMessage(mErrorMessage, listener);
-                break;
-            default:
-                Log.w(TAG, "Requested unsupported FallbackAssistant action.");
-                callback.onResult(ActionRequestCallback.RESULT_FAILED);
-                return;
-        }
-    }
-}
diff --git a/car-assist-client-lib/src/com/android/car/assist/client/FallbackAssistant.java b/car-assist-client-lib/src/com/android/car/assist/client/FallbackAssistant.java
deleted file mode 100644
index fe8c5ae..0000000
--- a/car-assist-client-lib/src/com/android/car/assist/client/FallbackAssistant.java
+++ /dev/null
@@ -1,256 +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 com.android.car.assist.client;
-
-
-import android.annotation.Nullable;
-import android.app.ActivityManager;
-import android.app.Notification;
-import android.app.Notification.MessagingStyle.Message;
-import android.app.PendingIntent;
-import android.app.Person;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Parcelable;
-import android.service.notification.StatusBarNotification;
-import android.util.Log;
-import android.widget.Toast;
-
-import androidx.core.app.NotificationCompat;
-
-import com.android.car.assist.client.tts.TextToSpeechHelper;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Handles Assistant request fallbacks in the case that Assistant cannot fulfill the request for
- * any given reason.
- * <p/>
- * Simply reads out the notification messages for read requests, and speaks out
- * an error message for other requests.
- */
-public class FallbackAssistant {
-
-    private static final String TAG = FallbackAssistant.class.getSimpleName();
-
-    private final Context mContext;
-    private final TextToSpeechHelper mTextToSpeechHelper;
-    private final RequestIdGenerator mRequestIdGenerator;
-    private Map<Long, ActionRequestInfo> mRequestIdToActionRequestInfo = new HashMap<>();
-    // String that means "says", to be used when reading out a message (i.e. <Sender> says
-    // <Message).
-    private final String mVerbForSays;
-
-    private final TextToSpeechHelper.Listener mListener = new TextToSpeechHelper.Listener() {
-        @Override
-        public void onTextToSpeechStarted(long requestId) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "onTextToSpeechStarted");
-            }
-        }
-
-        @Override
-        public void onTextToSpeechStopped(long requestId, boolean error) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "onTextToSpeechStopped");
-            }
-
-            if (error) {
-                Toast.makeText(mContext, mContext.getString(R.string.assist_action_failed_toast),
-                        Toast.LENGTH_LONG).show();
-            }
-            finishAction(requestId, error);
-        }
-    };
-
-    /** Listener to allow clients to be alerted when their requested message has been read. **/
-    public interface Listener {
-        /**
-         * Called after the TTS engine has finished reading aloud the message.
-         */
-        void onMessageRead(boolean hasError);
-    }
-
-    public FallbackAssistant(Context context) {
-        mContext = context;
-        mTextToSpeechHelper = new TextToSpeechHelper(context, mListener);
-        mRequestIdGenerator = new RequestIdGenerator();
-        mVerbForSays = mContext.getString(R.string.says);
-    }
-
-    /**
-     * Handles a fallback read action by reading all messages in the notification.
-     *
-     * @param sbn the payload notification from which to extract messages from
-     */
-    public void handleReadAction(StatusBarNotification sbn, Listener listener) {
-        if (mTextToSpeechHelper.isSpeaking()) {
-            mTextToSpeechHelper.requestStop();
-        }
-
-        Parcelable[] messagesBundle = sbn.getNotification().extras
-                .getParcelableArray(Notification.EXTRA_MESSAGES);
-
-        if (messagesBundle == null || messagesBundle.length == 0) {
-            listener.onMessageRead(/* hasError= */ true);
-            return;
-        }
-
-        List<CharSequence> messages = new ArrayList<>();
-        List<Message> messageList = Message.getMessagesFromBundleArray(messagesBundle);
-        if (messageList == null || messageList.isEmpty()) {
-            Log.w(TAG, "No messages could be extracted from the bundle");
-            listener.onMessageRead(/* hasError= */ true);
-            return;
-        }
-
-        Person previousSender = messageList.get(0).getSenderPerson();
-        if (previousSender != null) {
-            messages.add(previousSender.getName());
-            messages.add(mVerbForSays);
-        }
-        for (Message message : messageList) {
-            if (!message.getSenderPerson().equals(previousSender)) {
-                messages.add(message.getSenderPerson().getName());
-                messages.add(mVerbForSays);
-                previousSender = message.getSenderPerson();
-            }
-            messages.add(message.getText());
-        }
-
-        long requestId = mRequestIdGenerator.generateRequestId();
-
-        if (mTextToSpeechHelper.requestPlay(messages, requestId)) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Requesting TTS to read message with requestId: " + requestId);
-            }
-            mRequestIdToActionRequestInfo.put(requestId, new ActionRequestInfo(sbn, listener));
-        } else {
-            listener.onMessageRead(/* hasError= */ true);
-        }
-    }
-
-    /**
-     * Handles generic (non-read) actions by reading out an error message.
-     *
-     * @param errorMessage the error message to read out
-     */
-    public void handleErrorMessage(CharSequence errorMessage, Listener listener) {
-        if (mTextToSpeechHelper.isSpeaking()) {
-            mTextToSpeechHelper.requestStop();
-        }
-
-        long requestId = mRequestIdGenerator.generateRequestId();
-        if (mTextToSpeechHelper.requestPlay(Collections.singletonList(errorMessage),
-                requestId)) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Requesting TTS to read error with requestId: " + requestId);
-            }
-            mRequestIdToActionRequestInfo.put(requestId, new ActionRequestInfo(
-                    /* statusBarNotification= */ null,
-                    listener));
-        } else {
-            listener.onMessageRead(/* hasError= */ true);
-        }
-    }
-
-    private void finishAction(long requestId, boolean hasError) {
-        if (!mRequestIdToActionRequestInfo.containsKey(requestId)) {
-            Log.w(TAG, "No actionRequestInfo found for requestId: " + requestId);
-            return;
-        }
-
-        ActionRequestInfo info = mRequestIdToActionRequestInfo.remove(requestId);
-
-        if (info.getStatusBarNotification() != null && !hasError) {
-            sendMarkAsReadIntent(info.getStatusBarNotification());
-        }
-
-        info.getListener().onMessageRead(hasError);
-    }
-
-    private void sendMarkAsReadIntent(StatusBarNotification sbn) {
-        NotificationCompat.Action markAsReadAction = CarAssistUtils.getMarkAsReadAction(
-                sbn.getNotification());
-        boolean isDebugLoggable = Log.isLoggable(TAG, Log.DEBUG);
-
-        if (markAsReadAction != null) {
-            if (sendPendingIntent(markAsReadAction.getActionIntent(),
-                    null /* resultIntent */) != ActivityManager.START_SUCCESS
-                    && isDebugLoggable) {
-                Log.d(TAG, "Could not relay mark as read event to the messaging app.");
-            }
-        } else if (isDebugLoggable) {
-            Log.d(TAG, "Car compat message notification has no mark as read action: "
-                    + sbn.getKey());
-        }
-    }
-
-    private int sendPendingIntent(PendingIntent pendingIntent, Intent resultIntent) {
-        try {
-            return pendingIntent.sendAndReturnResult(/* context= */ mContext, /* code= */ 0,
-                    /* intent= */ resultIntent, /* onFinished= */null,
-                    /* handler= */ null, /* requiredPermissions= */ null,
-                    /* options= */ null);
-        } catch (PendingIntent.CanceledException e) {
-            // Do not take down the app over this
-            Log.w(TAG, "Sending contentIntent failed: " + e);
-            return ActivityManager.START_ABORTED;
-        }
-    }
-
-    /** Helper class that generates unique IDs per TTS request. **/
-    private class RequestIdGenerator {
-        private long mCounter;
-
-        RequestIdGenerator() {
-            mCounter = 0;
-        }
-
-        public long generateRequestId() {
-            return ++mCounter;
-        }
-    }
-
-    /**
-     * Contains all of the information needed to start and finish actions supported by the
-     * FallbackAssistant.
-     **/
-    private class ActionRequestInfo {
-        private final StatusBarNotification mStatusBarNotification;
-        private final Listener mListener;
-
-        ActionRequestInfo(@Nullable StatusBarNotification statusBarNotification,
-                Listener listener) {
-            mStatusBarNotification = statusBarNotification;
-            mListener = listener;
-        }
-
-        @Nullable
-        StatusBarNotification getStatusBarNotification() {
-            return mStatusBarNotification;
-        }
-
-        Listener getListener() {
-            return mListener;
-        }
-    }
-}
diff --git a/car-assist-client-lib/src/com/android/car/assist/client/tts/AndroidTextToSpeechEngine.java b/car-assist-client-lib/src/com/android/car/assist/client/tts/AndroidTextToSpeechEngine.java
deleted file mode 100644
index 86f880f..0000000
--- a/car-assist-client-lib/src/com/android/car/assist/client/tts/AndroidTextToSpeechEngine.java
+++ /dev/null
@@ -1,100 +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 com.android.car.assist.client.tts;
-
-import android.content.Context;
-import android.media.AudioAttributes;
-import android.os.Bundle;
-import android.speech.tts.TextToSpeech;
-import android.speech.tts.UtteranceProgressListener;
-
-/**
- * Implementation of {@link TextToSpeechEngine} by delegating to Android's {@link TextToSpeech} API.
- * <p>
- * NOTE: {@link #initialize(Context, TextToSpeech.OnInitListener)} must be called to use this
- * engine. After {@link #shutdown()}, {@link #initialize(Context, TextToSpeech.OnInitListener)} may
- * be called again to re-use it.
- */
-class AndroidTextToSpeechEngine implements TextToSpeechEngine {
-    private TextToSpeech mTextToSpeech;
-
-    @Override
-    public void initialize(Context context, TextToSpeech.OnInitListener initListener) {
-        if (mTextToSpeech == null) {
-            mTextToSpeech = new TextToSpeech(context, initListener);
-        }
-    }
-
-    @Override
-    public boolean isInitialized() {
-        return mTextToSpeech != null;
-    }
-
-    @Override
-    public void setOnUtteranceProgressListener(UtteranceProgressListener progressListener)
-            throws IllegalStateException {
-        assertInit();
-        mTextToSpeech.setOnUtteranceProgressListener(progressListener);
-    }
-
-    @Override
-    public void setAudioAttributes(AudioAttributes audioAttributes) {
-        assertInit();
-        mTextToSpeech.setAudioAttributes(audioAttributes);
-    }
-
-    @Override
-    public int speak(CharSequence text, int queueMode, Bundle params, String utteranceId)
-            throws IllegalStateException {
-        assertInit();
-        return mTextToSpeech.speak(text, queueMode, params, utteranceId);
-    }
-
-    @Override
-    public void stop() throws IllegalStateException {
-        assertInit();
-        mTextToSpeech.stop();
-    }
-
-    @Override
-    public boolean isSpeaking() {
-        return mTextToSpeech != null && mTextToSpeech.isSpeaking();
-    }
-
-    @Override
-    public void shutdown() throws IllegalStateException {
-        assertInit();
-        mTextToSpeech.shutdown();
-        mTextToSpeech = null;
-    }
-
-    @Override
-    public int getStream() {
-        return TextToSpeech.Engine.DEFAULT_STREAM;
-    }
-
-    /**
-     * Asserts that the TTS engine has been initialized.
-     *
-     * @throws IllegalStateException if the TTS has not been initialized.
-     */
-    private void assertInit() throws IllegalStateException {
-        if (!isInitialized()) {
-            throw new IllegalStateException("TTS Engine must be initialized before use.");
-        }
-    }
-}
diff --git a/car-assist-client-lib/src/com/android/car/assist/client/tts/TextToSpeechEngine.java b/car-assist-client-lib/src/com/android/car/assist/client/tts/TextToSpeechEngine.java
deleted file mode 100644
index a680cd1..0000000
--- a/car-assist-client-lib/src/com/android/car/assist/client/tts/TextToSpeechEngine.java
+++ /dev/null
@@ -1,89 +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 com.android.car.assist.client.tts;
-
-import android.content.Context;
-import android.media.AudioAttributes;
-import android.os.Bundle;
-import android.speech.tts.TextToSpeech;
-import android.speech.tts.UtteranceProgressListener;
-
-/**
- * Interface for TTS Engine that closely matches {@link TextToSpeech}; facilitates mocking/faking.
- */
-public interface TextToSpeechEngine {
-    /**
-     * Initializes the TTS engine.
-     *
-     * @param context the context to use
-     * @param initListener listener to monitor initialization result
-     */
-    void initialize(Context context, TextToSpeech.OnInitListener initListener);
-
-    /**
-     * Returns true if the engine is initialized.
-     */
-    boolean isInitialized();
-
-    /**
-     * Sets the UtteranceProgressListener.
-     *
-     * @see TextToSpeech#setOnUtteranceProgressListener(UtteranceProgressListener)
-     */
-    void setOnUtteranceProgressListener(UtteranceProgressListener progressListener);
-
-    /**
-     * Sets the audio attributes to be used when speaking text or playing
-     * back a file.
-     *
-     * @see TextToSpeech#setAudioAttributes(AudioAttributes)
-     */
-    void setAudioAttributes(AudioAttributes audioAttributes);
-
-    /**
-     * Speaks out the provided text.
-     *
-     * @see TextToSpeech#speak(CharSequence, int, Bundle, String)
-     */
-    int speak(CharSequence text, int queueMode, Bundle params, String utteranceId);
-
-    /**
-     * Stops play-out.
-     *
-     * @see TextToSpeech#stop()
-     */
-    void stop();
-
-    /**
-     * Returns true if the TTS engine is currently playing out.
-     */
-    boolean isSpeaking();
-
-    /**
-     * Shuts down the engine and releases resources.
-     * {@link #initialize(Context, TextToSpeech.OnInitListener)} will need to be called again before
-     * using this engine.
-     */
-    void shutdown();
-
-    /**
-     * Returns the stream used by this TTS engine.
-     * <p/>
-     * The streams are defined in {@link android.media.AudioManager}.
-     */
-    int getStream();
-}
diff --git a/car-assist-client-lib/src/com/android/car/assist/client/tts/TextToSpeechHelper.java b/car-assist-client-lib/src/com/android/car/assist/client/tts/TextToSpeechHelper.java
deleted file mode 100644
index c22e832..0000000
--- a/car-assist-client-lib/src/com/android/car/assist/client/tts/TextToSpeechHelper.java
+++ /dev/null
@@ -1,399 +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 com.android.car.assist.client.tts;
-
-import android.content.Context;
-import android.media.AudioAttributes;
-import android.media.AudioFocusRequest;
-import android.media.AudioManager;
-import android.os.Handler;
-import android.speech.tts.TextToSpeech;
-import android.speech.tts.UtteranceProgressListener;
-import android.util.Log;
-import android.util.Pair;
-
-import androidx.annotation.VisibleForTesting;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import java.util.function.BiConsumer;
-
-/**
- * Component that wraps platform TTS engine and supports play-out of batches of text.
- * <p>
- * It takes care of setting up TTS Engine when text is played out and shutting it down after an idle
- * period with no play-out. This is desirable since the owning app is long-lived and the TTS Engine
- * brings up another service-process.
- * <p>
- * As batches of text are played-out, they issue callbacks on the {@link Listener} provided with the
- * batch.
- */
-public class TextToSpeechHelper {
-    /**
-     * Listener interface used by clients to be notified as batch of text is played out.
-     */
-    public interface Listener {
-        /**
-         * Called when play-out starts for batch. May never get called if batch has errors or
-         * interruptions.
-         */
-        void onTextToSpeechStarted(long requestId);
-
-        /**
-         * Called when play-out ends for batch.
-         *
-         * @param error Whether play-out ended due to an error or not. Note: if it was aborted, it's
-         *              not considered an error.
-         */
-        void onTextToSpeechStopped(long requestId, boolean error);
-    }
-
-    private static final String TAG = "CM#TextToSpeechHelper";
-
-    private static final String UTTERANCE_ID_SEPARATOR = ";";
-    private static final long DEFAULT_SHUTDOWN_DELAY_MILLIS = TimeUnit.MINUTES.toMillis(1);
-
-    private final Map<String, BatchListener> mListeners = new HashMap<>();
-    private final Handler mHandler = new Handler();
-    private final Context mContext;
-    private final TextToSpeechHelper.Listener mListener;
-    private final AudioManager.OnAudioFocusChangeListener mNoOpListener = (f) -> { /* NO-OP */ };
-    private final AudioManager mAudioManager;
-    private final AudioAttributes mAudioAttributes;
-    private final AudioFocusRequest mAudioFocusRequest;
-    private final long mShutdownDelayMillis;
-    private TextToSpeechEngine mTextToSpeechEngine;
-    private int mInitStatus;
-    private SpeechRequest mPendingRequest;
-    private String mCurrentBatchId;
-
-    private final Runnable mMaybeShutdownRunnable = new Runnable() {
-        @Override
-        public void run() {
-            if (mListeners.isEmpty() || mPendingRequest == null) {
-                shutdownEngine();
-            } else {
-                mHandler.postDelayed(this, mShutdownDelayMillis);
-            }
-        }
-    };
-
-    public TextToSpeechHelper(Context context, TextToSpeechHelper.Listener listener) {
-        this(context, new AndroidTextToSpeechEngine(), DEFAULT_SHUTDOWN_DELAY_MILLIS, listener);
-    }
-
-    @VisibleForTesting
-    TextToSpeechHelper(Context context, TextToSpeechEngine ttsEngine, long shutdownDelayMillis,
-            TextToSpeechHelper.Listener listener) {
-        mContext = context;
-        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
-        mTextToSpeechEngine = ttsEngine;
-        mShutdownDelayMillis = shutdownDelayMillis;
-        // OnInitListener will only set to SUCCESS/ERROR. So we initialize to STOPPED.
-        mInitStatus = TextToSpeech.STOPPED;
-        mListener = listener;
-        mAudioAttributes =  new AudioAttributes.Builder()
-                .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
-                .setUsage(AudioAttributes.USAGE_ASSISTANT)
-                .build();
-        mAudioFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)
-                .setAudioAttributes(mAudioAttributes)
-                .setOnAudioFocusChangeListener(mNoOpListener)
-                .build();
-    }
-
-    private void maybeInitAndKeepAlive() {
-        if (!mTextToSpeechEngine.isInitialized()) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Initializing TTS Engine");
-            }
-            mTextToSpeechEngine.initialize(mContext, this::handleInitCompleted);
-            mTextToSpeechEngine.setOnUtteranceProgressListener(mProgressListener);
-            mTextToSpeechEngine.setAudioAttributes(mAudioAttributes);
-        }
-        // Since we're handling a request, delay engine shutdown.
-        mHandler.removeCallbacks(mMaybeShutdownRunnable);
-        mHandler.postDelayed(mMaybeShutdownRunnable, mShutdownDelayMillis);
-    }
-
-    private void handleInitCompleted(int initStatus) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, String.format("Init completed. Status: %d", initStatus));
-        }
-        mInitStatus = initStatus;
-        if (mPendingRequest != null) {
-            playInternal(mPendingRequest.mTextToSpeak, mPendingRequest.mRequestId);
-            mPendingRequest = null;
-        }
-    }
-
-    /**
-     * Plays out given batch of text. If engine is not active, it is setup and the request is stored
-     * until then. Only one batch is supported at a time; If a previous batch is waiting engine
-     * setup, that batch is dropped. If a previous batch is playing, the play-out is stopped and
-     * next one is passed to the TTS Engine. Callbacks are issued on the provided {@code listener}.
-     * Will request audio focus first, failure will trigger onAudioFocusFailed in listener.
-     * <p/>
-     * NOTE: Underlying engine may have limit on length of text in each element of the batch; it
-     * will reject anything longer. See {@link TextToSpeech#getMaxSpeechInputLength()}.
-     *
-     * @param textToSpeak Batch of text to play-out.
-     * @param requestId The tracking request id
-     * @return true if the request to play was successful
-     */
-    public boolean requestPlay(List<CharSequence> textToSpeak, long requestId) {
-        if (textToSpeak.isEmpty()) {
-            /* no-op */
-            return true;
-        }
-        int result = mAudioManager.requestAudioFocus(mAudioFocusRequest);
-        if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
-            return false;
-        }
-        maybeInitAndKeepAlive();
-
-        // Check if its still initializing.
-        if (mInitStatus == TextToSpeech.STOPPED) {
-            // Squash any already queued request.
-            if (mPendingRequest != null) {
-                onTtsStopped(requestId, /* error= */ false);
-            }
-            mPendingRequest = new SpeechRequest(textToSpeak, requestId);
-        } else {
-            playInternal(textToSpeak, requestId);
-        }
-        return true;
-    }
-
-    /** Requests that all play-out be stopped. */
-    public void requestStop() {
-        mTextToSpeechEngine.stop();
-        mCurrentBatchId = null;
-    }
-
-    public boolean isSpeaking() {
-        return mTextToSpeechEngine.isSpeaking();
-    }
-
-    // wrap call back to listener.onTextToSpeechStopped with adandonAudioFocus.
-    private void onTtsStopped(long requestId, boolean error) {
-        mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest);
-        mHandler.post(() -> mListener.onTextToSpeechStopped(requestId, error));
-    }
-
-    private void playInternal(List<CharSequence> textToSpeak, long requestId) {
-        if (mInitStatus == TextToSpeech.ERROR) {
-            Log.e(TAG, "TTS setup failed!");
-            onTtsStopped(requestId, /* error= */ true);
-            return;
-        }
-
-        // Abort anything currently playing and flushes queue.
-        mTextToSpeechEngine.stop();
-
-        // Queue up new batch. We assign id's = "batchId;index" where index increments from 0
-        // to batchSize - 1. If queueing fails, we abort the whole batch.
-        mCurrentBatchId = Long.toString(requestId);
-        for (int i = 0; i < textToSpeak.size(); i++) {
-            CharSequence text = textToSpeak.get(i);
-            String utteranceId =
-                    String.format("%s%s%d", mCurrentBatchId, UTTERANCE_ID_SEPARATOR, i);
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, String.format("Queueing tts: '%s' [%s]", text, utteranceId));
-            }
-            if (mTextToSpeechEngine.speak(text, TextToSpeech.QUEUE_ADD, /* params= */ null,
-                    utteranceId) != TextToSpeech.SUCCESS) {
-                mTextToSpeechEngine.stop();
-                mCurrentBatchId = null;
-                Log.e(TAG, "Queuing text failed!");
-                onTtsStopped(requestId, /* error= */ true);
-                return;
-            }
-        }
-        // Register BatchListener for entire batch. Will invoke callbacks on Listener as batch
-        // progresses.
-        mListeners.put(mCurrentBatchId, new BatchListener(requestId, textToSpeak.size()));
-    }
-
-    /**
-     * Releases resources and shuts down TTS Engine.
-     */
-    public void cleanup() {
-        mHandler.removeCallbacksAndMessages(/* token= */ null);
-        shutdownEngine();
-    }
-
-    /** Returns the stream used by the TTS engine. */
-    public int getStream() {
-        return mTextToSpeechEngine.getStream();
-    }
-
-    private void shutdownEngine() {
-        if (mTextToSpeechEngine.isInitialized()) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Shutting down TTS Engine");
-            }
-            mTextToSpeechEngine.stop();
-            mTextToSpeechEngine.shutdown();
-            mInitStatus = TextToSpeech.STOPPED;
-        }
-    }
-
-    private static Pair<String, Integer> parse(String utteranceId) {
-        try {
-            String[] pair = utteranceId.split(UTTERANCE_ID_SEPARATOR);
-            String batchId = pair[0];
-            int index = Integer.valueOf(pair[1]);
-            return Pair.create(batchId, index);
-        } catch (IndexOutOfBoundsException | NumberFormatException e) {
-            throw new IllegalArgumentException(
-                    String.format("Utterance ID is invalid: %s.", utteranceId)
-            );
-        }
-    }
-
-    // Handles all callbacks from TextToSpeechEngine. Possible order of callbacks:
-    // - onStart, onDone: successful play-out.
-    // - onStart, onStop: play-out starts, but interrupted.
-    // - onStart, onError: play-out starts and fails.
-    // - onStop: play-out never starts, but aborted.
-    // - onError: play-out never starts, but fails.
-    // Since the callbacks arrive on other threads, they are dispatched onto mHandler where the
-    // appropriate BatchListener is invoked.
-    private final UtteranceProgressListener mProgressListener = new UtteranceProgressListener() {
-        private void safeInvokeAsync(String utteranceId,
-                BiConsumer<BatchListener, Pair<String, Integer>> callback) {
-            mHandler.post(() -> {
-                Pair<String, Integer> parsedId = parse(utteranceId);
-                BatchListener listener = mListeners.get(parsedId.first);
-                if (listener != null) {
-                    callback.accept(listener, parsedId);
-                } else {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Missing batch listener: " + utteranceId);
-                    }
-                }
-            });
-        }
-
-        @Override
-        public void onStart(String utteranceId) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "TTS onStart: " + utteranceId);
-            }
-            mHandler.post(() -> {
-                Pair<String, Integer> parsedId = parse(utteranceId);
-                BatchListener listener = mListeners.get(parsedId.first);
-                if (listener != null) {
-                    listener.onStart();
-                } else {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Missing batch listener: " + utteranceId);
-                    }
-                }
-            });
-        }
-
-        @Override
-        public void onDone(String utteranceId) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "TTS onDone: " + utteranceId);
-            }
-            safeInvokeAsync(utteranceId, BatchListener::onDone);
-        }
-
-        @Override
-        public void onStop(String utteranceId, boolean interrupted) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "TTS onStop: " + utteranceId);
-            }
-            safeInvokeAsync(utteranceId, BatchListener::onStop);
-        }
-
-        @Override
-        public void onError(String utteranceId) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "TTS onError: " + utteranceId);
-            }
-            safeInvokeAsync(utteranceId, BatchListener::onError);
-        }
-    };
-
-    /**
-     * Handles callbacks for a single batch of TTS text and issues callbacks on wrapped
-     * {@link Listener} that client is listening on.
-     */
-    private class BatchListener {
-        private boolean mBatchStarted;
-        private final long mRequestId;
-        private final int mUtteranceCount;
-
-        BatchListener(long requestId, int utteranceCount) {
-            mRequestId = requestId;
-            mUtteranceCount = utteranceCount;
-        }
-
-        // Issues Listener.onTextToSpeechStarted when first item of batch starts.
-        void onStart() {
-            if (!mBatchStarted) {
-                mBatchStarted = true;
-                mListener.onTextToSpeechStarted(mRequestId);
-            }
-        }
-
-        // Issues Listener.onTextToSpeechStopped when last item of batch finishes.
-        void onDone(Pair<String, Integer> parsedId) {
-            // parseId is zero-indexed, mUtteranceCount is not.
-            if (parsedId.second == (mUtteranceCount - 1)) {
-                handleBatchFinished(parsedId, /* error= */ false);
-            }
-        }
-
-        // If any item of batch fails, abort the batch and issue Listener.onTextToSpeechStopped.
-        void onError(Pair<String, Integer> parsedId) {
-            if (parsedId.first.equals(mCurrentBatchId)) {
-                mTextToSpeechEngine.stop();
-            }
-            handleBatchFinished(parsedId, /* error= */ true);
-        }
-
-        // If any item of batch is preempted (rest should also be),
-        // issue Listener.onTextToSpeechStopped.
-        void onStop(Pair<String, Integer> parsedId) {
-            handleBatchFinished(parsedId, /* error= */ false);
-        }
-
-        // Handles terminal callbacks for the batch. We invoke stopped and remove ourselves.
-        // No further callbacks will be handled for the batch.
-        private void handleBatchFinished(Pair<String, Integer> parsedId, boolean error) {
-            onTtsStopped(mRequestId, error);
-            mListeners.remove(parsedId.first);
-        }
-    }
-
-    private static class SpeechRequest {
-        final List<CharSequence> mTextToSpeak;
-        final long mRequestId;
-
-        SpeechRequest(List<CharSequence> textToSpeak, long requestId) {
-            mTextToSpeak = textToSpeak;
-            mRequestId = requestId;
-        }
-    }
-}
diff --git a/car-broadcastradio-support/Android.bp b/car-broadcastradio-support/Android.bp
deleted file mode 100644
index d0e24e1..0000000
--- a/car-broadcastradio-support/Android.bp
+++ /dev/null
@@ -1,37 +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 {
-    default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-android_library {
-    name: "car-broadcastradio-support",
-
-    srcs: ["src/**/*.java"],
-    aidl: {
-        export_include_dirs: ["src"],
-    },
-    resource_dirs: ["res"],
-
-    optimize: {
-        enabled: false,
-    },
-
-    dist: {
-        targets: ["dist_files"],
-    },
-}
diff --git a/car-broadcastradio-support/AndroidManifest.xml b/car-broadcastradio-support/AndroidManifest.xml
deleted file mode 100644
index e592ee1..0000000
--- a/car-broadcastradio-support/AndroidManifest.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.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.android.car.broadcastradio.support">
-    <uses-sdk
-            android:minSdkVersion="28"
-            android:targetSdkVersion='28'/>
-</manifest>
diff --git a/car-broadcastradio-support/OWNERS b/car-broadcastradio-support/OWNERS
deleted file mode 100644
index 01124ba..0000000
--- a/car-broadcastradio-support/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-# People who can approve changes for submission.
-# Automotive team
-twasilczyk@google.com
diff --git a/car-broadcastradio-support/res/values-af/strings.xml b/car-broadcastradio-support/res/values-af/strings.xml
deleted file mode 100644
index 0c08586..0000000
--- a/car-broadcastradio-support/res/values-af/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stasies"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Gunstelinge"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-am/strings.xml b/car-broadcastradio-support/res/values-am/strings.xml
deleted file mode 100644
index 81b128a..0000000
--- a/car-broadcastradio-support/res/values-am/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"ኤኤም"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"ኤፍኤም"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"ጣቢያዎች"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"ተወዳጆች"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ar/strings.xml b/car-broadcastradio-support/res/values-ar/strings.xml
deleted file mode 100644
index 129c8c5..0000000
--- a/car-broadcastradio-support/res/values-ar/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"المحطات"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"المفضّلة"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-as/strings.xml b/car-broadcastradio-support/res/values-as/strings.xml
deleted file mode 100644
index 862e9bb..0000000
--- a/car-broadcastradio-support/res/values-as/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"কেন্দ্ৰসমূহ"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"প্ৰিয় বস্তুসমূহ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-az/strings.xml b/car-broadcastradio-support/res/values-az/strings.xml
deleted file mode 100644
index 3b40ff9..0000000
--- a/car-broadcastradio-support/res/values-az/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stansiyalar"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Sevimlilər"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-b+sr+Latn/strings.xml b/car-broadcastradio-support/res/values-b+sr+Latn/strings.xml
deleted file mode 100644
index e29e90e..0000000
--- a/car-broadcastradio-support/res/values-b+sr+Latn/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stanice"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Omiljeno"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-be/strings.xml b/car-broadcastradio-support/res/values-be/strings.xml
deleted file mode 100644
index cde54f4..0000000
--- a/car-broadcastradio-support/res/values-be/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Радыёстанцыі"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Абранае"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-bg/strings.xml b/car-broadcastradio-support/res/values-bg/strings.xml
deleted file mode 100644
index 6d7b2a0..0000000
--- a/car-broadcastradio-support/res/values-bg/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"Цифрово радиоразпръскване"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Станции"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Любими"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-bn/strings.xml b/car-broadcastradio-support/res/values-bn/strings.xml
deleted file mode 100644
index 245ce98..0000000
--- a/car-broadcastradio-support/res/values-bn/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"স্টেশন"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"পছন্দসই"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-bs/strings.xml b/car-broadcastradio-support/res/values-bs/strings.xml
deleted file mode 100644
index e29e90e..0000000
--- a/car-broadcastradio-support/res/values-bs/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stanice"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Omiljeno"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ca/strings.xml b/car-broadcastradio-support/res/values-ca/strings.xml
deleted file mode 100644
index 3737632..0000000
--- a/car-broadcastradio-support/res/values-ca/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Emissores"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Preferides"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-cs/strings.xml b/car-broadcastradio-support/res/values-cs/strings.xml
deleted file mode 100644
index db20752..0000000
--- a/car-broadcastradio-support/res/values-cs/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stanice"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Oblíbené"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-da/strings.xml b/car-broadcastradio-support/res/values-da/strings.xml
deleted file mode 100644
index 46d1603..0000000
--- a/car-broadcastradio-support/res/values-da/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Kanaler"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favoritter"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-de/strings.xml b/car-broadcastradio-support/res/values-de/strings.xml
deleted file mode 100644
index c6e2e9f..0000000
--- a/car-broadcastradio-support/res/values-de/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"MW"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"UKW"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Sender"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favoriten"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-el/strings.xml b/car-broadcastradio-support/res/values-el/strings.xml
deleted file mode 100644
index f5452ec..0000000
--- a/car-broadcastradio-support/res/values-el/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Σταθμοί"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Αγαπημένα"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-en-rAU/strings.xml b/car-broadcastradio-support/res/values-en-rAU/strings.xml
deleted file mode 100644
index 806c9c8..0000000
--- a/car-broadcastradio-support/res/values-en-rAU/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"a.m."</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stations"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favourites"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-en-rCA/strings.xml b/car-broadcastradio-support/res/values-en-rCA/strings.xml
deleted file mode 100644
index 806c9c8..0000000
--- a/car-broadcastradio-support/res/values-en-rCA/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"a.m."</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stations"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favourites"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-en-rGB/strings.xml b/car-broadcastradio-support/res/values-en-rGB/strings.xml
deleted file mode 100644
index 806c9c8..0000000
--- a/car-broadcastradio-support/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"a.m."</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stations"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favourites"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-en-rIN/strings.xml b/car-broadcastradio-support/res/values-en-rIN/strings.xml
deleted file mode 100644
index 806c9c8..0000000
--- a/car-broadcastradio-support/res/values-en-rIN/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"a.m."</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stations"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favourites"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-en-rXC/strings.xml b/car-broadcastradio-support/res/values-en-rXC/strings.xml
deleted file mode 100644
index b06db6c..0000000
--- a/car-broadcastradio-support/res/values-en-rXC/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‏‎‏‏‏‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‎‎‎AM‎‏‎‎‏‎"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‏‏‎‏‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‎‎‎‎‎‏‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‏‏‎‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‎FM‎‏‎‎‏‎"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‎‏‎‎‏‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎DAB‎‏‎‎‏‎"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‏‎‎‏‎‏‎‎‏‏‏‎‎‏‎‎‎‎‎‎‎‏‏‎‏‏‏‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎Stations‎‏‎‎‏‎"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‎‎‏‎‎‏‎‎‎‏‎‏‏‎‏‎‎‏‎‎‏‎‏‏‎‎‎‎‎‎‏‏‏‎‏‎‏‎‎‏‎‏‎‏‎‏‎‎‎‏‏‎Favorites‎‏‎‎‏‎"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-es-rUS/strings.xml b/car-broadcastradio-support/res/values-es-rUS/strings.xml
deleted file mode 100644
index 4862ab2..0000000
--- a/car-broadcastradio-support/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Estaciones"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favoritos"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-es/strings.xml b/car-broadcastradio-support/res/values-es/strings.xml
deleted file mode 100644
index f0f383e..0000000
--- a/car-broadcastradio-support/res/values-es/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Emisoras"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favoritos"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-et/strings.xml b/car-broadcastradio-support/res/values-et/strings.xml
deleted file mode 100644
index 810c07e..0000000
--- a/car-broadcastradio-support/res/values-et/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Jaamad"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Lemmikud"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-eu/strings.xml b/car-broadcastradio-support/res/values-eu/strings.xml
deleted file mode 100644
index 999d986..0000000
--- a/car-broadcastradio-support/res/values-eu/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Kateak"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Gogokoak"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-fa/strings.xml b/car-broadcastradio-support/res/values-fa/strings.xml
deleted file mode 100644
index 1828fc3..0000000
--- a/car-broadcastradio-support/res/values-fa/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"ایستگاه‌ها"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"موارد دلخواه"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-fi/strings.xml b/car-broadcastradio-support/res/values-fi/strings.xml
deleted file mode 100644
index a1b60db..0000000
--- a/car-broadcastradio-support/res/values-fi/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Kanavat"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Suosikit"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-fr-rCA/strings.xml b/car-broadcastradio-support/res/values-fr-rCA/strings.xml
deleted file mode 100644
index 89bd122..0000000
--- a/car-broadcastradio-support/res/values-fr-rCA/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stations"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favorites"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-fr/strings.xml b/car-broadcastradio-support/res/values-fr/strings.xml
deleted file mode 100644
index f12123f..0000000
--- a/car-broadcastradio-support/res/values-fr/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Radios"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favoris"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-gl/strings.xml b/car-broadcastradio-support/res/values-gl/strings.xml
deleted file mode 100644
index beccab0..0000000
--- a/car-broadcastradio-support/res/values-gl/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Emisoras"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Programas favoritos"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-gu/strings.xml b/car-broadcastradio-support/res/values-gu/strings.xml
deleted file mode 100644
index 8da5f9d..0000000
--- a/car-broadcastradio-support/res/values-gu/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"સ્ટેશન"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"મનપસંદ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-hi/strings.xml b/car-broadcastradio-support/res/values-hi/strings.xml
deleted file mode 100644
index 230e18b..0000000
--- a/car-broadcastradio-support/res/values-hi/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"एएम रेडियो"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"एफ़एम रेडियो"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"डीएबी"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"स्टेशन"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"पसंदीदा"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-hr/strings.xml b/car-broadcastradio-support/res/values-hr/strings.xml
deleted file mode 100644
index 63cc855..0000000
--- a/car-broadcastradio-support/res/values-hr/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Postaje"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favoriti"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-hu/strings.xml b/car-broadcastradio-support/res/values-hu/strings.xml
deleted file mode 100644
index 5a16d62..0000000
--- a/car-broadcastradio-support/res/values-hu/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Állomások"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Kedvencek"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-hy/strings.xml b/car-broadcastradio-support/res/values-hy/strings.xml
deleted file mode 100644
index 77efc29..0000000
--- a/car-broadcastradio-support/res/values-hy/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Ռադիոկայաններ"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Ընտրանի"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-in/strings.xml b/car-broadcastradio-support/res/values-in/strings.xml
deleted file mode 100644
index e40e53f..0000000
--- a/car-broadcastradio-support/res/values-in/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stasiun"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favorit"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-is/strings.xml b/car-broadcastradio-support/res/values-is/strings.xml
deleted file mode 100644
index b7e9135..0000000
--- a/car-broadcastradio-support/res/values-is/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stöðvar"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Uppáhald"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-it/strings.xml b/car-broadcastradio-support/res/values-it/strings.xml
deleted file mode 100644
index eef0a6e..0000000
--- a/car-broadcastradio-support/res/values-it/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stazioni"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Preferiti"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-iw/strings.xml b/car-broadcastradio-support/res/values-iw/strings.xml
deleted file mode 100644
index e990b26..0000000
--- a/car-broadcastradio-support/res/values-iw/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB ‏(Digital Audio Broadcasting)"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"תחנות"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"מועדפים"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ja/strings.xml b/car-broadcastradio-support/res/values-ja/strings.xml
deleted file mode 100644
index 21582d0..0000000
--- a/car-broadcastradio-support/res/values-ja/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"ステーション"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"お気に入り"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ka/strings.xml b/car-broadcastradio-support/res/values-ka/strings.xml
deleted file mode 100644
index 2f26b0a..0000000
--- a/car-broadcastradio-support/res/values-ka/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"ციფრული აუდიომაუწყებლობა"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"სადგურები"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"რჩეულები"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-kk/strings.xml b/car-broadcastradio-support/res/values-kk/strings.xml
deleted file mode 100644
index 740afce..0000000
--- a/car-broadcastradio-support/res/values-kk/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Станциялар"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Таңдаулылар"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-km/strings.xml b/car-broadcastradio-support/res/values-km/strings.xml
deleted file mode 100644
index be70353..0000000
--- a/car-broadcastradio-support/res/values-km/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB​"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"ស្ថានីយ"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"សំណព្វ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-kn/strings.xml b/car-broadcastradio-support/res/values-kn/strings.xml
deleted file mode 100644
index 9dadc54..0000000
--- a/car-broadcastradio-support/res/values-kn/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"ಬೆಳಿಗ್ಗೆ"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"ಸ್ಟೇಶನ್‌ಗಳು"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"ಮೆಚ್ಚಿನವುಗಳು"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ko/strings.xml b/car-broadcastradio-support/res/values-ko/strings.xml
deleted file mode 100644
index abebfa4..0000000
--- a/car-broadcastradio-support/res/values-ko/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"채널"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"즐겨찾기"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ky/strings.xml b/car-broadcastradio-support/res/values-ky/strings.xml
deleted file mode 100644
index ee67f46..0000000
--- a/car-broadcastradio-support/res/values-ky/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Станциялар"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Тандалмалар"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-lo/strings.xml b/car-broadcastradio-support/res/values-lo/strings.xml
deleted file mode 100644
index fbfe882..0000000
--- a/car-broadcastradio-support/res/values-lo/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"ສະຖານີ"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"ລາຍການທີ່ມັກ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-lt/strings.xml b/car-broadcastradio-support/res/values-lt/strings.xml
deleted file mode 100644
index 6a68328..0000000
--- a/car-broadcastradio-support/res/values-lt/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stotys"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Mėgstamiausi"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-lv/strings.xml b/car-broadcastradio-support/res/values-lv/strings.xml
deleted file mode 100644
index 75db93a..0000000
--- a/car-broadcastradio-support/res/values-lv/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Programmas"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Izlase"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-mk/strings.xml b/car-broadcastradio-support/res/values-mk/strings.xml
deleted file mode 100644
index c7410af..0000000
--- a/car-broadcastradio-support/res/values-mk/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Станици"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Омилени"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ml/strings.xml b/car-broadcastradio-support/res/values-ml/strings.xml
deleted file mode 100644
index 498bfd7..0000000
--- a/car-broadcastradio-support/res/values-ml/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"രാവിലെ"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"സ്റ്റേഷനുകള്‍"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"പ്രിയപ്പെട്ടവ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-mn/strings.xml b/car-broadcastradio-support/res/values-mn/strings.xml
deleted file mode 100644
index 3deca28..0000000
--- a/car-broadcastradio-support/res/values-mn/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"ӨГЛӨӨ"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Станцууд"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Дуртай"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-mr/strings.xml b/car-broadcastradio-support/res/values-mr/strings.xml
deleted file mode 100644
index 0fc95e4..0000000
--- a/car-broadcastradio-support/res/values-mr/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"स्टेशन"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"आवडीचे"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ms/strings.xml b/car-broadcastradio-support/res/values-ms/strings.xml
deleted file mode 100644
index 257cb5e..0000000
--- a/car-broadcastradio-support/res/values-ms/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stesen"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Kegemaran"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-my/strings.xml b/car-broadcastradio-support/res/values-my/strings.xml
deleted file mode 100644
index 692d19d..0000000
--- a/car-broadcastradio-support/res/values-my/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"အသံလွှင့်ရုံများ"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"အသုံးအများဆုံးများ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-nb/strings.xml b/car-broadcastradio-support/res/values-nb/strings.xml
deleted file mode 100644
index 79544cb..0000000
--- a/car-broadcastradio-support/res/values-nb/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stasjoner"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favoritter"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ne/strings.xml b/car-broadcastradio-support/res/values-ne/strings.xml
deleted file mode 100644
index ee1887b..0000000
--- a/car-broadcastradio-support/res/values-ne/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"पूर्वाह्न"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"एफएम"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"स्टेसनहरू"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"मन पर्ने कार्यक्रमहरू"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-nl/strings.xml b/car-broadcastradio-support/res/values-nl/strings.xml
deleted file mode 100644
index 2f1a5e1..0000000
--- a/car-broadcastradio-support/res/values-nl/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Zenders"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favorieten"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-or/strings.xml b/car-broadcastradio-support/res/values-or/strings.xml
deleted file mode 100644
index ab448c8..0000000
--- a/car-broadcastradio-support/res/values-or/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"ଷ୍ଟେଶନ୍"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"ପସନ୍ଦର"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-pa/strings.xml b/car-broadcastradio-support/res/values-pa/strings.xml
deleted file mode 100644
index 5f7ce46..0000000
--- a/car-broadcastradio-support/res/values-pa/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"ਸਟੇਸ਼ਨ"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"ਮਨਪਸੰਦ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-pl/strings.xml b/car-broadcastradio-support/res/values-pl/strings.xml
deleted file mode 100644
index 1fc4d67..0000000
--- a/car-broadcastradio-support/res/values-pl/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stacje"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Ulubione"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-pt-rPT/strings.xml b/car-broadcastradio-support/res/values-pt-rPT/strings.xml
deleted file mode 100644
index a4b120a..0000000
--- a/car-broadcastradio-support/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Estações"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favoritas"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-pt/strings.xml b/car-broadcastradio-support/res/values-pt/strings.xml
deleted file mode 100644
index 9d72f03..0000000
--- a/car-broadcastradio-support/res/values-pt/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Estações"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favoritos"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ro/strings.xml b/car-broadcastradio-support/res/values-ro/strings.xml
deleted file mode 100644
index 7ab0b50..0000000
--- a/car-broadcastradio-support/res/values-ro/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Posturi"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Preferate"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ru/strings.xml b/car-broadcastradio-support/res/values-ru/strings.xml
deleted file mode 100644
index 2fed0f4..0000000
--- a/car-broadcastradio-support/res/values-ru/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"Цифровое радио"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Радиостанции"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Избранное"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-si/strings.xml b/car-broadcastradio-support/res/values-si/strings.xml
deleted file mode 100644
index 53f72c6..0000000
--- a/car-broadcastradio-support/res/values-si/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"නාලිකා"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"ප්‍රියතම"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-sk/strings.xml b/car-broadcastradio-support/res/values-sk/strings.xml
deleted file mode 100644
index fcdab92..0000000
--- a/car-broadcastradio-support/res/values-sk/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stanice"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Obľúbené"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-sl/strings.xml b/car-broadcastradio-support/res/values-sl/strings.xml
deleted file mode 100644
index f0d3770..0000000
--- a/car-broadcastradio-support/res/values-sl/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Postaje"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Priljubljene"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-sq/strings.xml b/car-broadcastradio-support/res/values-sq/strings.xml
deleted file mode 100644
index a4c1c95..0000000
--- a/car-broadcastradio-support/res/values-sq/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stacionet"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Të preferuarat"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-sr/strings.xml b/car-broadcastradio-support/res/values-sr/strings.xml
deleted file mode 100644
index 8321b8c..0000000
--- a/car-broadcastradio-support/res/values-sr/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Станице"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Омиљено"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-sv/strings.xml b/car-broadcastradio-support/res/values-sv/strings.xml
deleted file mode 100644
index 5475b03..0000000
--- a/car-broadcastradio-support/res/values-sv/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Kanaler"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favoriter"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-sw/strings.xml b/car-broadcastradio-support/res/values-sw/strings.xml
deleted file mode 100644
index 879df73..0000000
--- a/car-broadcastradio-support/res/values-sw/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Stesheni"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Unavyopenda"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ta/strings.xml b/car-broadcastradio-support/res/values-ta/strings.xml
deleted file mode 100644
index 6b91b37..0000000
--- a/car-broadcastradio-support/res/values-ta/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"நிலையங்கள்"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"பிடித்தவை"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-te/strings.xml b/car-broadcastradio-support/res/values-te/strings.xml
deleted file mode 100644
index 864e222..0000000
--- a/car-broadcastradio-support/res/values-te/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"స్టేషన్‌లు"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"ఇష్టమైనవి"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-th/strings.xml b/car-broadcastradio-support/res/values-th/strings.xml
deleted file mode 100644
index 0370e76..0000000
--- a/car-broadcastradio-support/res/values-th/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"สถานี"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"รายการโปรด"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-tl/strings.xml b/car-broadcastradio-support/res/values-tl/strings.xml
deleted file mode 100644
index 932e133..0000000
--- a/car-broadcastradio-support/res/values-tl/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Mga Istasyon"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Mga Paborito"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-tr/strings.xml b/car-broadcastradio-support/res/values-tr/strings.xml
deleted file mode 100644
index 136387f..0000000
--- a/car-broadcastradio-support/res/values-tr/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"İstasyonlar"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Favoriler"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-uk/strings.xml b/car-broadcastradio-support/res/values-uk/strings.xml
deleted file mode 100644
index cdd259a..0000000
--- a/car-broadcastradio-support/res/values-uk/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Станції"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Вибране"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ur/strings.xml b/car-broadcastradio-support/res/values-ur/strings.xml
deleted file mode 100644
index a511d89..0000000
--- a/car-broadcastradio-support/res/values-ur/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"اسٹیشنز"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"پسندیدہ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-uz/strings.xml b/car-broadcastradio-support/res/values-uz/strings.xml
deleted file mode 100644
index bfb89d7..0000000
--- a/car-broadcastradio-support/res/values-uz/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"Raqamli radio"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Radiostansiyalar"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Saralangan"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-vi/strings.xml b/car-broadcastradio-support/res/values-vi/strings.xml
deleted file mode 100644
index 067c179..0000000
--- a/car-broadcastradio-support/res/values-vi/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"Phát thanh kỹ thuật số"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Đài"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Đài yêu thích"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-zh-rCN/strings.xml b/car-broadcastradio-support/res/values-zh-rCN/strings.xml
deleted file mode 100644
index 1789a58..0000000
--- a/car-broadcastradio-support/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"电台"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"收藏"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-zh-rHK/strings.xml b/car-broadcastradio-support/res/values-zh-rHK/strings.xml
deleted file mode 100644
index bb596c2..0000000
--- a/car-broadcastradio-support/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"數碼聲音廣播"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"電台"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"收藏"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-zh-rTW/strings.xml b/car-broadcastradio-support/res/values-zh-rTW/strings.xml
deleted file mode 100644
index 0ba44bc..0000000
--- a/car-broadcastradio-support/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"電台"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"收藏"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-zu/strings.xml b/car-broadcastradio-support/res/values-zu/strings.xml
deleted file mode 100644
index dd5578b..0000000
--- a/car-broadcastradio-support/res/values-zu/strings.xml
+++ /dev/null
@@ -1,24 +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 xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
-    <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
-    <string name="radio_dab_text" msgid="8456449462266648979">"I-DAB"</string>
-    <string name="program_list_text" msgid="4414150317304422313">"Iziteshi"</string>
-    <string name="favorites_list_text" msgid="7829827713977109155">"Izintandokazi"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values/strings.xml b/car-broadcastradio-support/res/values/strings.xml
deleted file mode 100644
index 9151c21..0000000
--- a/car-broadcastradio-support/res/values/strings.xml
+++ /dev/null
@@ -1,31 +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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- Text to denote the AM radio band. -->
-    <string name="radio_am_text">AM</string>
-
-    <!-- Text to denote the FM radio band. -->
-    <string name="radio_fm_text">FM</string>
-
-    <!-- Text to denote the DAB radio band. -->
-    <string name="radio_dab_text">DAB</string>
-
-    <!-- Text to denote the list of programs (stations). -->
-    <string name="program_list_text">Stations</string>
-
-    <!-- Text to denote the list of favorite programs (stations). -->
-    <string name="favorites_list_text">Favorites</string>
-</resources>
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.aidl b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.aidl
deleted file mode 100644
index 99c9a93..0000000
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.aidl
+++ /dev/null
@@ -1,18 +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 com.android.car.broadcastradio.support;
-
-parcelable Program;
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.java
deleted file mode 100644
index af57c90..0000000
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.java
+++ /dev/null
@@ -1,113 +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 com.android.car.broadcastradio.support;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.graphics.Bitmap;
-import android.hardware.radio.ProgramSelector;
-import android.hardware.radio.RadioManager.ProgramInfo;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.android.car.broadcastradio.support.platform.ProgramInfoExt;
-
-import java.util.Objects;
-
-/**
- * Holds storable information about a Program.
- *
- * Contrary to {@link android.hardware.radio.RadioManager.ProgramInfo}, it doesn't hold runtime
- * information, like artist or signal quality.
- */
-public final class Program implements Parcelable {
-    private final @NonNull ProgramSelector mSelector;
-    private final @NonNull String mName;
-
-    public Program(@NonNull ProgramSelector selector, @NonNull String name) {
-        mSelector = Objects.requireNonNull(selector);
-        mName = Objects.requireNonNull(name);
-    }
-
-    public @NonNull ProgramSelector getSelector() {
-        return mSelector;
-    }
-
-    public @NonNull String getName() {
-        return mName;
-    }
-
-    /** @hide */
-    public @Nullable Bitmap getIcon() {
-        // TODO(b/73950974): implement saving icons
-        return null;
-    }
-
-    @Override
-    public String toString() {
-        return "Program(\"" + mName + "\", " + mSelector + ")";
-    }
-
-    @Override
-    public int hashCode() {
-        return mSelector.hashCode();
-    }
-
-    /**
-     * Two programs are considered equal if their selectors are equal.
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) return true;
-        if (!(obj instanceof Program)) return false;
-        Program other = (Program) obj;
-        return mSelector.equals(other.mSelector);
-    }
-
-    /**
-     * Builds a new {@link Program} object from {@link ProgramInfo}.
-     */
-    public static @NonNull Program fromProgramInfo(@NonNull ProgramInfo info) {
-        return new Program(info.getSelector(), ProgramInfoExt.getProgramName(info, 0));
-    }
-
-    private Program(Parcel in) {
-        mSelector = Objects.requireNonNull(in.readTypedObject(ProgramSelector.CREATOR));
-        mName = Objects.requireNonNull(in.readString());
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeTypedObject(mSelector, 0);
-        dest.writeString(mName);
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    public static final Parcelable.Creator<Program> CREATOR = new Parcelable.Creator<Program>() {
-        public Program createFromParcel(Parcel in) {
-            return new Program(in);
-        }
-
-        public Program[] newArray(int size) {
-            return new Program[size];
-        }
-    };
-}
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/media/BrowseTree.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/media/BrowseTree.java
deleted file mode 100644
index 39d23dc..0000000
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/media/BrowseTree.java
+++ /dev/null
@@ -1,505 +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 com.android.car.broadcastradio.support.media;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.StringRes;
-import android.graphics.Bitmap;
-import android.hardware.radio.ProgramList;
-import android.hardware.radio.ProgramSelector;
-import android.hardware.radio.RadioManager;
-import android.hardware.radio.RadioManager.BandDescriptor;
-import android.hardware.radio.RadioMetadata;
-import android.media.MediaDescription;
-import android.media.browse.MediaBrowser.MediaItem;
-import android.os.Bundle;
-import android.service.media.MediaBrowserService;
-import android.service.media.MediaBrowserService.BrowserRoot;
-import android.service.media.MediaBrowserService.Result;
-import android.util.Log;
-
-import com.android.car.broadcastradio.support.Program;
-import com.android.car.broadcastradio.support.R;
-import com.android.car.broadcastradio.support.platform.ImageResolver;
-import com.android.car.broadcastradio.support.platform.ProgramInfoExt;
-import com.android.car.broadcastradio.support.platform.ProgramSelectorExt;
-import com.android.car.broadcastradio.support.platform.RadioMetadataExt;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-
-/**
- * Implementation of MediaBrowserService logic regarding browser tree.
- */
-public class BrowseTree {
-    private static final String TAG = "BcRadioApp.BrowseTree";
-
-    /**
-     * Used as a long extra field to indicate the Broadcast Radio folder type of the media item.
-     * The value should be one of the following:
-     * <ul>
-     * <li>{@link #BCRADIO_FOLDER_TYPE_PROGRAMS}</li>
-     * <li>{@link #BCRADIO_FOLDER_TYPE_FAVORITES}</li>
-     * <li>{@link #BCRADIO_FOLDER_TYPE_BAND}</li>
-     * </ul>
-     *
-     * @see android.media.MediaDescription#getExtras()
-     */
-    public static final String EXTRA_BCRADIO_FOLDER_TYPE =
-            "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE";
-
-    /**
-     * The type of folder that contains a list of Broadcast Radio programs available
-     * to tune at the moment.
-     */
-    public static final long BCRADIO_FOLDER_TYPE_PROGRAMS = 1;
-
-    /**
-     * The type of folder that contains a list of Broadcast Radio programs added
-     * to favorites (not necessarily available to tune at the moment).
-     *
-     * If this folder has {@link android.media.browse.MediaBrowser.MediaItem#FLAG_PLAYABLE} flag
-     * set, it can be used to play some program from the favorite list (selection depends on the
-     * radio app implementation).
-     */
-    public static final long BCRADIO_FOLDER_TYPE_FAVORITES = 2;
-
-    /**
-     * The type of folder that contains the list of all Broadcast Radio channels
-     * (frequency values valid in the current region) for a given band.
-     * Each band (like AM, FM) has its own, separate folder.
-     * These lists include all channels, whether or not some program is tunable through it.
-     *
-     * If this folder has {@link android.media.browse.MediaBrowser.MediaItem#FLAG_PLAYABLE} flag
-     * set, it can be used to tune to some channel within a given band (selection depends on the
-     * radio app implementation).
-     */
-    public static final long BCRADIO_FOLDER_TYPE_BAND = 3;
-
-    /**
-     * Non-localized name of the band.
-     *
-     * For now, it can only take one of the following values:
-     *  - AM;
-     *  - FM;
-     *  - DAB;
-     *  - SXM.
-     *
-     * However, in future releases the list might get extended.
-     */
-    public static final String EXTRA_BCRADIO_BAND_NAME_EN =
-            "android.media.extra.EXTRA_BCRADIO_BAND_NAME_EN";
-
-    /**
-     * General play intent action.
-     *
-     * MediaBrowserService of the radio app must handle this command to perform general
-     * "play" command. It usually means starting playback of recently tuned station.
-     */
-    public static final String ACTION_PLAY_BROADCASTRADIO =
-            "android.car.intent.action.PLAY_BROADCASTRADIO";
-
-    private static final String NODE_ROOT = "root_id";
-    public static final String NODE_PROGRAMS = "programs_id";
-    public static final String NODE_FAVORITES = "favorites_id";
-
-    private static final String NODEPREFIX_BAND = "band:";
-    public static final String NODE_BAND_AM = NODEPREFIX_BAND + "am";
-    public static final String NODE_BAND_FM = NODEPREFIX_BAND + "fm";
-    public static final String NODE_BAND_DAB = NODEPREFIX_BAND + "dab";
-
-    private static final String NODEPREFIX_AMFMCHANNEL = "amfm:";
-    private static final String NODEPREFIX_PROGRAM = "program:";
-
-    private final BrowserRoot mRoot = new BrowserRoot(NODE_ROOT, null);
-
-    private final Object mLock = new Object();
-    private final @NonNull MediaBrowserService mBrowserService;
-    private final @Nullable ImageResolver mImageResolver;
-
-    private List<MediaItem> mRootChildren;
-
-    private final AmFmChannelList mAmChannels = new AmFmChannelList(
-            NODE_BAND_AM, R.string.radio_am_text, "AM");
-    private final AmFmChannelList mFmChannels = new AmFmChannelList(
-            NODE_BAND_FM, R.string.radio_fm_text, "FM");
-    private boolean mDABEnabled;
-
-    private final ProgramList.OnCompleteListener mProgramListCompleteListener =
-            this::onProgramListUpdated;
-    @Nullable private ProgramList mProgramList;
-    @Nullable private List<RadioManager.ProgramInfo> mProgramListSnapshot;
-    @Nullable private List<MediaItem> mProgramListCache;
-    private final List<Runnable> mProgramListTasks = new ArrayList<>();
-    private final Map<String, ProgramSelector> mProgramSelectors = new HashMap<>();
-
-    @Nullable Set<Program> mFavorites;
-    @Nullable private List<MediaItem> mFavoritesCache;
-
-    public BrowseTree(@NonNull MediaBrowserService browserService,
-            @Nullable ImageResolver imageResolver) {
-        mBrowserService = Objects.requireNonNull(browserService);
-        mImageResolver = imageResolver;
-    }
-
-    public BrowserRoot getRoot() {
-        return mRoot;
-    }
-
-    private static MediaItem createChild(MediaDescription.Builder descBuilder,
-            String mediaId, String title, ProgramSelector sel, Bitmap icon) {
-        MediaDescription desc = descBuilder
-                .setMediaId(mediaId)
-                .setMediaUri(ProgramSelectorExt.toUri(sel))
-                .setTitle(title)
-                .setIconBitmap(icon)
-                .build();
-        return new MediaItem(desc, MediaItem.FLAG_PLAYABLE);
-    }
-
-    private static MediaItem createFolder(MediaDescription.Builder descBuilder, String mediaId,
-            String title, boolean isBrowseable, boolean isPlayable, long folderType,
-            Bundle extras) {
-        if (extras == null) extras = new Bundle();
-        extras.putLong(EXTRA_BCRADIO_FOLDER_TYPE, folderType);
-
-        MediaDescription desc = descBuilder
-                .setMediaId(mediaId).setTitle(title).setExtras(extras).build();
-
-        int flags = 0;
-        if (isBrowseable) flags |= MediaItem.FLAG_BROWSABLE;
-        if (isPlayable) flags |= MediaItem.FLAG_PLAYABLE;
-        return new MediaItem(desc, flags);
-    }
-
-    /**
-     * Sets AM/FM region configuration.
-     *
-     * This method is meant to be called shortly after initialization, if AM/FM is supported.
-     */
-    public void setAmFmRegionConfig(@Nullable List<BandDescriptor> amFmBands) {
-        List<BandDescriptor> amBands = new ArrayList<>();
-        List<BandDescriptor> fmBands = new ArrayList<>();
-
-        if (amFmBands != null) {
-            for (BandDescriptor band : amFmBands) {
-                final int freq = band.getLowerLimit();
-                if (ProgramSelectorExt.isAmFrequency(freq)) {
-                    amBands.add(band);
-                } else if (ProgramSelectorExt.isFmFrequency(freq)) {
-                    fmBands.add(band);
-                }
-            }
-        }
-
-        synchronized (mLock) {
-            mAmChannels.setBands(amBands);
-            mFmChannels.setBands(fmBands);
-            mRootChildren = null;
-            mBrowserService.notifyChildrenChanged(NODE_ROOT);
-        }
-    }
-
-    /**
-     * Configures the BrowseTree to include a DAB node or not
-     */
-    public void setDABEnabled(boolean enabled) {
-        synchronized (mLock) {
-            if (mDABEnabled != enabled) {
-                mDABEnabled = enabled;
-                mRootChildren = null;
-                mBrowserService.notifyChildrenChanged(NODE_ROOT);
-            }
-        }
-    }
-
-    private void onProgramListUpdated() {
-        synchronized (mLock) {
-            mProgramListSnapshot = mProgramList.toList();
-            mProgramListCache = null;
-            mBrowserService.notifyChildrenChanged(NODE_PROGRAMS);
-
-            for (Runnable task : mProgramListTasks) {
-                task.run();
-            }
-            mProgramListTasks.clear();
-        }
-    }
-
-    /**
-     * Binds program list.
-     *
-     * This method is meant to be called shortly after opening a new tuner session.
-     */
-    public void setProgramList(@Nullable ProgramList programList) {
-        synchronized (mLock) {
-            if (mProgramList != null) {
-                mProgramList.removeOnCompleteListener(mProgramListCompleteListener);
-            }
-            mProgramList = programList;
-            if (programList != null) {
-                mProgramList.addOnCompleteListener(mProgramListCompleteListener);
-            }
-            mBrowserService.notifyChildrenChanged(NODE_ROOT);
-        }
-    }
-
-    private List<MediaItem> getPrograms() {
-        synchronized (mLock) {
-            if (mProgramListSnapshot == null) {
-                Log.w(TAG, "There is no snapshot of the program list");
-                return null;
-            }
-
-            if (mProgramListCache != null) return mProgramListCache;
-            mProgramListCache = new ArrayList<>();
-
-            MediaDescription.Builder dbld = new MediaDescription.Builder();
-
-            for (RadioManager.ProgramInfo program : mProgramListSnapshot) {
-                ProgramSelector sel = program.getSelector();
-                String mediaId = selectorToMediaId(sel);
-                mProgramSelectors.put(mediaId, sel);
-
-                Bitmap icon = null;
-                RadioMetadata meta = program.getMetadata();
-                if (meta != null && mImageResolver != null) {
-                    long id = RadioMetadataExt.getGlobalBitmapId(meta,
-                            RadioMetadata.METADATA_KEY_ICON);
-                    if (id != 0) icon = mImageResolver.resolve(id);
-                }
-
-                mProgramListCache.add(createChild(dbld, mediaId,
-                        ProgramInfoExt.getProgramName(program, 0), program.getSelector(), icon));
-            }
-
-            if (mProgramListCache.size() == 0) {
-                Log.v(TAG, "Program list is empty");
-            }
-            return mProgramListCache;
-        }
-    }
-
-    private void sendPrograms(final Result<List<MediaItem>> result) {
-        synchronized (mLock) {
-            if (mProgramListSnapshot != null) {
-                result.sendResult(getPrograms());
-            } else {
-                Log.d(TAG, "Program list is not ready yet");
-                result.detach();
-                mProgramListTasks.add(() -> result.sendResult(getPrograms()));
-            }
-        }
-    }
-
-    /**
-     * Updates favorites list.
-     */
-    public void setFavorites(@Nullable Set<Program> favorites) {
-        synchronized (mLock) {
-            boolean rootChanged = (mFavorites == null) != (favorites == null);
-            mFavorites = favorites;
-            mFavoritesCache = null;
-            mBrowserService.notifyChildrenChanged(NODE_FAVORITES);
-            if (rootChanged) mBrowserService.notifyChildrenChanged(NODE_ROOT);
-        }
-    }
-
-    private List<MediaItem> getFavorites() {
-        synchronized (mLock) {
-            if (mFavorites == null) return null;
-            if (mFavoritesCache != null) return mFavoritesCache;
-            mFavoritesCache = new ArrayList<>();
-
-            MediaDescription.Builder dbld = new MediaDescription.Builder();
-
-            for (Program fav : mFavorites) {
-                ProgramSelector sel = fav.getSelector();
-                String mediaId = selectorToMediaId(sel);
-                mProgramSelectors.putIfAbsent(mediaId, sel);  // prefer program list entries
-                mFavoritesCache.add(createChild(dbld, mediaId, fav.getName(), sel, fav.getIcon()));
-            }
-
-            return mFavoritesCache;
-        }
-    }
-
-    private List<MediaItem> getRootChildren() {
-        synchronized (mLock) {
-            if (mRootChildren != null) return mRootChildren;
-            mRootChildren = new ArrayList<>();
-
-            MediaDescription.Builder dbld = new MediaDescription.Builder();
-            if (mProgramList != null) {
-                mRootChildren.add(createFolder(dbld, NODE_PROGRAMS,
-                        mBrowserService.getString(R.string.program_list_text),
-                        true, false, BCRADIO_FOLDER_TYPE_PROGRAMS, null));
-            }
-            if (mFavorites != null) {
-                mRootChildren.add(createFolder(dbld, NODE_FAVORITES,
-                        mBrowserService.getString(R.string.favorites_list_text),
-                        true, true, BCRADIO_FOLDER_TYPE_FAVORITES, null));
-            }
-
-            MediaItem amRoot = mAmChannels.getBandRoot();
-            if (amRoot != null) mRootChildren.add(amRoot);
-            MediaItem fmRoot = mFmChannels.getBandRoot();
-            if (fmRoot != null) mRootChildren.add(fmRoot);
-
-            if (mDABEnabled) {
-                mRootChildren.add(createFolder(dbld, NODE_BAND_DAB,
-                        mBrowserService.getString(R.string.radio_dab_text),
-                        false, true, BCRADIO_FOLDER_TYPE_BAND, null));
-            }
-
-            return mRootChildren;
-        }
-    }
-
-    private class AmFmChannelList {
-        public final @NonNull String mMediaId;
-        private final @StringRes int mBandName;
-        private final @NonNull String mBandNameEn;
-        private @Nullable List<BandDescriptor> mBands;
-        private @Nullable List<MediaItem> mChannels;
-
-        private AmFmChannelList(@NonNull String mediaId, @StringRes int bandName,
-                @NonNull String bandNameEn) {
-            mMediaId = Objects.requireNonNull(mediaId);
-            mBandName = bandName;
-            mBandNameEn = Objects.requireNonNull(bandNameEn);
-        }
-
-        public void setBands(List<BandDescriptor> bands) {
-            synchronized (mLock) {
-                mBands = bands;
-                mChannels = null;
-                mBrowserService.notifyChildrenChanged(mMediaId);
-            }
-        }
-
-        private boolean isEmpty() {
-            if (mBands == null) {
-                Log.w(TAG, "AM/FM configuration not set");
-                return true;
-            }
-            return mBands.isEmpty();
-        }
-
-        public @Nullable MediaItem getBandRoot() {
-            if (isEmpty()) return null;
-            Bundle extras = new Bundle();
-            extras.putString(EXTRA_BCRADIO_BAND_NAME_EN, mBandNameEn);
-            return createFolder(new MediaDescription.Builder(), mMediaId,
-                    mBrowserService.getString(mBandName), true, true, BCRADIO_FOLDER_TYPE_BAND,
-                    extras);
-        }
-
-        public List<MediaItem> getChannels() {
-            synchronized (mLock) {
-                if (mChannels != null) return mChannels;
-                if (isEmpty()) return null;
-                mChannels = new ArrayList<>();
-
-                MediaDescription.Builder dbld = new MediaDescription.Builder();
-
-                for (BandDescriptor band : mBands) {
-                    final int lowerLimit = band.getLowerLimit();
-                    final int upperLimit = band.getUpperLimit();
-                    final int spacing = band.getSpacing();
-                    for (int ch = lowerLimit; ch <= upperLimit; ch += spacing) {
-                        ProgramSelector sel = ProgramSelectorExt.createAmFmSelector(ch);
-                        mChannels.add(createChild(dbld, NODEPREFIX_AMFMCHANNEL + ch,
-                                ProgramSelectorExt.getDisplayName(sel, 0), sel, null));
-                    }
-                }
-
-                return mChannels;
-            }
-        }
-    }
-
-    /**
-     * Loads subtree children.
-     *
-     * This method is meant to be used in MediaBrowserService's onLoadChildren callback.
-     */
-    public void loadChildren(final String parentMediaId, final Result<List<MediaItem>> result) {
-        if (parentMediaId == null || result == null) return;
-
-        if (NODE_ROOT.equals(parentMediaId)) {
-            result.sendResult(getRootChildren());
-        } else if (NODE_PROGRAMS.equals(parentMediaId)) {
-            sendPrograms(result);
-        } else if (NODE_FAVORITES.equals(parentMediaId)) {
-            result.sendResult(getFavorites());
-        } else if (parentMediaId.equals(mAmChannels.mMediaId)) {
-            result.sendResult(mAmChannels.getChannels());
-        } else if (parentMediaId.equals(mFmChannels.mMediaId)) {
-            result.sendResult(mFmChannels.getChannels());
-        } else {
-            Log.w(TAG, "Invalid parent media ID: " + parentMediaId);
-            result.sendResult(null);
-        }
-    }
-
-    private static @NonNull String selectorToMediaId(@NonNull ProgramSelector sel) {
-        ProgramSelector.Identifier id = sel.getPrimaryId();
-        return NODEPREFIX_PROGRAM + id.getType() + '/' + id.getValue();
-    }
-
-    /**
-     * Resolves mediaId to a tunable {@link ProgramSelector}.
-     *
-     * This method is meant to be used in MediaSession's onPlayFromMediaId callback.
-     */
-    public @Nullable ProgramSelector parseMediaId(@Nullable String mediaId) {
-        if (mediaId == null) return null;
-
-        if (mediaId.startsWith(NODEPREFIX_AMFMCHANNEL)) {
-            String freqStr = mediaId.substring(NODEPREFIX_AMFMCHANNEL.length());
-            int freqInt;
-            try {
-                freqInt = Integer.parseInt(freqStr);
-            } catch (NumberFormatException ex) {
-                Log.e(TAG, "Invalid frequency", ex);
-                return null;
-            }
-            return ProgramSelectorExt.createAmFmSelector(freqInt);
-        } else if (mediaId.startsWith(NODEPREFIX_PROGRAM)) {
-            return mProgramSelectors.get(mediaId);
-        } else if (mediaId.equals(NODE_FAVORITES)) {
-            if (mFavorites == null || mFavorites.isEmpty()) return null;
-            return mFavorites.iterator().next().getSelector();
-        } else if (mediaId.equals(NODE_PROGRAMS)) {
-            if (mProgramListSnapshot == null || mProgramListSnapshot.isEmpty()) return null;
-            return mProgramListSnapshot.get(0).getSelector();
-        } else if (mediaId.equals(NODE_BAND_AM)) {
-            if (mAmChannels.mBands == null || mAmChannels.mBands.isEmpty()) return null;
-            return ProgramSelectorExt.createAmFmSelector(mAmChannels.mBands.get(0).getLowerLimit());
-        } else if (mediaId.equals(NODE_BAND_FM)) {
-            if (mFmChannels.mBands == null || mFmChannels.mBands.isEmpty()) return null;
-            return ProgramSelectorExt.createAmFmSelector(mFmChannels.mBands.get(0).getLowerLimit());
-        }
-        return null;
-    }
-}
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ImageResolver.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ImageResolver.java
deleted file mode 100644
index 5538a58..0000000
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ImageResolver.java
+++ /dev/null
@@ -1,33 +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 com.android.car.broadcastradio.support.platform;
-
-import android.annotation.Nullable;
-import android.graphics.Bitmap;
-
-/**
- * Resolves metadata images.
- */
-public interface ImageResolver {
-    /**
-     * Resolve a given metadata image global id to a bitmap.
-     *
-     * @param globalId metadata image id
-     * @return A bitmap, or null if it was not available or invalid
-     */
-    @Nullable Bitmap resolve(long globalId);
-}
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramInfoExt.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramInfoExt.java
deleted file mode 100644
index ce3d014..0000000
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramInfoExt.java
+++ /dev/null
@@ -1,173 +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 com.android.car.broadcastradio.support.platform;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.graphics.Bitmap;
-import android.hardware.radio.ProgramSelector;
-import android.hardware.radio.RadioManager.ProgramInfo;
-import android.hardware.radio.RadioMetadata;
-import android.media.MediaMetadata;
-import android.media.Rating;
-import android.util.Log;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Proposed extensions to android.hardware.radio.RadioManager.ProgramInfo.
- *
- * They might eventually get pushed to the framework.
- */
-public class ProgramInfoExt {
-    private static final String TAG = "BcRadioApp.pinfoext";
-
-    /**
-     * If there is no suitable program name, return null instead of doing
-     * a fallback to channel display name.
-     */
-    public static final int NAME_NO_CHANNEL_FALLBACK = 1 << 16;
-
-    /**
-     * Flags to control how to fetch program name with {@link #getProgramName}.
-     *
-     * Lower 16 bits are reserved for {@link ProgramSelectorExt#NameFlag}.
-     */
-    @IntDef(prefix = { "NAME_" }, flag = true, value = {
-        ProgramSelectorExt.NAME_NO_MODULATION,
-        ProgramSelectorExt.NAME_MODULATION_ONLY,
-        NAME_NO_CHANNEL_FALLBACK,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface NameFlag {}
-
-    private static final char EN_DASH = '\u2013';
-    private static final String TITLE_SEPARATOR = " " + EN_DASH + " ";
-
-    private static final String[] PROGRAM_NAME_ORDER = new String[] {
-        RadioMetadata.METADATA_KEY_PROGRAM_NAME,
-        RadioMetadata.METADATA_KEY_DAB_COMPONENT_NAME,
-        RadioMetadata.METADATA_KEY_DAB_SERVICE_NAME,
-        RadioMetadata.METADATA_KEY_DAB_ENSEMBLE_NAME,
-        RadioMetadata.METADATA_KEY_RDS_PS,
-    };
-
-    /**
-     * Returns program name suitable to display.
-     *
-     * If there is no program name, it falls back to channel name. Flags related to
-     * the channel name display will be forwarded to the channel name generation method.
-     */
-    public static @NonNull String getProgramName(@NonNull ProgramInfo info, @NameFlag int flags) {
-        RadioMetadata meta = info.getMetadata();
-        if (meta != null) {
-            for (String key : PROGRAM_NAME_ORDER) {
-                String value = meta.getString(key);
-                if (value != null) return value;
-            }
-        }
-
-        if ((flags & NAME_NO_CHANNEL_FALLBACK) != 0) return "";
-
-        ProgramSelector sel = info.getSelector();
-
-        // if it's AM/FM program, prefer to display currently used AF frequency
-        if (ProgramSelectorExt.isAmFmProgram(sel)) {
-            ProgramSelector.Identifier phy = info.getPhysicallyTunedTo();
-            if (phy != null && phy.getType() == ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY) {
-                String chName = ProgramSelectorExt.formatAmFmFrequency(phy.getValue(), flags);
-                if (chName != null) return chName;
-            }
-        }
-
-        String selName = ProgramSelectorExt.getDisplayName(sel, flags);
-        if (selName != null) return selName;
-
-        Log.w(TAG, "ProgramInfo without a name nor channel name");
-        return "";
-    }
-
-    /**
-     * Proposed reimplementation of {@link RadioManager#ProgramInfo#getMetadata}.
-     *
-     * As opposed to the original implementation, it never returns null.
-     */
-    public static @NonNull RadioMetadata getMetadata(@NonNull ProgramInfo info) {
-        RadioMetadata meta = info.getMetadata();
-        if (meta != null) return meta;
-
-        /* Creating new Metadata object on each get won't be necessary after we
-         * push this code to the framework. */
-        return (new RadioMetadata.Builder()).build();
-    }
-
-    /**
-     * Converts {@ProgramInfo} to {@MediaMetadata}.
-     *
-     * This method is meant to be used for currently playing station in {@link MediaSession}.
-     *
-     * @param info {@link ProgramInfo} to convert
-     * @param isFavorite true, if a given program is a favorite
-     * @param imageResolver metadata images resolver/cache
-     * @return {@link MediaMetadata} object
-     */
-    public static @NonNull MediaMetadata toMediaMetadata(@NonNull ProgramInfo info,
-            boolean isFavorite, @Nullable ImageResolver imageResolver) {
-        MediaMetadata.Builder bld = new MediaMetadata.Builder();
-
-        bld.putString(MediaMetadata.METADATA_KEY_DISPLAY_TITLE, getProgramName(info, 0));
-
-        RadioMetadata meta = info.getMetadata();
-        if (meta != null) {
-            String title = meta.getString(RadioMetadata.METADATA_KEY_TITLE);
-            if (title != null) {
-                bld.putString(MediaMetadata.METADATA_KEY_TITLE, title);
-            }
-            String artist = meta.getString(RadioMetadata.METADATA_KEY_ARTIST);
-            if (artist != null) {
-                bld.putString(MediaMetadata.METADATA_KEY_ARTIST, artist);
-            }
-            String album = meta.getString(RadioMetadata.METADATA_KEY_ALBUM);
-            if (album != null) {
-                bld.putString(MediaMetadata.METADATA_KEY_ALBUM, album);
-            }
-            if (title != null || artist != null) {
-                String subtitle;
-                if (title == null) {
-                    subtitle = artist;
-                } else if (artist == null) {
-                    subtitle = title;
-                } else {
-                    subtitle = title + TITLE_SEPARATOR + artist;
-                }
-                bld.putString(MediaMetadata.METADATA_KEY_DISPLAY_SUBTITLE, subtitle);
-            }
-            long albumArtId = RadioMetadataExt.getGlobalBitmapId(meta,
-                    RadioMetadata.METADATA_KEY_ART);
-            if (albumArtId != 0 && imageResolver != null) {
-                Bitmap bm = imageResolver.resolve(albumArtId);
-                if (bm != null) bld.putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, bm);
-            }
-        }
-
-        bld.putRating(MediaMetadata.METADATA_KEY_USER_RATING, Rating.newHeartRating(isFavorite));
-
-        return bld.build();
-    }
-}
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramSelectorExt.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramSelectorExt.java
deleted file mode 100644
index 4b3583b..0000000
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramSelectorExt.java
+++ /dev/null
@@ -1,486 +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 com.android.car.broadcastradio.support.platform;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.hardware.radio.ProgramSelector;
-import android.hardware.radio.ProgramSelector.Identifier;
-import android.hardware.radio.RadioManager;
-import android.net.Uri;
-import android.util.Log;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.BiConsumer;
-import java.util.function.BiFunction;
-
-/**
- * Proposed extensions to android.hardware.radio.ProgramSelector.
- *
- * They might eventually get pushed to the framework.
- */
-public class ProgramSelectorExt {
-    private static final String TAG = "BcRadioApp.pselext";
-
-    /**
-     * If this is AM/FM channel (or any other technology using different modulations),
-     * don't return modulation part.
-     */
-    public static final int NAME_NO_MODULATION = 1 << 0;
-
-    /**
-     * Return only modulation part of channel name.
-     *
-     * If this is not a radio technology using modulation, return nothing
-     * (unless combined with other _ONLY flags in the future).
-     *
-     * If this returns non-null string, it's guaranteed that {@link #NAME_NO_MODULATION}
-     * will return the complement of channel name.
-     */
-    public static final int NAME_MODULATION_ONLY = 1 << 1;
-
-    /**
-     * If the channel name is not human-readable (i.e. DAB SId), radio technology is displayed
-     * instead. This flag prevents that.
-     *
-     * With radio technology fallback, null pointer may still be returned in case of unsupported
-     * radio technologies.
-     */
-    public static final int NAME_NO_PROGRAM_TYPE_FALLBACK = 1 << 2;
-
-    /**
-     * Flags to control how channel values are converted to string with {@link #getDisplayName}.
-     *
-     * Upper 16 bits are reserved for {@link ProgramInfoExt#NameFlag}.
-     */
-    @IntDef(prefix = { "NAME_" }, flag = true, value = {
-        NAME_NO_MODULATION,
-        NAME_MODULATION_ONLY,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface NameFlag {}
-
-    private static final String URI_SCHEME_BROADCASTRADIO = "broadcastradio";
-    private static final String URI_AUTHORITY_PROGRAM = "program";
-    private static final String URI_VENDOR_PREFIX = "VENDOR_";
-    private static final String URI_HEX_PREFIX = "0x";
-
-    private static final DecimalFormat FORMAT_FM = new DecimalFormat("###.#");
-
-    private static final Map<Integer, String> ID_TO_URI = new HashMap<>();
-    private static final Map<String, Integer> URI_TO_ID = new HashMap<>();
-
-    /**
-     * New proposed constructor for {@link ProgramSelector}.
-     *
-     * As opposed to the current platform API, this one matches more closely simplified HAL 2.0.
-     *
-     * @param primaryId primary program identifier.
-     * @param secondaryIds list of secondary program identifiers.
-     */
-    public static @NonNull ProgramSelector newProgramSelector(@NonNull Identifier primaryId,
-            @Nullable Identifier[] secondaryIds) {
-        return new ProgramSelector(
-                identifierToProgramType(primaryId),
-                primaryId, secondaryIds, null);
-    }
-
-    // when pushed to the framework, remove similar code from HAL 2.0 service
-    private static @ProgramSelector.ProgramType int identifierToProgramType(
-            @NonNull Identifier primaryId) {
-        int idType = primaryId.getType();
-        switch (idType) {
-            case ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY:
-                if (isAmFrequency(primaryId.getValue())) {
-                    return ProgramSelector.PROGRAM_TYPE_AM;
-                } else {
-                    return ProgramSelector.PROGRAM_TYPE_FM;
-                }
-            case ProgramSelector.IDENTIFIER_TYPE_RDS_PI:
-                return ProgramSelector.PROGRAM_TYPE_FM;
-            case ProgramSelector.IDENTIFIER_TYPE_HD_STATION_ID_EXT:
-                if (isAmFrequency(IdentifierExt.asHdPrimary(primaryId).getFrequency())) {
-                    return ProgramSelector.PROGRAM_TYPE_AM_HD;
-                } else {
-                    return ProgramSelector.PROGRAM_TYPE_FM_HD;
-                }
-            case ProgramSelector.IDENTIFIER_TYPE_DAB_SIDECC:
-            case ProgramSelector.IDENTIFIER_TYPE_DAB_ENSEMBLE:
-            case ProgramSelector.IDENTIFIER_TYPE_DAB_SCID:
-            case ProgramSelector.IDENTIFIER_TYPE_DAB_FREQUENCY:
-                return ProgramSelector.PROGRAM_TYPE_DAB;
-            case ProgramSelector.IDENTIFIER_TYPE_DRMO_SERVICE_ID:
-            case ProgramSelector.IDENTIFIER_TYPE_DRMO_FREQUENCY:
-                return ProgramSelector.PROGRAM_TYPE_DRMO;
-            case ProgramSelector.IDENTIFIER_TYPE_SXM_SERVICE_ID:
-            case ProgramSelector.IDENTIFIER_TYPE_SXM_CHANNEL:
-                return ProgramSelector.PROGRAM_TYPE_SXM;
-        }
-        if (idType >= ProgramSelector.IDENTIFIER_TYPE_VENDOR_PRIMARY_START
-                && idType <= ProgramSelector.IDENTIFIER_TYPE_VENDOR_PRIMARY_END) {
-            return idType;
-        }
-        return ProgramSelector.PROGRAM_TYPE_INVALID;
-    }
-
-    /**
-     * Checks, if a given AM frequency is roughly valid and in correct unit.
-     *
-     * It does not check the range precisely: it may provide false positives, but not false
-     * negatives. In particular, it may be way off for certain regions.
-     * The main purpose is to avoid passing inproper units, ie. MHz instead of kHz.
-     * It also can be used to check if a given frequency is likely to be used
-     * with AM or FM modulation.
-     *
-     * @param frequencyKhz the frequency in kHz.
-     * @return true, if the frequency is rougly valid.
-     */
-    public static boolean isAmFrequency(long frequencyKhz) {
-        return frequencyKhz > 150 && frequencyKhz <= 30000;
-    }
-
-    /**
-     * Checks, if a given FM frequency is roughly valid and in correct unit.
-     *
-     * It does not check the range precisely: it may provide false positives, but not false
-     * negatives. In particular, it may be way off for certain regions.
-     * The main purpose is to avoid passing inproper units, ie. MHz instead of kHz.
-     * It also can be used to check if a given frequency is likely to be used
-     * with AM or FM modulation.
-     *
-     * @param frequencyKhz the frequency in kHz.
-     * @return true, if the frequency is rougly valid.
-     */
-    public static boolean isFmFrequency(long frequencyKhz) {
-        return frequencyKhz > 60000 && frequencyKhz < 110000;
-    }
-
-    /**
-     * Provides human-readable representation of AM/FM frequency.
-     *
-     * @param frequencyKhz the frequency in kHz.
-     * @param flags flags that affect display format
-     * @return human-readable formatted frequency
-     */
-    public static @Nullable String formatAmFmFrequency(long frequencyKhz, @NameFlag int flags) {
-        String channel;
-        String modulation;
-
-        if (isAmFrequency(frequencyKhz)) {
-            channel = Long.toString(frequencyKhz);
-            modulation = "AM";
-        } else if (isFmFrequency(frequencyKhz)) {
-            channel = FORMAT_FM.format(frequencyKhz / 1000f);
-            modulation = "FM";
-        } else {
-            Log.w(TAG, "AM/FM frequency out of range: " + frequencyKhz);
-            return null;
-        }
-
-        if ((flags & NAME_MODULATION_ONLY) != 0) return modulation;
-        if ((flags & NAME_NO_MODULATION) != 0) return channel;
-        return channel + ' ' + modulation;
-    }
-
-    /**
-     * Builds new ProgramSelector for AM/FM frequency.
-     *
-     * @param frequencyKhz the frequency in kHz.
-     * @return new ProgramSelector object representing given frequency.
-     * @throws IllegalArgumentException if provided frequency is out of bounds.
-     */
-    public static @NonNull ProgramSelector createAmFmSelector(long frequencyKhz) {
-        if (frequencyKhz < 0 || frequencyKhz > Integer.MAX_VALUE) {
-            throw new IllegalArgumentException("illegal frequency value: " + frequencyKhz);
-        }
-        return ProgramSelector.createAmFmSelector(RadioManager.BAND_INVALID, (int) frequencyKhz);
-    }
-
-    /**
-     * Checks, if {@link ProgramSelector} contains an id of a given type.
-     *
-     * @param sel selector being checked
-     * @param type identifier type to check for
-     * @return true, if sel contains any identifier of a given type
-     */
-    public static boolean hasId(@NonNull ProgramSelector sel,
-            @ProgramSelector.IdentifierType int type) {
-        try {
-            sel.getFirstId(type);
-            return true;
-        } catch (IllegalArgumentException e) {
-            return false;
-        }
-    }
-
-    /**
-     * Checks, if {@link ProgramSelector} is a AM/FM program.
-     *
-     * @return true, if the primary identifier of a selector belongs to one of the following
-     *         technologies:
-     *          - Analogue AM/FM
-     *          - FM RDS
-     *          - HD Radio AM/FM
-     */
-    public static boolean isAmFmProgram(@NonNull ProgramSelector sel) {
-        int priType = sel.getPrimaryId().getType();
-        return priType == ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY
-                || priType == ProgramSelector.IDENTIFIER_TYPE_RDS_PI
-                || priType == ProgramSelector.IDENTIFIER_TYPE_HD_STATION_ID_EXT;
-    }
-
-    /**
-     * Returns a channel name that can be displayed to the user.
-     *
-     * It's implemented only for radio technologies where the channel is meant
-     * to be presented to the user.
-     *
-     * @param sel the program selector
-     * @return Channel name or null, if radio technology doesn't present channel names to the user.
-     */
-    public static @Nullable String getDisplayName(@NonNull ProgramSelector sel,
-            @NameFlag int flags) {
-        boolean noProgramTypeFallback = (flags & NAME_NO_PROGRAM_TYPE_FALLBACK) != 0;
-
-        if (isAmFmProgram(sel)) {
-            if (!hasId(sel, ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY)) {
-                if (noProgramTypeFallback) return null;
-                // if there is no frequency assigned, let's assume it's a malformed RDS selector
-                return "FM";
-            }
-            long freq = sel.getFirstId(ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY);
-            return formatAmFmFrequency(freq, flags);
-        }
-
-        if ((flags & NAME_MODULATION_ONLY) != 0) return null;
-
-        if (sel.getPrimaryId().getType() == ProgramSelector.IDENTIFIER_TYPE_SXM_SERVICE_ID
-                && hasId(sel, ProgramSelector.IDENTIFIER_TYPE_SXM_CHANNEL)) {
-            return Long.toString(sel.getFirstId(ProgramSelector.IDENTIFIER_TYPE_SXM_CHANNEL));
-        }
-
-        if (noProgramTypeFallback) return null;
-
-        switch (sel.getPrimaryId().getType()) {
-            case ProgramSelector.IDENTIFIER_TYPE_SXM_SERVICE_ID:
-                return "SXM";
-            case ProgramSelector.IDENTIFIER_TYPE_DAB_SIDECC:
-                return "DAB";
-            case ProgramSelector.IDENTIFIER_TYPE_DRMO_SERVICE_ID:
-                return "DRMO";
-            default:
-                return null;
-        }
-    }
-
-    static {
-        BiConsumer<Integer, String> add = (idType, name) -> {
-            ID_TO_URI.put(idType, name);
-            URI_TO_ID.put(name, idType);
-        };
-
-        add.accept(ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY, "AMFM_FREQUENCY");
-        add.accept(ProgramSelector.IDENTIFIER_TYPE_RDS_PI, "RDS_PI");
-        add.accept(ProgramSelector.IDENTIFIER_TYPE_HD_STATION_ID_EXT, "HD_STATION_ID_EXT");
-        add.accept(ProgramSelector.IDENTIFIER_TYPE_HD_STATION_NAME, "HD_STATION_NAME");
-        add.accept(ProgramSelector.IDENTIFIER_TYPE_DAB_SID_EXT, "DAB_SID_EXT");
-        add.accept(ProgramSelector.IDENTIFIER_TYPE_DAB_ENSEMBLE, "DAB_ENSEMBLE");
-        add.accept(ProgramSelector.IDENTIFIER_TYPE_DAB_SCID, "DAB_SCID");
-        add.accept(ProgramSelector.IDENTIFIER_TYPE_DAB_FREQUENCY, "DAB_FREQUENCY");
-        add.accept(ProgramSelector.IDENTIFIER_TYPE_DRMO_SERVICE_ID, "DRMO_SERVICE_ID");
-        add.accept(ProgramSelector.IDENTIFIER_TYPE_DRMO_FREQUENCY, "DRMO_FREQUENCY");
-        add.accept(ProgramSelector.IDENTIFIER_TYPE_SXM_SERVICE_ID, "SXM_SERVICE_ID");
-        add.accept(ProgramSelector.IDENTIFIER_TYPE_SXM_CHANNEL, "SXM_CHANNEL");
-    }
-
-    private static @Nullable String typeToUri(int identifierType) {
-        if (identifierType >= ProgramSelector.IDENTIFIER_TYPE_VENDOR_START
-                && identifierType <= ProgramSelector.IDENTIFIER_TYPE_VENDOR_END) {
-            int idx = identifierType - ProgramSelector.IDENTIFIER_TYPE_VENDOR_START;
-            return URI_VENDOR_PREFIX + idx;
-        }
-        return ID_TO_URI.get(identifierType);
-    }
-
-    private static int uriToType(@Nullable String typeUri) {
-        if (typeUri == null) return ProgramSelector.IDENTIFIER_TYPE_INVALID;
-        if (typeUri.startsWith(URI_VENDOR_PREFIX)) {
-            int idx;
-            try {
-                idx = Integer.parseInt(typeUri.substring(URI_VENDOR_PREFIX.length()));
-            } catch (NumberFormatException ex) {
-                return ProgramSelector.IDENTIFIER_TYPE_INVALID;
-            }
-            if (idx > ProgramSelector.IDENTIFIER_TYPE_VENDOR_END
-                    - ProgramSelector.IDENTIFIER_TYPE_VENDOR_START) {
-                return ProgramSelector.IDENTIFIER_TYPE_INVALID;
-            }
-            return ProgramSelector.IDENTIFIER_TYPE_VENDOR_START + idx;
-        }
-        return URI_TO_ID.get(typeUri);
-    }
-
-    private static @NonNull String valueToUri(@NonNull Identifier id) {
-        long val = id.getValue();
-        switch (id.getType()) {
-            case ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY:
-            case ProgramSelector.IDENTIFIER_TYPE_DAB_FREQUENCY:
-            case ProgramSelector.IDENTIFIER_TYPE_DRMO_FREQUENCY:
-            case ProgramSelector.IDENTIFIER_TYPE_SXM_CHANNEL:
-                return Long.toString(val);
-            default:
-                return URI_HEX_PREFIX + Long.toHexString(val);
-        }
-    }
-
-    private static @Nullable Long uriToValue(@Nullable String valUri) {
-        if (valUri == null) return null;
-        try {
-            if (valUri.startsWith(URI_HEX_PREFIX)) {
-                return Long.parseLong(valUri.substring(URI_HEX_PREFIX.length()), 16);
-            } else {
-                return Long.parseLong(valUri, 10);
-            }
-        } catch (NumberFormatException ex) {
-            return null;
-        }
-    }
-
-    /**
-     * Serialize {@link ProgramSelector} to URI.
-     *
-     * @param sel selector to serialize
-     * @return serialized form of selector
-     */
-    public static @Nullable Uri toUri(@NonNull ProgramSelector sel) {
-        Identifier pri = sel.getPrimaryId();
-        String priType = typeToUri(pri.getType());
-        // unsupported primary identifier, might be from future HAL revision
-        if (priType == null) return null;
-
-        Uri.Builder uri = new Uri.Builder()
-                .scheme(URI_SCHEME_BROADCASTRADIO)
-                .authority(URI_AUTHORITY_PROGRAM)
-                .appendPath(priType)
-                .appendPath(valueToUri(pri));
-
-        for (Identifier sec : sel.getSecondaryIds()) {
-            String secType = typeToUri(sec.getType());
-            if (secType == null) continue;  // skip unsupported secondary identifier
-            uri.appendQueryParameter(secType, valueToUri(sec));
-        }
-        return uri.build();
-    }
-
-    /**
-     * Parse serialized {@link ProgramSelector}.
-     *
-     * @param uri URI-zed form of ProgramSelector
-     * @return de-serialized object or null, if couldn't parse
-     */
-    public static @Nullable ProgramSelector fromUri(@Nullable Uri uri) {
-        if (uri == null) return null;
-
-        if (!URI_SCHEME_BROADCASTRADIO.equals(uri.getScheme())) return null;
-        if (!URI_AUTHORITY_PROGRAM.equals(uri.getAuthority())) {
-            Log.w(TAG, "Unknown URI authority part (might be a future, unsupported version): "
-                    + uri.getAuthority());
-            return null;
-        }
-
-        BiFunction<String, String, Identifier> parseComponents = (typeStr, valueStr) -> {
-            int type = uriToType(typeStr);
-            Long value = uriToValue(valueStr);
-            if (type == ProgramSelector.IDENTIFIER_TYPE_INVALID || value == null) return null;
-            return new Identifier(type, value);
-        };
-
-        List<String> priUri = uri.getPathSegments();
-        if (priUri.size() != 2) return null;
-        Identifier pri = parseComponents.apply(priUri.get(0), priUri.get(1));
-        if (pri == null) return null;
-
-        String query = uri.getQuery();
-        List<Identifier> secIds = new ArrayList<>();
-        if (query != null) {
-            for (String secPair : query.split("&")) {
-                String[] secStr = secPair.split("=");
-                if (secStr.length != 2) continue;
-                Identifier sec = parseComponents.apply(secStr[0], secStr[1]);
-                if (sec != null) secIds.add(sec);
-            }
-        }
-
-        return newProgramSelector(pri, secIds.toArray(new Identifier[secIds.size()]));
-    }
-
-    /**
-     * Proposed extensions to android.hardware.radio.ProgramSelector.Identifier.
-     *
-     * They might eventually get pushed to the framework.
-     */
-    public static class IdentifierExt {
-        /**
-         * Decode {@link ProgramSelector#IDENTIFIER_TYPE_HD_STATION_ID_EXT} value.
-         *
-         * @param id identifier to decode
-         * @return value decoder
-         */
-        public static @Nullable HdPrimary asHdPrimary(@NonNull Identifier id) {
-            if (id.getType() == ProgramSelector.IDENTIFIER_TYPE_HD_STATION_ID_EXT) {
-                return new HdPrimary(id.getValue());
-            }
-            return null;
-        }
-
-        /**
-         * Decoder of {@link ProgramSelector#IDENTIFIER_TYPE_HD_STATION_ID_EXT} value.
-         *
-         * When pushed to the framework, it will be non-static class referring
-         * to the original value.
-         */
-        public static class HdPrimary {
-            /* For mValue format (bit shifts and bit masks), please refer to
-             * HD_STATION_ID_EXT from broadcastradio HAL 2.0.
-             */
-            private final long mValue;
-
-            private HdPrimary(long value) {
-                mValue = value;
-            }
-
-            public long getStationId() {
-                return mValue & 0xFFFFFFFF;
-            }
-
-            public int getSubchannel() {
-                return (int) ((mValue >>> 32) & 0xF);
-            }
-
-            public int getFrequency() {
-                return (int) ((mValue >>> (32 + 4)) & 0x3FFFF);
-            }
-        }
-    }
-}
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/RadioMetadataExt.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/RadioMetadataExt.java
deleted file mode 100644
index e7b6f3b..0000000
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/RadioMetadataExt.java
+++ /dev/null
@@ -1,60 +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 com.android.car.broadcastradio.support.platform;
-
-import android.annotation.NonNull;
-import android.hardware.radio.RadioMetadata;
-
-/**
- * Proposed extensions to android.hardware.radio.RadioMetadata.
- *
- * They might eventually get pushed to the framework.
- */
-public class RadioMetadataExt {
-    private static int sModuleId;
-
-    /**
-     * A hack to inject module ID for getGlobalBitmapId. When pushed to the framework,
-     * it will be set with RadioMetadata object creation or just separate int field.
-     * @hide
-     */
-    public static void setModuleId(int id) {
-        sModuleId = id;
-    }
-
-    /**
-     * Proposed redefinition of {@link RadioMetadata#getBitmapId}.
-     *
-     * {@link RadioMetadata#getBitmapId} isn't part of the system API yet, so we can skip
-     * deprecation here and jump straight to the correct solution.
-     */
-    public static long getGlobalBitmapId(@NonNull RadioMetadata meta, @NonNull String key) {
-        int localId = meta.getBitmapId(key);
-        if (localId == 0) return 0;
-
-        /* When generating global bitmap ID, we want them to remain stable between sessions
-         * (radio app might cache images to disk between sessions).
-         *
-         * Local IDs are already stable, but module ID is not guaranteed to be stable (i.e. some
-         * module might be not available at each boot, due to HW failure).
-         *
-         * When we push this to the framework, we will need persistence mechanism at the radio
-         * service to permanently match modules to their IDs.
-         */
-        return ((long) sModuleId << 32) | localId;
-    }
-}
diff --git a/car-media-common/res/values-te/strings.xml b/car-media-common/res/values-te/strings.xml
index f3dec11..265d667 100644
--- a/car-media-common/res/values-te/strings.xml
+++ b/car-media-common/res/values-te/strings.xml
@@ -30,5 +30,5 @@
     <string name="error_code_content_already_playing" msgid="1306236349553004461">"ఇప్పటికే ఆ కంటెంట్ ప్లే అవుతోంది"</string>
     <string name="error_code_skip_limit_reached" msgid="4203743406433151146">"ఇంక ఏ ట్రాక్‌లనూ స్కిప్ చేయడం సాధ్యపడదు"</string>
     <string name="error_code_action_aborted" msgid="8611777981356536501">"పూర్తి చేయడం సాధ్యపడలేదు. మళ్లీ ట్రై చేయండి."</string>
-    <string name="error_code_end_of_queue" msgid="6935022448319288887">"క్రమ వరుసలో ఏమీ లేదు"</string>
+    <string name="error_code_end_of_queue" msgid="6935022448319288887">"క్యూలో ఏమీ లేదు"</string>
 </resources>
diff --git a/car-media-common/res/values/overlayable.xml b/car-media-common/res/values/overlayable.xml
new file mode 100644
index 0000000..ae5d970
--- /dev/null
+++ b/car-media-common/res/values/overlayable.xml
@@ -0,0 +1,150 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Copyright (C) 2022 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.-->
+<!--
+THIS FILE WAS AUTO GENERATED, DO NOT EDIT MANUALLY.
+REGENERATE USING packages/apps/Car/tests/tools/rro/generate-overlayable.py
+-->
+<resources>
+  <overlayable name="CarMediaCommon">
+    <policy type="system|product|signature">
+      <item type="anim" name="trim_end_interpolator"/>
+      <item type="anim" name="trim_start_interpolator"/>
+      <item type="array" name="custom_media_packages"/>
+      <item type="array" name="placeholder_backgrounds"/>
+      <item type="array" name="placeholder_images"/>
+      <item type="array" name="preferred_media_sources"/>
+      <item type="attr" name="align_horizontal"/>
+      <item type="attr" name="aspect_ratio"/>
+      <item type="attr" name="columns"/>
+      <item type="attr" name="show_expand_button"/>
+      <item type="attr" name="state_disabled"/>
+      <item type="attr" name="state_pause"/>
+      <item type="attr" name="state_play"/>
+      <item type="attr" name="state_stop"/>
+      <item type="bool" name="show_circular_progress_bar"/>
+      <item type="bool" name="show_linear_progress_bar"/>
+      <item type="bool" name="use_media_source_color_for_fab_spinner"/>
+      <item type="bool" name="use_media_source_logo_for_app_selector"/>
+      <item type="color" name="album_art_placeholder_color"/>
+      <item type="color" name="album_art_scrim"/>
+      <item type="color" name="appbar_view_icon_background_color"/>
+      <item type="color" name="fab_spinner_indeterminate_color"/>
+      <item type="color" name="media_button_tint_disabled"/>
+      <item type="color" name="media_source_default_color"/>
+      <item type="color" name="minimized_progress_bar_highlight"/>
+      <item type="color" name="placeholder_color_0"/>
+      <item type="color" name="placeholder_color_1"/>
+      <item type="color" name="placeholder_color_2"/>
+      <item type="color" name="placeholder_color_3"/>
+      <item type="color" name="placeholder_color_4"/>
+      <item type="color" name="placeholder_color_5"/>
+      <item type="color" name="placeholder_color_6"/>
+      <item type="color" name="placeholder_color_7"/>
+      <item type="color" name="playback_control_color"/>
+      <item type="dimen" name="album_art_scrim_alpha"/>
+      <item type="dimen" name="app_selector_icon_size"/>
+      <item type="dimen" name="app_selector_icon_touch_target"/>
+      <item type="dimen" name="app_selector_margin_x"/>
+      <item type="dimen" name="appbar_2_rows_height"/>
+      <item type="dimen" name="appbar_view_icon_background_corner_radius"/>
+      <item type="dimen" name="appbar_view_icon_background_radius"/>
+      <item type="dimen" name="appbar_view_icon_padding"/>
+      <item type="dimen" name="appbar_view_icon_touch_target_size"/>
+      <item type="dimen" name="appbar_view_search_app_icon_margin"/>
+      <item type="dimen" name="appbar_view_search_bar_end_margin"/>
+      <item type="dimen" name="appbar_view_search_close_icon_margin"/>
+      <item type="dimen" name="fab_spinner_size"/>
+      <item type="dimen" name="minimized_progress_bar_track_thickness"/>
+      <item type="dimen" name="playback_fragment_app_icon_margin_right"/>
+      <item type="dimen" name="playback_fragment_controls_margin_bottom"/>
+      <item type="dimen" name="playback_fragment_error_button_margin_bottom"/>
+      <item type="dimen" name="playback_fragment_error_button_margin_top"/>
+      <item type="dimen" name="playback_fragment_text_margin_top"/>
+      <item type="dimen" name="playback_fragment_text_margin_x"/>
+      <item type="drawable" name="appbar_view_icon_background"/>
+      <item type="drawable" name="circular_progress_bar"/>
+      <item type="drawable" name="ic_app_switch"/>
+      <item type="drawable" name="ic_music"/>
+      <item type="drawable" name="ic_pause"/>
+      <item type="drawable" name="ic_placeholder"/>
+      <item type="drawable" name="ic_placeholder_0"/>
+      <item type="drawable" name="ic_placeholder_1"/>
+      <item type="drawable" name="ic_placeholder_2"/>
+      <item type="drawable" name="ic_placeholder_3"/>
+      <item type="drawable" name="ic_placeholder_4"/>
+      <item type="drawable" name="ic_placeholder_5"/>
+      <item type="drawable" name="ic_placeholder_6"/>
+      <item type="drawable" name="ic_placeholder_7"/>
+      <item type="drawable" name="ic_play_arrow"/>
+      <item type="drawable" name="ic_play_arrow_off"/>
+      <item type="drawable" name="ic_play_pause_stop_animated"/>
+      <item type="drawable" name="ic_skip_next"/>
+      <item type="drawable" name="ic_skip_previous"/>
+      <item type="drawable" name="ic_star_empty"/>
+      <item type="drawable" name="ic_star_filled"/>
+      <item type="drawable" name="ic_stop"/>
+      <item type="drawable" name="ic_tracklist"/>
+      <item type="drawable" name="minimized_progress_bar_background"/>
+      <item type="drawable" name="music_buffering"/>
+      <item type="drawable" name="placeholder_color_drawable_0"/>
+      <item type="drawable" name="placeholder_color_drawable_1"/>
+      <item type="drawable" name="placeholder_color_drawable_2"/>
+      <item type="drawable" name="placeholder_color_drawable_3"/>
+      <item type="drawable" name="placeholder_color_drawable_4"/>
+      <item type="drawable" name="placeholder_color_drawable_5"/>
+      <item type="drawable" name="placeholder_color_drawable_6"/>
+      <item type="drawable" name="placeholder_color_drawable_7"/>
+      <item type="drawable" name="vector_drawable_progress_bar_medium_thin"/>
+      <item type="id" name="album_background"/>
+      <item type="id" name="app_selector"/>
+      <item type="id" name="app_selector_container"/>
+      <item type="id" name="circular_progress_bar"/>
+      <item type="id" name="linear_progress_bar"/>
+      <item type="id" name="minimized_control_bar"/>
+      <item type="id" name="overflow"/>
+      <item type="id" name="play_pause_container"/>
+      <item type="id" name="play_pause_stop"/>
+      <item type="id" name="playback_scrim"/>
+      <item type="id" name="skip_next"/>
+      <item type="id" name="skip_prev"/>
+      <item type="id" name="track_list"/>
+      <item type="integer" name="media_items_bitmap_max_size_px"/>
+      <item type="integer" name="new_album_art_fade_in_duration"/>
+      <item type="integer" name="num_app_selector_columns"/>
+      <item type="integer" name="playback_subtitle_text_max_lines"/>
+      <item type="integer" name="playback_title_text_max_lines"/>
+      <item type="integer" name="widget_error_text_max_lines"/>
+      <item type="layout" name="minimized_play_pause_stop_button_layout"/>
+      <item type="layout" name="minimized_playback_control_bar"/>
+      <item type="layout" name="play_pause_stop_button_layout"/>
+      <item type="layout" name="playback_fragment"/>
+      <item type="string" name="album_art"/>
+      <item type="string" name="default_error_message"/>
+      <item type="string" name="error_code_action_aborted"/>
+      <item type="string" name="error_code_app_error"/>
+      <item type="string" name="error_code_authentication_expired"/>
+      <item type="string" name="error_code_concurrent_stream_limit"/>
+      <item type="string" name="error_code_content_already_playing"/>
+      <item type="string" name="error_code_end_of_queue"/>
+      <item type="string" name="error_code_not_available_in_region"/>
+      <item type="string" name="error_code_not_supported"/>
+      <item type="string" name="error_code_parental_control_restricted"/>
+      <item type="string" name="error_code_premium_account_required"/>
+      <item type="string" name="error_code_skip_limit_reached"/>
+      <item type="string" name="launcher_intent"/>
+      <item type="string" name="launcher_popup_intent"/>
+      <item type="string" name="metadata_default_title"/>
+      <item type="style" name="PlaybackSubtitleStyle"/>
+      <item type="style" name="PlaybackTitleStyle"/>
+    </policy>
+  </overlayable>
+</resources>
diff --git a/car-media-common/tools/generate-overlayable.sh b/car-media-common/tools/generate-overlayable.sh
new file mode 100755
index 0000000..7566e7e
--- /dev/null
+++ b/car-media-common/tools/generate-overlayable.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+#  Copyright (C) 2021 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.
+
+# Run this script to regenerate the overlayable.xml file.
+
+if [[ -z "$ANDROID_BUILD_TOP" ]]; then
+  echo 'ANDROID_BUILD_TOP environment variable is empty; did you forget to run `lunch`?'
+  exit 1
+fi
+
+PROJECT_TOP=$ANDROID_BUILD_TOP/packages/apps/Car/libs/car-media-common
+
+python3 $ANDROID_BUILD_TOP/packages/apps/Car/tests/tools/rro/generate-overlayable.py \
+    -n car-media-common \
+    -r $PROJECT_TOP/res \
+    -e $PROJECT_TOP/res/values/overlayable.xml \
+    -o $PROJECT_TOP/res/values/overlayable.xml
diff --git a/car-qc-lib/Android.bp b/car-qc-lib/Android.bp
deleted file mode 100644
index c12fd28..0000000
--- a/car-qc-lib/Android.bp
+++ /dev/null
@@ -1,31 +0,0 @@
-//
-// Copyright (C) 2021 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 {
-    default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-android_library {
-    name: "car-qc-lib",
-    platform_apis: true,
-    srcs: ["src/**/*.java"],
-    optimize: {
-        enabled: false,
-    },
-    static_libs: [
-        "androidx.annotation_annotation",
-        "car-ui-lib"
-    ],
-}
diff --git a/car-qc-lib/OWNERS b/car-qc-lib/OWNERS
deleted file mode 100644
index 7f8081c..0000000
--- a/car-qc-lib/OWNERS
+++ /dev/null
@@ -1,8 +0,0 @@
-# People who can approve changes for submission.
-
-# Primary
-alexstetson@google.com
-
-# Secondary (only if people in Primary are unreachable)
-hseog@google.com
-nehah@google.com
diff --git a/car-qc-lib/PREUPLOAD.cfg b/car-qc-lib/PREUPLOAD.cfg
deleted file mode 100644
index 38f9800..0000000
--- a/car-qc-lib/PREUPLOAD.cfg
+++ /dev/null
@@ -1,7 +0,0 @@
-[Hook Scripts]
-checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPLOAD_COMMIT}
-ktlint_hook = ${REPO_ROOT}/prebuilts/ktlint/ktlint.py -f ${PREUPLOAD_FILES}
-
-[Builtin Hooks]
-commit_msg_changeid_field = true
-commit_msg_test_field = true
diff --git a/car-qc-lib/res/color/qc_toggle_background_color.xml b/car-qc-lib/res/color/qc_toggle_background_color.xml
deleted file mode 100644
index 15253ad..0000000
--- a/car-qc-lib/res/color/qc_toggle_background_color.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2021 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_checked="false" android:state_enabled="false"
-          android:alpha="?android:attr/disabledAlpha"
-          android:color="@color/qc_toggle_off_background_color"/>
-    <item android:state_checked="false"
-          android:color="@color/qc_toggle_off_background_color"/>
-    <item android:state_enabled="false"
-          android:alpha="?android:attr/disabledAlpha"
-          android:color="?android:attr/colorAccent"/>
-    <item android:color="?android:attr/colorAccent"/>
-</selector>
diff --git a/car-qc-lib/res/color/qc_toggle_icon_fill_color.xml b/car-qc-lib/res/color/qc_toggle_icon_fill_color.xml
deleted file mode 100644
index bdb5433..0000000
--- a/car-qc-lib/res/color/qc_toggle_icon_fill_color.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2021 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_checked="false" android:state_enabled="false"
-          android:alpha="?android:attr/disabledAlpha"
-          android:color="@android:color/white"/>
-    <item android:state_checked="false"
-          android:color="@android:color/white"/>
-    <item android:state_enabled="false"
-          android:alpha="?android:attr/disabledAlpha"
-          android:color="@android:color/black"/>
-    <item android:color="@android:color/black"/>
-</selector>
diff --git a/car-qc-lib/res/drawable/qc_row_action_divider.xml b/car-qc-lib/res/drawable/qc_row_action_divider.xml
deleted file mode 100644
index 75ffd46..0000000
--- a/car-qc-lib/res/drawable/qc_row_action_divider.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
-  ~ Copyright (C) 2021 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="0dp"
-        android:width="@dimen/qc_toggle_margin"/>
-</shape>
diff --git a/car-qc-lib/res/drawable/qc_seekbar_wrapper_background.xml b/car-qc-lib/res/drawable/qc_seekbar_wrapper_background.xml
deleted file mode 100644
index 58b9c65..0000000
--- a/car-qc-lib/res/drawable/qc_seekbar_wrapper_background.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2021 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <!-- Highlight the wrapper when it's focused but not selected. The wrapper is selected in
-    direct manipulation mode. -->
-    <item android:state_focused="true" android:state_selected="false">
-        <shape android:shape="rectangle">
-            <solid android:color="@color/car_ui_rotary_focus_fill_color"/>
-            <stroke android:width="@dimen/car_ui_rotary_focus_stroke_width"
-                    android:color="@color/car_ui_rotary_focus_stroke_color"/>
-        </shape>
-    </item>
-</selector>
\ No newline at end of file
diff --git a/car-qc-lib/res/drawable/qc_toggle_background.xml b/car-qc-lib/res/drawable/qc_toggle_background.xml
deleted file mode 100644
index c139590..0000000
--- a/car-qc-lib/res/drawable/qc_toggle_background.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2021 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"
-          android:width="@dimen/qc_toggle_size"
-          android:height="@dimen/qc_toggle_size">
-        <shape android:shape="rectangle">
-            <solid android:color="@color/qc_toggle_background_color" />
-            <corners android:radius="@dimen/qc_toggle_background_radius" />
-        </shape>
-    </item>
-    <item android:width="@dimen/qc_toggle_size"
-          android:height="@dimen/qc_toggle_size"
-          android:drawable="@drawable/qc_toggle_rotary_background"/>
-</layer-list>
\ No newline at end of file
diff --git a/car-qc-lib/res/drawable/qc_toggle_unavailable_background.xml b/car-qc-lib/res/drawable/qc_toggle_unavailable_background.xml
deleted file mode 100644
index 98cbded..0000000
--- a/car-qc-lib/res/drawable/qc_toggle_unavailable_background.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2021 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"
-          android:width="@dimen/qc_toggle_size"
-          android:height="@dimen/qc_toggle_size">
-        <shape android:shape="rectangle">
-            <solid android:color="@color/qc_toggle_unavailable_background_color" />
-            <stroke android:color="@color/qc_toggle_unavailable_color"
-                    android:width="@dimen/qc_toggle_unavailable_outline_width" />
-            <corners android:radius="@dimen/qc_toggle_background_radius" />
-        </shape>
-    </item>
-    <item android:width="@dimen/qc_toggle_size"
-          android:height="@dimen/qc_toggle_size"
-          android:drawable="@drawable/qc_toggle_rotary_background"/>
-</layer-list>
diff --git a/car-qc-lib/res/layout/qc_action_switch.xml b/car-qc-lib/res/layout/qc_action_switch.xml
deleted file mode 100644
index d51b61d..0000000
--- a/car-qc-lib/res/layout/qc_action_switch.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2021 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.
-  -->
-<Switch
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@android:id/switch_widget"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content" />
-
diff --git a/car-qc-lib/res/layout/qc_action_toggle.xml b/car-qc-lib/res/layout/qc_action_toggle.xml
deleted file mode 100644
index 301e0c4..0000000
--- a/car-qc-lib/res/layout/qc_action_toggle.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2021 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.
-  -->
-<com.android.car.ui.uxr.DrawableStateToggleButton
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/qc_toggle_button"
-    android:background="@android:color/transparent"
-    android:defaultFocusHighlightEnabled="false"
-    android:minHeight="0dp"
-    android:minWidth="0dp"
-    android:layout_width="@dimen/qc_toggle_size"
-    android:layout_height="@dimen/qc_toggle_size"/>
\ No newline at end of file
diff --git a/car-qc-lib/res/layout/qc_row_view.xml b/car-qc-lib/res/layout/qc_row_view.xml
deleted file mode 100644
index 5975426..0000000
--- a/car-qc-lib/res/layout/qc_row_view.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2021 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.
-  -->
-
-<com.android.car.ui.uxr.DrawableStateConstraintLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_centerVertical="true"
-    android:layout_marginVertical="@dimen/qc_row_margin_vertical"
-    android:clipToPadding="false"
-    android:minHeight="@dimen/qc_row_min_height"
-    android:paddingEnd="@dimen/qc_row_padding_end"
-    android:paddingStart="@dimen/qc_row_padding_start">
-
-    <LinearLayout
-        android:id="@+id/qc_row_start_items"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginEnd="@dimen/qc_action_items_horizontal_margin"
-        android:orientation="horizontal"
-        android:divider="@drawable/qc_row_action_divider"
-        android:showDividers="middle"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toStartOf="@+id/qc_row_content"
-        app:layout_constraintHorizontal_chainStyle="spread_inside"/>
-
-    <com.android.car.ui.uxr.DrawableStateConstraintLayout
-        android:id="@+id/qc_row_content"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:background="?android:attr/selectableItemBackground"
-        app:layout_constraintStart_toEndOf="@+id/qc_row_start_items"
-        app:layout_constraintEnd_toStartOf="@+id/qc_row_end_items"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintHeight_default="wrap"
-        app:layout_constraintHeight_min="@dimen/qc_row_min_height">
-
-        <com.android.car.ui.uxr.DrawableStateImageView
-            android:id="@+id/qc_icon"
-            android:layout_width="@dimen/qc_row_icon_size"
-            android:layout_height="@dimen/qc_row_icon_size"
-            android:layout_marginEnd="@dimen/qc_row_icon_margin_end"
-            android:scaleType="fitCenter"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintEnd_toStartOf="@+id/barrier1"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintBottom_toTopOf="@+id/barrier2"/>
-
-        <androidx.constraintlayout.widget.Barrier
-            android:id="@+id/barrier1"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            app:barrierDirection="end"
-            app:constraint_referenced_ids="qc_icon"
-            app:barrierAllowsGoneWidgets="false"/>
-
-        <com.android.car.ui.uxr.DrawableStateTextView
-            android:id="@+id/qc_title"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_centerVertical="true"
-            android:singleLine="true"
-            android:textAppearance="@style/TextAppearance.QC.Title"
-            app:layout_constraintStart_toEndOf="@+id/barrier1"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintBottom_toTopOf="@+id/qc_summary"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintVertical_chainStyle="packed"/>
-
-        <com.android.car.ui.uxr.DrawableStateTextView
-            android:id="@+id/qc_summary"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_centerVertical="true"
-            android:textAppearance="@style/TextAppearance.QC.Subtitle"
-            app:layout_constraintStart_toEndOf="@+id/barrier1"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/qc_title"
-            app:layout_constraintBottom_toTopOf="@+id/barrier2"/>
-
-        <androidx.constraintlayout.widget.Barrier
-            android:id="@+id/barrier2"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            app:barrierDirection="top"
-            app:constraint_referenced_ids="qc_seekbar_wrapper"
-            app:barrierAllowsGoneWidgets="false"/>
-
-        <androidx.preference.UnPressableLinearLayout
-            android:id="@+id/qc_seekbar_wrapper"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:paddingTop="@dimen/qc_seekbar_padding_top"
-            android:focusable="true"
-            android:background="@drawable/qc_seekbar_wrapper_background"
-            android:clipChildren="false"
-            android:clipToPadding="false"
-            android:layout_centerVertical="true"
-            android:orientation="vertical"
-            android:visibility="gone"
-            app:layout_constraintStart_toEndOf="@+id/barrier1"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/barrier2"
-            app:layout_constraintBottom_toBottomOf="parent">
-            <SeekBar
-                android:id="@+id/seekbar"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                style="@style/Widget.QC.SeekBar"/>
-        </androidx.preference.UnPressableLinearLayout>
-
-    </com.android.car.ui.uxr.DrawableStateConstraintLayout>
-
-    <LinearLayout
-        android:id="@+id/qc_row_end_items"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="@dimen/qc_action_items_horizontal_margin"
-        android:orientation="horizontal"
-        android:divider="@drawable/qc_row_action_divider"
-        android:showDividers="middle"
-        app:layout_constraintStart_toEndOf="@+id/qc_row_content"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintBottom_toBottomOf="parent"/>
-
-</com.android.car.ui.uxr.DrawableStateConstraintLayout>
diff --git a/car-qc-lib/res/layout/qc_tile_view.xml b/car-qc-lib/res/layout/qc_tile_view.xml
deleted file mode 100644
index 7fb0884..0000000
--- a/car-qc-lib/res/layout/qc_tile_view.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2021 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.
-  -->
-<com.android.car.ui.uxr.DrawableStateLinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/qc_tile_wrapper"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:gravity="center"
-    android:orientation="vertical"
-    android:background="?android:attr/selectableItemBackground">
-    <com.android.car.ui.uxr.DrawableStateToggleButton
-        android:id="@+id/qc_tile_toggle_button"
-        android:background="@android:color/transparent"
-        android:layout_width="@dimen/qc_toggle_size"
-        android:layout_height="@dimen/qc_toggle_size"
-        android:layout_marginTop="@dimen/qc_toggle_margin"
-        android:layout_marginBottom="@dimen/qc_toggle_margin"
-        android:layout_marginStart="@dimen/qc_toggle_margin"
-        android:layout_marginEnd="@dimen/qc_toggle_margin"
-        android:clickable="false"
-        android:focusable="false"/>
-    <com.android.car.ui.uxr.DrawableStateTextView
-        android:id="@android:id/summary"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:textAppearance="@style/TextAppearance.QC.Subtitle"/>
-</com.android.car.ui.uxr.DrawableStateLinearLayout>
\ No newline at end of file
diff --git a/car-qc-lib/res/values/colors.xml b/car-qc-lib/res/values/colors.xml
deleted file mode 100644
index e3fbd6f..0000000
--- a/car-qc-lib/res/values/colors.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-  ~ Copyright (C) 2021 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="qc_start_icon_color">@android:color/white</color>
-    <color name="qc_toggle_off_background_color">#626262</color>
-    <color name="qc_toggle_unavailable_background_color">@android:color/transparent</color>
-    <color name="qc_toggle_unavailable_color">#75FFFFFF</color>
-</resources>
\ No newline at end of file
diff --git a/car-qc-lib/res/values/dimens.xml b/car-qc-lib/res/values/dimens.xml
deleted file mode 100644
index 6247561..0000000
--- a/car-qc-lib/res/values/dimens.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<!--
-  ~ Copyright (C) 2021 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="qc_row_padding_start">32dp</dimen>
-    <dimen name="qc_row_padding_end">32dp</dimen>
-    <dimen name="qc_row_min_height">76dp</dimen>
-    <dimen name="qc_row_margin_vertical">10dp</dimen>
-    <dimen name="qc_row_icon_size">44dp</dimen>
-    <dimen name="qc_row_icon_margin_end">32dp</dimen>
-    <dimen name="qc_row_content_margin">16dp</dimen>
-
-    <dimen name="qc_action_items_horizontal_margin">32dp</dimen>
-    <dimen name="qc_toggle_size">72dp</dimen>
-    <dimen name="qc_toggle_margin">12dp</dimen>
-    <dimen name="qc_toggle_background_radius">16dp</dimen>
-    <dimen name="qc_toggle_rotary_background_radius">11dp</dimen>
-    <dimen name="qc_toggle_foreground_icon_inset">14dp</dimen>
-    <dimen name="qc_toggle_unavailable_outline_width">2dp</dimen>
-
-    <dimen name="qc_seekbar_padding_top">16dp</dimen>
-</resources>
\ No newline at end of file
diff --git a/car-qc-lib/res/values/styles.xml b/car-qc-lib/res/values/styles.xml
deleted file mode 100644
index 587b522..0000000
--- a/car-qc-lib/res/values/styles.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<!--
-  ~ Copyright (C) 2021 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="TextAppearance.QC" parent="android:TextAppearance.DeviceDefault">
-        <item name="android:textColor">@color/car_ui_text_color_primary</item>
-    </style>
-
-    <style name="TextAppearance.QC.Title">
-        <item name="android:textSize">@dimen/car_ui_body1_size</item>
-    </style>
-
-    <style name="TextAppearance.QC.Subtitle">
-        <item name="android:textColor">@color/car_ui_text_color_secondary</item>
-        <item name="android:textSize">@dimen/car_ui_body3_size</item>
-    </style>
-
-    <style name="Widget.QC" parent="android:Widget.DeviceDefault"/>
-
-    <style name="Widget.QC.SeekBar">
-        <item name="android:background">@null</item>
-        <item name="android:clickable">false</item>
-        <item name="android:focusable">false</item>
-        <item name="android:splitTrack">false</item>
-    </style>
-</resources>
diff --git a/car-qc-lib/src/com/android/car/qc/QCActionItem.java b/car-qc-lib/src/com/android/car/qc/QCActionItem.java
deleted file mode 100644
index 4c66bea..0000000
--- a/car-qc-lib/src/com/android/car/qc/QCActionItem.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc;
-
-import android.app.PendingIntent;
-import android.graphics.drawable.Icon;
-import android.os.Parcel;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-/**
- * Quick Control Action that are includes as either start or end actions in {@link QCRow}
- */
-public class QCActionItem extends QCItem {
-    private final boolean mIsChecked;
-    private final boolean mIsEnabled;
-    private final boolean mIsAvailable;
-    private Icon mIcon;
-    private PendingIntent mAction;
-
-    public QCActionItem(@NonNull @QCItemType String type, boolean isChecked, boolean isEnabled,
-            boolean isAvailable, @Nullable Icon icon, @Nullable PendingIntent action) {
-        super(type);
-        mIsEnabled = isEnabled;
-        mIsChecked = isChecked;
-        mIsAvailable = isAvailable;
-        mIcon = icon;
-        mAction = action;
-    }
-
-    public QCActionItem(@NonNull Parcel in) {
-        super(in);
-        mIsChecked = in.readBoolean();
-        mIsEnabled = in.readBoolean();
-        mIsAvailable = in.readBoolean();
-        boolean hasIcon = in.readBoolean();
-        if (hasIcon) {
-            mIcon = Icon.CREATOR.createFromParcel(in);
-        }
-        boolean hasAction = in.readBoolean();
-        if (hasAction) {
-            mAction = PendingIntent.CREATOR.createFromParcel(in);
-        }
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        super.writeToParcel(dest, flags);
-        dest.writeBoolean(mIsChecked);
-        dest.writeBoolean(mIsEnabled);
-        dest.writeBoolean(mIsAvailable);
-        boolean includeIcon = getType().equals(QC_TYPE_ACTION_TOGGLE) && mIcon != null;
-        dest.writeBoolean(includeIcon);
-        if (includeIcon) {
-            mIcon.writeToParcel(dest, flags);
-        }
-        boolean hasAction = mAction != null;
-        dest.writeBoolean(hasAction);
-        if (hasAction) {
-            mAction.writeToParcel(dest, flags);
-        }
-    }
-
-    @Override
-    public PendingIntent getPrimaryAction() {
-        return mAction;
-    }
-
-    public boolean isChecked() {
-        return mIsChecked;
-    }
-
-    public boolean isEnabled() {
-        return mIsEnabled;
-    }
-
-    public boolean isAvailable() {
-        return mIsAvailable;
-    }
-
-    @Nullable
-    public Icon getIcon() {
-        return mIcon;
-    }
-
-    public static Creator<QCActionItem> CREATOR = new Creator<QCActionItem>() {
-        @Override
-        public QCActionItem createFromParcel(Parcel source) {
-            return new QCActionItem(source);
-        }
-
-        @Override
-        public QCActionItem[] newArray(int size) {
-            return new QCActionItem[size];
-        }
-    };
-
-    /**
-     * Builder for {@link QCActionItem}.
-     */
-    public static class Builder {
-        private final String mType;
-        private boolean mIsChecked;
-        private boolean mIsEnabled = true;
-        private boolean mIsAvailable = true;
-        private Icon mIcon;
-        private PendingIntent mAction;
-
-        public Builder(@NonNull @QCItemType String type) {
-            if (!isValidType(type)) {
-                throw new IllegalArgumentException("Invalid QCActionItem type provided" + type);
-            }
-            mType = type;
-        }
-
-        /**
-         * Sets whether or not the action item should be checked.
-         */
-        public Builder setChecked(boolean checked) {
-            mIsChecked = checked;
-            return this;
-        }
-
-        /**
-         * Sets whether or not the action item should be enabled.
-         */
-        public Builder setEnabled(boolean enabled) {
-            mIsEnabled = enabled;
-            return this;
-        }
-
-        /**
-         * Sets whether or not the action item is available.
-         */
-        public Builder setAvailable(boolean available) {
-            mIsAvailable = available;
-            return this;
-        }
-
-        /**
-         * Sets the icon for {@link QC_TYPE_ACTION_TOGGLE} actions
-         */
-        public Builder setIcon(@Nullable Icon icon) {
-            mIcon = icon;
-            return this;
-        }
-
-        /**
-         * Sets the PendingIntent to be sent when the action item is clicked.
-         */
-        public Builder setAction(@Nullable PendingIntent action) {
-            mAction = action;
-            return this;
-        }
-
-        /**
-         * Builds the final {@link QCActionItem}.
-         */
-        public QCActionItem build() {
-            return new QCActionItem(mType, mIsChecked, mIsEnabled, mIsAvailable, mIcon, mAction);
-        }
-
-        private boolean isValidType(String type) {
-            return type.equals(QC_TYPE_ACTION_SWITCH) || type.equals(QC_TYPE_ACTION_TOGGLE);
-        }
-    }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/QCItem.java b/car-qc-lib/src/com/android/car/qc/QCItem.java
deleted file mode 100644
index 77fe30f..0000000
--- a/car-qc-lib/src/com/android/car/qc/QCItem.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc;
-
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.StringDef;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Base class for all quick controls elements.
- */
-public abstract class QCItem implements Parcelable {
-    public static final String QC_TYPE_LIST = "QC_TYPE_LIST";
-    public static final String QC_TYPE_ROW = "QC_TYPE_ROW";
-    public static final String QC_TYPE_TILE = "QC_TYPE_TILE";
-    public static final String QC_TYPE_SLIDER = "QC_TYPE_SLIDER";
-    public static final String QC_TYPE_ACTION_SWITCH = "QC_TYPE_ACTION_SWITCH";
-    public static final String QC_TYPE_ACTION_TOGGLE = "QC_TYPE_ACTION_TOGGLE";
-
-    public static final String QC_ACTION_TOGGLE_STATE = "QC_ACTION_TOGGLE_STATE";
-    public static final String QC_ACTION_SLIDER_VALUE = "QC_ACTION_SLIDER_VALUE";
-
-    @StringDef(value = {
-            QC_TYPE_LIST,
-            QC_TYPE_ROW,
-            QC_TYPE_TILE,
-            QC_TYPE_SLIDER,
-            QC_TYPE_ACTION_SWITCH,
-            QC_TYPE_ACTION_TOGGLE,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface QCItemType {
-    }
-
-    private final String mType;
-    private ActionHandler mActionHandler;
-
-    public QCItem(@NonNull @QCItemType String type) {
-        mType = type;
-    }
-
-    public QCItem(@NonNull Parcel in) {
-        mType = in.readString();
-    }
-
-    @NonNull
-    @QCItemType
-    public String getType() {
-        return mType;
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(mType);
-    }
-
-    public void setActionHandler(@Nullable ActionHandler handler) {
-        mActionHandler = handler;
-    }
-
-    @Nullable
-    public ActionHandler getActionHandler() {
-        return mActionHandler;
-    }
-
-    /**
-     * Returns the PendingIntent that is sent when the item is clicked.
-     */
-    @Nullable
-    public abstract PendingIntent getPrimaryAction();
-
-    /**
-     * Action handler that can listen for an action to occur and notify listeners.
-     */
-    public interface ActionHandler {
-        /**
-         * Callback when an action occurs.
-         * @param item the QCItem that sent the action
-         * @param context the context for the action
-         * @param intent the intent that was sent with the action
-         */
-        void onAction(@NonNull QCItem item, @NonNull Context context, @NonNull Intent intent);
-
-        default boolean isActivity() {
-            return false;
-        }
-    }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/QCList.java b/car-qc-lib/src/com/android/car/qc/QCList.java
deleted file mode 100644
index 250b5d8..0000000
--- a/car-qc-lib/src/com/android/car/qc/QCList.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc;
-
-import android.app.PendingIntent;
-import android.os.Parcel;
-
-import androidx.annotation.NonNull;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Wrapping quick controls element that contains QCRow elements.
- */
-public class QCList extends QCItem {
-    private final List<QCRow> mRows;
-
-    public QCList(@NonNull List<QCRow> rows) {
-        super(QC_TYPE_LIST);
-        mRows = Collections.unmodifiableList(rows);
-    }
-
-    public QCList(@NonNull Parcel in) {
-        super(in);
-        int rowCount = in.readInt();
-        List<QCRow> rows = new ArrayList<>();
-        for (int i = 0; i < rowCount; i++) {
-            rows.add(QCRow.CREATOR.createFromParcel(in));
-        }
-        mRows = Collections.unmodifiableList(rows);
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        super.writeToParcel(dest, flags);
-        dest.writeInt(mRows.size());
-        for (QCRow row : mRows) {
-            row.writeToParcel(dest, flags);
-        }
-    }
-
-    @Override
-    public PendingIntent getPrimaryAction() {
-        return null;
-    }
-
-    @NonNull
-    public List<QCRow> getRows() {
-        return mRows;
-    }
-
-    public static Creator<QCList> CREATOR = new Creator<QCList>() {
-        @Override
-        public QCList createFromParcel(Parcel source) {
-            return new QCList(source);
-        }
-
-        @Override
-        public QCList[] newArray(int size) {
-            return new QCList[size];
-        }
-    };
-
-    /**
-     * Builder for {@link QCList}.
-     */
-    public static class Builder {
-        private final List<QCRow> mRows = new ArrayList<>();
-
-        /**
-         * Adds a {@link QCRow} to the list.
-         */
-        public Builder addRow(@NonNull QCRow row) {
-            mRows.add(row);
-            return this;
-        }
-
-        /**
-         * Builds the final {@link QCList}.
-         */
-        public QCList build() {
-            return new QCList(mRows);
-        }
-    }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/QCRow.java b/car-qc-lib/src/com/android/car/qc/QCRow.java
deleted file mode 100644
index deb4429..0000000
--- a/car-qc-lib/src/com/android/car/qc/QCRow.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc;
-
-import android.app.PendingIntent;
-import android.graphics.drawable.Icon;
-import android.os.Parcel;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Quick Control Row Element
- * ------------------------------------
- * |            | Title    |          |
- * | StartItems | Subtitle | EndItems |
- * |            | Sliders  |          |
- * ------------------------------------
- */
-public class QCRow extends QCItem {
-    private final String mTitle;
-    private final String mSubtitle;
-    private final Icon mStartIcon;
-    private final boolean mIsStartIconTintable;
-    private final QCSlider mSlider;
-    private final List<QCActionItem> mStartItems;
-    private final List<QCActionItem> mEndItems;
-    private final PendingIntent mPrimaryAction;
-
-    public QCRow(@Nullable String title, @Nullable String subtitle,
-            @Nullable PendingIntent primaryAction, @Nullable Icon startIcon, boolean isIconTintable,
-            @Nullable QCSlider slider, @NonNull List<QCActionItem> startItems,
-            @NonNull List<QCActionItem> endItems) {
-        super(QC_TYPE_ROW);
-        mTitle = title;
-        mSubtitle = subtitle;
-        mPrimaryAction = primaryAction;
-        mStartIcon = startIcon;
-        mIsStartIconTintable = isIconTintable;
-        mSlider = slider;
-        mStartItems = Collections.unmodifiableList(startItems);
-        mEndItems = Collections.unmodifiableList(endItems);
-    }
-
-    public QCRow(@NonNull Parcel in) {
-        super(in);
-        mTitle = in.readString();
-        mSubtitle = in.readString();
-        boolean hasIcon = in.readBoolean();
-        if (hasIcon) {
-            mStartIcon = Icon.CREATOR.createFromParcel(in);
-        } else {
-            mStartIcon = null;
-        }
-        mIsStartIconTintable = in.readBoolean();
-        boolean hasSlider = in.readBoolean();
-        if (hasSlider) {
-            mSlider = QCSlider.CREATOR.createFromParcel(in);
-        } else {
-            mSlider = null;
-        }
-        List<QCActionItem> startItems = new ArrayList<>();
-        int startItemCount = in.readInt();
-        for (int i = 0; i < startItemCount; i++) {
-            startItems.add(QCActionItem.CREATOR.createFromParcel(in));
-        }
-        mStartItems = Collections.unmodifiableList(startItems);
-        List<QCActionItem> endItems = new ArrayList<>();
-        int endItemCount = in.readInt();
-        for (int i = 0; i < endItemCount; i++) {
-            endItems.add(QCActionItem.CREATOR.createFromParcel(in));
-        }
-        mEndItems = Collections.unmodifiableList(endItems);
-        boolean hasPrimaryAction = in.readBoolean();
-        if (hasPrimaryAction) {
-            mPrimaryAction = PendingIntent.CREATOR.createFromParcel(in);
-        } else {
-            mPrimaryAction = null;
-        }
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        super.writeToParcel(dest, flags);
-        dest.writeString(mTitle);
-        dest.writeString(mSubtitle);
-        boolean hasStartIcon = mStartIcon != null;
-        dest.writeBoolean(hasStartIcon);
-        if (hasStartIcon) {
-            mStartIcon.writeToParcel(dest, flags);
-        }
-        dest.writeBoolean(mIsStartIconTintable);
-        boolean hasSlider = mSlider != null;
-        dest.writeBoolean(hasSlider);
-        if (hasSlider) {
-            mSlider.writeToParcel(dest, flags);
-        }
-        dest.writeInt(mStartItems.size());
-        for (QCActionItem startItem : mStartItems) {
-            startItem.writeToParcel(dest, flags);
-        }
-        dest.writeInt(mEndItems.size());
-        for (QCActionItem endItem : mEndItems) {
-            endItem.writeToParcel(dest, flags);
-        }
-        dest.writeBoolean(mPrimaryAction != null);
-        boolean hasPrimaryAction = mPrimaryAction != null;
-        if (hasPrimaryAction) {
-            mPrimaryAction.writeToParcel(dest, flags);
-        }
-    }
-
-    @Override
-    public PendingIntent getPrimaryAction() {
-        return mPrimaryAction;
-    }
-
-    @Nullable
-    public String getTitle() {
-        return mTitle;
-    }
-
-    @Nullable
-    public String getSubtitle() {
-        return mSubtitle;
-    }
-
-    @Nullable
-    public Icon getStartIcon() {
-        return mStartIcon;
-    }
-
-    public boolean isStartIconTintable() {
-        return mIsStartIconTintable;
-    }
-
-    @Nullable
-    public QCSlider getSlider() {
-        return mSlider;
-    }
-
-    @NonNull
-    public List<QCActionItem> getStartItems() {
-        return mStartItems;
-    }
-
-    @NonNull
-    public List<QCActionItem> getEndItems() {
-        return mEndItems;
-    }
-
-    public static Creator<QCRow> CREATOR = new Creator<QCRow>() {
-        @Override
-        public QCRow createFromParcel(Parcel source) {
-            return new QCRow(source);
-        }
-
-        @Override
-        public QCRow[] newArray(int size) {
-            return new QCRow[size];
-        }
-    };
-
-    /**
-     * Builder for {@link QCRow}.
-     */
-    public static class Builder {
-        private final List<QCActionItem> mStartItems = new ArrayList<>();
-        private final List<QCActionItem> mEndItems = new ArrayList<>();
-        private Icon mStartIcon;
-        private boolean mIsStartIconTintable = true;
-        private String mTitle;
-        private String mSubtitle;
-        private QCSlider mSlider;
-        private PendingIntent mPrimaryAction;
-
-        /**
-         * Sets the row title.
-         */
-        public Builder setTitle(@Nullable String title) {
-            mTitle = title;
-            return this;
-        }
-
-        /**
-         * Sets the row subtitle.
-         */
-        public Builder setSubtitle(@Nullable String subtitle) {
-            mSubtitle = subtitle;
-            return this;
-        }
-
-        /**
-         * Sets the row icon.
-         */
-        public Builder setIcon(@Nullable Icon icon) {
-            mStartIcon = icon;
-            return this;
-        }
-
-        /**
-         * Sets whether or not the row icon is tintable.
-         */
-        public Builder setIconTintable(boolean tintable) {
-            mIsStartIconTintable = tintable;
-            return this;
-        }
-
-        /**
-         * Adds a {@link QCSlider} to the slider area.
-         */
-        public Builder addSlider(@Nullable QCSlider slider) {
-            mSlider = slider;
-            return this;
-        }
-
-        /**
-         * Sets the PendingIntent to be sent when the row is clicked.
-         */
-        public Builder setPrimaryAction(@Nullable PendingIntent action) {
-            mPrimaryAction = action;
-            return this;
-        }
-
-        /**
-         * Adds a {@link QCActionItem} to the start items area.
-         */
-        public Builder addStartItem(@NonNull QCActionItem item) {
-            mStartItems.add(item);
-            return this;
-        }
-
-        /**
-         * Adds a {@link QCActionItem} to the end items area.
-         */
-        public Builder addEndItem(@NonNull QCActionItem item) {
-            mEndItems.add(item);
-            return this;
-        }
-
-        /**
-         * Builds the final {@link QCRow}.
-         */
-        public QCRow build() {
-            return new QCRow(mTitle, mSubtitle, mPrimaryAction, mStartIcon, mIsStartIconTintable,
-                    mSlider, mStartItems, mEndItems);
-        }
-    }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/QCSlider.java b/car-qc-lib/src/com/android/car/qc/QCSlider.java
deleted file mode 100644
index 16be5e7..0000000
--- a/car-qc-lib/src/com/android/car/qc/QCSlider.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc;
-
-import android.app.PendingIntent;
-import android.os.Parcel;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-/**
- * Quick Control Slider included in {@link QCRow}
- */
-public class QCSlider extends QCItem {
-    private int mMin = 0;
-    private int mMax = 100;
-    private int mValue = 0;
-    private PendingIntent mInputAction;
-
-    public QCSlider(int min, int max, int value, @Nullable PendingIntent inputAction) {
-        super(QC_TYPE_SLIDER);
-        mMin = min;
-        mMax = max;
-        mValue = value;
-        mInputAction = inputAction;
-    }
-
-    public QCSlider(@NonNull Parcel in) {
-        super(in);
-        mMin = in.readInt();
-        mMax = in.readInt();
-        mValue = in.readInt();
-        boolean hasAction = in.readBoolean();
-        if (hasAction) {
-            mInputAction = PendingIntent.CREATOR.createFromParcel(in);
-        }
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        super.writeToParcel(dest, flags);
-        dest.writeInt(mMin);
-        dest.writeInt(mMax);
-        dest.writeInt(mValue);
-        boolean hasAction = mInputAction != null;
-        dest.writeBoolean(hasAction);
-        if (hasAction) {
-            mInputAction.writeToParcel(dest, flags);
-        }
-    }
-
-    @Override
-    public PendingIntent getPrimaryAction() {
-        return mInputAction;
-    }
-
-    public int getMin() {
-        return mMin;
-    }
-
-    public int getMax() {
-        return mMax;
-    }
-
-    public int getValue() {
-        return mValue;
-    }
-
-    public static Creator<QCSlider> CREATOR = new Creator<QCSlider>() {
-        @Override
-        public QCSlider createFromParcel(Parcel source) {
-            return new QCSlider(source);
-        }
-
-        @Override
-        public QCSlider[] newArray(int size) {
-            return new QCSlider[size];
-        }
-    };
-
-    /**
-     * Builder for {@link QCSlider}.
-     */
-    public static class Builder {
-        private int mMin = 0;
-        private int mMax = 100;
-        private int mValue = 0;
-        private PendingIntent mInputAction;
-
-        /**
-         * Set the minimum allowed value for the slider input.
-         */
-        public Builder setMin(int min) {
-            mMin = min;
-            return this;
-        }
-
-        /**
-         * Set the maximum allowed value for the slider input.
-         */
-        public Builder setMax(int max) {
-            mMax = max;
-            return this;
-        }
-
-        /**
-         * Set the current value for the slider input.
-         */
-        public Builder setValue(int value) {
-            mValue = value;
-            return this;
-        }
-
-        /**
-         * Set the PendingIntent to be sent when the slider value is changed.
-         */
-        public Builder setInputAction(@Nullable PendingIntent inputAction) {
-            mInputAction = inputAction;
-            return this;
-        }
-
-        /**
-         * Builds the final {@link QCSlider}.
-         */
-        public QCSlider build() {
-            return new QCSlider(mMin, mMax, mValue, mInputAction);
-        }
-    }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/QCTile.java b/car-qc-lib/src/com/android/car/qc/QCTile.java
deleted file mode 100644
index 5f891e6..0000000
--- a/car-qc-lib/src/com/android/car/qc/QCTile.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc;
-
-import android.app.PendingIntent;
-import android.graphics.drawable.Icon;
-import android.os.Parcel;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-/**
- * Quick Control Tile Element
- * ------------
- * | -------- |
- * | | Icon | |
- * | -------- |
- * | Subtitle |
- * ------------
- */
-public class QCTile extends QCItem {
-    private final boolean mIsChecked;
-    private final boolean mIsEnabled;
-    private final boolean mIsAvailable;
-    private final String mSubtitle;
-    private Icon mIcon;
-    private PendingIntent mAction;
-
-    public QCTile(boolean isChecked, boolean isEnabled, boolean isAvailable,
-            @Nullable String subtitle, @Nullable Icon icon, @Nullable PendingIntent action) {
-        super(QC_TYPE_TILE);
-        mIsEnabled = isEnabled;
-        mIsChecked = isChecked;
-        mIsAvailable = isAvailable;
-        mSubtitle = subtitle;
-        mIcon = icon;
-        mAction = action;
-    }
-
-    public QCTile(@NonNull Parcel in) {
-        super(in);
-        mIsChecked = in.readBoolean();
-        mIsEnabled = in.readBoolean();
-        mIsAvailable = in.readBoolean();
-        mSubtitle = in.readString();
-        boolean hasIcon = in.readBoolean();
-        if (hasIcon) {
-            mIcon = Icon.CREATOR.createFromParcel(in);
-        }
-        boolean hasAction = in.readBoolean();
-        if (hasAction) {
-            mAction = PendingIntent.CREATOR.createFromParcel(in);
-        }
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        super.writeToParcel(dest, flags);
-        dest.writeBoolean(mIsChecked);
-        dest.writeBoolean(mIsEnabled);
-        dest.writeBoolean(mIsAvailable);
-        dest.writeString(mSubtitle);
-        boolean hasIcon = mIcon != null;
-        dest.writeBoolean(hasIcon);
-        if (hasIcon) {
-            mIcon.writeToParcel(dest, flags);
-        }
-        boolean hasAction = mAction != null;
-        dest.writeBoolean(hasAction);
-        if (hasAction) {
-            mAction.writeToParcel(dest, flags);
-        }
-    }
-
-    @Override
-    public PendingIntent getPrimaryAction() {
-        return mAction;
-    }
-
-    public boolean isChecked() {
-        return mIsChecked;
-    }
-
-    public boolean isEnabled() {
-        return mIsEnabled;
-    }
-
-    public boolean isAvailable() {
-        return mIsAvailable;
-    }
-
-    @Nullable
-    public String getSubtitle() {
-        return mSubtitle;
-    }
-
-    @Nullable
-    public Icon getIcon() {
-        return mIcon;
-    }
-
-    public static Creator<QCTile> CREATOR = new Creator<QCTile>() {
-        @Override
-        public QCTile createFromParcel(Parcel source) {
-            return new QCTile(source);
-        }
-
-        @Override
-        public QCTile[] newArray(int size) {
-            return new QCTile[size];
-        }
-    };
-
-    /**
-     * Builder for {@link QCTile}.
-     */
-    public static class Builder {
-        private boolean mIsChecked;
-        private boolean mIsEnabled = true;
-        private boolean mIsAvailable = true;
-        private String mSubtitle;
-        private Icon mIcon;
-        private PendingIntent mAction;
-
-        /**
-         * Sets whether or not the tile should be checked.
-         */
-        public Builder setChecked(boolean checked) {
-            mIsChecked = checked;
-            return this;
-        }
-
-        /**
-         * Sets whether or not the tile should be enabled.
-         */
-        public Builder setEnabled(boolean enabled) {
-            mIsEnabled = enabled;
-            return this;
-        }
-
-        /**
-         * Sets whether or not the action item is available.
-         */
-        public Builder setAvailable(boolean available) {
-            mIsAvailable = available;
-            return this;
-        }
-
-        /**
-         * Sets the tile's subtitle.
-         */
-        public Builder setSubtitle(@Nullable String subtitle) {
-            mSubtitle = subtitle;
-            return this;
-        }
-
-        /**
-         * Sets the tile's icon.
-         */
-        public Builder setIcon(@Nullable Icon icon) {
-            mIcon = icon;
-            return this;
-        }
-
-        /**
-         * Sets the PendingIntent to be sent when the tile is clicked.
-         */
-        public Builder setAction(@Nullable PendingIntent action) {
-            mAction = action;
-            return this;
-        }
-
-        /**
-         * Builds the final {@link QCTile}.
-         */
-        public QCTile build() {
-            return new QCTile(mIsChecked, mIsEnabled, mIsAvailable, mSubtitle, mIcon, mAction);
-        }
-    }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/controller/BaseQCController.java b/car-qc-lib/src/com/android/car/qc/controller/BaseQCController.java
deleted file mode 100644
index ce2bea3..0000000
--- a/car-qc-lib/src/com/android/car/qc/controller/BaseQCController.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.controller;
-
-import android.content.Context;
-
-import androidx.annotation.Nullable;
-import androidx.annotation.UiThread;
-import androidx.lifecycle.Observer;
-
-import com.android.car.qc.QCItem;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Base controller class for Quick Controls.
- */
-public abstract class BaseQCController implements QCItemCallback {
-    protected final Context mContext;
-    protected final List<Observer<QCItem>> mObservers = new ArrayList<>();
-    protected boolean mShouldListen = false;
-    protected boolean mWasListening = false;
-    protected QCItem mQCItem;
-
-    public BaseQCController(Context context) {
-        mContext = context;
-    }
-
-    /**
-     * Update whether or not the controller should be listening to updates from the provider.
-     */
-    public void listen(boolean shouldListen) {
-        mShouldListen = shouldListen;
-        updateListening();
-    }
-
-    /**
-     * Add a QCItem observer to the controller.
-     */
-    @UiThread
-    public void addObserver(Observer<QCItem> observer) {
-        mObservers.add(observer);
-        updateListening();
-    }
-
-    /**
-     * Remove a QCItem observer from the controller.
-     */
-    @UiThread
-    public void removeObserver(Observer<QCItem> observer) {
-        mObservers.remove(observer);
-        updateListening();
-    }
-
-    @UiThread
-    @Override
-    public void onQCItemUpdated(@Nullable QCItem item) {
-        mQCItem = item;
-        mObservers.forEach(o -> o.onChanged(mQCItem));
-    }
-
-    /**
-     * Destroy the controller. This should be called when the controller is no longer needed so
-     * the listeners can be cleaned up.
-     */
-    public void destroy() {
-        mShouldListen = false;
-        mObservers.clear();
-        updateListening();
-    }
-
-    /**
-     * Subclasses must override this method to handle a listening update.
-     */
-    protected abstract void updateListening();
-}
diff --git a/car-qc-lib/src/com/android/car/qc/controller/LocalQCController.java b/car-qc-lib/src/com/android/car/qc/controller/LocalQCController.java
deleted file mode 100644
index 01bd6f8..0000000
--- a/car-qc-lib/src/com/android/car/qc/controller/LocalQCController.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.controller;
-
-import android.content.Context;
-
-import com.android.car.qc.provider.BaseLocalQCProvider;
-
-/**
- * Controller for binding to local quick control providers.
- */
-public class LocalQCController extends BaseQCController {
-
-    private final BaseLocalQCProvider mProvider;
-
-    private final BaseLocalQCProvider.Notifier mProviderNotifier =
-            new BaseLocalQCProvider.Notifier() {
-                @Override
-                public void notifyUpdate() {
-                    if (mShouldListen && !mObservers.isEmpty()) {
-                        onQCItemUpdated(mProvider.getQCItem());
-                    }
-                }
-            };
-
-    public LocalQCController(Context context, BaseLocalQCProvider provider) {
-        super(context);
-        mProvider = provider;
-        mProvider.setNotifier(mProviderNotifier);
-        mQCItem = mProvider.getQCItem();
-    }
-
-    @Override
-    protected void updateListening() {
-        boolean listen = mShouldListen && !mObservers.isEmpty();
-        if (mWasListening != listen) {
-            mWasListening = listen;
-            mProvider.shouldListen(listen);
-            if (listen) {
-                mQCItem = mProvider.getQCItem();
-                onQCItemUpdated(mQCItem);
-            }
-        }
-    }
-
-    @Override
-    public void destroy() {
-        super.destroy();
-        mProvider.onDestroy();
-    }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/controller/QCItemCallback.java b/car-qc-lib/src/com/android/car/qc/controller/QCItemCallback.java
deleted file mode 100644
index b5efdef..0000000
--- a/car-qc-lib/src/com/android/car/qc/controller/QCItemCallback.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.controller;
-
-import androidx.annotation.Nullable;
-
-import com.android.car.qc.QCItem;
-
-/**
- * Callback to be executed when a QCItem changes.
- */
-public interface QCItemCallback {
-    /**
-     * Called when QCItem is updated.
-     *
-     * @param item The updated QCItem.
-     */
-    void onQCItemUpdated(@Nullable QCItem item);
-}
diff --git a/car-qc-lib/src/com/android/car/qc/controller/RemoteQCController.java b/car-qc-lib/src/com/android/car/qc/controller/RemoteQCController.java
deleted file mode 100644
index c98ca86..0000000
--- a/car-qc-lib/src/com/android/car/qc/controller/RemoteQCController.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.controller;
-
-import static com.android.car.qc.provider.BaseQCProvider.EXTRA_ITEM;
-import static com.android.car.qc.provider.BaseQCProvider.EXTRA_URI;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_BIND;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_DESTROY;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_SUBSCRIBE;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_UNSUBSCRIBE;
-
-import android.content.ContentProviderClient;
-import android.content.Context;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.HandlerExecutor;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.Parcelable;
-import android.os.RemoteException;
-import android.util.ArrayMap;
-import android.util.Log;
-import android.util.Pair;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.VisibleForTesting;
-import androidx.annotation.WorkerThread;
-
-import com.android.car.qc.QCItem;
-
-import java.util.concurrent.Executor;
-
-/**
- * Controller for binding to remote quick control providers.
- */
-public class RemoteQCController extends BaseQCController {
-    private static final String TAG = "RemoteQCController";
-    private static final long PROVIDER_ANR_TIMEOUT = 3000L;
-
-    private final Uri mUri;
-    private final Executor mBackgroundExecutor;
-    private final HandlerThread mBackgroundHandlerThread;
-    private final ArrayMap<Pair<Uri, QCItemCallback>, QCObserver> mObserverLookup =
-            new ArrayMap<>();
-
-    public RemoteQCController(Context context, Uri uri) {
-        super(context);
-        mUri = uri;
-        mBackgroundHandlerThread = new HandlerThread(/* name= */ TAG + "HandlerThread");
-        mBackgroundHandlerThread.start();
-        mBackgroundExecutor = new HandlerExecutor(
-                new Handler(mBackgroundHandlerThread.getLooper()));
-    }
-
-    @VisibleForTesting
-    RemoteQCController(Context context, Uri uri, Executor backgroundExecutor) {
-        super(context);
-        mUri = uri;
-        mBackgroundHandlerThread = null;
-        mBackgroundExecutor = backgroundExecutor;
-    }
-
-    @Override
-    protected void updateListening() {
-        boolean listen = mShouldListen && !mObservers.isEmpty();
-        mBackgroundExecutor.execute(() -> updateListeningBg(listen));
-    }
-
-    @Override
-    public void destroy() {
-        super.destroy();
-        if (mBackgroundHandlerThread != null) {
-            mBackgroundHandlerThread.quit();
-        }
-        try (ContentProviderClient client = getClient()) {
-            if (client == null) {
-                return;
-            }
-            Bundle b = new Bundle();
-            b.putParcelable(EXTRA_URI, mUri);
-            try {
-                client.call(METHOD_DESTROY, /* arg= */ null, b);
-            } catch (Exception e) {
-                Log.d(TAG, "Error destroying QCItem", e);
-            }
-        }
-    }
-
-    @WorkerThread
-    private void updateListeningBg(boolean isListening) {
-        if (mWasListening != isListening) {
-            mWasListening = isListening;
-            if (isListening) {
-                registerQCCallback(mContext.getMainExecutor(), /* callback= */ this);
-                // Update one-time on a different thread so that it can display in parallel
-                mBackgroundExecutor.execute(this::updateQCItem);
-            } else {
-                unregisterQCCallback(this);
-            }
-        }
-    }
-
-    @WorkerThread
-    private void updateQCItem() {
-        try {
-            QCItem item = bind();
-            mContext.getMainExecutor().execute(() -> onQCItemUpdated(item));
-        } catch (Exception e) {
-            Log.d(TAG, "Error fetching QCItem", e);
-        }
-    }
-
-    private QCItem bind() {
-        try (ContentProviderClient provider = getClient()) {
-            if (provider == null) {
-                return null;
-            }
-            Bundle extras = new Bundle();
-            extras.putParcelable(EXTRA_URI, mUri);
-            Bundle res = provider.call(METHOD_BIND, /* arg= */ null, extras);
-            if (res == null) {
-                return null;
-            }
-            res.setDefusable(true);
-            res.setClassLoader(QCItem.class.getClassLoader());
-            Parcelable parcelable = res.getParcelable(EXTRA_ITEM);
-            if (parcelable instanceof QCItem) {
-                return (QCItem) parcelable;
-            }
-            return null;
-        } catch (RemoteException e) {
-            Log.d(TAG, "Error binding QCItem", e);
-            return null;
-        }
-    }
-
-    private void subscribe() {
-        try (ContentProviderClient client = getClient()) {
-            if (client == null) {
-                return;
-            }
-            Bundle b = new Bundle();
-            b.putParcelable(EXTRA_URI, mUri);
-            try {
-                client.call(METHOD_SUBSCRIBE, /* arg= */ null, b);
-            } catch (Exception e) {
-                Log.d(TAG, "Error subscribing to QCItem", e);
-            }
-        }
-    }
-
-    private void unsubscribe()  {
-        try (ContentProviderClient client = getClient()) {
-            if (client == null) {
-                return;
-            }
-            Bundle b = new Bundle();
-            b.putParcelable(EXTRA_URI, mUri);
-            try {
-                client.call(METHOD_UNSUBSCRIBE, /* arg= */ null, b);
-            } catch (Exception e) {
-                Log.d(TAG, "Error unsubscribing from QCItem", e);
-            }
-        }
-    }
-
-    @VisibleForTesting
-    ContentProviderClient getClient() {
-        ContentProviderClient client = mContext.getContentResolver()
-                .acquireContentProviderClient(mUri);
-        if (client == null) {
-            return null;
-        }
-        client.setDetectNotResponding(PROVIDER_ANR_TIMEOUT);
-        return client;
-    }
-
-    private void registerQCCallback(@NonNull Executor executor, @NonNull QCItemCallback callback) {
-        getObserver(callback, new QCObserver(mUri, executor, callback)).startObserving();
-    }
-
-    private void unregisterQCCallback(@NonNull QCItemCallback callback) {
-        synchronized (mObserverLookup) {
-            QCObserver observer = mObserverLookup.remove(new Pair<>(mUri, callback));
-            if (observer != null) {
-                observer.stopObserving();
-            }
-        }
-    }
-
-    private QCObserver getObserver(QCItemCallback callback, QCObserver observer) {
-        Pair<Uri, QCItemCallback> key = new Pair<>(mUri, callback);
-        synchronized (mObserverLookup) {
-            QCObserver oldObserver = mObserverLookup.put(key, observer);
-            if (oldObserver != null) {
-                oldObserver.stopObserving();
-            }
-        }
-        return observer;
-    }
-
-    private class QCObserver {
-        private final Uri mUri;
-        private final Executor mExecutor;
-        private final QCItemCallback mCallback;
-        private boolean mIsSubscribed;
-
-        private final Runnable mUpdateItem = new Runnable() {
-            @Override
-            public void run() {
-                trySubscribe();
-                QCItem item = bind();
-                mExecutor.execute(() -> mCallback.onQCItemUpdated(item));
-            }
-        };
-
-        private final ContentObserver mObserver = new ContentObserver(
-                new Handler(Looper.getMainLooper())) {
-            @Override
-            public void onChange(boolean selfChange) {
-                android.os.AsyncTask.execute(mUpdateItem);
-            }
-        };
-
-        QCObserver(Uri uri, Executor executor, QCItemCallback callback) {
-            mUri = uri;
-            mExecutor = executor;
-            mCallback = callback;
-        }
-
-        void startObserving() {
-            ContentProviderClient provider =
-                    mContext.getContentResolver().acquireContentProviderClient(mUri);
-            if (provider != null) {
-                provider.close();
-                mContext.getContentResolver().registerContentObserver(
-                        mUri, /* notifyForDescendants= */ true, mObserver);
-                trySubscribe();
-            }
-        }
-
-        void trySubscribe() {
-            if (!mIsSubscribed) {
-                subscribe();
-                mIsSubscribed = true;
-            }
-        }
-
-        void stopObserving() {
-            mContext.getContentResolver().unregisterContentObserver(mObserver);
-            if (mIsSubscribed) {
-                unsubscribe();
-                mIsSubscribed = false;
-            }
-        }
-    }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/provider/BaseLocalQCProvider.java b/car-qc-lib/src/com/android/car/qc/provider/BaseLocalQCProvider.java
deleted file mode 100644
index 764d2a3..0000000
--- a/car-qc-lib/src/com/android/car/qc/provider/BaseLocalQCProvider.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.provider;
-
-import android.content.Context;
-
-import com.android.car.qc.QCItem;
-
-/**
- * Base class for local Quick Control providers.
- */
-public abstract class BaseLocalQCProvider {
-
-    /**
-     * Callback to be executed when the QCItem updates.
-     */
-    public interface Notifier {
-        /**
-         * Called when the QCItem has been updated.
-         */
-        default void notifyUpdate() {
-        }
-    }
-
-    private Notifier mNotifier;
-    private boolean mIsListening;
-    protected final Context mContext;
-
-    public BaseLocalQCProvider(Context context) {
-        mContext = context;
-    }
-
-    /**
-     * Set the notifier that should be called when the QCItem updates.
-     */
-    public void setNotifier(Notifier notifier) {
-        mNotifier = notifier;
-    }
-
-    /**
-     * Update whether or not the provider should be listening for live updates.
-     */
-    public void shouldListen(boolean listen) {
-        if (mIsListening == listen) {
-            return;
-        }
-        mIsListening = listen;
-        if (listen) {
-            onSubscribed();
-        } else {
-            onUnsubscribed();
-        }
-    }
-
-    /**
-     * Method to create and return a {@link QCItem}.
-     */
-    public abstract QCItem getQCItem();
-
-    /**
-     * Called to inform the provider that it has been subscribed to.
-     */
-    protected void onSubscribed() {
-    }
-
-    /**
-     * Called to inform the provider that it has been unsubscribed from.
-     */
-    protected void onUnsubscribed() {
-    }
-
-    /**
-     * Called to inform the provider that it is being destroyed.
-     */
-    public void onDestroy() {
-    }
-
-    protected void notifyChange() {
-        if (mNotifier != null) {
-            mNotifier.notifyUpdate();
-        }
-    }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/provider/BaseQCProvider.java b/car-qc-lib/src/com/android/car/qc/provider/BaseQCProvider.java
deleted file mode 100644
index 61db361..0000000
--- a/car-qc-lib/src/com/android/car/qc/provider/BaseQCProvider.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.provider;
-
-import android.content.ContentProvider;
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Process;
-import android.os.StrictMode;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.car.qc.QCItem;
-
-import java.util.Set;
-
-/**
- * Base Quick Controls provider implementation.
- */
-public abstract class BaseQCProvider extends ContentProvider {
-    public static final String METHOD_BIND = "QC_METHOD_BIND";
-    public static final String METHOD_SUBSCRIBE = "QC_METHOD_SUBSCRIBE";
-    public static final String METHOD_UNSUBSCRIBE = "QC_METHOD_UNSUBSCRIBE";
-    public static final String METHOD_DESTROY = "QC_METHOD_DESTROY";
-    public static final String EXTRA_URI = "QC_EXTRA_URI";
-    public static final String EXTRA_ITEM = "QC_EXTRA_ITEM";
-
-    private static final String TAG = "BaseQCProvider";
-    private static final long QC_ANR_TIMEOUT = 3000L;
-    private static final Handler MAIN_THREAD_HANDLER = new Handler(Looper.getMainLooper());
-    private String mCallbackMethod;
-    private final Runnable mAnr = () -> {
-        Process.sendSignal(Process.myPid(), Process.SIGNAL_QUIT);
-        Log.e(TAG, "Timed out while handling QC method " + mCallbackMethod);
-    };
-
-    @Override
-    public boolean onCreate() {
-        return true;
-    }
-
-    @Override
-    public Bundle call(String method, String arg, Bundle extras) {
-        enforceCallingPermissions();
-
-        Uri uri = getUriWithoutUserId(validateIncomingUriOrNull(
-                extras.getParcelable(EXTRA_URI)));
-        switch(method) {
-            case METHOD_BIND:
-                QCItem item = handleBind(uri);
-                Bundle b = new Bundle();
-                b.putParcelable(EXTRA_ITEM, item);
-                return b;
-            case METHOD_SUBSCRIBE:
-                handleSubscribe(uri);
-                break;
-            case METHOD_UNSUBSCRIBE:
-                handleUnsubscribe(uri);
-                break;
-            case METHOD_DESTROY:
-                handleDestroy(uri);
-                break;
-        }
-        return super.call(method, arg, extras);
-    }
-
-    @Override
-    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
-            String sortOrder) {
-        return null;
-    }
-
-    @Override
-    public String getType(Uri uri) {
-        return null;
-    }
-
-    @Override
-    public Uri insert(Uri uri, ContentValues values) {
-        return null;
-    }
-
-    @Override
-    public int delete(Uri uri, String selection, String[] selectionArgs) {
-        return 0;
-    }
-
-    @Override
-    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
-        return 0;
-    }
-
-    /**
-     * Method to create and return a {@link QCItem}.
-     *
-     * onBind is expected to return as quickly as possible. Therefore, no network or other IO
-     * will be allowed. Any loading that needs to be done should happen in the background and
-     * should then notify the content resolver of the change when ready to provide the
-     * complete data in onBind.
-     */
-    @Nullable
-    protected QCItem onBind(@NonNull Uri uri) {
-        return null;
-    }
-
-    /**
-     * Called to inform an app that an item has been subscribed to.
-     *
-     * Subscribing is a way that a host can notify apps of which QCItems they would like to
-     * receive updates for. The providing apps are expected to keep the content up to date
-     * and notify of change via the content resolver.
-     */
-    protected void onSubscribed(@NonNull Uri uri) {
-    }
-
-    /**
-     * Called to inform an app that an item has been unsubscribed from.
-     *
-     * This is used to notify providing apps that a host is no longer listening
-     * to updates, so any background processes and/or listeners should be removed.
-     */
-    protected void onUnsubscribed(@NonNull Uri uri) {
-    }
-
-    /**
-     * Called to inform an app that an item is being destroyed.
-     *
-     * This is used to notify providing apps that a host is no longer going to use this QCItem
-     * instance, so the relevant elements should be cleaned up.
-     */
-    protected void onDestroy(@NonNull Uri uri) {
-    }
-
-    /**
-     * Returns a Set of packages that are allowed to call this provider.
-     */
-    @NonNull
-    protected abstract Set<String> getAllowlistedPackages();
-
-    private QCItem handleBind(Uri uri) {
-        mCallbackMethod = "handleBind";
-        MAIN_THREAD_HANDLER.postDelayed(mAnr, QC_ANR_TIMEOUT);
-        try {
-            return onBindStrict(uri);
-        } finally {
-            MAIN_THREAD_HANDLER.removeCallbacks(mAnr);
-        }
-    }
-
-    private QCItem onBindStrict(@NonNull Uri uri) {
-        StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
-        try {
-            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
-                    .detectAll()
-                    .penaltyDeath()
-                    .build());
-            return onBind(uri);
-        } finally {
-            StrictMode.setThreadPolicy(oldPolicy);
-        }
-    }
-
-    private void handleSubscribe(@NonNull Uri uri) {
-        mCallbackMethod = "handleSubscribe";
-        MAIN_THREAD_HANDLER.postDelayed(mAnr, QC_ANR_TIMEOUT);
-        try {
-            onSubscribed(uri);
-        } finally {
-            MAIN_THREAD_HANDLER.removeCallbacks(mAnr);
-        }
-    }
-
-    private void handleUnsubscribe(@NonNull Uri uri) {
-        mCallbackMethod = "handleUnsubscribe";
-        MAIN_THREAD_HANDLER.postDelayed(mAnr, QC_ANR_TIMEOUT);
-        try {
-            onUnsubscribed(uri);
-        } finally {
-            MAIN_THREAD_HANDLER.removeCallbacks(mAnr);
-        }
-    }
-
-    private void handleDestroy(@NonNull Uri uri) {
-        mCallbackMethod = "handleDestroy";
-        MAIN_THREAD_HANDLER.postDelayed(mAnr, QC_ANR_TIMEOUT);
-        try {
-            onDestroy(uri);
-        } finally {
-            MAIN_THREAD_HANDLER.removeCallbacks(mAnr);
-        }
-    }
-
-    private Uri validateIncomingUriOrNull(Uri uri) {
-        if (uri == null) {
-            throw new IllegalArgumentException("Uri cannot be null");
-        }
-        return validateIncomingUri(uri);
-    }
-
-    private void enforceCallingPermissions() {
-        String callingPackage = getCallingPackage();
-        if (callingPackage == null) {
-            throw new IllegalArgumentException("Calling package cannot be null");
-        }
-        if (!getAllowlistedPackages().contains(callingPackage)) {
-            throw new SecurityException(
-                    String.format("%s is not permitted to access provider: %s", callingPackage,
-                            getClass().getName()));
-        }
-    }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/view/QCListView.java b/car-qc-lib/src/com/android/car/qc/view/QCListView.java
deleted file mode 100644
index 9aba976..0000000
--- a/car-qc-lib/src/com/android/car/qc/view/QCListView.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.view;
-
-import static com.android.car.qc.view.QCView.QCActionListener;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.LinearLayout;
-
-import androidx.lifecycle.Observer;
-
-import com.android.car.qc.QCItem;
-import com.android.car.qc.QCList;
-
-/**
- * Quick Controls view for {@link QCList} instances.
- */
-public class QCListView extends LinearLayout implements Observer<QCItem> {
-
-    private QCActionListener mActionListener;
-
-    public QCListView(Context context) {
-        super(context);
-        init();
-    }
-
-    public QCListView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        init();
-    }
-
-    public QCListView(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        init();
-    }
-
-    public QCListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-        init();
-    }
-
-    private void init() {
-        setOrientation(VERTICAL);
-    }
-
-    /**
-     * Set the view's {@link QCActionListener}. This listener will propagate to all QCRows.
-     */
-    public void setActionListener(QCActionListener listener) {
-        mActionListener = listener;
-        for (int i = 0; i < getChildCount(); i++) {
-            QCRowView view = (QCRowView) getChildAt(i);
-            view.setActionListener(mActionListener);
-        }
-    }
-
-    @Override
-    public void onChanged(QCItem qcItem) {
-        if (qcItem == null) {
-            removeAllViews();
-            return;
-        }
-        if (!qcItem.getType().equals(QCItem.QC_TYPE_LIST)) {
-            throw new IllegalArgumentException("Expected QCList type for QCListView but got "
-                    + qcItem.getType());
-        }
-        QCList qcList = (QCList) qcItem;
-        int rowCount = qcList.getRows().size();
-        for (int i = 0; i < rowCount; i++) {
-            if (getChildAt(i) != null) {
-                QCRowView view = (QCRowView) getChildAt(i);
-                view.setRow(qcList.getRows().get(i));
-                view.setActionListener(mActionListener);
-            } else {
-                QCRowView view = new QCRowView(getContext());
-                view.setRow(qcList.getRows().get(i));
-                view.setActionListener(mActionListener);
-                addView(view);
-            }
-        }
-        if (getChildCount() > rowCount) {
-            // remove extra rows
-            removeViews(rowCount, getChildCount() - rowCount);
-        }
-    }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/view/QCRowView.java b/car-qc-lib/src/com/android/car/qc/view/QCRowView.java
deleted file mode 100644
index 14d4b19..0000000
--- a/car-qc-lib/src/com/android/car/qc/view/QCRowView.java
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.view;
-
-import static com.android.car.qc.QCItem.QC_ACTION_SLIDER_VALUE;
-import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
-import static com.android.car.qc.QCItem.QC_TYPE_ACTION_SWITCH;
-import static com.android.car.qc.view.QCView.QCActionListener;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.text.BidiFormatter;
-import android.text.TextDirectionHeuristics;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.SeekBar;
-import android.widget.Switch;
-import android.widget.TextView;
-
-import androidx.annotation.ColorInt;
-import androidx.annotation.LayoutRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.car.qc.QCActionItem;
-import com.android.car.qc.QCItem;
-import com.android.car.qc.QCRow;
-import com.android.car.qc.QCSlider;
-import com.android.car.qc.R;
-import com.android.car.ui.utils.DirectManipulationHelper;
-import com.android.car.ui.uxr.DrawableStateToggleButton;
-
-/**
- * Quick Controls view for {@link QCRow} instances.
- */
-public class QCRowView extends FrameLayout {
-    private static final String TAG = "QCRowView";
-
-    private LayoutInflater mLayoutInflater;
-    private BidiFormatter mBidiFormatter;
-    private View mContentView;
-    private TextView mTitle;
-    private TextView mSubtitle;
-    private ImageView mStartIcon;
-    @ColorInt
-    private int mStartIconTint;
-    private LinearLayout mStartItemsContainer;
-    private LinearLayout mEndItemsContainer;
-    private LinearLayout mSeekBarContainer;
-    private SeekBar mSeekBar;
-    private QCActionListener mActionListener;
-    private boolean mInDirectManipulationMode;
-
-    private QCSeekbarChangeListener mSeekbarChangeListener;
-    private final View.OnKeyListener mSeekBarKeyListener = new View.OnKeyListener() {
-        @Override
-        public boolean onKey(View v, int keyCode, KeyEvent event) {
-            if (mSeekBar == null) {
-                return false;
-            }
-            // Consume nudge events in direct manipulation mode.
-            if (mInDirectManipulationMode
-                    && (keyCode == KeyEvent.KEYCODE_DPAD_LEFT
-                    || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT
-                    || keyCode == KeyEvent.KEYCODE_DPAD_UP
-                    || keyCode == KeyEvent.KEYCODE_DPAD_DOWN)) {
-                return true;
-            }
-
-            // Handle events to enter or exit direct manipulation mode.
-            if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
-                if (event.getAction() == KeyEvent.ACTION_DOWN) {
-                    setInDirectManipulationMode(v, mSeekBar, !mInDirectManipulationMode);
-                }
-                return true;
-            }
-            if (keyCode == KeyEvent.KEYCODE_BACK) {
-                if (mInDirectManipulationMode) {
-                    if (event.getAction() == KeyEvent.ACTION_DOWN) {
-                        setInDirectManipulationMode(v, mSeekBar, false);
-                    }
-                    return true;
-                }
-            }
-
-            // Don't propagate confirm keys to the SeekBar to prevent a ripple effect on the thumb.
-            if (KeyEvent.isConfirmKey(keyCode)) {
-                return false;
-            }
-
-            if (event.getAction() == KeyEvent.ACTION_DOWN) {
-                return mSeekBar.onKeyDown(keyCode, event);
-            } else {
-                return mSeekBar.onKeyUp(keyCode, event);
-            }
-        }
-    };
-
-    private final View.OnFocusChangeListener mSeekBarFocusChangeListener =
-            (v, hasFocus) -> {
-                if (!hasFocus && mInDirectManipulationMode && mSeekBar != null) {
-                    setInDirectManipulationMode(v, mSeekBar, false);
-                }
-            };
-
-    private final View.OnGenericMotionListener mSeekBarScrollListener =
-            (v, event) -> {
-                if (!mInDirectManipulationMode || mSeekBar == null) {
-                    return false;
-                }
-                int adjustment = Math.round(event.getAxisValue(MotionEvent.AXIS_SCROLL));
-                if (adjustment == 0) {
-                    return false;
-                }
-                int count = Math.abs(adjustment);
-                int keyCode =
-                        adjustment < 0 ? KeyEvent.KEYCODE_DPAD_LEFT : KeyEvent.KEYCODE_DPAD_RIGHT;
-                KeyEvent downEvent = new KeyEvent(event.getDownTime(), event.getEventTime(),
-                        KeyEvent.ACTION_DOWN, keyCode, /* repeat= */ 0);
-                KeyEvent upEvent = new KeyEvent(event.getDownTime(), event.getEventTime(),
-                        KeyEvent.ACTION_UP, keyCode, /* repeat= */ 0);
-                for (int i = 0; i < count; i++) {
-                    mSeekBar.onKeyDown(keyCode, downEvent);
-                    mSeekBar.onKeyUp(keyCode, upEvent);
-                }
-                return true;
-            };
-
-    QCRowView(Context context) {
-        super(context);
-        init(context);
-    }
-
-    QCRowView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        init(context);
-    }
-
-    QCRowView(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        init(context);
-    }
-
-    QCRowView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-        init(context);
-    }
-
-    private void init(Context context) {
-        mLayoutInflater = LayoutInflater.from(context);
-        mBidiFormatter = BidiFormatter.getInstance();
-        mLayoutInflater.inflate(R.layout.qc_row_view, /* root= */ this);
-        mContentView = findViewById(R.id.qc_row_content);
-        mTitle = findViewById(R.id.qc_title);
-        mSubtitle = findViewById(R.id.qc_summary);
-        mStartIcon = findViewById(R.id.qc_icon);
-        mStartItemsContainer = findViewById(R.id.qc_row_start_items);
-        mEndItemsContainer = findViewById(R.id.qc_row_end_items);
-        mSeekBarContainer = findViewById(R.id.qc_seekbar_wrapper);
-        mSeekBar = findViewById(R.id.seekbar);
-    }
-
-    void setActionListener(QCActionListener listener) {
-        mActionListener = listener;
-    }
-
-    void setRow(QCRow row) {
-        if (row == null) {
-            setVisibility(GONE);
-            return;
-        }
-        setVisibility(VISIBLE);
-        if (row.getPrimaryAction() != null || row.getActionHandler() != null) {
-            mContentView.setOnClickListener(v -> {
-                fireAction(row, /* intent= */ null);
-            });
-        }
-        if (!TextUtils.isEmpty(row.getTitle())) {
-            mTitle.setVisibility(VISIBLE);
-            mTitle.setText(
-                    mBidiFormatter.unicodeWrap(row.getTitle(), TextDirectionHeuristics.LOCALE));
-        } else {
-            mTitle.setVisibility(GONE);
-        }
-        if (!TextUtils.isEmpty(row.getSubtitle())) {
-            mSubtitle.setVisibility(VISIBLE);
-            mSubtitle.setText(
-                    mBidiFormatter.unicodeWrap(row.getSubtitle(), TextDirectionHeuristics.LOCALE));
-        } else {
-            mSubtitle.setVisibility(GONE);
-        }
-        if (row.getStartIcon() != null) {
-            mStartIcon.setVisibility(VISIBLE);
-            Drawable drawable = row.getStartIcon().loadDrawable(getContext());
-            if (drawable != null && row.isStartIconTintable()) {
-                if (mStartIconTint == 0) {
-                    mStartIconTint = getContext().getColor(R.color.qc_start_icon_color);
-                }
-                drawable.setTint(mStartIconTint);
-            }
-            mStartIcon.setImageDrawable(drawable);
-        } else {
-            mStartIcon.setImageDrawable(null);
-            mStartIcon.setVisibility(GONE);
-        }
-        QCSlider slider = row.getSlider();
-        if (slider != null) {
-            mSeekBarContainer.setVisibility(View.VISIBLE);
-            initSlider(slider);
-        } else {
-            mSeekBarContainer.setVisibility(View.GONE);
-        }
-
-        int startItemCount = row.getStartItems().size();
-        for (int i = 0; i < startItemCount; i++) {
-            QCActionItem action = row.getStartItems().get(i);
-            initActionItem(mStartItemsContainer, mStartItemsContainer.getChildAt(i), action);
-        }
-        if (mStartItemsContainer.getChildCount() > startItemCount) {
-            // remove extra items
-            mStartItemsContainer.removeViews(startItemCount,
-                    mStartItemsContainer.getChildCount() - startItemCount);
-        }
-        if (startItemCount == 0) {
-            mStartItemsContainer.setVisibility(View.GONE);
-        } else {
-            mStartItemsContainer.setVisibility(View.VISIBLE);
-        }
-
-        int endItemCount = row.getEndItems().size();
-        for (int i = 0; i < endItemCount; i++) {
-            QCActionItem action = row.getEndItems().get(i);
-            initActionItem(mEndItemsContainer, mEndItemsContainer.getChildAt(i), action);
-        }
-        if (mEndItemsContainer.getChildCount() > endItemCount) {
-            // remove extra items
-            mEndItemsContainer.removeViews(endItemCount,
-                    mEndItemsContainer.getChildCount() - endItemCount);
-        }
-        if (endItemCount == 0) {
-            mEndItemsContainer.setVisibility(View.GONE);
-        } else {
-            mEndItemsContainer.setVisibility(View.VISIBLE);
-        }
-    }
-
-    private void initActionItem(@NonNull ViewGroup root, @Nullable View actionView,
-            @NonNull QCActionItem action) {
-        if (action.getType().equals(QC_TYPE_ACTION_SWITCH)) {
-            initSwitchView(action, root, actionView);
-        } else {
-            initToggleView(action, root, actionView);
-        }
-    }
-
-    private void initSwitchView(QCActionItem action, ViewGroup root, View actionView) {
-        Switch switchView = actionView == null ? null : actionView.findViewById(
-                android.R.id.switch_widget);
-        if (switchView == null) {
-            actionView = createActionView(root, actionView, R.layout.qc_action_switch);
-            switchView = actionView.requireViewById(android.R.id.switch_widget);
-        }
-
-        switchView.setOnCheckedChangeListener(null);
-        switchView.setEnabled(action.isEnabled());
-        switchView.setChecked(action.isChecked());
-        switchView.setOnCheckedChangeListener(
-                (buttonView, isChecked) -> {
-                    Intent intent = new Intent();
-                    intent.putExtra(QC_ACTION_TOGGLE_STATE, isChecked);
-                    fireAction(action, intent);
-                });
-    }
-
-    private void initToggleView(QCActionItem action, ViewGroup root, View actionView) {
-        DrawableStateToggleButton toggleButton =
-                actionView == null ? null : actionView.findViewById(R.id.qc_toggle_button);
-        if (toggleButton == null) {
-            actionView = createActionView(root, actionView, R.layout.qc_action_toggle);
-            toggleButton = actionView.requireViewById(R.id.qc_toggle_button);
-        }
-        toggleButton.setText(null);
-        toggleButton.setTextOn(null);
-        toggleButton.setTextOff(null);
-        toggleButton.setOnCheckedChangeListener(null);
-        Drawable icon = QCViewUtils.getInstance(mContext).getToggleIcon(
-                action.getIcon(), action.isAvailable());
-        toggleButton.setButtonDrawable(icon);
-        toggleButton.setChecked(action.isChecked());
-        toggleButton.setEnabled(action.isEnabled() && action.isAvailable());
-        toggleButton.setOnCheckedChangeListener(
-                (buttonView, isChecked) -> {
-                    Intent intent = new Intent();
-                    intent.putExtra(QC_ACTION_TOGGLE_STATE, isChecked);
-                    fireAction(action, intent);
-                });
-    }
-
-    @NonNull
-    private View createActionView(@NonNull ViewGroup root, @Nullable View actionView,
-            @LayoutRes int resId) {
-        if (actionView != null) {
-            // remove current action view
-            root.removeView(actionView);
-        }
-        actionView = mLayoutInflater.inflate(resId, /* root = */ null);
-        root.addView(actionView);
-        return actionView;
-    }
-
-    private void initSlider(QCSlider slider) {
-        mSeekBar.setOnSeekBarChangeListener(null);
-        mSeekBar.setMin(slider.getMin());
-        mSeekBar.setMax(slider.getMax());
-        mSeekBar.setProgress(slider.getValue());
-        if (mSeekbarChangeListener == null) {
-            mSeekbarChangeListener = new QCSeekbarChangeListener();
-        }
-        mSeekbarChangeListener.setSlider(slider);
-        mSeekBar.setOnSeekBarChangeListener(mSeekbarChangeListener);
-        // set up rotary support
-        mSeekBarContainer.setOnKeyListener(mSeekBarKeyListener);
-        mSeekBarContainer.setOnFocusChangeListener(mSeekBarFocusChangeListener);
-        mSeekBarContainer.setOnGenericMotionListener(mSeekBarScrollListener);
-    }
-
-    private void setInDirectManipulationMode(View view, SeekBar seekbar, boolean enable) {
-        mInDirectManipulationMode = enable;
-        DirectManipulationHelper.enableDirectManipulationMode(seekbar, enable);
-        view.setSelected(enable);
-        seekbar.setSelected(enable);
-    }
-
-    private void fireAction(QCItem item, Intent intent) {
-        if (item.getPrimaryAction() != null) {
-            try {
-                item.getPrimaryAction().send(getContext(), 0, intent);
-                if (mActionListener != null) {
-                    mActionListener.onQCAction(item);
-                }
-            } catch (PendingIntent.CanceledException e) {
-                Log.d(TAG, "Error sending intent", e);
-            }
-        } else if (item.getActionHandler() != null) {
-            item.getActionHandler().onAction(item, getContext(), intent);
-            if (mActionListener != null) {
-                mActionListener.onQCAction(item);
-            }
-        }
-    }
-
-    private class QCSeekbarChangeListener implements SeekBar.OnSeekBarChangeListener {
-        // Interval of updates (in ms) sent in response to seekbar moving.
-        private static final int SLIDER_UPDATE_INTERVAL = 200;
-
-        private final Handler mSliderUpdateHandler;
-        private QCSlider mSlider;
-        private int mCurrSliderValue;
-        private boolean mSliderUpdaterRunning;
-        private long mLastSentSliderUpdate;
-        private final Runnable mSliderUpdater = () -> {
-            sendSliderValue();
-            mSliderUpdaterRunning = false;
-        };
-
-        QCSeekbarChangeListener() {
-            mSliderUpdateHandler = new Handler();
-        }
-
-        void setSlider(QCSlider slider) {
-            mSlider = slider;
-        }
-
-        @Override
-        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-            mCurrSliderValue = progress;
-            long now = System.currentTimeMillis();
-            if (mLastSentSliderUpdate != 0
-                    && now - mLastSentSliderUpdate > SLIDER_UPDATE_INTERVAL) {
-                mSliderUpdaterRunning = false;
-                mSliderUpdateHandler.removeCallbacks(mSliderUpdater);
-                sendSliderValue();
-            } else if (!mSliderUpdaterRunning) {
-                mSliderUpdaterRunning = true;
-                mSliderUpdateHandler.postDelayed(mSliderUpdater, SLIDER_UPDATE_INTERVAL);
-            }
-        }
-
-        @Override
-        public void onStartTrackingTouch(SeekBar seekBar) {
-        }
-
-        @Override
-        public void onStopTrackingTouch(SeekBar seekBar) {
-            if (mSliderUpdaterRunning) {
-                mSliderUpdaterRunning = false;
-                mSliderUpdateHandler.removeCallbacks(mSliderUpdater);
-            }
-            mCurrSliderValue = seekBar.getProgress();
-            sendSliderValue();
-        }
-
-        private void sendSliderValue() {
-            if (mSlider == null) {
-                return;
-            }
-            mLastSentSliderUpdate = System.currentTimeMillis();
-            Intent intent = new Intent();
-            intent.putExtra(QC_ACTION_SLIDER_VALUE, mCurrSliderValue);
-            fireAction(mSlider, intent);
-        }
-    }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/view/QCTileView.java b/car-qc-lib/src/com/android/car/qc/view/QCTileView.java
deleted file mode 100644
index 233c81a..0000000
--- a/car-qc-lib/src/com/android/car/qc/view/QCTileView.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.view;
-
-import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
-import static com.android.car.qc.view.QCView.QCActionListener;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.View;
-import android.widget.FrameLayout;
-import android.widget.TextView;
-
-import androidx.lifecycle.Observer;
-
-import com.android.car.qc.QCItem;
-import com.android.car.qc.QCTile;
-import com.android.car.qc.R;
-import com.android.car.ui.uxr.DrawableStateToggleButton;
-
-/**
- * Quick Controls view for {@link QCTile} instances.
- */
-public class QCTileView extends FrameLayout implements Observer<QCItem> {
-    private static final String TAG = "QCTileView";
-
-    private View mTileWrapper;
-    private DrawableStateToggleButton mToggleButton;
-    private TextView mSubtitle;
-    private QCActionListener mActionListener;
-
-    public QCTileView(Context context) {
-        super(context);
-        init(context);
-    }
-
-    public QCTileView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        init(context);
-    }
-
-    public QCTileView(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        init(context);
-    }
-
-    public QCTileView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-        init(context);
-    }
-
-    /**
-     * Set the tile's {@link QCActionListener}.
-     */
-    public void setActionListener(QCActionListener listener) {
-        mActionListener = listener;
-    }
-
-    private void init(Context context) {
-        View.inflate(context, R.layout.qc_tile_view, /* root= */ this);
-        mTileWrapper = findViewById(R.id.qc_tile_wrapper);
-        mToggleButton = findViewById(R.id.qc_tile_toggle_button);
-        mSubtitle = findViewById(android.R.id.summary);
-        mToggleButton.setText(null);
-        mToggleButton.setTextOn(null);
-        mToggleButton.setTextOff(null);
-
-    }
-
-    @Override
-    public void onChanged(QCItem qcItem) {
-        if (qcItem == null) {
-            removeAllViews();
-            return;
-        }
-        if (!qcItem.getType().equals(QCItem.QC_TYPE_TILE)) {
-            throw new IllegalArgumentException("Expected QCTile type for QCTileView but got "
-                    + qcItem.getType());
-        }
-        QCTile qcTile = (QCTile) qcItem;
-        mSubtitle.setText(qcTile.getSubtitle());
-        mToggleButton.setOnCheckedChangeListener(null);
-        mToggleButton.setChecked(qcTile.isChecked());
-        mToggleButton.setEnabled(qcTile.isEnabled());
-        mTileWrapper.setEnabled(qcTile.isEnabled() && qcTile.isAvailable());
-        mTileWrapper.setOnClickListener(v -> mToggleButton.toggle());
-        Drawable icon = QCViewUtils.getInstance(mContext).getToggleIcon(
-                qcTile.getIcon(), qcTile.isAvailable());
-        mToggleButton.setButtonDrawable(icon);
-        mToggleButton.setOnCheckedChangeListener(
-                (buttonView, isChecked) -> {
-                    Intent intent = new Intent();
-                    intent.putExtra(QC_ACTION_TOGGLE_STATE, isChecked);
-                    if (qcTile.getPrimaryAction() != null) {
-                        try {
-                            qcTile.getPrimaryAction().send(getContext(), 0, intent);
-                            if (mActionListener != null) {
-                                mActionListener.onQCAction(qcTile);
-                            }
-                        } catch (PendingIntent.CanceledException e) {
-                            Log.d(TAG, "Error sending intent", e);
-                        }
-                    } else if (qcTile.getActionHandler() != null) {
-                        qcTile.getActionHandler().onAction(qcTile, getContext(), intent);
-                        if (mActionListener != null) {
-                            mActionListener.onQCAction(qcTile);
-                        }
-                    }
-                });
-    }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/view/QCView.java b/car-qc-lib/src/com/android/car/qc/view/QCView.java
deleted file mode 100644
index 73b909e..0000000
--- a/car-qc-lib/src/com/android/car/qc/view/QCView.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.view;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.widget.FrameLayout;
-
-import androidx.annotation.NonNull;
-import androidx.lifecycle.Observer;
-
-import com.android.car.qc.QCItem;
-
-/**
- * Base Quick Controls View - supports {@link QCItem.QC_TYPE_TILE} and {@link QCItem.QC_TYPE_LIST}
- */
-public class QCView extends FrameLayout implements Observer<QCItem> {
-    @QCItem.QCItemType
-    private String mType;
-    private Observer<QCItem> mChildObserver;
-    private QCActionListener mActionListener;
-
-    public QCView(Context context) {
-        super(context);
-    }
-
-    public QCView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public QCView(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-    }
-
-    public QCView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-    }
-
-    /**
-     * Set the view's {@link QCActionListener}. This listener will propagate to all sub-views.
-     */
-    public void setActionListener(QCActionListener listener) {
-        mActionListener = listener;
-        if (mChildObserver instanceof QCTileView) {
-            ((QCTileView) mChildObserver).setActionListener(mActionListener);
-        } else if (mChildObserver instanceof QCListView) {
-            ((QCListView) mChildObserver).setActionListener(mActionListener);
-        }
-    }
-
-    @Override
-    public void onChanged(QCItem qcItem) {
-        if (qcItem == null) {
-            removeAllViews();
-            mChildObserver = null;
-            mType = null;
-            return;
-        }
-        if (!isValidQCItemType(qcItem)) {
-            throw new IllegalArgumentException("Expected QCTile or QCList type but got "
-                    + qcItem.getType());
-        }
-        if (qcItem.getType().equals(mType)) {
-            mChildObserver.onChanged(qcItem);
-            return;
-        }
-        removeAllViews();
-        mType = qcItem.getType();
-        if (mType.equals(QCItem.QC_TYPE_TILE)) {
-            QCTileView view = new QCTileView(getContext());
-            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
-                    LayoutParams.WRAP_CONTENT,
-                    LayoutParams.WRAP_CONTENT,
-                    Gravity.CENTER_HORIZONTAL);
-            view.onChanged(qcItem);
-            view.setActionListener(mActionListener);
-            addView(view, params);
-            mChildObserver = view;
-        } else {
-            QCListView view = new QCListView(getContext());
-            view.onChanged(qcItem);
-            view.setActionListener(mActionListener);
-            addView(view);
-            mChildObserver = view;
-        }
-    }
-
-    private boolean isValidQCItemType(QCItem qcItem) {
-        String type = qcItem.getType();
-        return type.equals(QCItem.QC_TYPE_TILE) || type.equals(QCItem.QC_TYPE_LIST);
-    }
-
-    /**
-     * Listener to be called when an action occurs on a QCView.
-     */
-    public interface QCActionListener {
-        /**
-         * Called when an interaction has occurred with an element in this view.
-         * @param item the specific item within the {@link QCItem} that was interacted with.
-         */
-        void onQCAction(@NonNull QCItem item);
-    }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/view/QCViewUtils.java b/car-qc-lib/src/com/android/car/qc/view/QCViewUtils.java
deleted file mode 100644
index 366c724..0000000
--- a/car-qc-lib/src/com/android/car/qc/view/QCViewUtils.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.view;
-
-import android.annotation.ColorInt;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-import android.graphics.drawable.LayerDrawable;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.car.qc.R;
-
-/**
- * Utility class used by {@link QCTileView} and {@link QCRowView}
- */
-public class QCViewUtils {
-    private static QCViewUtils sInstance;
-
-    private final Context mContext;
-    private final Drawable mDefaultToggleBackground;
-    private final Drawable mUnavailableToggleBackground;
-    private final ColorStateList mDefaultToggleIconTint;
-    @ColorInt
-    private final int mUnavailableToggleIconTint;
-    private final int mToggleForegroundIconInset;
-
-    private QCViewUtils(@NonNull Context context) {
-        mContext = context.getApplicationContext();
-        mDefaultToggleBackground = mContext.getDrawable(R.drawable.qc_toggle_background);
-        mUnavailableToggleBackground = mContext.getDrawable(
-                R.drawable.qc_toggle_unavailable_background);
-        mDefaultToggleIconTint = mContext.getColorStateList(R.color.qc_toggle_icon_fill_color);
-        mUnavailableToggleIconTint = mContext.getColor(R.color.qc_toggle_unavailable_color);
-        mToggleForegroundIconInset = mContext.getResources()
-                .getDimensionPixelSize(R.dimen.qc_toggle_foreground_icon_inset);
-    }
-
-    /**
-     * Get an instance of {@link QCViewUtils}
-     */
-    public static QCViewUtils getInstance(@NonNull Context context) {
-        if (sInstance == null) {
-            sInstance = new QCViewUtils(context);
-        }
-        return sInstance;
-    }
-
-    /**
-     * Create a return a Quick Control toggle icon - used for tiles and action toggles.
-     */
-    public Drawable getToggleIcon(@Nullable Icon icon, boolean available) {
-        Drawable background = available
-                ? mDefaultToggleBackground.getConstantState().newDrawable().mutate()
-                : mUnavailableToggleBackground.getConstantState().newDrawable().mutate();
-        if (icon == null) {
-            return background;
-        }
-
-        Drawable iconDrawable = icon.loadDrawable(mContext);
-        if (iconDrawable == null) {
-            return background;
-        }
-
-        if (!available) {
-            iconDrawable.setTint(mUnavailableToggleIconTint);
-        } else {
-            iconDrawable.setTintList(mDefaultToggleIconTint);
-        }
-
-        Drawable[] layers = {background, iconDrawable};
-        LayerDrawable drawable = new LayerDrawable(layers);
-        drawable.setLayerInsetRelative(/* index= */ 1, mToggleForegroundIconInset,
-                mToggleForegroundIconInset, mToggleForegroundIconInset,
-                mToggleForegroundIconInset);
-        return drawable;
-    }
-}
diff --git a/car-qc-lib/tests/unit/Android.bp b/car-qc-lib/tests/unit/Android.bp
deleted file mode 100644
index b1f107a..0000000
--- a/car-qc-lib/tests/unit/Android.bp
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-// Copyright (C) 2021 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 {
-    default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-android_test {
-    name: "CarQCLibUnitTests",
-
-    certificate: "platform",
-    privileged: true,
-
-    srcs: ["src/**/*.java"],
-
-    libs: [
-        "android.test.runner",
-        "android.test.base",
-        "android.test.mock",
-    ],
-
-    static_libs: [
-        "car-qc-lib",
-        "androidx.test.core",
-        "androidx.test.rules",
-        "androidx.test.ext.junit",
-        "androidx.test.ext.truth",
-        "mockito-target-extended-minus-junit4",
-        "platform-test-annotations",
-        "truth-prebuilt",
-        "testng",
-    ],
-
-    jni_libs: ["libdexmakerjvmtiagent", "libstaticjvmtiagent"],
-}
diff --git a/car-qc-lib/tests/unit/AndroidManifest.xml b/car-qc-lib/tests/unit/AndroidManifest.xml
deleted file mode 100644
index e500c4d..0000000
--- a/car-qc-lib/tests/unit/AndroidManifest.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2021 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.qc.tests.unit">
-
-    <application android:debuggable="true">
-        <uses-library android:name="android.test.runner" />
-
-        <provider
-            android:name="com.android.car.qc.testutils.AllowedTestQCProvider"
-            android:authorities="com.android.car.qc.testutils.AllowedTestQCProvider"
-            android:exported="true">
-        </provider>
-
-        <provider
-            android:name="com.android.car.qc.testutils.DeniedTestQCProvider"
-            android:authorities="com.android.car.qc.testutils.DeniedTestQCProvider"
-            android:exported="true">
-        </provider>
-    </application>
-
-    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.car.qc.tests.unit"
-                     android:label="Quick Controls Library Unit Tests"/>
-</manifest>
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/QCActionItemTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/QCActionItemTest.java
deleted file mode 100644
index 588144f..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/QCActionItemTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc;
-
-import static com.android.car.qc.QCItem.QC_TYPE_ACTION_SWITCH;
-import static com.android.car.qc.QCItem.QC_TYPE_ACTION_TOGGLE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.testng.Assert.assertThrows;
-
-import android.app.PendingIntent;
-import android.graphics.drawable.Icon;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class QCActionItemTest extends QCItemTestCase<QCActionItem> {
-
-    @Test
-    public void onCreate_invalidType_throwsException() {
-        assertThrows(IllegalArgumentException.class,
-                () -> createAction("INVALID_TYPE", /* action= */ null, /* icon= */ null));
-    }
-
-    @Test
-    public void onCreateSwitch_hasCorrectType() {
-        QCActionItem action = createAction(QC_TYPE_ACTION_SWITCH, /* action= */ null,
-                /* icon= */null);
-        assertThat(action.getType()).isEqualTo(QC_TYPE_ACTION_SWITCH);
-    }
-
-    @Test
-    public void onCreateToggle_hasCorrectType() {
-        QCActionItem action = createAction(QC_TYPE_ACTION_TOGGLE, /* action= */ null,
-                /* icon= */ null);
-        assertThat(action.getType()).isEqualTo(QC_TYPE_ACTION_TOGGLE);
-    }
-
-    @Test
-    public void onBundle_nullAction_noCrash() {
-        QCActionItem action = createAction(QC_TYPE_ACTION_TOGGLE, /* action= */ null, mDefaultIcon);
-        writeAndLoadFromBundle(action);
-        // Test passes if this doesn't crash
-    }
-
-    @Test
-    public void onBundle_nullIcon_noCrash() {
-        QCActionItem action = createAction(QC_TYPE_ACTION_TOGGLE, mDefaultAction, /* icon= */ null);
-        writeAndLoadFromBundle(action);
-        // Test passes if this doesn't crash
-    }
-
-    @Test
-    public void onBundle_switch_accurateData() {
-        QCActionItem action = createAction(QC_TYPE_ACTION_SWITCH, mDefaultAction, /* icon= */ null);
-        QCActionItem newAction = writeAndLoadFromBundle(action);
-        assertThat(newAction.getType()).isEqualTo(QC_TYPE_ACTION_SWITCH);
-        assertThat(newAction.isChecked()).isTrue();
-        assertThat(newAction.isEnabled()).isTrue();
-        assertThat(newAction.getPrimaryAction()).isNotNull();
-        assertThat(newAction.getIcon()).isNull();
-    }
-
-    @Test
-    public void onBundle_toggle_accurateDate() {
-        QCActionItem action = createAction(QC_TYPE_ACTION_TOGGLE, mDefaultAction, mDefaultIcon);
-        QCActionItem newAction = writeAndLoadFromBundle(action);
-        assertThat(newAction.getType()).isEqualTo(QC_TYPE_ACTION_TOGGLE);
-        assertThat(newAction.isChecked()).isTrue();
-        assertThat(newAction.isEnabled()).isTrue();
-        assertThat(newAction.getPrimaryAction()).isNotNull();
-        assertThat(newAction.getIcon()).isNotNull();
-    }
-
-    private QCActionItem createAction(String type, PendingIntent action, Icon icon) {
-        return new QCActionItem.Builder(type)
-                .setChecked(true)
-                .setEnabled(true)
-                .setAction(action)
-                .setIcon(icon)
-                .build();
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/QCItemTestCase.java b/car-qc-lib/tests/unit/src/com/android/car/qc/QCItemTestCase.java
deleted file mode 100644
index fab8302..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/QCItemTestCase.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc;
-
-import android.R;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Icon;
-import android.os.Bundle;
-
-import androidx.test.core.app.ApplicationProvider;
-
-public abstract class QCItemTestCase<T extends QCItem> {
-    protected static final String BUNDLE_KEY = "BUNDLE_KEY";
-    protected static final String TEST_TITLE = "TEST TITLE";
-    protected static final String TEST_SUBTITLE = "TEST SUBTITLE";
-
-    protected final Context mContext = ApplicationProvider.getApplicationContext();
-
-    protected PendingIntent mDefaultAction = PendingIntent.getActivity(mContext,
-            /* requestCode= */ 0, new Intent(), PendingIntent.FLAG_IMMUTABLE);
-    protected Icon mDefaultIcon = Icon.createWithResource(mContext, R.drawable.btn_star);
-
-    protected T writeAndLoadFromBundle(T item) {
-        Bundle bundle = new Bundle();
-        bundle.putParcelable(BUNDLE_KEY, item);
-        return bundle.getParcelable(BUNDLE_KEY);
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/QCListTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/QCListTest.java
deleted file mode 100644
index 766d82c..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/QCListTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc;
-
-import static com.android.car.qc.QCItem.QC_TYPE_LIST;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.Collections;
-import java.util.List;
-
-@RunWith(AndroidJUnit4.class)
-public class QCListTest extends QCItemTestCase<QCList> {
-
-    @Test
-    public void onCreate_hasCorrectType() {
-        QCList list = createList(Collections.emptyList());
-        assertThat(list.getType()).isEqualTo(QC_TYPE_LIST);
-    }
-
-    @Test
-    public void createFromParcel_accurateData() {
-        QCRow row = new QCRow.Builder()
-                .setTitle(TEST_TITLE)
-                .setSubtitle(TEST_SUBTITLE)
-                .setIcon(mDefaultIcon)
-                .setPrimaryAction(mDefaultAction)
-                .build();
-
-        QCList list = createList(Collections.singletonList(row));
-        QCList newList = writeAndLoadFromBundle(list);
-        assertThat(newList.getType()).isEqualTo(QC_TYPE_LIST);
-        assertThat(newList.getRows().size()).isEqualTo(1);
-    }
-
-    private QCList createList(List<QCRow> rows) {
-        QCList.Builder builder = new QCList.Builder();
-        for (QCRow row : rows) {
-            builder.addRow(row);
-        }
-        return builder.build();
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/QCRowTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/QCRowTest.java
deleted file mode 100644
index 816c1d6..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/QCRowTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc;
-
-import static com.android.car.qc.QCItem.QC_TYPE_ACTION_SWITCH;
-import static com.android.car.qc.QCItem.QC_TYPE_ROW;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.PendingIntent;
-import android.graphics.drawable.Icon;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.Collections;
-import java.util.List;
-
-@RunWith(AndroidJUnit4.class)
-public class QCRowTest extends QCItemTestCase<QCRow> {
-
-    @Test
-    public void onCreate_hasCorrectType() {
-        QCRow row = createRow(/* action= */ null, /* icon= */ null);
-        assertThat(row.getType()).isEqualTo(QC_TYPE_ROW);
-    }
-
-    @Test
-    public void onBundle_nullAction_noCrash() {
-        QCRow row = createRow(/* action= */ null, mDefaultIcon);
-        writeAndLoadFromBundle(row);
-        // Test passes if this doesn't crash
-    }
-
-    @Test
-    public void onBundle_nullIcon_noCrash() {
-        QCRow row = createRow(mDefaultAction, /* icon= */ null);
-        writeAndLoadFromBundle(row);
-        // Test passes if this doesn't crash
-    }
-
-    @Test
-    public void createFromParcel_accurateData() {
-        QCRow row = createRow(mDefaultAction, mDefaultIcon);
-        QCRow newRow = writeAndLoadFromBundle(row);
-        assertThat(newRow.getType()).isEqualTo(QC_TYPE_ROW);
-        assertThat(newRow.getTitle()).isEqualTo(TEST_TITLE);
-        assertThat(newRow.getSubtitle()).isEqualTo(TEST_SUBTITLE);
-        assertThat(newRow.getPrimaryAction()).isNotNull();
-        assertThat(newRow.getStartIcon()).isNotNull();
-    }
-
-    @Test
-    public void createFromParcel_accurateData_startItem() {
-        QCActionItem item = new QCActionItem.Builder(QC_TYPE_ACTION_SWITCH).build();
-
-        QCRow row = createRow(/* action= */ null, /* icon= */ null, Collections.singletonList(item),
-                Collections.emptyList(), Collections.emptyList());
-        QCRow newRow = writeAndLoadFromBundle(row);
-        assertThat(newRow.getStartItems().size()).isEqualTo(1);
-    }
-
-    @Test
-    public void createFromParcel_accurateData_endItem() {
-        QCActionItem item = new QCActionItem.Builder(QC_TYPE_ACTION_SWITCH).build();
-
-        QCRow row = createRow(/* action= */ null, /* icon= */ null, Collections.emptyList(),
-                Collections.singletonList(item), Collections.emptyList());
-        QCRow newRow = writeAndLoadFromBundle(row);
-        assertThat(newRow.getEndItems().size()).isEqualTo(1);
-    }
-
-    @Test
-    public void createFromParcel_accurateData_slider() {
-        QCSlider slider = new QCSlider.Builder().build();
-
-        QCRow row = createRow(/* action= */ null, /* icon= */ null, Collections.emptyList(),
-                Collections.emptyList(), Collections.singletonList(slider));
-        QCRow newRow = writeAndLoadFromBundle(row);
-        assertThat(newRow.getSlider()).isNotNull();
-    }
-
-    private QCRow createRow(PendingIntent action, Icon icon) {
-        return createRow(action, icon, Collections.emptyList(), Collections.emptyList(),
-                Collections.emptyList());
-    }
-
-    private QCRow createRow(PendingIntent action, Icon icon, List<QCActionItem> startItems,
-            List<QCActionItem> endItems, List<QCSlider> sliders) {
-        QCRow.Builder builder = new QCRow.Builder()
-                .setTitle(TEST_TITLE)
-                .setSubtitle(TEST_SUBTITLE)
-                .setIcon(icon)
-                .setPrimaryAction(action);
-        for (QCActionItem item : startItems) {
-            builder.addStartItem(item);
-        }
-        for (QCActionItem item : endItems) {
-            builder.addEndItem(item);
-        }
-        for (QCSlider slider : sliders) {
-            builder.addSlider(slider);
-        }
-        return builder.build();
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/QCSliderTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/QCSliderTest.java
deleted file mode 100644
index 97bf191..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/QCSliderTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc;
-
-import static com.android.car.qc.QCItem.QC_TYPE_SLIDER;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.PendingIntent;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class QCSliderTest extends QCItemTestCase<QCSlider> {
-    private static final int MIN = 50;
-    private static final int MAX = 150;
-    private static final int VALUE = 75;
-
-    @Test
-    public void onCreate_hasCorrectType() {
-        QCSlider slider = createSlider(/* action= */ null);
-        assertThat(slider.getType()).isEqualTo(QC_TYPE_SLIDER);
-    }
-
-    @Test
-    public void onBundle_nullAction_noCrash() {
-        QCSlider slider = createSlider(/* action= */ null);
-        writeAndLoadFromBundle(slider);
-        // Test passes if this doesn't crash
-    }
-
-    @Test
-    public void createFromParcel_accurateData() {
-        QCSlider slider = createSlider(mDefaultAction);
-        QCSlider newSlider = writeAndLoadFromBundle(slider);
-        assertThat(newSlider.getType()).isEqualTo(QC_TYPE_SLIDER);
-        assertThat(newSlider.getPrimaryAction()).isNotNull();
-        assertThat(newSlider.getMin()).isEqualTo(MIN);
-        assertThat(newSlider.getMax()).isEqualTo(MAX);
-        assertThat(newSlider.getValue()).isEqualTo(VALUE);
-    }
-
-    private QCSlider createSlider(PendingIntent action) {
-        return new QCSlider.Builder()
-                .setMin(MIN)
-                .setMax(MAX)
-                .setValue(VALUE)
-                .setInputAction(action)
-                .build();
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/QCTileTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/QCTileTest.java
deleted file mode 100644
index e9530d5..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/QCTileTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc;
-
-import static com.android.car.qc.QCItem.QC_TYPE_TILE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.PendingIntent;
-import android.graphics.drawable.Icon;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class QCTileTest extends QCItemTestCase<QCTile> {
-
-    @Test
-    public void onCreate_hasCorrectType() {
-        QCTile tile = createTile(/* action= */ null, /* icon= */ null);
-        assertThat(tile.getType()).isEqualTo(QC_TYPE_TILE);
-    }
-
-    @Test
-    public void onBundle_nullAction_noCrash() {
-        QCTile tile = createTile(/* action= */ null, mDefaultIcon);
-        writeAndLoadFromBundle(tile);
-        // Test passes if this doesn't crash
-    }
-
-    @Test
-    public void onBundle_nullIcon_noCrash() {
-        QCTile tile = createTile(mDefaultAction, /* icon= */ null);
-        writeAndLoadFromBundle(tile);
-        // Test passes if this doesn't crash
-    }
-
-    @Test
-    public void createFromParcel_accurateData() {
-        QCTile tile = createTile(mDefaultAction, mDefaultIcon);
-        QCTile newTile = writeAndLoadFromBundle(tile);
-        assertThat(newTile.getType()).isEqualTo(QC_TYPE_TILE);
-        assertThat(newTile.getSubtitle()).isEqualTo(TEST_SUBTITLE);
-        assertThat(newTile.isChecked()).isTrue();
-        assertThat(newTile.isEnabled()).isTrue();
-        assertThat(newTile.getPrimaryAction()).isNotNull();
-        assertThat(newTile.getIcon()).isNotNull();
-    }
-
-    private QCTile createTile(PendingIntent action, Icon icon) {
-        return new QCTile.Builder()
-                .setSubtitle(TEST_SUBTITLE)
-                .setChecked(true)
-                .setEnabled(true)
-                .setAction(action)
-                .setIcon(icon)
-                .build();
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/controller/BaseQCControllerTestCase.java b/car-qc-lib/tests/unit/src/com/android/car/qc/controller/BaseQCControllerTestCase.java
deleted file mode 100644
index 095b192..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/controller/BaseQCControllerTestCase.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.controller;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-
-import androidx.lifecycle.Observer;
-import androidx.test.core.app.ApplicationProvider;
-
-import com.android.car.qc.QCItem;
-import com.android.car.qc.QCTile;
-
-import org.junit.Test;
-
-public abstract class BaseQCControllerTestCase<T extends BaseQCController> {
-
-    protected final Context mContext = spy(ApplicationProvider.getApplicationContext());
-
-    protected abstract T getController();
-
-    @Test
-    public void listen_updateListeningCalled() {
-        T spiedController = spy(getController());
-        spiedController.listen(true);
-        verify(spiedController).updateListening();
-    }
-
-    @Test
-    public void addObserver_updateListeningCalled() {
-        Observer<QCItem> observer = mock(Observer.class);
-        T spiedController = spy(getController());
-        spiedController.addObserver(observer);
-        verify(spiedController).updateListening();
-    }
-
-    @Test
-    public void removeObserver_updateListeningCalled() {
-        Observer<QCItem> observer = mock(Observer.class);
-        T spiedController = spy(getController());
-        spiedController.removeObserver(observer);
-        verify(spiedController).updateListening();
-    }
-
-    @Test
-    public void onQCItemUpdated_observersNotified() {
-        Observer<QCItem> observer = mock(Observer.class);
-        getController().addObserver(observer);
-        getController().onQCItemUpdated(new QCTile.Builder().build());
-        verify(observer).onChanged(any(QCItem.class));
-    }
-
-    @Test
-    public void onDestroy_cleanUpController() {
-        Observer<QCItem> observer = mock(Observer.class);
-        getController().addObserver(observer);
-        getController().listen(true);
-        getController().destroy();
-        assertThat(getController().mObservers.size()).isEqualTo(0);
-        assertThat(getController().mShouldListen).isFalse();
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/controller/LocalQCControllerTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/controller/LocalQCControllerTest.java
deleted file mode 100644
index 17d7392..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/controller/LocalQCControllerTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.controller;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import androidx.lifecycle.Observer;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.qc.QCItem;
-import com.android.car.qc.provider.BaseLocalQCProvider;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mockito;
-
-@RunWith(AndroidJUnit4.class)
-public class LocalQCControllerTest extends BaseQCControllerTestCase<LocalQCController> {
-
-    private LocalQCController mController;
-    private BaseLocalQCProvider mProvider;
-
-    @Override
-    protected LocalQCController getController() {
-        if (mController == null) {
-            mProvider = mock(BaseLocalQCProvider.class);
-            mController = new LocalQCController(mContext, mProvider);
-        }
-        return mController;
-    }
-
-    @Test
-    public void onCreate_setsProviderNotifier() {
-        getController(); // instantiate
-        verify(mProvider).setNotifier(any());
-    }
-
-    @Test
-    public void updateListening_updatesProviderListening() {
-        Observer<QCItem> observer = mock(Observer.class);
-        getController().addObserver(observer);
-        getController().listen(true);
-        verify(mProvider).shouldListen(true);
-        getController().listen(false);
-        verify(mProvider).shouldListen(false);
-    }
-
-    @Test
-    public void updateListening_listen_updatesQCItem() {
-        Observer<QCItem> observer = mock(Observer.class);
-        LocalQCController spiedController = spy(getController());
-        spiedController.addObserver(observer);
-        Mockito.reset(mProvider);
-        spiedController.listen(true);
-        verify(mProvider).getQCItem();
-        verify(spiedController).onQCItemUpdated(any());
-    }
-
-    @Test
-    public void onDestroy_callsProviderDestroy() {
-        getController().destroy();
-        verify(mProvider).onDestroy();
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/controller/RemoteQCControllerTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/controller/RemoteQCControllerTest.java
deleted file mode 100644
index a1db602..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/controller/RemoteQCControllerTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.controller;
-
-import static com.android.car.qc.provider.BaseQCProvider.EXTRA_URI;
-import static com.android.car.qc.testutils.TestQCProvider.IS_DESTROYED_KEY;
-import static com.android.car.qc.testutils.TestQCProvider.IS_SUBSCRIBED_KEY;
-import static com.android.car.qc.testutils.TestQCProvider.KEY_DEFAULT;
-import static com.android.car.qc.testutils.TestQCProvider.METHOD_IS_DESTROYED;
-import static com.android.car.qc.testutils.TestQCProvider.METHOD_IS_SUBSCRIBED;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.notNull;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.ContentProviderClient;
-import android.content.ContentResolver;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.RemoteException;
-
-import androidx.lifecycle.Observer;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.platform.app.InstrumentationRegistry;
-
-import com.android.car.qc.QCItem;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class RemoteQCControllerTest extends BaseQCControllerTestCase<RemoteQCController> {
-
-    private final Uri mDefaultUri = Uri.parse(
-            "content://com.android.car.qc.testutils.AllowedTestQCProvider/" + KEY_DEFAULT);
-
-    private RemoteQCController mController;
-
-    @Override
-    protected RemoteQCController getController() {
-        if (mController == null) {
-            mController = new RemoteQCController(mContext, mDefaultUri, mContext.getMainExecutor());
-        }
-        return mController;
-    }
-
-    @Test
-    public void updateListening_listen_updatesQCItem() {
-        Observer<QCItem> observer = mock(Observer.class);
-        RemoteQCController spiedController = spy(getController());
-        spiedController.addObserver(observer);
-        spiedController.listen(true);
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-        verify(spiedController).onQCItemUpdated(notNull());
-    }
-
-    @Test
-    public void updateListening_listen_providerSubscribed() throws RemoteException {
-        Observer<QCItem> observer = mock(Observer.class);
-        getController().addObserver(observer);
-        getController().listen(true);
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
-        Bundle extras = new Bundle();
-        extras.putParcelable(EXTRA_URI, mDefaultUri);
-        Bundle res = getController().getClient().call(METHOD_IS_SUBSCRIBED, null, extras);
-        assertThat(res).isNotNull();
-        boolean isSubscribed = res.getBoolean(IS_SUBSCRIBED_KEY, false);
-        assertThat(isSubscribed).isTrue();
-    }
-
-    @Test
-    public void updateListening_doNotListen_providerUnsubscribed() throws RemoteException {
-        Observer<QCItem> observer = mock(Observer.class);
-        getController().addObserver(observer);
-        getController().listen(true);
-        getController().listen(false);
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
-        Bundle extras = new Bundle();
-        extras.putParcelable(EXTRA_URI, mDefaultUri);
-        Bundle res = getController().getClient().call(METHOD_IS_SUBSCRIBED, null, extras);
-        assertThat(res).isNotNull();
-        boolean isSubscribed = res.getBoolean(IS_SUBSCRIBED_KEY, true);
-        assertThat(isSubscribed).isFalse();
-    }
-
-    @Test
-    public void updateListening_listen_registerContentObserver() {
-        ContentResolver resolver = mock(ContentResolver.class);
-        when(mContext.getContentResolver()).thenReturn(resolver);
-        when(resolver.acquireContentProviderClient(mDefaultUri)).thenReturn(
-                mock(ContentProviderClient.class));
-        Observer<QCItem> observer = mock(Observer.class);
-        getController().addObserver(observer);
-        getController().listen(true);
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-        verify(resolver).registerContentObserver(eq(mDefaultUri), eq(true),
-                any(ContentObserver.class));
-    }
-
-    @Test
-    public void updateListening_doNotListen_unregisterContentObserver() {
-        ContentResolver resolver = mock(ContentResolver.class);
-        when(mContext.getContentResolver()).thenReturn(resolver);
-        when(resolver.acquireContentProviderClient(mDefaultUri)).thenReturn(
-                mock(ContentProviderClient.class));
-        Observer<QCItem> observer = mock(Observer.class);
-        getController().addObserver(observer);
-        getController().listen(true);
-        getController().listen(false);
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-        verify(resolver).unregisterContentObserver(any(ContentObserver.class));
-    }
-
-    @Test
-    public void onDestroy_callsProviderOnDestroy() throws RemoteException {
-        Observer<QCItem> observer = mock(Observer.class);
-        getController().addObserver(observer);
-        getController().listen(true);
-        getController().listen(false);
-        getController().destroy();
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
-        Bundle extras = new Bundle();
-        extras.putParcelable(EXTRA_URI, mDefaultUri);
-        Bundle res = getController().getClient().call(METHOD_IS_DESTROYED, null, extras);
-        assertThat(res).isNotNull();
-        boolean isDestroyed = res.getBoolean(IS_DESTROYED_KEY, false);
-        assertThat(isDestroyed).isTrue();
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/provider/BaseLocalQCProviderTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/provider/BaseLocalQCProviderTest.java
deleted file mode 100644
index 6defad7..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/provider/BaseLocalQCProviderTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.provider;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.qc.QCItem;
-import com.android.car.qc.QCTile;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class BaseLocalQCProviderTest {
-
-    private final Context mContext = ApplicationProvider.getApplicationContext();
-    private TestBaseLocalQCProvider mProvider;
-
-    @Before
-    public void setUp() {
-        mProvider = new TestBaseLocalQCProvider(mContext);
-    }
-
-    @Test
-    public void getQCItem_returnsItem() {
-        QCItem item = mProvider.getQCItem();
-        assertThat(item).isNotNull();
-        assertThat(item instanceof QCTile).isTrue();
-    }
-
-    @Test
-    public void listen_callsOnSubscribed() {
-        mProvider.shouldListen(true);
-        assertThat(mProvider.isSubscribed()).isTrue();
-    }
-
-    @Test
-    public void stopListening_callsOnUnsubscribed() {
-        mProvider.shouldListen(true);
-        mProvider.shouldListen(false);
-        assertThat(mProvider.isSubscribed()).isFalse();
-    }
-
-    @Test
-    public void notifyChange_updateNotified() {
-        BaseLocalQCProvider.Notifier notifier = mock(BaseLocalQCProvider.Notifier.class);
-        mProvider.setNotifier(notifier);
-        mProvider.notifyChange();
-        verify(notifier).notifyUpdate();
-    }
-
-    private static class TestBaseLocalQCProvider extends BaseLocalQCProvider {
-
-        private boolean mIsSubscribed;
-
-        TestBaseLocalQCProvider(Context context) {
-            super(context);
-        }
-
-        @Override
-        public QCItem getQCItem() {
-            return new QCTile.Builder().build();
-        }
-
-        @Override
-        protected void onSubscribed() {
-            mIsSubscribed = true;
-        }
-
-        @Override
-        protected void onUnsubscribed() {
-            mIsSubscribed = false;
-        }
-
-        boolean isSubscribed() {
-            return mIsSubscribed;
-        }
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/provider/BaseQCProviderTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/provider/BaseQCProviderTest.java
deleted file mode 100644
index 30607fa..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/provider/BaseQCProviderTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.provider;
-
-import static com.android.car.qc.provider.BaseQCProvider.EXTRA_ITEM;
-import static com.android.car.qc.provider.BaseQCProvider.EXTRA_URI;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_BIND;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_DESTROY;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_SUBSCRIBE;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_UNSUBSCRIBE;
-import static com.android.car.qc.testutils.TestQCProvider.IS_DESTROYED_KEY;
-import static com.android.car.qc.testutils.TestQCProvider.IS_SUBSCRIBED_KEY;
-import static com.android.car.qc.testutils.TestQCProvider.KEY_DEFAULT;
-import static com.android.car.qc.testutils.TestQCProvider.KEY_SLOW;
-import static com.android.car.qc.testutils.TestQCProvider.METHOD_IS_DESTROYED;
-import static com.android.car.qc.testutils.TestQCProvider.METHOD_IS_SUBSCRIBED;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.testng.Assert.assertThrows;
-
-import android.content.ContentProviderClient;
-import android.content.Context;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.os.RemoteException;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.qc.QCItem;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class BaseQCProviderTest {
-
-    private final Context mContext = ApplicationProvider.getApplicationContext();
-    private final Uri mDefaultUri = Uri.parse(
-            "content://com.android.car.qc.testutils.AllowedTestQCProvider/" + KEY_DEFAULT);
-    private final Uri mSlowUri =
-            Uri.parse("content://com.android.car.qc.testutils.AllowedTestQCProvider/" + KEY_SLOW);
-    private final Uri mDeniedUri =
-            Uri.parse("content://com.android.car.qc.testutils.DeniedTestQCProvider");
-
-    @Test
-    public void callOnBind_allowed_returnsItem() throws RemoteException {
-        ContentProviderClient provider = getClient(mDefaultUri);
-        assertThat(provider).isNotNull();
-        Bundle extras = new Bundle();
-        extras.putParcelable(EXTRA_URI, mDefaultUri);
-        Bundle res = provider.call(METHOD_BIND, null, extras);
-        assertThat(res).isNotNull();
-        res.setClassLoader(QCItem.class.getClassLoader());
-        Parcelable parcelable = res.getParcelable(EXTRA_ITEM);
-        assertThat(parcelable).isNotNull();
-        assertThat(parcelable instanceof QCItem).isTrue();
-    }
-
-    @Test
-    public void callOnBind_noUri_throwsIllegalArgumentException() throws RemoteException {
-        ContentProviderClient provider = getClient(mDefaultUri);
-        assertThat(provider).isNotNull();
-        Bundle extras = new Bundle();
-        assertThrows(IllegalArgumentException.class,
-                () -> provider.call(METHOD_BIND, null, extras));
-    }
-
-    @Test
-    public void callOnBind_slowOperation_throwsRuntimeException() {
-        ContentProviderClient provider = getClient(mSlowUri);
-        assertThat(provider).isNotNull();
-        Bundle extras = new Bundle();
-        extras.putParcelable(EXTRA_URI, mSlowUri);
-        assertThrows(RuntimeException.class,
-                () -> provider.call(METHOD_BIND, null, extras));
-    }
-
-    @Test
-    public void callOnBind_notAllowed_throwsSecurityException() {
-        ContentProviderClient provider = getClient(mDeniedUri);
-        assertThat(provider).isNotNull();
-        Bundle extras = new Bundle();
-        extras.putParcelable(EXTRA_URI, mDeniedUri);
-        assertThrows(SecurityException.class,
-                () -> provider.call(METHOD_BIND, null, extras));
-    }
-
-    @Test
-    public void callOnSubscribed_isSubscribed() throws RemoteException {
-        ContentProviderClient provider = getClient(mDefaultUri);
-        assertThat(provider).isNotNull();
-        Bundle extras = new Bundle();
-        extras.putParcelable(EXTRA_URI, mDefaultUri);
-        provider.call(METHOD_SUBSCRIBE, null, extras);
-
-        Bundle res = provider.call(METHOD_IS_SUBSCRIBED, null, extras);
-        assertThat(res).isNotNull();
-        boolean isSubscribed = res.getBoolean(IS_SUBSCRIBED_KEY, false);
-        assertThat(isSubscribed).isTrue();
-    }
-
-    @Test
-    public void callOnUnsubscribed_isUnsubscribed() throws RemoteException {
-        ContentProviderClient provider = getClient(mDefaultUri);
-        assertThat(provider).isNotNull();
-        Bundle extras = new Bundle();
-        extras.putParcelable(EXTRA_URI, mDefaultUri);
-        provider.call(METHOD_SUBSCRIBE, null, extras);
-        provider.call(METHOD_UNSUBSCRIBE, null, extras);
-
-        Bundle res = provider.call(METHOD_IS_SUBSCRIBED, null, extras);
-        assertThat(res).isNotNull();
-        boolean isSubscribed = res.getBoolean(IS_SUBSCRIBED_KEY, true);
-        assertThat(isSubscribed).isFalse();
-    }
-
-    @Test
-    public void callDestroy_isDestroyed() throws RemoteException {
-        ContentProviderClient provider = getClient(mDefaultUri);
-        assertThat(provider).isNotNull();
-        Bundle extras = new Bundle();
-        extras.putParcelable(EXTRA_URI, mDefaultUri);
-        provider.call(METHOD_SUBSCRIBE, null, extras);
-        provider.call(METHOD_UNSUBSCRIBE, null, extras);
-        provider.call(METHOD_DESTROY, null, extras);
-
-        Bundle res = provider.call(METHOD_IS_DESTROYED, null, extras);
-        assertThat(res).isNotNull();
-        boolean isDestroyed = res.getBoolean(IS_DESTROYED_KEY, false);
-        assertThat(isDestroyed).isTrue();
-    }
-
-    private ContentProviderClient getClient(Uri uri) {
-        return mContext.getContentResolver().acquireContentProviderClient(uri);
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/AllowedTestQCProvider.java b/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/AllowedTestQCProvider.java
deleted file mode 100644
index d3cbf87..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/AllowedTestQCProvider.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.testutils;
-
-import java.util.HashSet;
-import java.util.Set;
-
-public class AllowedTestQCProvider extends TestQCProvider {
-    @Override
-    protected Set<String> getAllowlistedPackages() {
-        Set<String> allowlist = new HashSet<>();
-        allowlist.add("com.android.car.qc.tests.unit");
-        return allowlist;
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/DeniedTestQCProvider.java b/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/DeniedTestQCProvider.java
deleted file mode 100644
index a9c56ce..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/DeniedTestQCProvider.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.testutils;
-
-import java.util.HashSet;
-import java.util.Set;
-
-public class DeniedTestQCProvider extends TestQCProvider {
-    @Override
-    protected Set<String> getAllowlistedPackages() {
-        return new HashSet<>();
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/TestQCProvider.java b/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/TestQCProvider.java
deleted file mode 100644
index 8248832..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/TestQCProvider.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.testutils;
-
-import android.R;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-import android.net.Uri;
-import android.os.Bundle;
-
-import androidx.annotation.NonNull;
-
-import com.android.car.qc.QCItem;
-import com.android.car.qc.QCTile;
-import com.android.car.qc.provider.BaseQCProvider;
-
-import java.io.ByteArrayOutputStream;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public abstract class TestQCProvider extends BaseQCProvider {
-
-    public static final String METHOD_IS_SUBSCRIBED = "METHOD_IS_SUBSCRIBED";
-    public static final String IS_SUBSCRIBED_KEY = "IS_SUBSCRIBED";
-    public static final String METHOD_IS_DESTROYED = "METHOD_IS_DESTROYED";
-    public static final String IS_DESTROYED_KEY = "IS_DESTROYED";
-
-    public static final String KEY_DEFAULT = "DEFAULT";
-    public static final String KEY_SLOW = "SLOW";
-
-    private final Set<Uri> mSubscribedUris = new HashSet<>();
-    private final Set<Uri> mDestroyedUris = new HashSet<>();
-
-    @Override
-    public Bundle call(String method, String arg, Bundle extras) {
-        if (METHOD_IS_SUBSCRIBED.equals(method)) {
-            Uri uri = getUriWithoutUserId(extras.getParcelable(EXTRA_URI));
-            Bundle bundle = new Bundle();
-            bundle.putBoolean(IS_SUBSCRIBED_KEY, mSubscribedUris.contains(uri));
-            return bundle;
-        }
-        if (METHOD_IS_DESTROYED.equals(method)) {
-            Uri uri = getUriWithoutUserId(extras.getParcelable(EXTRA_URI));
-            Bundle bundle = new Bundle();
-            bundle.putBoolean(IS_DESTROYED_KEY, mDestroyedUris.contains(uri));
-            return bundle;
-        }
-        return super.call(method, arg, extras);
-    }
-
-    @Override
-    protected QCItem onBind(@NonNull Uri uri) {
-        List<String> pathSegments = uri.getPathSegments();
-        String key = pathSegments.get(0);
-
-        if (KEY_DEFAULT.equals(key)) {
-            return new QCTile.Builder()
-                    .setIcon(Icon.createWithResource(getContext(), R.drawable.btn_star))
-                    .build();
-        } else if (KEY_SLOW.equals(key)) {
-            // perform a slow operation that should trigger the strict thread policy
-            Drawable d = getContext().getDrawable(R.drawable.btn_star);
-            Bitmap bitmap = drawableToBitmap(d);
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
-            byte[] b = baos.toByteArray();
-            Icon icon = Icon.createWithData(b, 0, b.length);
-            return new QCTile.Builder()
-                    .setIcon(icon)
-                    .build();
-        }
-        return null;
-    }
-
-    @Override
-    protected void onSubscribed(@NonNull Uri uri) {
-        mSubscribedUris.add(uri);
-    }
-
-    @Override
-    protected void onUnsubscribed(@NonNull Uri uri) {
-        mSubscribedUris.remove(uri);
-    }
-
-    @Override
-    protected void onDestroy(@NonNull Uri uri) {
-        mDestroyedUris.add(uri);
-    }
-
-    private static Bitmap drawableToBitmap(Drawable drawable) {
-
-        if (drawable instanceof BitmapDrawable) {
-            return ((BitmapDrawable) drawable).getBitmap();
-        }
-
-        Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
-                drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
-        Canvas canvas = new Canvas(bitmap);
-        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
-        drawable.draw(canvas);
-
-        return bitmap;
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCListViewTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCListViewTest.java
deleted file mode 100644
index a1065e8..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCListViewTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.view;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-import static org.testng.Assert.assertThrows;
-
-import android.content.Context;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.qc.QCList;
-import com.android.car.qc.QCRow;
-import com.android.dx.mockito.inline.extended.ExtendedMockito;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class QCListViewTest {
-
-    private final Context mContext = ApplicationProvider.getApplicationContext();
-    private QCListView mView;
-
-    @Before
-    public void setUp() {
-        mView = new QCListView(mContext);
-    }
-
-    @Test
-    public void onChanged_null_noViews() {
-        mView.onChanged(null);
-        assertThat(mView.getChildCount()).isEqualTo(0);
-    }
-
-    @Test
-    public void onChanged_invalidType_throwsIllegalArgumentException() {
-        QCRow row = new QCRow.Builder().build();
-        assertThrows(IllegalArgumentException.class,
-                () -> mView.onChanged(row));
-    }
-
-    @Test
-    public void onChanged_createsRows() {
-        QCList list = new QCList.Builder()
-                .addRow(new QCRow.Builder().build())
-                .addRow(new QCRow.Builder().build())
-                .build();
-        mView.onChanged(list);
-        assertThat(mView.getChildCount()).isEqualTo(2);
-        assertThat(mView.getChildAt(0) instanceof QCRowView).isTrue();
-        assertThat(mView.getChildAt(1) instanceof QCRowView).isTrue();
-    }
-
-    @Test
-    public void onChanged_decreasedRowCount_removesExtraRows() {
-        QCList list = new QCList.Builder()
-                .addRow(new QCRow.Builder().build())
-                .addRow(new QCRow.Builder().build())
-                .build();
-        mView.onChanged(list);
-        assertThat(mView.getChildCount()).isEqualTo(2);
-        list = new QCList.Builder()
-                .addRow(new QCRow.Builder().build())
-                .build();
-        mView.onChanged(list);
-        assertThat(mView.getChildCount()).isEqualTo(1);
-    }
-
-    @Test
-    public void setActionListener_setsOnChildView() {
-        QCList list = new QCList.Builder()
-                .addRow(new QCRow.Builder().build())
-                .addRow(new QCRow.Builder().build())
-                .build();
-        mView.onChanged(list);
-        assertThat(mView.getChildCount()).isEqualTo(2);
-        QCRowView row1 = (QCRowView) mView.getChildAt(0);
-        QCRowView row2 = (QCRowView) mView.getChildAt(1);
-        ExtendedMockito.spyOn(row1);
-        ExtendedMockito.spyOn(row2);
-        QCView.QCActionListener listener = mock(QCView.QCActionListener.class);
-        mView.setActionListener(listener);
-        ExtendedMockito.verify(row1).setActionListener(listener);
-        ExtendedMockito.verify(row2).setActionListener(listener);
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCRowViewTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCRowViewTest.java
deleted file mode 100644
index 6e1639c..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCRowViewTest.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.view;
-
-import static com.android.car.qc.QCItem.QC_TYPE_ACTION_SWITCH;
-import static com.android.car.qc.QCItem.QC_TYPE_ACTION_TOGGLE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Icon;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import androidx.test.annotation.UiThreadTest;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.qc.QCActionItem;
-import com.android.car.qc.QCRow;
-import com.android.car.qc.QCSlider;
-import com.android.car.qc.R;
-import com.android.dx.mockito.inline.extended.ExtendedMockito;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class QCRowViewTest {
-
-    private final Context mContext = ApplicationProvider.getApplicationContext();
-    private QCRowView mView;
-
-    @Before
-    public void setUp() {
-        mView = new QCRowView(mContext);
-    }
-
-    @Test
-    public void setRow_null_notVisible() {
-        mView.setRow(null);
-        assertThat(mView.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void setRow_notNull_visible() {
-        QCRow row = new QCRow.Builder().build();
-        mView.setRow(row);
-        assertThat(mView.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void setRow_setsTitle() {
-        String title = "TEST_TITLE";
-        QCRow row = new QCRow.Builder().setTitle(title).build();
-        mView.setRow(row);
-        TextView titleView = mView.findViewById(R.id.qc_title);
-        assertThat(titleView.getVisibility()).isEqualTo(View.VISIBLE);
-        assertThat(titleView.getText().toString()).isEqualTo(title);
-    }
-
-    @Test
-    public void setRow_setsSubtitle() {
-        String subtitle = "TEST_TITLE";
-        QCRow row = new QCRow.Builder().setSubtitle(subtitle).build();
-        mView.setRow(row);
-        TextView subtitleView = mView.findViewById(R.id.qc_summary);
-        assertThat(subtitleView.getVisibility()).isEqualTo(View.VISIBLE);
-        assertThat(subtitleView.getText().toString()).isEqualTo(subtitle);
-    }
-
-    @Test
-    public void setRow_setsIcon() {
-        Icon icon = Icon.createWithResource(mContext, android.R.drawable.btn_star);
-        QCRow row = new QCRow.Builder().setIcon(icon).build();
-        mView.setRow(row);
-        ImageView iconView = mView.findViewById(R.id.qc_icon);
-        assertThat(iconView.getVisibility()).isEqualTo(View.VISIBLE);
-        assertThat(iconView.getDrawable()).isNotNull();
-    }
-
-    @Test
-    public void setRow_createsStartItems() {
-        QCRow row = new QCRow.Builder()
-                .addStartItem(new QCActionItem.Builder(QC_TYPE_ACTION_SWITCH).build())
-                .addStartItem(new QCActionItem.Builder(QC_TYPE_ACTION_TOGGLE).build())
-                .build();
-        mView.setRow(row);
-        LinearLayout startContainer = mView.findViewById(R.id.qc_row_start_items);
-        assertThat(startContainer.getChildCount()).isEqualTo(2);
-        assertThat((View) startContainer.getChildAt(0).findViewById(
-                android.R.id.switch_widget)).isNotNull();
-        assertThat((View) startContainer.getChildAt(1).findViewById(
-                R.id.qc_toggle_button)).isNotNull();
-    }
-
-    @Test
-    public void setRow_createsEndItems() {
-        QCRow row = new QCRow.Builder()
-                .addEndItem(new QCActionItem.Builder(QC_TYPE_ACTION_SWITCH).build())
-                .addEndItem(new QCActionItem.Builder(QC_TYPE_ACTION_TOGGLE).build())
-                .build();
-        mView.setRow(row);
-        LinearLayout endContainer = mView.findViewById(R.id.qc_row_end_items);
-        assertThat(endContainer.getChildCount()).isEqualTo(2);
-        assertThat((View) endContainer.getChildAt(0).findViewById(
-                android.R.id.switch_widget)).isNotNull();
-        assertThat((View) endContainer.getChildAt(1).findViewById(
-                R.id.qc_toggle_button)).isNotNull();
-    }
-
-    @Test
-    public void setRow_noSlider_sliderViewNotVisible() {
-        QCRow row = new QCRow.Builder().build();
-        mView.setRow(row);
-        LinearLayout sliderContainer = mView.findViewById(R.id.qc_seekbar_wrapper);
-        assertThat(sliderContainer.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    @UiThreadTest
-    public void setRow_hasSlider_sliderViewVisible() {
-        QCRow row = new QCRow.Builder()
-                .addSlider(new QCSlider.Builder().build())
-                .build();
-        mView.setRow(row);
-        LinearLayout sliderContainer = mView.findViewById(R.id.qc_seekbar_wrapper);
-        assertThat(sliderContainer.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void onRowClick_firesAction() throws PendingIntent.CanceledException {
-        PendingIntent action = mock(PendingIntent.class);
-        QCRow row = new QCRow.Builder().setPrimaryAction(action).build();
-        mView.setRow(row);
-        mView.findViewById(R.id.qc_row_content).performClick();
-        verify(action).send(any(Context.class), anyInt(), eq(null));
-    }
-
-    @Test
-    public void onSwitchClick_firesAction() throws PendingIntent.CanceledException {
-        PendingIntent action = mock(PendingIntent.class);
-        QCRow row = new QCRow.Builder()
-                .addEndItem(
-                        new QCActionItem.Builder(QC_TYPE_ACTION_SWITCH).setAction(action).build())
-                .build();
-        mView.setRow(row);
-        LinearLayout endContainer = mView.findViewById(R.id.qc_row_end_items);
-        assertThat(endContainer.getChildCount()).isEqualTo(1);
-        endContainer.getChildAt(0).performClick();
-        verify(action).send(any(Context.class), anyInt(), any(Intent.class));
-    }
-
-    @Test
-    @UiThreadTest
-    public void onToggleClick_firesAction() throws PendingIntent.CanceledException {
-        PendingIntent action = mock(PendingIntent.class);
-        QCRow row = new QCRow.Builder()
-                .addEndItem(
-                        new QCActionItem.Builder(QC_TYPE_ACTION_TOGGLE).setAction(action).build())
-                .build();
-        mView.setRow(row);
-        LinearLayout endContainer = mView.findViewById(R.id.qc_row_end_items);
-        assertThat(endContainer.getChildCount()).isEqualTo(1);
-        endContainer.getChildAt(0).performClick();
-        verify(action).send(any(Context.class), anyInt(), any(Intent.class));
-    }
-
-    @Test
-    @UiThreadTest
-    public void onSliderChange_firesAction() throws PendingIntent.CanceledException {
-        PendingIntent action = mock(PendingIntent.class);
-        QCRow row = new QCRow.Builder()
-                .addSlider(new QCSlider.Builder().setInputAction(action).build())
-                .build();
-        mView.setRow(row);
-        SeekBar seekBar = mView.findViewById(R.id.seekbar);
-        seekBar.setProgress(50);
-        MotionEvent motionEvent = ExtendedMockito.mock(MotionEvent.class);
-        ExtendedMockito.when(motionEvent.getAction()).thenReturn(MotionEvent.ACTION_UP);
-        seekBar.onTouchEvent(motionEvent);
-        verify(action).send(any(Context.class), anyInt(), any(Intent.class));
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCTileViewTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCTileViewTest.java
deleted file mode 100644
index 9104520..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCTileViewTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.view;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.testng.Assert.assertThrows;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-import android.graphics.drawable.LayerDrawable;
-import android.widget.TextView;
-
-import androidx.test.annotation.UiThreadTest;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.qc.QCRow;
-import com.android.car.qc.QCTile;
-import com.android.car.qc.R;
-import com.android.car.ui.uxr.DrawableStateToggleButton;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class QCTileViewTest {
-
-    private final Context mContext = ApplicationProvider.getApplicationContext();
-    private QCTileView mView;
-
-    @Before
-    public void setUp() {
-        mView = new QCTileView(mContext);
-    }
-
-    @Test
-    public void onChanged_null_noViews() {
-        mView.onChanged(null);
-        assertThat(mView.getChildCount()).isEqualTo(0);
-    }
-
-    @Test
-    public void onChanged_invalidType_throwsIllegalArgumentException() {
-        QCRow row = new QCRow.Builder().build();
-        assertThrows(IllegalArgumentException.class,
-                () -> mView.onChanged(row));
-    }
-
-    @Test
-    public void onChanged_setsSubtitleView() {
-        String subtitle = "TEST_SUBTITLE";
-        QCTile tile = new QCTile.Builder().setSubtitle(subtitle).build();
-        mView.onChanged(tile);
-        TextView subtitleView = mView.findViewById(android.R.id.summary);
-        assertThat(subtitleView.getText().toString()).isEqualTo(subtitle);
-    }
-
-    @Test
-    @UiThreadTest
-    public void onChanged_setsButtonState() {
-        QCTile tile = new QCTile.Builder().setChecked(true).setEnabled(true).build();
-        mView.onChanged(tile);
-        DrawableStateToggleButton button = mView.findViewById(R.id.qc_tile_toggle_button);
-        assertThat(button.isEnabled()).isTrue();
-        assertThat(button.isChecked()).isTrue();
-    }
-
-    @Test
-    public void onChanged_setsIcon() {
-        Icon icon = Icon.createWithResource(mContext, android.R.drawable.btn_star);
-        QCTile tile = new QCTile.Builder().setIcon(icon).build();
-        mView.onChanged(tile);
-        DrawableStateToggleButton button = mView.findViewById(R.id.qc_tile_toggle_button);
-        Drawable buttonDrawable = button.getButtonDrawable();
-        assertThat(buttonDrawable).isNotNull();
-        assertThat(buttonDrawable instanceof LayerDrawable).isTrue();
-        assertThat(((LayerDrawable) buttonDrawable).getNumberOfLayers()).isEqualTo(2);
-    }
-
-    @Test
-    @UiThreadTest
-    public void onClick_firesAction() throws PendingIntent.CanceledException {
-        PendingIntent action = mock(PendingIntent.class);
-        QCTile tile = new QCTile.Builder().setChecked(false).setAction(action).build();
-        mView.onChanged(tile);
-        mView.findViewById(R.id.qc_tile_wrapper).performClick();
-        DrawableStateToggleButton button = mView.findViewById(R.id.qc_tile_toggle_button);
-        assertThat(button.isChecked()).isTrue();
-        verify(action).send(any(Context.class), anyInt(), any(Intent.class));
-    }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCViewTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCViewTest.java
deleted file mode 100644
index b2090cb..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCViewTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2021 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.qc.view;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.testng.Assert.assertThrows;
-
-import android.content.Context;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.qc.QCList;
-import com.android.car.qc.QCRow;
-import com.android.car.qc.QCTile;
-import com.android.dx.mockito.inline.extended.ExtendedMockito;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class QCViewTest {
-
-    private final Context mContext = ApplicationProvider.getApplicationContext();
-    private QCView mView;
-
-    @Before
-    public void setUp() {
-        mView = new QCView(mContext);
-    }
-
-    @Test
-    public void onChanged_null_noViews() {
-        mView.onChanged(null);
-        assertThat(mView.getChildCount()).isEqualTo(0);
-    }
-
-    @Test
-    public void onChanged_invalidType_throwsIllegalArgumentException() {
-        QCRow row = new QCRow.Builder().build();
-        assertThrows(IllegalArgumentException.class,
-                () -> mView.onChanged(row));
-    }
-
-    @Test
-    public void onChanged_list_createsListView() {
-        QCList list = new QCList.Builder().build();
-        mView.onChanged(list);
-        assertThat(mView.getChildCount()).isEqualTo(1);
-        assertThat(mView.getChildAt(0) instanceof QCListView).isTrue();
-    }
-
-    @Test
-    public void onChanged_tile_createsTileView() {
-        QCTile tile = new QCTile.Builder().build();
-        mView.onChanged(tile);
-        assertThat(mView.getChildCount()).isEqualTo(1);
-        assertThat(mView.getChildAt(0) instanceof QCTileView).isTrue();
-    }
-
-    @Test
-    public void onChanged_alreadyHasView_callsOnChanged() {
-        QCTile tile = new QCTile.Builder().build();
-        mView.onChanged(tile);
-        assertThat(mView.getChildCount()).isEqualTo(1);
-        assertThat(mView.getChildAt(0) instanceof QCTileView).isTrue();
-        QCTileView tileView = (QCTileView) mView.getChildAt(0);
-        ExtendedMockito.spyOn(tileView);
-        mView.onChanged(tile);
-        verify(tileView).onChanged(tile);
-    }
-
-    @Test
-    public void setActionListener_setsOnChildView() {
-        QCTile tile = new QCTile.Builder().build();
-        mView.onChanged(tile);
-        assertThat(mView.getChildCount()).isEqualTo(1);
-        assertThat(mView.getChildAt(0) instanceof QCTileView).isTrue();
-        QCTileView tileView = (QCTileView) mView.getChildAt(0);
-        ExtendedMockito.spyOn(tileView);
-        QCView.QCActionListener listener = mock(QCView.QCActionListener.class);
-        mView.setActionListener(listener);
-        ExtendedMockito.verify(tileView).setActionListener(listener);
-    }
-}
diff --git a/car-ui-lib/Android.bp b/car-ui-lib/Android.bp
index b6dddd8..1ff7959 100644
--- a/car-ui-lib/Android.bp
+++ b/car-ui-lib/Android.bp
@@ -155,7 +155,6 @@
         "libdexmakerjvmtiagent",
         "libstaticjvmtiagent",
     ],
-    required: ["car-ui-lib-plugin"],
     platform_apis: true,
     test_suites: ["device-tests"],
 }
diff --git a/car-ui-lib/car-rotary-lib/src/main/java/com/android/car/ui/FocusParkingView.java b/car-ui-lib/car-rotary-lib/src/main/java/com/android/car/ui/FocusParkingView.java
index d1bb5ff..ec338d1 100644
--- a/car-ui-lib/car-rotary-lib/src/main/java/com/android/car/ui/FocusParkingView.java
+++ b/car-ui-lib/car-rotary-lib/src/main/java/com/android/car/ui/FocusParkingView.java
@@ -228,9 +228,11 @@
             // OnGlobalFocusChangeListener won't be triggered when the window lost focus, so reset
             // the focused view here.
             updateFocusedView(null);
-        } else if (isFocused() && mShouldRestoreFocus) {
-            // When FocusParkingView is focused and the window just gets focused, transfer the view
-            // focus to a non-FocusParkingView in the window.
+        } else if (mShouldRestoreFocus
+                && (isFocused() || getRootView().findFocus() instanceof FocusParkingView)) {
+            // When a FocusParkingView is focused and the window just gets focused, transfer
+            // the view focus to a non-FocusParkingView in the window. (Though not common,
+            // there might be multiple FocusParkingViews in the view tree.)
             restoreFocusInRoot(/* checkForTouchMode= */ true);
         }
         super.onWindowFocusChanged(hasWindowFocus);
diff --git a/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/preference/PreferenceTest.java b/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/preference/PreferenceTest.java
index c675df7..ac0b765 100644
--- a/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/preference/PreferenceTest.java
+++ b/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/preference/PreferenceTest.java
@@ -31,6 +31,7 @@
 
 import static com.android.car.ui.actions.ViewActions.setProgress;
 import static com.android.car.ui.core.CarUi.MIN_TARGET_API;
+import static com.android.car.ui.matchers.ViewMatchers.isActivated;
 import static com.android.car.ui.matchers.ViewMatchers.withIndex;
 
 import static junit.framework.Assert.assertFalse;
@@ -331,7 +332,6 @@
         // Scroll until list preference is visible
         mActivity.runOnUiThread(() -> mActivity.scrollToPreference("switch"));
 
-
         // Check title and summary are displayed as expected.
         onView(withIndex(withId(android.R.id.title), 0)).check(matches(
                 withText(mActivity.getString(R.string.title_switch_preference))));
@@ -366,6 +366,54 @@
     }
 
     @Test
+    public void testPrimarySwitchPreference() {
+        // Create switch preference and add it to screen.
+        CarUiPrimarySwitchPreference preference = new CarUiPrimarySwitchPreference(mActivity);
+        preference.setOrder(0);
+        preference.setKey("switch");
+        preference.setTitle(R.string.title_switch_preference);
+        preference.setSummary(R.string.summary_compound_button_preference);
+        mActivity.addPreference(preference);
+
+        // Scroll until list preference is visible
+        mActivity.runOnUiThread(() -> mActivity.scrollToPreference("switch"));
+
+        // Check title and summary are displayed as expected.
+        onView(withIndex(withId(android.R.id.title), 0)).check(matches(
+                withText(mActivity.getString(R.string.title_switch_preference))));
+        onView(withIndex(withId(android.R.id.summary), 0)).check(matches(
+                withText(mActivity.getString(R.string.summary_compound_button_preference))));
+
+        // Ensure switch preference is initially not selected.
+        onView(withId(android.R.id.switch_widget)).check(matches(isNotChecked()));
+
+        Preference.OnPreferenceChangeListener mockListener = mock(
+                Preference.OnPreferenceChangeListener.class);
+        when(mockListener.onPreferenceChange(any(), any())).thenReturn(true);
+        mActivity.setOnPreferenceChangeListener("switch", mockListener);
+
+        // Select switch preference.
+        onView(withText(R.string.title_switch_preference)).perform(click());
+
+        // Verify preference value was updated.
+        verify(mockListener, times(1)).onPreferenceChange(any(), eq(true));
+
+        // Verify switch preference correctly indicates preference is selected.
+        onView(withId(android.R.id.switch_widget)).check(matches(isChecked()));
+        onView(withText(R.string.title_switch_preference)).check(matches(isActivated()));
+
+        // Un-select switch preference.
+        onView(withText(R.string.title_switch_preference)).perform(click());
+
+        // Verify preference value was updated.
+        verify(mockListener, times(1)).onPreferenceChange(any(), eq(false));
+
+        // Verify switch preference correctly indicates preference is selected.
+        onView(withId(android.R.id.switch_widget)).check(matches(isNotChecked()));
+        onView(withText(R.string.title_switch_preference)).check(matches(not(isActivated())));
+    }
+
+    @Test
     public void testSwitchPreference_uxRestricted() {
         // Create switch preference and add it to screen.
         CarUiSwitchPreference preference = new CarUiSwitchPreference(mActivity);
diff --git a/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/recyclerview/CarUiRecyclerViewTest.java b/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/recyclerview/CarUiRecyclerViewTest.java
index 8257cad..01c66f0 100644
--- a/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/recyclerview/CarUiRecyclerViewTest.java
+++ b/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/recyclerview/CarUiRecyclerViewTest.java
@@ -33,6 +33,7 @@
 import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
 import static androidx.test.espresso.assertion.ViewAssertions.matches;
 import static androidx.test.espresso.matcher.ViewMatchers.assertThat;
+import static androidx.test.espresso.matcher.ViewMatchers.hasDescendant;
 import static androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
 import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
 import static androidx.test.espresso.matcher.ViewMatchers.isEnabled;
@@ -40,6 +41,7 @@
 import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;
 import static androidx.test.espresso.matcher.ViewMatchers.withId;
 import static androidx.test.espresso.matcher.ViewMatchers.withText;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
 
 import static com.android.car.ui.actions.CarUiRecyclerViewActions.scrollToPosition;
 import static com.android.car.ui.actions.LowLevelActions.performDrag;
@@ -56,7 +58,6 @@
 import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.greaterThanOrEqualTo;
 import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.lessThan;
 import static org.hamcrest.Matchers.lessThanOrEqualTo;
 import static org.hamcrest.Matchers.not;
 import static org.junit.Assert.assertEquals;
@@ -102,7 +103,6 @@
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.recyclerview.widget.RecyclerView.LayoutManager;
 import androidx.recyclerview.widget.RecyclerView.LayoutParams;
-import androidx.test.core.app.ActivityScenario;
 import androidx.test.espresso.IdlingRegistry;
 import androidx.test.espresso.IdlingResource;
 import androidx.test.ext.junit.rules.ActivityScenarioRule;
@@ -115,11 +115,11 @@
 import com.android.car.ui.utils.CarUxRestrictionsUtil;
 
 import org.junit.After;
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
+import org.mockito.ArgumentCaptor;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -127,14 +127,15 @@
 import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * Unit tests for {@link CarUiRecyclerView}.
  */
-@TargetApi(MIN_TARGET_API)
 @RunWith(Parameterized.class)
+@TargetApi(MIN_TARGET_API)
 public class CarUiRecyclerViewTest {
-
     @Parameterized.Parameters
     public static Object[] data() {
         // It's important to do no plugin first, so that the plugin will
@@ -146,14 +147,6 @@
     public ActivityScenarioRule<TestActivity> mActivityRule =
             new ActivityScenarioRule<>(TestActivity.class);
 
-    ActivityScenario<TestActivity> mScenario;
-
-    private TestActivity mActivity;
-    private Context mTestableContext;
-    private Resources mTestableResources;
-
-
-    private Context mPluginContext;
     private final boolean mIsPluginEnabled;
 
     public CarUiRecyclerViewTest(boolean pluginEnabled) {
@@ -161,21 +154,6 @@
         mIsPluginEnabled = pluginEnabled;
     }
 
-    @Before
-    public void setUp() {
-        if (mIsPluginEnabled) {
-            mPluginContext = PluginFactorySingleton.getPluginContext();
-        }
-        mScenario = mActivityRule.getScenario();
-        mScenario.onActivity(activity -> {
-            mActivity = activity;
-            mTestableContext = spy(mActivity);
-            mTestableResources = spy(mActivity.getResources());
-        });
-
-        when(mTestableContext.getResources()).thenReturn(mTestableResources);
-    }
-
     @After
     public void tearDown() {
         for (IdlingResource idlingResource : IdlingRegistry.getInstance().getResources()) {
@@ -187,11 +165,19 @@
 
     @Test
     public void testIsScrollbarPresent_scrollbarDisabled() {
-        if (isScrollbarEnabledNotAsExpected(false)) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
-        container.post(() -> {
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            doReturn(false).when(testableResources)
+                    .getBoolean(R.bool.car_ui_scrollbar_enable);
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
             carUiRecyclerView.setAdapter(new TestAdapter(100));
         });
@@ -201,21 +187,31 @@
 
     @Test
     public void testSmallRecyclerView_scrollbarDisabled() {
-        if (isScrollbarEnabledNotAsExpected(false)) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
-                null, R.styleable.CarUiRecyclerView));
-        doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
-                any(),
-                eq(R.styleable.CarUiRecyclerView),
-                anyInt(),
-                anyInt());
-        when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
-                anyInt())).thenReturn(0); // Small size
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
 
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
-        container.post(() -> {
+            TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+                    null, R.styleable.CarUiRecyclerView));
+            doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+                    any(),
+                    eq(R.styleable.CarUiRecyclerView),
+                    anyInt(),
+                    anyInt());
+            when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
+                    anyInt())).thenReturn(0); // Small size
+
+            // Disable scrollbar
+            doReturn(false).when(testableResources)
+                    .getBoolean(R.bool.car_ui_scrollbar_enable);
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
             carUiRecyclerView.setAdapter(new TestAdapter(100));
         });
@@ -225,21 +221,31 @@
 
     @Test
     public void testMediumRecyclerView_scrollbarDisabled() {
-        if (isScrollbarEnabledNotAsExpected(false)) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
-                null, R.styleable.CarUiRecyclerView));
-        doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
-                any(),
-                eq(R.styleable.CarUiRecyclerView),
-                anyInt(),
-                anyInt());
-        when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
-                anyInt())).thenReturn(1); // Medium size
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
 
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
-        container.post(() -> {
+            TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+                    null, R.styleable.CarUiRecyclerView));
+            doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+                    any(),
+                    eq(R.styleable.CarUiRecyclerView),
+                    anyInt(),
+                    anyInt());
+            when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
+                    anyInt())).thenReturn(1); // Medium size
+
+            // Disable scrollbar
+            doReturn(false).when(testableResources)
+                    .getBoolean(R.bool.car_ui_scrollbar_enable);
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
             carUiRecyclerView.setAdapter(new TestAdapter(100));
         });
@@ -249,21 +255,31 @@
 
     @Test
     public void testLargeRecyclerView_scrollbarDisabled() {
-        if (isScrollbarEnabledNotAsExpected(false)) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
-                null, R.styleable.CarUiRecyclerView));
-        doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
-                any(),
-                eq(R.styleable.CarUiRecyclerView),
-                anyInt(),
-                anyInt());
-        when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
-                anyInt())).thenReturn(2); // Large size
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
 
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
-        container.post(() -> {
+            TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+                    null, R.styleable.CarUiRecyclerView));
+            doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+                    any(),
+                    eq(R.styleable.CarUiRecyclerView),
+                    anyInt(),
+                    anyInt());
+            when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
+                    anyInt())).thenReturn(2); // Large size
+
+            // Disable scrollbar
+            doReturn(false).when(testableResources)
+                    .getBoolean(R.bool.car_ui_scrollbar_enable);
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
             carUiRecyclerView.setAdapter(new TestAdapter(100));
         });
@@ -273,19 +289,19 @@
 
     @Test
     public void testPadding() {
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
-        int padding = 100;
-        carUiRecyclerView.setPadding(padding, padding, padding, padding);
-        container.post(() -> {
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+            ViewGroup container = activity.findViewById(R.id.test_container);
+            int padding = 100;
+            carUiRecyclerView.setPadding(padding, padding, padding, padding);
             container.addView(carUiRecyclerView.getView());
             carUiRecyclerView.setAdapter(new TestAdapter(100));
-        });
 
-        assertEquals(padding, carUiRecyclerView.getPaddingLeft());
-        assertEquals(padding, carUiRecyclerView.getPaddingRight());
-        assertEquals(padding, carUiRecyclerView.getPaddingTop());
-        assertEquals(padding, carUiRecyclerView.getPaddingBottom());
+            assertEquals(padding, carUiRecyclerView.getPaddingLeft());
+            assertEquals(padding, carUiRecyclerView.getPaddingRight());
+            assertEquals(padding, carUiRecyclerView.getPaddingTop());
+            assertEquals(padding, carUiRecyclerView.getPaddingBottom());
+        });
     }
 
     @Test
@@ -293,28 +309,35 @@
         // Ensure the CarUiRecyclerViewLayout constant matches the styleable attribute enum value
         assertEquals(CarUiRecyclerView.CarUiRecyclerViewLayout.GRID, 1);
 
-        TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
-                null, R.styleable.CarUiRecyclerView));
-
-        doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
-                any(),
-                eq(R.styleable.CarUiRecyclerView),
-                anyInt(),
-                anyInt());
-        when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_layoutStyle), anyInt()))
-                .thenReturn(CarUiRecyclerView.CarUiRecyclerViewLayout.GRID);
-        when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_numOfColumns), anyInt()))
-                .thenReturn(3);
-
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(4);
-        container.post(() -> {
-            container.addView(carUiRecyclerView.getView());
-            carUiRecyclerView.setAdapter(adapter);
-        });
 
-        assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiGridLayoutStyle);
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+
+            TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+                    null, R.styleable.CarUiRecyclerView));
+
+            doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+                    any(),
+                    eq(R.styleable.CarUiRecyclerView),
+                    anyInt(),
+                    anyInt());
+            when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_layoutStyle), anyInt()))
+                    .thenReturn(CarUiRecyclerView.CarUiRecyclerViewLayout.GRID);
+            when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_numOfColumns), anyInt()))
+                    .thenReturn(3);
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
+            container.post(() -> {
+                container.addView(carUiRecyclerView.getView());
+                carUiRecyclerView.setAdapter(adapter);
+            });
+
+            assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiGridLayoutStyle);
+        });
 
         // Check that all items in the first row are top-aligned.
         onView(withText(adapter.getItemText(0))).check(
@@ -342,26 +365,33 @@
         // Ensure the CarUiRecyclerViewLayout constant matches the styleable attribute enum value
         assertEquals(CarUiRecyclerView.CarUiRecyclerViewLayout.LINEAR, 0);
 
-        TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
-                null, R.styleable.CarUiRecyclerView));
-
-        doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
-                any(),
-                eq(R.styleable.CarUiRecyclerView),
-                anyInt(),
-                anyInt());
-        when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_layoutStyle), anyInt()))
-                .thenReturn(CarUiRecyclerView.CarUiRecyclerViewLayout.LINEAR);
-
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(4);
-        container.post(() -> {
-            container.addView(carUiRecyclerView.getView());
-            carUiRecyclerView.setAdapter(adapter);
-        });
 
-        assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiLinearLayoutStyle);
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+
+            TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+                    null, R.styleable.CarUiRecyclerView));
+
+            doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+                    any(),
+                    eq(R.styleable.CarUiRecyclerView),
+                    anyInt(),
+                    anyInt());
+            when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_layoutStyle), anyInt()))
+                    .thenReturn(CarUiRecyclerView.CarUiRecyclerViewLayout.LINEAR);
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
+            container.post(() -> {
+                container.addView(carUiRecyclerView.getView());
+                carUiRecyclerView.setAdapter(adapter);
+            });
+
+            assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiLinearLayoutStyle);
+        });
 
         // Check that item views are laid out linearly.
         onView(withText(adapter.getItemText(0))).check(
@@ -374,151 +404,192 @@
 
     @Test
     public void testStartAtFirstPosition() {
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(100);
-        container.post(() -> {
+        int listId = View.generateViewId();
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
         });
 
         // Check that the first item is completely displayed.
         onView(withText(adapter.getItemText(0))).check(matches(isCompletelyDisplayed()));
-        assertEquals(0, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertEquals(0, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+        });
     }
 
     @Test
     public void testPositionAfterPadding() {
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(100);
         int testPosition = 40;
-        container.post(() -> {
-            container.addView(carUiRecyclerView.getView());
+        int listId = View.generateViewId();
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
+            ViewGroup container = activity.findViewById(R.id.test_container);
+            container.addView(carUiRecyclerView.getView());
             carUiRecyclerView.scrollToPosition(testPosition);
         });
 
         // Check that the scrolled to item is completely displayed.
         onView(withText(adapter.getItemText(testPosition))).check(matches(isCompletelyDisplayed()));
-        assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
 
-        int padding = 150;
-        container.post(() -> carUiRecyclerView.setPadding(padding, padding, padding, padding));
+            int padding = 150;
+            carUiRecyclerView.setPadding(padding, padding, padding, padding);
+        });
 
         // Check that the scrolled to item is completely displayed.
         onView(withText(adapter.getItemText(testPosition))).check(matches(isCompletelyDisplayed()));
-        assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+        });
     }
 
     @Test
     public void testPositionAfterPaddingRelative() {
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(100);
         int testPosition = 40;
-        container.post(() -> {
-            container.addView(carUiRecyclerView.getView());
+        int listId = View.generateViewId();
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
+            ViewGroup container = activity.findViewById(R.id.test_container);
+            container.addView(carUiRecyclerView.getView());
             carUiRecyclerView.scrollToPosition(testPosition);
         });
 
         // Check that the scrolled to item is completely displayed.
         onView(withText(adapter.getItemText(testPosition))).check(matches(isCompletelyDisplayed()));
-        assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
 
-        int padding = 150;
-        container.post(
-                () -> carUiRecyclerView.setPaddingRelative(padding, padding, padding, padding));
+            int padding = 150;
+            carUiRecyclerView.setPaddingRelative(padding, padding, padding, padding);
+        });
 
         // Check that the scrolled to item is completely displayed.
         onView(withText(adapter.getItemText(testPosition))).check(matches(isCompletelyDisplayed()));
-        assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+        });
     }
 
     @Test
     public void testLayoutManagerSetInXml() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
         // Inflate activity where a LayoutManger is set for a CarUiRecyclerView through a
         // styleable attribute.
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(
-                        R.layout.car_ui_recycler_view_layout_manager_xml_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_layout_manager_xml_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
         TestAdapter adapter = new TestAdapter(3);
-        mActivity.runOnUiThread(() -> {
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
             setRotaryScrollEnabled(carUiRecyclerView.getView(), /* isVertical= */ true);
             carUiRecyclerView.setAdapter(adapter);
             carUiRecyclerView.setVisibility(View.VISIBLE);
+
+            assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiGridLayoutStyle);
         });
 
         // Check that items in are displayed.
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
         onView(withText(adapter.getItemText(1))).check(matches(isDisplayed()));
         onView(withText(adapter.getItemText(2))).check(matches(isDisplayed()));
-
-        assertTrue(carUiRecyclerView.getLayoutManager() instanceof GridLayoutManager);
     }
 
     @Test
     public void testSetLayoutManager_shouldUpdateItemDecorations() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
-                null, R.styleable.CarUiRecyclerView));
-
-        doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
-                any(),
-                eq(R.styleable.CarUiRecyclerView),
-                anyInt(),
-                anyInt());
-        when(typedArray.getBoolean(eq(R.styleable.CarUiRecyclerView_enableDivider), anyBoolean()))
-                .thenReturn(true);
-        when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_layoutStyle), anyInt()))
-                .thenReturn(CarUiRecyclerView.CarUiRecyclerViewLayout.GRID);
-        when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_numOfColumns), anyInt()))
-                .thenReturn(3);
-
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(4);
-        container.post(() -> {
+        int listId = View.generateViewId();
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+
+            TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+                    null, R.styleable.CarUiRecyclerView));
+
+            doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+                    any(),
+                    eq(R.styleable.CarUiRecyclerView),
+                    anyInt(),
+                    anyInt());
+            when(typedArray.getBoolean(eq(R.styleable.CarUiRecyclerView_enableDivider),
+                    anyBoolean()))
+                    .thenReturn(true);
+            when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_layoutStyle), anyInt()))
+                    .thenReturn(CarUiRecyclerView.CarUiRecyclerViewLayout.GRID);
+            when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_numOfColumns), anyInt()))
+                    .thenReturn(3);
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            carUiRecyclerView.setId(listId);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
             carUiRecyclerView.setAdapter(adapter);
         });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiGridLayoutStyle);
-        assertEquals(carUiRecyclerView.getItemDecorationCount(), 1);
-        assertTrue(carUiRecyclerView.getItemDecorationAt(0) instanceof GridDividerItemDecoration);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiGridLayoutStyle);
+            assertEquals(carUiRecyclerView.getItemDecorationCount(), 1);
+            assertTrue(
+                    carUiRecyclerView.getItemDecorationAt(0) instanceof GridDividerItemDecoration);
 
-        mActivity.runOnUiThread(() ->
-                carUiRecyclerView.setLayoutStyle(new CarUiLinearLayoutStyle()));
+            carUiRecyclerView.setLayoutStyle(new CarUiLinearLayoutStyle());
+        });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiLinearLayoutStyle);
-        assertEquals(carUiRecyclerView.getItemDecorationCount(), 1);
-        assertFalse(carUiRecyclerView.getItemDecorationAt(0)
-                instanceof GridDividerItemDecoration);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiLinearLayoutStyle);
+            assertEquals(carUiRecyclerView.getItemDecorationCount(), 1);
+            assertFalse(carUiRecyclerView.getItemDecorationAt(0)
+                    instanceof GridDividerItemDecoration);
+        });
     }
 
     @Test
     public void testVisibility_goneAtInflationWithChangeToVisible() {
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(
-                        R.layout.car_ui_recycler_view_gone_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_gone_test_activity));
 
         onView(withId(R.id.list)).check(matches(not(isDisplayed())));
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
         TestAdapter adapter = new TestAdapter(3);
-        mActivity.runOnUiThread(() -> {
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
             carUiRecyclerView.setAdapter(adapter);
             carUiRecyclerView.setVisibility(View.VISIBLE);
         });
@@ -531,15 +602,15 @@
 
     @Test
     public void testVisibility_invisibleAtInflationWithChangeToVisible() {
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(
-                        R.layout.car_ui_recycler_view_invisible_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_invisible_test_activity));
 
         onView(withId(R.id.list)).check(matches(not(isDisplayed())));
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
         TestAdapter adapter = new TestAdapter(3);
-        mActivity.runOnUiThread(() -> {
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
             carUiRecyclerView.setAdapter(adapter);
             carUiRecyclerView.setVisibility(View.VISIBLE);
         });
@@ -552,68 +623,93 @@
 
     @Test
     public void testFirstItemAtTop_onInitialLoad() {
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
         TestAdapter adapter = new TestAdapter(25);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            activity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+        });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        assertEquals(carUiRecyclerView.findFirstVisibleItemPosition(), 0);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            assertEquals(carUiRecyclerView.findFirstVisibleItemPosition(), 0);
+        });
     }
 
     @Test
     public void testPageUpAndDownMoveSameDistance() {
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            // Can't use OrientationHelper here, because it returns 0 when calling getTotalSpace
+            // methods
+            // until LayoutManager's onLayoutComplete is called. In this case waiting until the
+            // first
+            // item of the list is displayed guarantees that OrientationHelper is initialized
+            // properly.
+            int totalSpace = carUiRecyclerView.getHeight()
+                    - carUiRecyclerView.getPaddingTop()
+                    - carUiRecyclerView.getPaddingBottom();
+            PerfectFitTestAdapter adapter = new PerfectFitTestAdapter(5, totalSpace);
+            carUiRecyclerView.setAdapter(adapter);
 
-        // Can't use OrientationHelper here, because it returns 0 when calling getTotalSpace methods
-        // until LayoutManager's onLayoutComplete is called. In this case waiting until the first
-        // item of the list is displayed guarantees that OrientationHelper is initialized properly.
-        int totalSpace = carUiRecyclerView.getHeight()
-                - carUiRecyclerView.getPaddingTop()
-                - carUiRecyclerView.getPaddingBottom();
-        PerfectFitTestAdapter adapter = new PerfectFitTestAdapter(5, totalSpace);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        });
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
-        onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
+        onView(withText(PerfectFitTestAdapter.getItemText(0))).check(matches(isDisplayed()));
 
-        assertEquals(totalSpace, carUiRecyclerView.getTotalSpace());
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            // Recalculate total space
+            int totalSpace = carUiRecyclerView.getHeight()
+                    - carUiRecyclerView.getPaddingTop()
+                    - carUiRecyclerView.getPaddingBottom();
+            assertEquals(totalSpace, carUiRecyclerView.getTotalSpace());
+        });
 
         // Move down one page so there will be sufficient pages for up and downs.
         onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
 
-        int topPosition = carUiRecyclerView.findFirstVisibleItemPosition();
 
         for (int i = 0; i < 3; i++) {
             onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
             onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
         }
 
-        assertEquals(carUiRecyclerView.findFirstVisibleItemPosition(), topPosition);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            int topPosition = carUiRecyclerView.findFirstVisibleItemPosition();
+            assertEquals(carUiRecyclerView.findFirstVisibleItemPosition(), topPosition);
+        });
     }
 
     @Test
     public void testContinuousScroll() {
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
         TestAdapter adapter = new TestAdapter(50);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            carUiRecyclerView.setAdapter(adapter);
+
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        });
+
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
         // Press and hold the down button for 2 seconds to scroll the list to bottom.
@@ -621,49 +717,69 @@
         onView(isRoot()).perform(waitForView(withText("Sample item #49"), 3000));
         onView(withId(getId("car_ui_scrollbar_page_down"))).perform(release());
 
-        assertEquals(carUiRecyclerView.findLastCompletelyVisibleItemPosition(), 49);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            assertEquals(carUiRecyclerView.findLastCompletelyVisibleItemPosition(), 49);
+        });
     }
 
     @Test
     public void testAlphaJumpToMiddleForThumbWhenTrackClicked() {
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
         TestAdapter adapter = new TestAdapter(50);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            carUiRecyclerView.setAdapter(adapter);
+
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        });
+
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        View trackView = mActivity.requireViewById(getId("car_ui_scrollbar_track"));
+        AtomicInteger trackViewHeight = new AtomicInteger();
+        mActivityRule.getScenario().onActivity(activity -> {
+            View trackView = activity.requireViewById(getId("car_ui_scrollbar_track"));
+            trackViewHeight.set(trackView.getHeight());
+        });
+
         // scroll to the middle
         onView(withId(getId("car_ui_scrollbar_track"))).perform(
-                touchDownAndUp(0f, (trackView.getHeight() / 2f)));
+                touchDownAndUp(0f, (trackViewHeight.get() / 2f)));
         onView(withText(adapter.getItemText(25))).check(matches(isDisplayed()));
     }
 
     @Test
     public void testAlphaJumpToEndAndStartForThumbWhenTrackClicked() {
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
         TestAdapter adapter = new TestAdapter(50);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            carUiRecyclerView.setAdapter(adapter);
+
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        });
+
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        View trackView = mActivity.requireViewById(getId("car_ui_scrollbar_track"));
-        View thumbView = mActivity.requireViewById(getId("car_ui_scrollbar_thumb"));
+        AtomicInteger trackViewHeight = new AtomicInteger();
+        mActivityRule.getScenario().onActivity(activity -> {
+            View trackView = activity.requireViewById(getId("car_ui_scrollbar_track"));
+            trackViewHeight.set(trackView.getHeight());
+        });
+
         // scroll to the end
         onView(withId(getId("car_ui_scrollbar_track"))).perform(
-                touchDownAndUp(0f, trackView.getHeight() - 1));
+                touchDownAndUp(0f, trackViewHeight.get() - 1));
         onView(withText(adapter.getItemText(49))).check(matches(isDisplayed()));
 
         // scroll to the start
@@ -674,45 +790,56 @@
 
     @Test
     public void testThumbDragToCenter() {
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
         TestAdapter adapter = new TestAdapter(50);
-        mActivity.runOnUiThread(() -> {
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
             carUiRecyclerView.setAdapter(adapter);
+
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         });
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        View trackView = mActivity.requireViewById(getId("car_ui_scrollbar_track"));
-        View thumbView = mActivity.requireViewById(getId("car_ui_scrollbar_thumb"));
+        AtomicInteger trackViewHeight = new AtomicInteger();
+        AtomicInteger thumbViewHeight = new AtomicInteger();
+        mActivityRule.getScenario().onActivity(activity -> {
+            View trackView = activity.requireViewById(getId("car_ui_scrollbar_track"));
+            View thumbView = activity.requireViewById(getId("car_ui_scrollbar_thumb"));
+
+            trackViewHeight.set(trackView.getHeight());
+            thumbViewHeight.set(thumbView.getHeight());
+        });
+
         // if you drag too far in a single step you'll stop selecting the thumb view. Hence, drag
         // 5 units at a time for 200 intervals and stop at the center of the track by limitY.
-
         onView(withId(getId("car_ui_scrollbar_track"))).perform(
-                performDrag(0f, (thumbView.getHeight() / 2f), 0,
+                performDrag(0f, (thumbViewHeight.get() / 2f), 0,
                         5, 200, Float.MAX_VALUE,
-                        trackView.getHeight() / 2f));
+                        trackViewHeight.get() / 2f));
         onView(withText(adapter.getItemText(25))).check(matches(isDisplayed()));
     }
 
     @Test
     public void testPageUpButtonDisabledAtTop() {
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
-        //  50, because needs to be big enough to make sure content is scrollable.
         TestAdapter adapter = new TestAdapter(50);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            carUiRecyclerView.setAdapter(adapter);
+
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        });
 
         // Initially page_up button is disabled.
         onView(withId(getId("car_ui_scrollbar_page_up"))).check(matches(not(isEnabled())));
@@ -731,15 +858,17 @@
     public void testPageUpScrollsWithoutSnap() {
         CarUiRecyclerView.OnScrollListener scrollListener =
                 mock(CarUiRecyclerView.OnScrollListener.class);
+        int listId = View.generateViewId();
 
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
-        container.post(() -> {
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(new TestAdapter(100));
-        });
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        });
 
         // Scroll down a few pages so that you can perform page up operations.
         onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
@@ -747,22 +876,35 @@
         onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
         onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
 
-        // Set a mocked scroll listener on the CarUiRecyclerView
-        carUiRecyclerView.addOnScrollListener(scrollListener);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            // Set a mocked scroll listener on the CarUiRecyclerView
+            carUiRecyclerView.addOnScrollListener(scrollListener);
+        });
 
         onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
 
+        ArgumentCaptor<CarUiRecyclerView> captor = ArgumentCaptor.forClass(CarUiRecyclerView.class);
+
         // Verify that scroll operation only settles on the destination once. This means a single
         // smooth scroll to the destination. If the scroll includes a secondary snap after an
         // initial scroll, this callback will have more than one invocation.
-        verify(scrollListener, times(1)).onScrollStateChanged(
-                carUiRecyclerView, SCROLL_STATE_SETTLING);
+        verify(scrollListener, times(1)).onScrollStateChanged(captor.capture(),
+                eq(SCROLL_STATE_SETTLING));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertEquals(carUiRecyclerView, captor.getValue());
+        });
 
         onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
 
         // Make same verification as above for a second page up operation.
         verify(scrollListener, times(2)).onScrollStateChanged(
-                carUiRecyclerView, SCROLL_STATE_SETTLING);
+                captor.capture(), eq(SCROLL_STATE_SETTLING));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertEquals(carUiRecyclerView, captor.getValue());
+        });
     }
 
     @Test
@@ -770,39 +912,45 @@
         CarUiRecyclerView.OnScrollListener scrollListener =
                 mock(CarUiRecyclerView.OnScrollListener.class);
 
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
-        container.post(() -> {
+        int listId = View.generateViewId();
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(new TestAdapter(100));
+
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+
+            // Set a mocked scroll listener on the CarUiRecyclerView
+            carUiRecyclerView.addOnScrollListener(scrollListener);
         });
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
-
-        // Set a mocked scroll listener on the CarUiRecyclerView
-        carUiRecyclerView.addOnScrollListener(scrollListener);
-
         onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
 
         // Verify that scroll operation only settles on the destination once. This means a single
         // smooth scroll to the destination. If the scroll includes a secondary snap after an
         // initial scroll, this callback will have more than one invocation.
+        ArgumentCaptor<CarUiRecyclerView> captor = ArgumentCaptor.forClass(CarUiRecyclerView.class);
         verify(scrollListener, times(1)).onScrollStateChanged(
-                carUiRecyclerView, SCROLL_STATE_SETTLING);
+                captor.capture(), eq(SCROLL_STATE_SETTLING));
 
         onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
 
         // Make same verification as above for a second page down operation.
         verify(scrollListener, times(2)).onScrollStateChanged(
-                carUiRecyclerView, SCROLL_STATE_SETTLING);
+                captor.capture(), eq(SCROLL_STATE_SETTLING));
     }
 
     @Test
     public void testPageDownScrollsOverLongItem() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
@@ -814,63 +962,83 @@
         heightOverrides.put(longItemPosition, TestAdapter.ItemHeight.TALL);
         TestAdapter adapter = new TestAdapter(itemCount, heightOverrides);
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            carUiRecyclerView.setAdapter(adapter);
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        });
+
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        OrientationHelper orientationHelper =
-                OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
-        int screenHeight = carUiRecyclerView.getTotalSpace();
-
         // Scroll to a position where long item is partially visible.
         // Scrolling from top, scrollToPosition() aligns the pos-1 item to bottom.
         onView(withId(R.id.list)).perform(scrollToPosition(longItemPosition - 1));
         // This is needed to make sure scroll is finished before looking for the long item.
         onView(withText(adapter.getItemText(longItemPosition - 1))).check(matches(isDisplayed()));
 
-        // Scroll by half the height of the screen so the long item is partially visible.
-        mActivity.runOnUiThread(() -> carUiRecyclerView.scrollBy(0, screenHeight / 2));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            int screenHeight = carUiRecyclerView.getTotalSpace();
+
+            // Scroll by half the height of the screen so the long item is partially visible.
+            carUiRecyclerView.scrollBy(0, screenHeight / 2);
+        });
+
         onView(withText(adapter.getItemText(longItemPosition))).check(matches(isDisplayed()));
 
-        // Verify long item is partially shown.
-        View longItem = getLongItem(carUiRecyclerView);
-        assertThat(
-                orientationHelper.getDecoratedStart(longItem),
-                is(greaterThan(orientationHelper.getStartAfterPadding())));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            OrientationHelper orientationHelper =
+                    OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+            // Verify long item is partially shown.
+            View longItem = getLongItem(carUiRecyclerView);
+            assertThat(
+                    orientationHelper.getDecoratedStart(longItem),
+                    is(greaterThan(carUiRecyclerView.getStartAfterPadding())));
+        });
 
         onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
 
-        // Verify long item is snapped to top.
-        assertThat(orientationHelper.getDecoratedStart(longItem),
-                is(equalTo(orientationHelper.getStartAfterPadding())));
-        assertThat(orientationHelper.getDecoratedEnd(longItem),
-                is(greaterThan(orientationHelper.getEndAfterPadding())));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            OrientationHelper orientationHelper =
+                    OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+            // Verify long item is snapped to top.
+            View longItem = getLongItem(carUiRecyclerView);
+            assertThat(orientationHelper.getDecoratedStart(longItem),
+                    is(equalTo(carUiRecyclerView.getStartAfterPadding())));
+            assertThat(orientationHelper.getDecoratedEnd(longItem),
+                    is(greaterThan(carUiRecyclerView.getEndAfterPadding())));
+        });
 
-        // Set a limit to avoid test stuck in non-moving state.
-        while (orientationHelper.getDecoratedEnd(longItem)
-                > orientationHelper.getEndAfterPadding()) {
-            onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
-        }
+        onView(withText(adapter.getItemText(longItemPosition))).check(matches(isDisplayed()));
+        onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
 
-        // Verify long item end is aligned to bottom.
-        assertThat(orientationHelper.getDecoratedEnd(longItem),
-                is(equalTo(orientationHelper.getEndAfterPadding())));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            OrientationHelper orientationHelper =
+                    OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+            View longItem = getLongItem(carUiRecyclerView);
+            // Verify long item end is aligned to bottom.
+            assertThat(orientationHelper.getDecoratedEnd(longItem),
+                    is(equalTo(carUiRecyclerView.getEndAfterPadding())));
+        });
 
         onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
         // Verify that the long item is no longer visible; Should be on the next child
-        assertThat(
-                orientationHelper.getDecoratedStart(longItem),
-                is(lessThan(orientationHelper.getStartAfterPadding())));
+        onView(hasDescendant(withText(adapter.getItemText(longItemPosition)))).check(
+                doesNotExistOrIsNotDisplayed());
     }
 
     @Test
     public void testPageDownScrollsOverLongItemAtTheEnd() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
@@ -882,22 +1050,20 @@
         heightOverrides.put(longItemPosition, TestAdapter.ItemHeight.TALL);
         TestAdapter adapter = new TestAdapter(itemCount, heightOverrides);
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
-        mActivity.runOnUiThread(() -> {
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
             // Setting top padding to any number greater than 0.
             // Not having padding will make this test pass all the time.
             // Also adding bottom padding to make sure the padding
             // after the last content is considered in calculations.
             carUiRecyclerView.setPadding(0, 1, 0, 1);
             carUiRecyclerView.setAdapter(adapter);
+
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         });
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        OrientationHelper orientationHelper =
-                OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
-
         // 20 is just an arbitrary number to make sure we reach the end of the recyclerview.
         for (int i = 0; i < 20; i++) {
             onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
@@ -905,19 +1071,26 @@
 
         onView(withId(getId("car_ui_scrollbar_page_down"))).check(matches(not(isEnabled())));
 
-        View longItem = getLongItem(carUiRecyclerView);
-        // Making sure we've reached end of the recyclerview, after
-        // adding bottom padding
-        assertThat(orientationHelper.getDecoratedEnd(longItem),
-                is(equalTo(orientationHelper.getEndAfterPadding())));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            OrientationHelper orientationHelper =
+                    OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+            View longItem = getLongItem(carUiRecyclerView);
+            // Making sure we've reached end of the recyclerview, after
+            // adding bottom padding
+            assertThat(orientationHelper.getDecoratedEnd(longItem),
+                    is(equalTo(carUiRecyclerView.getEndAfterPadding())));
+        });
     }
 
     @Test
     public void testPageUpScrollsOverLongItem() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
@@ -929,48 +1102,74 @@
         heightOverrides.put(longItemPosition, TestAdapter.ItemHeight.TALL);
         TestAdapter adapter = new TestAdapter(itemCount, heightOverrides);
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            carUiRecyclerView.setAdapter(adapter);
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        });
+
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        OrientationHelper orientationHelper =
-                OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
-
         // Scroll to a position just below the long item.
         onView(withId(R.id.list)).perform(scrollToPosition(longItemPosition + 1));
         onView(withText(adapter.getItemText(longItemPosition + 1))).check(matches(isDisplayed()));
 
-        // Verify long item is off-screen.
-        View longItem = getLongItem(carUiRecyclerView);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            OrientationHelper orientationHelper =
+                    OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+            // Verify long item is off-screen.
+            View longItem = getLongItem(carUiRecyclerView);
+            assertThat(
+                    orientationHelper.getDecoratedEnd(longItem),
+                    is(lessThanOrEqualTo(carUiRecyclerView.getEndAfterPadding())));
+        });
 
-        assertThat(
-                orientationHelper.getDecoratedEnd(longItem),
-                is(lessThanOrEqualTo(orientationHelper.getEndAfterPadding())));
+        final AtomicBoolean check = new AtomicBoolean();
+        final AtomicInteger topBeforeClick = new AtomicInteger();
 
-        if (orientationHelper.getStartAfterPadding() - orientationHelper.getDecoratedStart(longItem)
-                < orientationHelper.getTotalSpace()) {
-            onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
-            assertThat(orientationHelper.getDecoratedStart(longItem),
-                    is(greaterThanOrEqualTo(orientationHelper.getStartAfterPadding())));
-        } else {
-            int topBeforeClick = orientationHelper.getDecoratedStart(longItem);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            OrientationHelper orientationHelper =
+                    OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+            View longItem = getLongItem(carUiRecyclerView);
+            if (carUiRecyclerView.getStartAfterPadding() - orientationHelper.getDecoratedStart(
+                    longItem)
+                    < carUiRecyclerView.getTotalSpace()) {
+                check.set(true);
+            } else {
+                topBeforeClick.set(orientationHelper.getDecoratedStart(longItem));
+            }
+        });
 
-            onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
+        onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
 
-            // Verify we scrolled 1 screen
-            assertThat(orientationHelper.getStartAfterPadding() - topBeforeClick,
-                    is(equalTo(orientationHelper.getTotalSpace())));
-        }
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            View longItem = getLongItem(carUiRecyclerView);
+            if (check.get()) {
+                OrientationHelper orientationHelper =
+                        OrientationHelper.createVerticalHelper(
+                                carUiRecyclerView.getLayoutManager());
+                assertThat(orientationHelper.getDecoratedStart(longItem),
+                        is(greaterThanOrEqualTo(carUiRecyclerView.getStartAfterPadding())));
+            } else {
+                // Verify we scrolled 1 screen
+                assertThat(carUiRecyclerView.getStartAfterPadding() - topBeforeClick.get(),
+                        is(equalTo(carUiRecyclerView.getTotalSpace())));
+            }
+        });
     }
 
     @Test
     public void testPageDownScrollsOverVeryLongItem() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
@@ -982,15 +1181,15 @@
         heightOverrides.put(longItemPosition, TestAdapter.ItemHeight.EXTRA_TALL);
         TestAdapter adapter = new TestAdapter(itemCount, heightOverrides);
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            carUiRecyclerView.setAdapter(adapter);
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        });
+
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        OrientationHelper orientationHelper =
-                OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
-
         int screenHeight = Resources.getSystem().getDisplayMetrics().heightPixels;
         // Scroll to a position where long item is partially visible.
         // Scrolling from top, scrollToPosition() aligns the pos-1 item to bottom.
@@ -999,38 +1198,60 @@
         onView(withText(adapter.getItemText(longItemPosition - 1)))
                 .check(matches(isDisplayed()));
 
-        // Scroll by half the height of the screen so the long item is partially visible.
-        mActivity.runOnUiThread(() -> carUiRecyclerView.scrollBy(0, screenHeight / 2));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            // Scroll by half the height of the screen so the long item is partially visible.
+            carUiRecyclerView.scrollBy(0, screenHeight / 2);
+        });
 
         onView(withText(adapter.getItemText(longItemPosition))).check(matches(isDisplayed()));
 
-        // Verify long item is partially shown.
-        View longItem = getLongItem(carUiRecyclerView);
-        assertThat(
-                orientationHelper.getDecoratedStart(longItem),
-                is(greaterThan(orientationHelper.getStartAfterPadding())));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            OrientationHelper orientationHelper =
+                    OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+            // Verify long item is partially shown.
+            View longItem = getLongItem(carUiRecyclerView);
+            assertThat(
+                    orientationHelper.getDecoratedStart(longItem),
+                    is(greaterThan(carUiRecyclerView.getStartAfterPadding())));
+        });
 
         onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
 
-        // Verify long item is snapped to top.
-        assertThat(orientationHelper.getDecoratedStart(longItem),
-                is(equalTo(orientationHelper.getStartAfterPadding())));
-        assertThat(orientationHelper.getDecoratedEnd(longItem),
-                is(greaterThan(orientationHelper.getEndAfterPadding())));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            View longItem = getLongItem(carUiRecyclerView);
+            OrientationHelper orientationHelper =
+                    OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+            // Verify long item is snapped to top.
+            assertThat(orientationHelper.getDecoratedStart(longItem),
+                    is(equalTo(carUiRecyclerView.getStartAfterPadding())));
+            assertThat(orientationHelper.getDecoratedEnd(longItem),
+                    is(greaterThan(carUiRecyclerView.getEndAfterPadding())));
+        });
 
         onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
 
-        // Verify long item does not snap to bottom.
-        assertThat(orientationHelper.getDecoratedEnd(longItem),
-                not(equalTo(orientationHelper.getEndAfterPadding())));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            OrientationHelper orientationHelper =
+                    OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+            View longItem = getLongItem(carUiRecyclerView);
+            // Verify long item does not snap to bottom.
+            assertThat(orientationHelper.getDecoratedEnd(longItem),
+                    not(equalTo(carUiRecyclerView.getEndAfterPadding())));
+        });
     }
 
     @Test
     public void testPageDownScrollsOverVeryLongItemAtTheEnd() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
@@ -1042,22 +1263,20 @@
         heightOverrides.put(longItemPosition, TestAdapter.ItemHeight.EXTRA_TALL);
         TestAdapter adapter = new TestAdapter(itemCount, heightOverrides);
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
-        mActivity.runOnUiThread(() -> {
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
             // Setting top padding to any number greater than 0.
             // Not having padding will make this test pass all the time.
             // Also adding bottom padding to make sure the padding
             // after the last content is considered in calculations.
             carUiRecyclerView.setPadding(0, 1, 0, 1);
             carUiRecyclerView.setAdapter(adapter);
+
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         });
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        OrientationHelper orientationHelper =
-                OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
-
         // 20 is just an arbitrary number to make sure we reach the end of the recyclerview.
         for (int i = 0; i < 20; i++) {
             onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
@@ -1065,283 +1284,362 @@
 
         onView(withId(getId("car_ui_scrollbar_page_down"))).check(matches(not(isEnabled())));
 
-        View longItem = getLongItem(carUiRecyclerView);
-        // Making sure we've reached end of the recyclerview, after
-        // adding bottom padding
-        assertThat(orientationHelper.getDecoratedEnd(longItem),
-                is(equalTo(orientationHelper.getEndAfterPadding())));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            OrientationHelper orientationHelper =
+                    OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+            View longItem = getLongItem(carUiRecyclerView);
+            // Making sure we've reached end of the recyclerview, after
+            // adding bottom padding
+            assertThat(orientationHelper.getDecoratedEnd(longItem),
+                    is(equalTo(carUiRecyclerView.getEndAfterPadding())));
+        });
     }
 
     @Test
     public void testPageDownMaintainsMinimumScrollThumbTrackHeight() {
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
         int itemCount = 2500;
         TestAdapter adapter = new TestAdapter(itemCount);
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
-        mActivity.runOnUiThread(() -> carUiRecyclerView.requestLayout());
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            carUiRecyclerView.setAdapter(adapter);
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+            carUiRecyclerView.requestLayout();
+        });
 
         onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
 
-        // Check that thumb track maintains minimum height
-        int minThumbViewHeight = (int) mActivity.getResources()
-                .getDimension(R.dimen.car_ui_scrollbar_min_thumb_height);
-        View thumbView = mActivity.requireViewById(getId("car_ui_scrollbar_thumb"));
-        // Conversion from DP to pixel sometimes makes these two value differ by 1
-        assertThat(abs(thumbView.getHeight() - minThumbViewHeight), is(lessThanOrEqualTo(1)));
+        mActivityRule.getScenario().onActivity(activity -> {
+            // Check that thumb track maintains minimum height
+            int minThumbViewHeight = (int) activity.getResources()
+                    .getDimension(R.dimen.car_ui_scrollbar_min_thumb_height);
+            View thumbView = activity.requireViewById(getId("car_ui_scrollbar_thumb"));
+            // Conversion from DP to pixel sometimes makes these two value differ by 1
+            assertThat(abs(thumbView.getHeight() - minThumbViewHeight), is(lessThanOrEqualTo(1)));
+        });
     }
 
     @Test
     public void testRecyclerView_canScrollVertically() {
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            // Can't use OrientationHelper here, because it returns 0 when calling getTotalSpace
+            // methods until LayoutManager's onLayoutComplete is called. In this case waiting until
+            // the first item of the list is displayed guarantees that OrientationHelper is
+            // initialized properly.
+            int totalSpace = carUiRecyclerView.getHeight()
+                    - carUiRecyclerView.getPaddingTop()
+                    - carUiRecyclerView.getPaddingBottom();
+            PerfectFitTestAdapter adapter = new PerfectFitTestAdapter(1, totalSpace);
+            carUiRecyclerView.setAdapter(adapter);
 
-        // Can't use OrientationHelper here, because it returns 0 when calling getTotalSpace methods
-        // until LayoutManager's onLayoutComplete is called. In this case waiting until the first
-        // item of the list is displayed guarantees that OrientationHelper is initialized properly.
-        int totalSpace = carUiRecyclerView.getHeight()
-                - carUiRecyclerView.getPaddingTop()
-                - carUiRecyclerView.getPaddingBottom();
-        PerfectFitTestAdapter adapter = new PerfectFitTestAdapter(1, totalSpace);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        });
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
-        onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
+        onView(withText(PerfectFitTestAdapter.getItemText(0))).check(matches(isDisplayed()));
 
-        assertEquals(totalSpace, carUiRecyclerView.getTotalSpace());
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+            int totalSpace = carUiRecyclerView.getHeight()
+                    - carUiRecyclerView.getPaddingTop()
+                    - carUiRecyclerView.getPaddingBottom();
 
-        // Both scroll up and down are disabled
-        assertFalse(carUiRecyclerView.getView().canScrollVertically(1));
-        assertFalse(carUiRecyclerView.getView().canScrollVertically(-1));
+            assertEquals(totalSpace, carUiRecyclerView.getTotalSpace());
+
+            // Both scroll up and down are disabled
+            assertFalse(carUiRecyclerView.getView().canScrollVertically(1));
+            assertFalse(carUiRecyclerView.getView().canScrollVertically(-1));
+        });
     }
 
     @Test
     public void testSetPaddingToRecyclerViewContainerWithScrollbar() {
-        if (isScrollbarEnabledNotAsExpected(true)) return;
-
         TestAdapter adapter = new TestAdapter(50);
+        int listId = View.generateViewId();
 
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
-        mActivity.runOnUiThread(() -> {
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
         });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
         onView(withId(getId("car_ui_scroll_bar"))).check(matches(isDisplayed()));
 
-        assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
-        assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(0)));
-        assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(0)));
-        // available space in recyclerview after applying paddings.
-        int screenHeight = carUiRecyclerView.getTotalSpace();
-        assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
+            assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(0)));
+            assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(0)));
+            // available space in recyclerview after applying paddings.
+            int screenHeight = carUiRecyclerView.getTotalSpace();
+            assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
 
-        View scrollbar = mActivity.findViewById(getId("car_ui_scroll_bar"));
-        assertThat(scrollbar.getPaddingTop(), is(equalTo(0)));
-        assertThat(scrollbar.getPaddingLeft(), is(equalTo(0)));
-        assertThat(scrollbar.getPaddingRight(), is(equalTo(0)));
-        assertThat(scrollbar.getPaddingBottom(), is(equalTo(0)));
+            View scrollbar = activity.findViewById(getId("car_ui_scroll_bar"));
+            assertThat(scrollbar.getPaddingTop(), is(equalTo(0)));
+            assertThat(scrollbar.getPaddingLeft(), is(equalTo(0)));
+            assertThat(scrollbar.getPaddingRight(), is(equalTo(0)));
+            assertThat(scrollbar.getPaddingBottom(), is(equalTo(0)));
 
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setPadding(20, 150, 30, 170));
+            carUiRecyclerView.setPadding(20, 150, 30, 170);
+        });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(20)));
-        assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(30)));
-        assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
-        // available space in recyclerview after applying paddings.
-        screenHeight = carUiRecyclerView.getTotalSpace();
-        assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(20)));
+            assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(30)));
+            assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
 
-        assertThat(scrollbar.getPaddingTop(), is(equalTo(150)));
-        assertThat(scrollbar.getPaddingLeft(), is(equalTo(0)));
-        assertThat(scrollbar.getPaddingRight(), is(equalTo(0)));
-        assertThat(scrollbar.getPaddingBottom(), is(equalTo(170)));
+            // available space in recyclerview after applying paddings.
+            int screenHeight = carUiRecyclerView.getTotalSpace();
+            assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
+
+            View scrollbar = activity.findViewById(getId("car_ui_scroll_bar"));
+            assertThat(scrollbar.getPaddingTop(), is(equalTo(150)));
+            assertThat(scrollbar.getPaddingLeft(), is(equalTo(0)));
+            assertThat(scrollbar.getPaddingRight(), is(equalTo(0)));
+            assertThat(scrollbar.getPaddingBottom(), is(equalTo(170)));
+        });
     }
 
     @Test
     public void testSetPaddingToRecyclerViewContainerWithoutScrollbar() {
-        if (isScrollbarEnabledNotAsExpected(false)) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
         TestAdapter adapter = new TestAdapter(5);
+        int listId = View.generateViewId();
 
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
-        mActivity.runOnUiThread(() -> {
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            // Disable scrollbar
+            doReturn(false).when(testableResources)
+                    .getBoolean(R.bool.car_ui_scrollbar_enable);
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
         });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
         onView(withId(getId("car_ui_scroll_bar"))).check(doesNotExist());
 
-        assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
-        assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(0)));
-        assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(0)));
-        // available space in recyclerview after applying paddings.
-        int screenHeight = carUiRecyclerView.getTotalSpace();
-        assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
+            assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(0)));
+            assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(0)));
+            // available space in recyclerview after applying paddings.
+            int screenHeight = carUiRecyclerView.getTotalSpace();
+            assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
 
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setPadding(20, 150, 30, 170));
+            carUiRecyclerView.setPadding(20, 150, 30, 170);
+        });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(20)));
-        assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(30)));
-        assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
-        // available space in recyclerview after applying paddings.
-        screenHeight = carUiRecyclerView.getTotalSpace();
-        assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(20)));
+            assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(30)));
+            assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
+            // available space in recyclerview after applying paddings.
+            int screenHeight = carUiRecyclerView.getTotalSpace();
+            assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
+        });
     }
 
     @Test
     public void testSetPaddingRelativeToRecyclerViewContainerWithScrollbar() {
-        if (isScrollbarEnabledNotAsExpected(true)) return;
-
         TestAdapter adapter = new TestAdapter(50);
+        int listId = View.generateViewId();
 
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
-        mActivity.runOnUiThread(() -> {
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
         });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
         onView(withId(getId("car_ui_scroll_bar"))).check(matches(isDisplayed()));
 
-        assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
-        assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(0)));
-        assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(0)));
-        // available space in recyclerview after applying paddings.
-        int screenHeight = carUiRecyclerView.getTotalSpace();
-        assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
+            assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(0)));
+            assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(0)));
+            // available space in recyclerview after applying paddings.
+            int screenHeight = carUiRecyclerView.getTotalSpace();
+            assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
 
-        View scrollbar = mActivity.findViewById(getId("car_ui_scroll_bar"));
-        assertThat(scrollbar.getPaddingTop(), is(equalTo(0)));
-        assertThat(scrollbar.getPaddingStart(), is(equalTo(0)));
-        assertThat(scrollbar.getPaddingEnd(), is(equalTo(0)));
-        assertThat(scrollbar.getPaddingBottom(), is(equalTo(0)));
+            View scrollbar = activity.findViewById(getId("car_ui_scroll_bar"));
+            assertThat(scrollbar.getPaddingTop(), is(equalTo(0)));
+            assertThat(scrollbar.getPaddingStart(), is(equalTo(0)));
+            assertThat(scrollbar.getPaddingEnd(), is(equalTo(0)));
+            assertThat(scrollbar.getPaddingBottom(), is(equalTo(0)));
 
-        mActivity.runOnUiThread(() -> {
             carUiRecyclerView.setPaddingRelative(20, 150, 30, 170);
         });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(20)));
-        assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(30)));
-        assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
-        // available space in recyclerview after applying paddings.
-        screenHeight = carUiRecyclerView.getTotalSpace();
-        assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(20)));
+            assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(30)));
+            assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
+            // available space in recyclerview after applying paddings.
+            int screenHeight = carUiRecyclerView.getTotalSpace();
+            assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
 
-        assertThat(scrollbar.getPaddingTop(), is(equalTo(150)));
-        assertThat(scrollbar.getPaddingStart(), is(equalTo(0)));
-        assertThat(scrollbar.getPaddingEnd(), is(equalTo(0)));
-        assertThat(scrollbar.getPaddingBottom(), is(equalTo(170)));
+            View scrollbar = activity.findViewById(getId("car_ui_scroll_bar"));
+            assertThat(scrollbar.getPaddingTop(), is(equalTo(150)));
+            assertThat(scrollbar.getPaddingStart(), is(equalTo(0)));
+            assertThat(scrollbar.getPaddingEnd(), is(equalTo(0)));
+            assertThat(scrollbar.getPaddingBottom(), is(equalTo(170)));
+        });
     }
 
     @Test
     public void testSetPaddingRelativeToRecyclerViewContainerWithoutScrollbar() {
-        if (isScrollbarEnabledNotAsExpected(false)) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
         TestAdapter adapter = new TestAdapter(5);
+        int listId = View.generateViewId();
 
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
-        mActivity.runOnUiThread(() -> {
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            // Disable scrollbar
+            doReturn(false).when(testableResources)
+                    .getBoolean(R.bool.car_ui_scrollbar_enable);
+
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
         });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
         onView(withId(getId("car_ui_scroll_bar"))).check(doesNotExist());
 
-        assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
-        assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(0)));
-        assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(0)));
-        // available space in recyclerview after applying paddings.
-        int screenHeight = carUiRecyclerView.getTotalSpace();
-        assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
+            assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(0)));
+            assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(0)));
+            // available space in recyclerview after applying paddings.
+            int screenHeight = carUiRecyclerView.getTotalSpace();
+            assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
 
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setPaddingRelative(20, 150, 30, 170));
+            carUiRecyclerView.setPaddingRelative(20, 150, 30, 170);
+        });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(20)));
-        assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(30)));
-        assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
-        // available space in recyclerview after applying paddings.
-        screenHeight = carUiRecyclerView.getTotalSpace();
-        assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(20)));
+            assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(30)));
+            assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
+            // available space in recyclerview after applying paddings.
+            int screenHeight = carUiRecyclerView.getTotalSpace();
+            assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
+        });
     }
 
     @Test
     public void testSetAlphaToRecyclerView() {
-        if (isScrollbarEnabledNotAsExpected(false)) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-
-        assertThat(carUiRecyclerView.getView().getAlpha(), is(equalTo(1.0f)));
-
-        carUiRecyclerView.setAlpha(0.5f);
-
-        assertThat(carUiRecyclerView.getView().getAlpha(), is(equalTo(0.5f)));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+            assertThat(carUiRecyclerView.getView().getAlpha(), is(equalTo(1.0f)));
+            carUiRecyclerView.setAlpha(0.5f);
+            assertThat(carUiRecyclerView.getView().getAlpha(), is(equalTo(0.5f)));
+        });
     }
 
     @Test
     public void testScrollbarVisibility_tooSmallHeight() {
-
-        if (isScrollbarEnabledNotAsExpected(true)) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
         // Set to anything less than 2 * (minTouchSize + margin)
         // minTouchSize = R.dimen.car_ui_touch_target_size
         // margin is button up top margin or button down bottom margin
         int recyclerviewHeight = 1;
 
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
-        container.post(() -> {
+        int listId = View.generateViewId();
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(-1, recyclerviewHeight);
             container.addView(carUiRecyclerView.getView(), lp);
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(new TestAdapter(100));
         });
 
         onView(withId(getId("car_ui_scroll_bar"))).check(matches(not(isDisplayed())));
 
-        assertEquals(recyclerviewHeight, carUiRecyclerView.getTotalSpace());
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertEquals(recyclerviewHeight, carUiRecyclerView.getTotalSpace());
+        });
     }
 
     @Test
     public void testScrollbarVisibility_justEnoughToShowOnlyButtons() {
-        if (isScrollbarEnabledNotAsExpected(true)) return;
+        Context context = getInstrumentation().getTargetContext();
+        int listId = View.generateViewId();
 
         // R.dimen.car_ui_touch_target_size
-        float minTouchSize = mTestableResources.getDimension(R.dimen.car_ui_touch_target_size);
+        float minTouchSize = context.getResources().getDimension(R.dimen.car_ui_touch_target_size);
         // This value is hardcoded to 15dp in the layout.
-        int margin = (int) dpToPixel(mTestableContext, 15)
-                + (int) mTestableResources.getDimension(R.dimen.car_ui_scrollbar_separator_margin);
+        int margin = (int) dpToPixel(context, 15)
+                + (int) context.getResources().getDimension(
+                R.dimen.car_ui_scrollbar_separator_margin);
         // Set to 2 * (minTouchSize + margin)
         int recyclerviewHeight = 2 * (int) (minTouchSize + margin);
 
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
-        container.post(() -> {
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(-1, recyclerviewHeight);
             container.addView(carUiRecyclerView.getView(), lp);
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(new TestAdapter(100));
         });
 
@@ -1351,22 +1649,27 @@
         onView(withId(getId("car_ui_scrollbar_page_down"))).check(matches(isDisplayed()));
         onView(withId(getId("car_ui_scrollbar_page_up"))).check(matches(isDisplayed()));
 
-        int screenHeight = carUiRecyclerView.getTotalSpace();
-
-        assertEquals(recyclerviewHeight, screenHeight);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            int screenHeight = carUiRecyclerView.getTotalSpace();
+            assertEquals(recyclerviewHeight, screenHeight);
+        });
     }
 
     @Test
     public void testScrollbarVisibility_enoughToShowEverything() {
-        if (isScrollbarEnabledNotAsExpected(true)) return;
+        Context context = getInstrumentation().getTargetContext();
+        int listId = View.generateViewId();
 
-        int minTouchSize = (int) mTestableResources.getDimension(R.dimen.car_ui_touch_target_size);
-        int mScrollbarThumbMinHeight = (int) mTestableResources
+        int minTouchSize = (int) context.getResources().getDimension(
+                R.dimen.car_ui_touch_target_size);
+        int mScrollbarThumbMinHeight = (int) context.getResources()
                 .getDimension(R.dimen.car_ui_scrollbar_min_thumb_height);
         // This value is hardcoded to 15dp in the layout.
-        int margin = (int) dpToPixel(mTestableContext, 15)
-                + (int) mTestableResources.getDimension(R.dimen.car_ui_scrollbar_separator_margin);
-        int trackMargin = 2 * (int) mTestableResources
+        int margin = (int) dpToPixel(context, 15)
+                + (int) context.getResources().getDimension(
+                R.dimen.car_ui_scrollbar_separator_margin);
+        int trackMargin = 2 * (int) context.getResources()
                 .getDimension(R.dimen.car_ui_scrollbar_separator_margin);
         // Set to anything greater or equal to
         // 2 * minTouchSize + max(minTouchSize, mScrollbarThumbMinHeight) + 2 * margin
@@ -1375,11 +1678,12 @@
                         + max(minTouchSize, mScrollbarThumbMinHeight)
                         + 2 * margin + trackMargin;
 
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
-        container.post(() -> {
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(-1, recyclerviewHeight);
             container.addView(carUiRecyclerView.getView(), lp);
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(new TestAdapter(100));
         });
 
@@ -1389,18 +1693,32 @@
         onView(withId(getId("car_ui_scrollbar_page_down"))).check(matches(isDisplayed()));
         onView(withId(getId("car_ui_scrollbar_page_up"))).check(matches(isDisplayed()));
 
-        assertEquals(recyclerviewHeight, carUiRecyclerView.getTotalSpace());
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertEquals(recyclerviewHeight, carUiRecyclerView.getTotalSpace());
+        });
     }
 
     @Test
     public void testDefaultSize_noScrollbar() {
-        if (isScrollbarEnabledNotAsExpected(false)) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
-        int listId = View.generateViewId();
         TestAdapter adapter = new TestAdapter(50);
-        container.post(() -> {
+        int listId = View.generateViewId();
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            // Disable scrollbar
+            doReturn(false).when(testableResources)
+                    .getBoolean(R.bool.car_ui_scrollbar_enable);
+
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
             carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
@@ -1413,24 +1731,26 @@
 
     @Test
     public void testLargeSize_withScrollbar() {
-        if (isScrollbarEnabledNotAsExpected(true)) return;
-
-        TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
-                null, R.styleable.CarUiRecyclerView));
-
-        doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
-                any(),
-                eq(R.styleable.CarUiRecyclerView),
-                anyInt(),
-                anyInt());
-        when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
-                anyInt())).thenReturn(2); // Large size
-
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        int listId = View.generateViewId();
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(50);
-        container.post(() -> {
+        int listId = View.generateViewId();
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+                    null, R.styleable.CarUiRecyclerView));
+
+            doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+                    any(),
+                    eq(R.styleable.CarUiRecyclerView),
+                    anyInt(),
+                    anyInt());
+            when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
+                    anyInt())).thenReturn(2); // Large size
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
             carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
@@ -1445,24 +1765,27 @@
 
     @Test
     public void testMediumSize_withScrollbar() {
-        if (isScrollbarEnabledNotAsExpected(true)) return;
 
-        TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
-                null, R.styleable.CarUiRecyclerView));
-
-        doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
-                any(),
-                eq(R.styleable.CarUiRecyclerView),
-                anyInt(),
-                anyInt());
-        when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
-                anyInt())).thenReturn(1); // Medium size
-
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        int listId = View.generateViewId();
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(50);
-        container.post(() -> {
+        int listId = View.generateViewId();
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+                    null, R.styleable.CarUiRecyclerView));
+
+            doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+                    any(),
+                    eq(R.styleable.CarUiRecyclerView),
+                    anyInt(),
+                    anyInt());
+            when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
+                    anyInt())).thenReturn(1); // Medium size
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
             carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
@@ -1476,24 +1799,26 @@
 
     @Test
     public void testSmallSize_oneItem() {
-        if (isScrollbarEnabledNotAsExpected(true)) return;
-
-        TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
-                null, R.styleable.CarUiRecyclerView));
-
-        doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
-                any(),
-                eq(R.styleable.CarUiRecyclerView),
-                anyInt(),
-                anyInt());
-        when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
-                anyInt())).thenReturn(0); // Small size
-
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        int listId = View.generateViewId();
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(1);
-        container.post(() -> {
+        int listId = View.generateViewId();
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+                    null, R.styleable.CarUiRecyclerView));
+
+            doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+                    any(),
+                    eq(R.styleable.CarUiRecyclerView),
+                    anyInt(),
+                    anyInt());
+            when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
+                    anyInt())).thenReturn(0); // Small size
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
             carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
@@ -1506,24 +1831,26 @@
 
     @Test
     public void testSmallSize_multipleItem() {
-        doReturn(true).when(mTestableResources).getBoolean(R.bool.car_ui_scrollbar_enable);
-
-        TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
-                null, R.styleable.CarUiRecyclerView));
-
-        doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
-                any(),
-                eq(R.styleable.CarUiRecyclerView),
-                anyInt(),
-                anyInt());
-        when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
-                anyInt())).thenReturn(0); // Small size
-
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        int listId = View.generateViewId();
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(50);
-        container.post(() -> {
+        int listId = View.generateViewId();
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+                    null, R.styleable.CarUiRecyclerView));
+
+            doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+                    any(),
+                    eq(R.styleable.CarUiRecyclerView),
+                    anyInt(),
+                    anyInt());
+            when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
+                    anyInt())).thenReturn(0); // Small size
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
             carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
@@ -1537,75 +1864,92 @@
 
     @Test
     public void testSameSizeItems_estimateNextPositionDiffForScrollDistance() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
         int itemCount = 100;
         TestAdapter adapter = new TestAdapter(itemCount);
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+            carUiRecyclerView.setAdapter(adapter);
+
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        });
+
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        // TODO:
-        LayoutManager layoutManager = carUiRecyclerView.getLayoutManager();
-        OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(layoutManager);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+            int firstViewHeight = carUiRecyclerView.getRecyclerViewChildAt(0).getHeight();
+            int itemsToScroll = 10;
+            OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(
+                    carUiRecyclerView.getLayoutManager());
+            CarUiSnapHelper snapHelper = new CarUiSnapHelper(activity);
+            // Get an estimate of how many items CarUiSnapHelper says we need to scroll. The scroll
+            // distance is set to 10 * height of the first item. Since all items have the items have
+            // the same height, we're expecting to get exactly 10 back from CarUiSnapHelper.
+            int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(
+                    orientationHelper, itemsToScroll * firstViewHeight);
 
-        int firstViewHeight = layoutManager.getChildAt(0).getHeight();
-        int itemsToScroll = 10;
-        CarUiSnapHelper snapHelper = new CarUiSnapHelper(mActivity);
-        // Get an estimate of how many items CarUiSnaphelpwer says we need to scroll. The scroll
-        // distance is set to 10 * height of the first item. Since all items have the items have
-        // the same height, we're expecting to get exactly 10 back from CarUiSnapHelper.
-        int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(orientationHelper,
-                itemsToScroll * firstViewHeight);
-
-        assertEquals(estimate, itemsToScroll);
+            assertEquals(estimate, itemsToScroll);
+        });
     }
 
     @Test
     public void testSameSizeItems_estimateNextPositionDiffForScrollDistance_zeroDistance() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
         int itemCount = 100;
         TestAdapter adapter = new TestAdapter(itemCount);
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+            carUiRecyclerView.setAdapter(adapter);
+
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        });
+
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        LayoutManager layoutManager = carUiRecyclerView.getLayoutManager();
-        OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(layoutManager);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+            OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(
+                    carUiRecyclerView.getLayoutManager());
+            int firstViewHeight = carUiRecyclerView.getRecyclerViewChildAt(0).getHeight();
+            // the scroll distance has to be less than half of the size of the first view so that
+            // recyclerview doesn't snap to the next view
+            int distantToScroll = (firstViewHeight / 2) - 1;
+            CarUiSnapHelper snapHelper = new CarUiSnapHelper(activity);
+            int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(
+                    orientationHelper, distantToScroll);
 
-        // TODO:
-        int firstViewHeight = layoutManager.getChildAt(0).getHeight();
-        // the scroll distance has to be less than half of the size of the first view so that
-        // recyclerview doesn't snap to the next view
-        int distantToScroll = (firstViewHeight / 2) - 1;
-        CarUiSnapHelper snapHelper = new CarUiSnapHelper(mActivity);
-        int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(orientationHelper,
-                distantToScroll);
+            assertEquals(estimate, 0);
+        });
 
-        assertEquals(estimate, 0);
     }
 
     @Test
     public void testSameSizeItems_estimateNextPositionDiffForScrollDistance_zeroHeight() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
@@ -1614,241 +1958,316 @@
         heightOverrides.put(0, TestAdapter.ItemHeight.ZERO);
         TestAdapter adapter = new TestAdapter(itemCount, heightOverrides);
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+            carUiRecyclerView.setAdapter(adapter);
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        });
+
         onView(withContentDescription("ZERO")).check(matches(isEnabled()));
 
-        LayoutManager layoutManager = carUiRecyclerView.getLayoutManager();
-        OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(layoutManager);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+            OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(
+                    carUiRecyclerView.getLayoutManager());
+            // 10 is an arbitrary number
+            int distantToScroll = 10;
+            CarUiSnapHelper snapHelper = new CarUiSnapHelper(activity);
+            int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(
+                    orientationHelper, distantToScroll);
 
-        // 10 is an arbitrary number
-        int distantToScroll = 10;
-        CarUiSnapHelper snapHelper = new CarUiSnapHelper(mActivity);
-        int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(orientationHelper,
-                distantToScroll);
-
-        assertEquals(estimate, 0);
+            assertEquals(estimate, 0);
+        });
     }
 
     @Test
     public void testSameSizeItems_estimateNextPositionDiffForScrollDistance_zeroItems() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
         int itemCount = 0;
         TestAdapter adapter = new TestAdapter(itemCount);
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+            carUiRecyclerView.setAdapter(adapter);
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        });
 
-        LayoutManager layoutManager = carUiRecyclerView.getLayoutManager();
-        OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(layoutManager);
-        CarUiSnapHelper snapHelper = new CarUiSnapHelper(mActivity);
-        int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(orientationHelper, 50);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+            OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(
+                    carUiRecyclerView.getLayoutManager());
+            CarUiSnapHelper snapHelper = new CarUiSnapHelper(activity);
+            int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(
+                    orientationHelper, 50);
 
-        assertEquals(estimate, 50);
+            assertEquals(estimate, 50);
+        });
     }
 
     @Test
     public void testEmptyList_calculateScrollDistanceClampToScreenSize() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         int itemCount = 0;
         TestAdapter adapter = new TestAdapter(itemCount);
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+            carUiRecyclerView.setAdapter(adapter);
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
 
-        LayoutManager layoutManager = carUiRecyclerView.getLayoutManager();
+            LinearSnapHelper linearSnapHelper = new LinearSnapHelper();
+            carUiRecyclerView.setOnFlingListener(null);
+            linearSnapHelper.attachToRecyclerView(
+                    ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
+            // 200 is just an arbitrary number. the intent is to make sure the return value is
+            // smaller
+            // than the layoutmanager height.
+            int[] baseOutDist = linearSnapHelper.calculateScrollDistance(200, -200);
 
-        LinearSnapHelper linearSnapHelper = new LinearSnapHelper();
-        carUiRecyclerView.setOnFlingListener(null);
-        linearSnapHelper.attachToRecyclerView(
-                ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
-        // 200 is just an arbitrary number. the intent is to make sure the return value is smaller
-        // than the layoutmanager height.
-        int[] baseOutDist = linearSnapHelper.calculateScrollDistance(200, -200);
+            CarUiSnapHelper carUiSnapHelper = new CarUiSnapHelper(activity);
+            carUiRecyclerView.setOnFlingListener(null);
+            carUiSnapHelper.attachToRecyclerView(
+                    ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
+            int[] outDist = carUiSnapHelper.calculateScrollDistance(200, -200);
 
-        CarUiSnapHelper carUiSnapHelper = new CarUiSnapHelper(mTestableContext);
-        carUiRecyclerView.setOnFlingListener(null);
-        carUiSnapHelper.attachToRecyclerView(
-                ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
-        int[] outDist = carUiSnapHelper.calculateScrollDistance(200, -200);
-
-        assertEquals(outDist[0], baseOutDist[0]);
-        assertEquals(outDist[1], baseOutDist[1]);
+            assertEquals(outDist[0], baseOutDist[0]);
+            assertEquals(outDist[1], baseOutDist[1]);
+        });
     }
 
     @Test
     public void testCalculateScrollDistanceClampToScreenSize() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        mActivity.runOnUiThread(
-                () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+        mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+                R.layout.car_ui_recycler_view_test_activity));
 
         onView(withId(R.id.list)).check(matches(isDisplayed()));
 
         int itemCount = 100;
         TestAdapter adapter = new TestAdapter(itemCount);
 
-        CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
-        mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+            carUiRecyclerView.setAdapter(adapter);
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+        });
+
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        LayoutManager layoutManager = carUiRecyclerView.getLayoutManager();
-        OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(layoutManager);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+            LayoutManager layoutManager = carUiRecyclerView.getLayoutManager();
+            OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(
+                    layoutManager);
 
-        LinearSnapHelper linearSnapHelper = new LinearSnapHelper();
-        carUiRecyclerView.setOnFlingListener(null);
-        linearSnapHelper.attachToRecyclerView(
-                ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
-        // 8000 is just an arbitrary number. the intent is to make sure the return value is bigger
-        // than the layoutmanager height.
-        int[] baseOutDist = linearSnapHelper.calculateScrollDistance(8000, -8000);
+            LinearSnapHelper linearSnapHelper = new LinearSnapHelper();
+            carUiRecyclerView.setOnFlingListener(null);
+            linearSnapHelper.attachToRecyclerView(
+                    ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
+            // 8000 is just an arbitrary number. the intent is to make sure the return value is
+            // bigger
+            // than the layoutmanager height.
+            int[] baseOutDist = linearSnapHelper.calculateScrollDistance(8000, -8000);
 
-        CarUiSnapHelper carUiSnapHelper = new CarUiSnapHelper(mTestableContext);
-        carUiRecyclerView.setOnFlingListener(null);
-        carUiSnapHelper.attachToRecyclerView(
-                ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
-        int[] outDist = carUiSnapHelper.calculateScrollDistance(8000, -8000);
+            CarUiSnapHelper carUiSnapHelper = new CarUiSnapHelper(activity);
+            carUiRecyclerView.setOnFlingListener(null);
+            carUiSnapHelper.attachToRecyclerView(
+                    ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
+            int[] outDist = carUiSnapHelper.calculateScrollDistance(8000, -8000);
 
-        int lastChildPosition = carUiSnapHelper.isAtEnd(layoutManager)
-                ? 0 : layoutManager.getChildCount() - 1;
-        View lastChild = Objects.requireNonNull(layoutManager.getChildAt(lastChildPosition));
-        float percentageVisible = CarUiSnapHelper
-                .getPercentageVisible(lastChild, orientationHelper);
+            int lastChildPosition = carUiSnapHelper.isAtEnd(carUiRecyclerView.getLayoutManager())
+                    ? 0 : carUiRecyclerView.getRecyclerViewChildCount() - 1;
+            View lastChild = Objects.requireNonNull(
+                    carUiRecyclerView.getRecyclerViewChildAt(lastChildPosition));
+            float percentageVisible = CarUiSnapHelper
+                    .getPercentageVisible(lastChild, orientationHelper);
 
-        int maxDistance = layoutManager.getHeight();
-        if (percentageVisible > 0.f) {
-            // The max and min distance is the total height of the RecyclerView minus the height of
-            // the last child. This ensures that each scroll will never scroll more than a single
-            // page on the RecyclerView. That is, the max scroll will make the last child the
-            // first child and vice versa when scrolling the opposite way.
-            maxDistance -= layoutManager.getDecoratedMeasuredHeight(lastChild);
-        }
-        int minDistance = -maxDistance;
+            int maxDistance = carUiRecyclerView.getTotalSpace();
+            if (percentageVisible > 0.f) {
+                // The max and min distance is the total height of the RecyclerView minus the
+                // height of
+                // the last child. This ensures that each scroll will never scroll more than a
+                // single
+                // page on the RecyclerView. That is, the max scroll will make the last child the
+                // first child and vice versa when scrolling the opposite way.
+                maxDistance -= carUiRecyclerView.getLayoutManager()
+                        .getDecoratedMeasuredHeight(lastChild);
+            }
+            int minDistance = -maxDistance;
 
-        assertEquals(clamp(baseOutDist[0], minDistance, maxDistance), outDist[0]);
-        assertEquals(clamp(baseOutDist[1], minDistance, maxDistance), outDist[1]);
+            assertEquals(clamp(baseOutDist[0], minDistance, maxDistance), outDist[0]);
+            assertEquals(clamp(baseOutDist[1], minDistance, maxDistance), outDist[1]);
+        });
     }
 
     @Test
     public void testContinuousScrollListenerConstructor_negativeInitialDelay() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        if (isScrollbarEnabledNotAsExpected(true)) return;
-        doReturn(-1).when(mTestableResources)
-                .getInteger(R.integer.car_ui_scrollbar_longpress_initial_delay);
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            doReturn(-1).when(testableResources)
+                    .getInteger(R.integer.car_ui_scrollbar_longpress_initial_delay);
 
-        IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
-                () -> CarUiRecyclerView.create(mTestableContext));
-        assertEquals("negative intervals are not allowed", ex.getMessage());
+            IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
+                    () -> CarUiRecyclerView.create(testableContext));
+            assertEquals("negative intervals are not allowed", ex.getMessage());
+        });
     }
 
     @Test
     public void testContinuousScrollListenerConstructor_negativeRepeatInterval() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        if (isScrollbarEnabledNotAsExpected(true)) return;
-        doReturn(-1).when(mTestableResources)
-                .getInteger(R.integer.car_ui_scrollbar_longpress_repeat_interval);
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            doReturn(-1).when(testableResources)
+                    .getInteger(R.integer.car_ui_scrollbar_longpress_repeat_interval);
 
-        IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
-                () -> CarUiRecyclerView.create(mTestableContext));
-        assertEquals("negative intervals are not allowed", ex.getMessage());
+            IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
+                    () -> CarUiRecyclerView.create(testableContext));
+            assertEquals("negative intervals are not allowed", ex.getMessage());
+        });
     }
 
     @Test
     public void testUnknownClass_createScrollBarFromConfig() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        doReturn("random.class").when(mTestableResources)
-                .getString(R.string.car_ui_scrollbar_component);
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            doReturn("random.class").when(testableResources)
+                    .getString(R.string.car_ui_scrollbar_component);
 
-        RuntimeException ex = assertThrows(RuntimeException.class,
-                () -> CarUiRecyclerView.create(mTestableContext));
-        assertEquals("Error loading scroll bar component: random.class", ex.getMessage());
+            RuntimeException ex = assertThrows(RuntimeException.class,
+                    () -> CarUiRecyclerView.create(testableContext));
+            assertEquals("Error loading scroll bar component: random.class", ex.getMessage());
+        });
     }
 
     @Test
     public void testWrongType_createScrollBarFromConfig() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        // Basically return any class that exists but doesn't extend ScrollBar
-        doReturn(CarUiRecyclerView.class.getName()).when(mTestableResources)
-                .getString(R.string.car_ui_scrollbar_component);
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            // Basically return any class that exists but doesn't extend ScrollBar
+            doReturn(CarUiRecyclerView.class.getName()).when(testableResources)
+                    .getString(R.string.car_ui_scrollbar_component);
 
-        RuntimeException ex = assertThrows(RuntimeException.class,
-                () -> CarUiRecyclerView.create(mTestableContext));
-        assertEquals("Error creating scroll bar component: "
-                + CarUiRecyclerView.class.getName(), ex.getMessage());
+            RuntimeException ex = assertThrows(RuntimeException.class,
+                    () -> CarUiRecyclerView.create(testableContext));
+            assertEquals("Error creating scroll bar component: "
+                    + CarUiRecyclerView.class.getName(), ex.getMessage());
+        });
     }
 
     @Test
     public void testSetLinearLayoutStyle_setsLayoutManager() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        CarUiLayoutStyle layoutStyle = new CarUiLinearLayoutStyle();
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        carUiRecyclerView.setLayoutStyle(layoutStyle);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(50);
+        int listId = View.generateViewId();
+        CarUiLayoutStyle layoutStyle = new CarUiLinearLayoutStyle();
 
-        container.post(() -> {
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView =
+                    (CarUiRecyclerViewImpl) CarUiRecyclerView.create(activity);
+            carUiRecyclerView.setLayoutStyle(layoutStyle);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
         });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        assertTrue(carUiRecyclerView.getLayoutManager() instanceof LinearLayoutManager);
-        assertEquals(((LinearLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
-                layoutStyle.getOrientation());
-        assertEquals(((LinearLayoutManager) carUiRecyclerView.getLayoutManager())
-                .getReverseLayout(), layoutStyle.getReverseLayout());
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(listId);
+            assertTrue(carUiRecyclerView.getLayoutManager() instanceof LinearLayoutManager);
+            assertEquals(
+                    ((LinearLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
+                    layoutStyle.getOrientation());
+            assertEquals(((LinearLayoutManager) carUiRecyclerView.getLayoutManager())
+                    .getReverseLayout(), layoutStyle.getReverseLayout());
+        });
     }
 
     @Test
     public void testSetGridLayoutStyle_setsLayoutManager() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        CarUiLayoutStyle layoutStyle = new CarUiGridLayoutStyle();
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        carUiRecyclerView.setLayoutStyle(layoutStyle);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(50);
+        CarUiLayoutStyle layoutStyle = new CarUiGridLayoutStyle();
+        int listId = View.generateViewId();
 
-        container.post(() -> {
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView =
+                    (CarUiRecyclerViewImpl) CarUiRecyclerView.create(activity);
+            carUiRecyclerView.setLayoutStyle(layoutStyle);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
         });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        assertTrue(carUiRecyclerView.getLayoutManager() instanceof GridLayoutManager);
-        assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
-                layoutStyle.getOrientation());
-        assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getReverseLayout(),
-                layoutStyle.getReverseLayout());
-        assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanCount(),
-                layoutStyle.getSpanCount());
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(listId);
+            assertTrue(carUiRecyclerView.getLayoutManager() instanceof GridLayoutManager);
+            assertEquals(
+                    ((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
+                    layoutStyle.getOrientation());
+            assertEquals(
+                    ((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getReverseLayout(),
+                    layoutStyle.getReverseLayout());
+            assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanCount(),
+                    layoutStyle.getSpanCount());
+        });
     }
 
     @Test
@@ -1861,7 +2280,6 @@
 
     @Test
     public void testSetGridLayoutStyle_setsLayoutManagerSpanSizeLookup() {
-
         CarUiGridLayoutStyle layoutStyle = new CarUiGridLayoutStyle();
         // has to bigger than span sizes for all the rows
         layoutStyle.setSpanCount(20);
@@ -1879,80 +2297,105 @@
             }
         };
         layoutStyle.setSpanSizeLookup(spanSizeLookup);
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        carUiRecyclerView.setLayoutStyle(layoutStyle);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(50);
+        int listId = View.generateViewId();
 
-        container.post(() -> {
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+            carUiRecyclerView.setLayoutStyle(layoutStyle);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
         });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiGridLayoutStyle);
-        assertEquals(((CarUiGridLayoutStyle) carUiRecyclerView.getLayoutStyle()).getSpanSizeLookup()
-                .getSpanSize(0), spanSizeLookup.getSpanSize(0));
-        assertEquals(((CarUiGridLayoutStyle) carUiRecyclerView.getLayoutStyle()).getSpanSizeLookup()
-                .getSpanSize(1), spanSizeLookup.getSpanSize(1));
-        assertEquals(((CarUiGridLayoutStyle) carUiRecyclerView.getLayoutStyle()).getSpanSizeLookup()
-                .getSpanSize(2), spanSizeLookup.getSpanSize(2));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiGridLayoutStyle);
+            assertEquals(
+                    ((CarUiGridLayoutStyle) carUiRecyclerView.getLayoutStyle()).getSpanSizeLookup()
+                            .getSpanSize(0), spanSizeLookup.getSpanSize(0));
+            assertEquals(
+                    ((CarUiGridLayoutStyle) carUiRecyclerView.getLayoutStyle()).getSpanSizeLookup()
+                            .getSpanSize(1), spanSizeLookup.getSpanSize(1));
+            assertEquals(
+                    ((CarUiGridLayoutStyle) carUiRecyclerView.getLayoutStyle()).getSpanSizeLookup()
+                            .getSpanSize(2), spanSizeLookup.getSpanSize(2));
+        });
     }
 
     @Test
     public void testCarUiGridLayoutStyle_LayoutManagerFrom() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        GridLayoutManager layoutManager =
-                new GridLayoutManager(mTestableContext, 20, RecyclerView.VERTICAL, true);
-        layoutManager.setSpanSizeLookup(new SpanSizeLookup() {
-            @Override
-            public int getSpanSize(int position) {
-                switch (position) {
-                    case 0:
-                        return 10;
-                    case 1:
-                        return 20;
-                    default:
-                        return 15;
-                }
-            }
-        });
-        CarUiGridLayoutStyle layoutStyle = CarUiGridLayoutStyle.from(layoutManager);
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        carUiRecyclerView.setLayoutStyle(layoutStyle);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(50);
+        int listId = View.generateViewId();
 
-        container.post(() -> {
+        mActivityRule.getScenario().onActivity(activity -> {
+            GridLayoutManager layoutManager =
+                    new GridLayoutManager(activity, 20, RecyclerView.VERTICAL, true);
+            layoutManager.setSpanSizeLookup(new SpanSizeLookup() {
+                @Override
+                public int getSpanSize(int position) {
+                    switch (position) {
+                        case 0:
+                            return 10;
+                        case 1:
+                            return 20;
+                        default:
+                            return 15;
+                    }
+                }
+            });
+            CarUiGridLayoutStyle layoutStyle = CarUiGridLayoutStyle.from(layoutManager);
+            CarUiRecyclerViewImpl carUiRecyclerView =
+                    (CarUiRecyclerViewImpl) CarUiRecyclerView.create(activity);
+            carUiRecyclerView.setLayoutStyle(layoutStyle);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
         });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        assertTrue(carUiRecyclerView.getLayoutManager() instanceof GridLayoutManager);
-        assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
-                layoutManager.getOrientation());
-        assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getReverseLayout(),
-                layoutManager.getReverseLayout());
-        assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanCount(),
-                layoutManager.getSpanCount());
-        assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanSizeLookup()
-                .getSpanSize(0), layoutManager.getSpanSizeLookup().getSpanSize(0));
-        assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanSizeLookup()
-                .getSpanSize(1), layoutManager.getSpanSizeLookup().getSpanSize(1));
-        assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanSizeLookup()
-                .getSpanSize(2), layoutManager.getSpanSizeLookup().getSpanSize(2));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(listId);
+            assertTrue(carUiRecyclerView.getLayoutManager() instanceof GridLayoutManager);
+            GridLayoutManager layoutManager =
+                    (GridLayoutManager) carUiRecyclerView.getLayoutManager();
+            assertEquals(
+                    ((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
+                    layoutManager.getOrientation());
+            assertEquals(
+                    ((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getReverseLayout(),
+                    layoutManager.getReverseLayout());
+            assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanCount(),
+                    layoutManager.getSpanCount());
+            assertEquals(
+                    ((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanSizeLookup()
+                            .getSpanSize(0), layoutManager.getSpanSizeLookup().getSpanSize(0));
+            assertEquals(
+                    ((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanSizeLookup()
+                            .getSpanSize(1), layoutManager.getSpanSizeLookup().getSpanSize(1));
+            assertEquals(
+                    ((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanSizeLookup()
+                            .getSpanSize(2), layoutManager.getSpanSizeLookup().getSpanSize(2));
+        });
     }
 
     @Test
     public void testCarUiGridLayoutStyle_fromLinearLayout_throwsException() {
-        LinearLayoutManager layoutManager = new LinearLayoutManager(mTestableContext);
-        AssertionError ex = assertThrows(AssertionError.class,
-                () -> CarUiGridLayoutStyle.from(layoutManager));
-        assertEquals("GridLayoutManager required.", ex.getMessage());
+        mActivityRule.getScenario().onActivity(activity -> {
+            LinearLayoutManager layoutManager = new LinearLayoutManager(activity);
+            AssertionError ex = assertThrows(AssertionError.class,
+                    () -> CarUiGridLayoutStyle.from(layoutManager));
+            assertEquals("GridLayoutManager required.", ex.getMessage());
+        });
     }
 
     @Test
@@ -1962,36 +2405,49 @@
 
     @Test
     public void testCarUiLinearLayoutStyle_LayoutManagerFrom() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        LinearLayoutManager layoutManager =
-                new LinearLayoutManager(mTestableContext, RecyclerView.VERTICAL, true);
-        CarUiLinearLayoutStyle layoutStyle = CarUiLinearLayoutStyle.from(layoutManager);
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        carUiRecyclerView.setLayoutStyle(layoutStyle);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(50);
+        int listId = View.generateViewId();
 
-        container.post(() -> {
+        mActivityRule.getScenario().onActivity(activity -> {
+            LinearLayoutManager layoutManager =
+                    new LinearLayoutManager(activity, RecyclerView.VERTICAL, true);
+            CarUiLinearLayoutStyle layoutStyle = CarUiLinearLayoutStyle.from(layoutManager);
+            CarUiRecyclerViewImpl carUiRecyclerView =
+                    (CarUiRecyclerViewImpl) CarUiRecyclerView.create(activity);
+            carUiRecyclerView.setLayoutStyle(layoutStyle);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             container.addView(carUiRecyclerView.getView());
+            carUiRecyclerView.setId(listId);
             carUiRecyclerView.setAdapter(adapter);
         });
 
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        assertTrue(carUiRecyclerView.getLayoutManager() instanceof LinearLayoutManager);
-        assertEquals(((LinearLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
-                layoutManager.getOrientation());
-        assertEquals(((LinearLayoutManager) carUiRecyclerView.getLayoutManager())
-                .getReverseLayout(), layoutManager.getReverseLayout());
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(listId);
+            LinearLayoutManager layoutManager =
+                    (LinearLayoutManager) carUiRecyclerView.getLayoutManager();
+            assertTrue(carUiRecyclerView.getLayoutManager() instanceof LinearLayoutManager);
+            assertEquals(
+                    ((LinearLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
+                    layoutManager.getOrientation());
+            assertEquals(((LinearLayoutManager) carUiRecyclerView.getLayoutManager())
+                    .getReverseLayout(), layoutManager.getReverseLayout());
+        });
     }
 
     @Test
     public void testCarUiLinearLayoutStyle_fromGridLayout_throwsException() {
-        NotLinearLayoutManager layoutManager = new NotLinearLayoutManager(mTestableContext);
-        AssertionError ex = assertThrows(AssertionError.class,
-                () -> CarUiLinearLayoutStyle.from(layoutManager));
-        assertEquals("LinearLayoutManager required.", ex.getMessage());
+        mActivityRule.getScenario().onActivity(activity -> {
+            NotLinearLayoutManager layoutManager = new NotLinearLayoutManager(activity);
+            AssertionError ex = assertThrows(AssertionError.class,
+                    () -> CarUiLinearLayoutStyle.from(layoutManager));
+            assertEquals("LinearLayoutManager required.", ex.getMessage());
+        });
     }
 
     @Test
@@ -2001,186 +2457,252 @@
 
     @Test
     public void testOnContinuousScrollListener_cancelCallback() {
-        doReturn(0).when(mTestableResources)
-                .getInteger(R.integer.car_ui_scrollbar_longpress_initial_delay);
-        View view = mock(View.class);
-        OnClickListener clickListener = mock(OnClickListener.class);
-        OnContinuousScrollListener listener = new OnContinuousScrollListener(
-                mTestableContext, clickListener);
-        MotionEvent motionEvent = mock(MotionEvent.class);
-        when(motionEvent.getAction()).thenReturn(MotionEvent.ACTION_DOWN);
-        listener.onTouch(view, motionEvent);
-        when(view.isEnabled()).thenReturn(false);
-        when(motionEvent.getAction()).thenReturn(MotionEvent.ACTION_UP);
-        listener.onTouch(view, motionEvent);
-        verify(clickListener, times(1)).onClick(view);
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            doReturn(0).when(testableResources)
+                    .getInteger(R.integer.car_ui_scrollbar_longpress_initial_delay);
+            View view = mock(View.class);
+            OnClickListener clickListener = mock(OnClickListener.class);
+            OnContinuousScrollListener listener = new OnContinuousScrollListener(
+                    testableContext, clickListener);
+            MotionEvent motionEvent = mock(MotionEvent.class);
+            when(motionEvent.getAction()).thenReturn(MotionEvent.ACTION_DOWN);
+            listener.onTouch(view, motionEvent);
+            when(view.isEnabled()).thenReturn(false);
+            when(motionEvent.getAction()).thenReturn(MotionEvent.ACTION_UP);
+            listener.onTouch(view, motionEvent);
+            verify(clickListener, times(1)).onClick(view);
+        });
     }
 
     @Test
     public void testUxRestriction_withLimitedContent_setsMaxItems() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        CarUxRestrictionsUtil uxRestriction = CarUxRestrictionsUtil.getInstance(mTestableContext);
-        CarUxRestrictions restriction = mock(CarUxRestrictions.class);
-        when(restriction.getActiveRestrictions()).thenReturn(UX_RESTRICTIONS_LIMIT_CONTENT);
-        when(restriction.getMaxCumulativeContentItems()).thenReturn(10);
-
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter.WithItemCap adapter = spy(new TestAdapter.WithItemCap(100));
-        container.post(() -> {
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUxRestrictionsUtil uxRestriction = CarUxRestrictionsUtil.getInstance(activity);
+            CarUxRestrictions restriction = mock(CarUxRestrictions.class);
+            when(restriction.getActiveRestrictions()).thenReturn(UX_RESTRICTIONS_LIMIT_CONTENT);
+            when(restriction.getMaxCumulativeContentItems()).thenReturn(10);
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             uxRestriction.setUxRestrictions(restriction);
             carUiRecyclerView.setAdapter(adapter);
             container.addView(carUiRecyclerView.getView());
+
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         });
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
-
         verify(adapter, atLeastOnce()).setMaxItems(10);
     }
 
     @Test
     public void testUxRestriction_withoutLimitedContent_setsUnlimitedMaxItems() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        CarUxRestrictionsUtil uxRestriction = CarUxRestrictionsUtil.getInstance(mTestableContext);
-        CarUxRestrictions restriction = mock(CarUxRestrictions.class);
-        when(restriction.getMaxCumulativeContentItems()).thenReturn(10);
-
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter.WithItemCap adapter = spy(new TestAdapter.WithItemCap(100));
-        container.post(() -> {
-            uxRestriction.setUxRestrictions(restriction);
-            carUiRecyclerView.setAdapter(adapter);
-            container.addView(carUiRecyclerView.getView());
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUxRestrictionsUtil uxRestriction = CarUxRestrictionsUtil.getInstance(activity);
+            CarUxRestrictions restriction = mock(CarUxRestrictions.class);
+            when(restriction.getMaxCumulativeContentItems()).thenReturn(10);
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+            ViewGroup container = activity.findViewById(R.id.test_container);
+            container.post(() -> {
+                uxRestriction.setUxRestrictions(restriction);
+                carUiRecyclerView.setAdapter(adapter);
+                container.addView(carUiRecyclerView.getView());
+            });
+
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         });
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
-
         verify(adapter, atLeastOnce()).setMaxItems(UNLIMITED);
     }
 
     @Test
     public void testPageUp_returnsWhen_verticalScrollOffsetIsZero() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        if (isScrollbarEnabledNotAsExpected(true)) return;
-        doReturn(TestScrollBar.class.getName()).when(mTestableResources)
-                .getString(R.string.car_ui_scrollbar_component);
-
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(100);
         int listId = View.generateViewId();
-        container.post(() -> {
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            doReturn(TestScrollBar.class.getName()).when(testableResources)
+                    .getString(R.string.car_ui_scrollbar_component);
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             carUiRecyclerView.setAdapter(adapter);
             carUiRecyclerView.setId(listId);
             container.addView(carUiRecyclerView.getView());
+
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         });
 
         onView(withId(listId)).check(matches(isDisplayed()));
-
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        // Scroll to a position so page up is enabled.
-        container.post(() -> carUiRecyclerView.scrollToPosition(20));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            // Scroll to a position so page up is enabled.
+            carUiRecyclerView.scrollToPosition(20);
+        });
 
         onView(withId(getId("car_ui_scrollbar_page_up"))).check(matches(isEnabled()));
 
-        View v = mActivity.findViewById(getId("car_ui_scroll_bar"));
-        TestScrollBar sb = (TestScrollBar) v.getTag();
-        // We set this to simulate a case where layout manager is null
-        sb.mReturnZeroVerticalScrollOffset = true;
+        mActivityRule.getScenario().onActivity(activity -> {
+            View v = activity.findViewById(getId("car_ui_scroll_bar"));
+            TestScrollBar sb = (TestScrollBar) v.getTag();
+            // We set this to simulate a case where layout manager is null
+            sb.mReturnZeroVerticalScrollOffset = true;
+        });
 
         onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
 
-        assertFalse(sb.mScrollWasCalled);
+        mActivityRule.getScenario().onActivity(activity -> {
+            View v = activity.findViewById(getId("car_ui_scroll_bar"));
+            TestScrollBar sb = (TestScrollBar) v.getTag();
+            assertFalse(sb.mScrollWasCalled);
+        });
     }
 
     @Test
     public void testPageUp_returnsWhen_layoutManagerIsNull() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        if (isScrollbarEnabledNotAsExpected(true)) return;
-        doReturn(TestScrollBar.class.getName()).when(mTestableResources)
-                .getString(R.string.car_ui_scrollbar_component);
-
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(100);
-        container.post(() -> {
+        int listId = View.generateViewId();
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            doReturn(TestScrollBar.class.getName()).when(testableResources)
+                    .getString(R.string.car_ui_scrollbar_component);
+
+            CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             carUiRecyclerView.setAdapter(adapter);
+            carUiRecyclerView.setId(listId);
             container.addView(carUiRecyclerView.getView());
+
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         });
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        // Scroll to a position so page up is enabled.
-        container.post(() -> carUiRecyclerView.scrollToPosition(20));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            // Scroll to a position so page up is enabled.
+            carUiRecyclerView.scrollToPosition(20);
+        });
 
         onView(withId(getId("car_ui_scrollbar_page_up"))).check(matches(isEnabled()));
 
-        View v = mActivity.findViewById(getId("car_ui_scroll_bar"));
-        TestScrollBar sb = (TestScrollBar) v.getTag();
-        // We set this to simulate a case where layout manager is null
-        sb.mReturnMockLayoutManager = true;
+        mActivityRule.getScenario().onActivity(activity -> {
+            View v = activity.findViewById(getId("car_ui_scroll_bar"));
+            TestScrollBar sb = (TestScrollBar) v.getTag();
+            // We set this to simulate a case where layout manager is null
+            sb.mReturnMockLayoutManager = true;
+        });
 
         onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
 
-        assertFalse(sb.mScrollWasCalled);
+        mActivityRule.getScenario().onActivity(activity -> {
+            View v = activity.findViewById(getId("car_ui_scroll_bar"));
+            TestScrollBar sb = (TestScrollBar) v.getTag();
+            assertFalse(sb.mScrollWasCalled);
+        });
     }
 
     @Test
     public void testPageDown_returnsWhen_layoutManagerIsNullOrEmpty() {
-        if (mIsPluginEnabled) return;
+        if (mIsPluginEnabled) {
+            return;
+        }
 
-        if (isScrollbarEnabledNotAsExpected(true)) return;
-        doReturn(TestScrollBar.class.getName()).when(mTestableResources)
-                .getString(R.string.car_ui_scrollbar_component);
-
-        CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-        ViewGroup container = mActivity.findViewById(R.id.test_container);
         TestAdapter adapter = new TestAdapter(100);
-        container.post(() -> {
+        int listId = View.generateViewId();
+
+        mActivityRule.getScenario().onActivity(activity -> {
+            Context testableContext = spy(activity);
+            Resources testableResources = spy(activity.getResources());
+            when(testableContext.getResources()).thenReturn(testableResources);
+            doReturn(TestScrollBar.class.getName()).when(testableResources)
+                    .getString(R.string.car_ui_scrollbar_component);
+
+            CarUiRecyclerViewImpl carUiRecyclerView =
+                    (CarUiRecyclerViewImpl) CarUiRecyclerView.create(testableContext);
+            ViewGroup container = activity.findViewById(R.id.test_container);
             carUiRecyclerView.setAdapter(adapter);
+            carUiRecyclerView.setId(listId);
             container.addView(carUiRecyclerView.getView());
+
+            IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         });
 
-        IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
         onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
 
-        // Scroll to a position so page up is enabled.
-        container.post(() -> carUiRecyclerView.scrollToPosition(20));
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+            // Scroll to a position so page up is enabled.
+            carUiRecyclerView.scrollToPosition(20);
+        });
 
         onView(withId(getId("car_ui_scrollbar_page_down"))).check(matches(isEnabled()));
 
-        View v = mActivity.findViewById(getId("car_ui_scroll_bar"));
-        TestScrollBar sb = (TestScrollBar) v.getTag();
-        // We set this to simulate a case where layout manager is empty
-        sb.mReturnMockLayoutManager = true;
-        sb.mMockLayoutManager = spy(carUiRecyclerView.getLayoutManager());
-        when(sb.mMockLayoutManager.getChildCount()).thenReturn(0);
+        mActivityRule.getScenario().onActivity(activity -> {
+            CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(listId);
+            View v = activity.findViewById(getId("car_ui_scroll_bar"));
+            TestScrollBar sb = (TestScrollBar) v.getTag();
+            // We set this to simulate a case where layout manager is empty
+            sb.mReturnMockLayoutManager = true;
+            sb.mMockLayoutManager = spy(carUiRecyclerView.getLayoutManager());
+            when(sb.mMockLayoutManager.getChildCount()).thenReturn(0);
+        });
 
         onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
 
-        assertFalse(sb.mScrollWasCalled);
+        mActivityRule.getScenario().onActivity(activity -> {
+            View v = activity.findViewById(getId("car_ui_scroll_bar"));
+            TestScrollBar sb = (TestScrollBar) v.getTag();
+            assertFalse(sb.mScrollWasCalled);
 
-        // We set this to simulate a case where layout manager is null
-        sb.mReturnMockLayoutManager = true;
-        sb.mMockLayoutManager = null;
+            // We set this to simulate a case where layout manager is null
+            sb.mReturnMockLayoutManager = true;
+            sb.mMockLayoutManager = null;
+        });
 
         onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
 
-        assertFalse(sb.mScrollWasCalled);
+        mActivityRule.getScenario().onActivity(activity -> {
+            View v = activity.findViewById(getId("car_ui_scroll_bar"));
+            TestScrollBar sb = (TestScrollBar) v.getTag();
+            assertFalse(sb.mScrollWasCalled);
+        });
     }
 
     static class TestScrollBar extends DefaultScrollBar {
-
         boolean mReturnMockLayoutManager = false;
         LayoutManager mMockLayoutManager = null;
         boolean mScrollWasCalled = false;
@@ -2229,12 +2751,10 @@
      * @return An item that is taller than the CarUiRecyclerView.
      */
     private View getLongItem(CarUiRecyclerView recyclerView) {
-        OrientationHelper orientationHelper =
-                OrientationHelper.createVerticalHelper(recyclerView.getLayoutManager());
-        for (int i = 0; i < recyclerView.getLayoutManager().getChildCount(); i++) {
-            View item = recyclerView.getLayoutManager().getChildAt(i);
+        for (int i = 0; i < recyclerView.getRecyclerViewChildCount(); i++) {
+            View item = recyclerView.getRecyclerViewChildAt(i);
 
-            if (item.getHeight() > orientationHelper.getTotalSpace()) {
+            if (item.getHeight() > recyclerView.getTotalSpace()) {
                 return item;
             }
         }
@@ -2306,10 +2826,10 @@
                 case STANDARD:
                     break;
                 case TALL:
-                    holder.itemView.setMinimumHeight(screenHeight);
+                    holder.itemView.setMinimumHeight((int) (screenHeight * 1.1));
                     break;
                 case EXTRA_TALL:
-                    holder.itemView.setMinimumHeight(screenHeight * 2);
+                    holder.itemView.setMinimumHeight((int) (screenHeight * 2.1));
                     break;
                 default:
                     throw new IllegalStateException("Unexpected value: " + height);
@@ -2324,8 +2844,7 @@
         }
 
         static class WithItemCap extends TestAdapter implements CarUiRecyclerView.ItemCap {
-
-            private int mMaxitems = -1;
+            private int mMaxItems = -1;
 
             WithItemCap(int itemCount,
                     Map<Integer, ItemHeight> overrides) {
@@ -2338,18 +2857,17 @@
 
             @Override
             public void setMaxItems(int maxItems) {
-                mMaxitems = maxItems;
+                mMaxItems = maxItems;
             }
 
             @Override
             public int getItemCount() {
-                return mMaxitems >= 0 ? mMaxitems : mData.size();
+                return mMaxItems >= 0 ? mMaxItems : mData.size();
             }
         }
     }
 
     private static class PerfectFitTestAdapter extends RecyclerView.Adapter<TestViewHolder> {
-
         private static final int MIN_HEIGHT = 30;
         private final List<String> mData;
         private final int mItemHeight;
@@ -2376,7 +2894,7 @@
             }
         }
 
-        String getItemText(int position) {
+        public static String getItemText(int position) {
             return String.format(Locale.US, "Sample item #%d", position);
         }
 
@@ -2400,7 +2918,7 @@
     }
 
     private static class TestViewHolder extends RecyclerView.ViewHolder {
-        private TextView mTextView;
+        private final TextView mTextView;
 
         TestViewHolder(LayoutInflater inflater, ViewGroup parent) {
             super(inflater.inflate(R.layout.test_list_item, parent, false));
@@ -2439,8 +2957,8 @@
 
                                 @Override
                                 public void onScrolled(@NonNull CarUiRecyclerView recyclerView,
-                                                       int dx,
-                                                       int dy) {
+                                        int dx,
+                                        int dy) {
                                 }
                             });
         }
@@ -2462,8 +2980,8 @@
     }
 
     private static class NotLinearLayoutManager extends LayoutManager {
-
-        NotLinearLayoutManager(Context mTestableContext) {}
+        NotLinearLayoutManager(Context mTestableContext) {
+        }
 
         @Override
         public LayoutParams generateDefaultLayoutParams() {
@@ -2471,25 +2989,15 @@
         }
     }
 
-    private boolean isScrollbarEnabledNotAsExpected(boolean expectedValue) {
-        if (mIsPluginEnabled) {
-            int id = mPluginContext.getResources()
-                    .getIdentifier("scrollbar_enable", "bool", mPluginContext.getPackageName());
-            return (mPluginContext.getResources().getBoolean(id) != expectedValue);
-        } else {
-            doReturn(expectedValue).when(mTestableResources)
-                    .getBoolean(R.bool.car_ui_scrollbar_enable);
-            return false;
-        }
-    }
-
     private int getId(String resourceName) {
         if (mIsPluginEnabled) {
-            return mPluginContext.getResources().getIdentifier(
-                    resourceName.replace("car_ui_", ""), "id", mPluginContext.getPackageName());
+            Context pluginContext = PluginFactorySingleton.getPluginContext();
+            return pluginContext.getResources().getIdentifier(
+                    resourceName.replace("car_ui_", ""), "id", pluginContext.getPackageName());
         } else {
-            return mActivity.getResources()
-                    .getIdentifier(resourceName, "id", mActivity.getPackageName());
+            Context context = getInstrumentation().getTargetContext();
+            return context.getResources()
+                    .getIdentifier(resourceName, "id", context.getPackageName());
         }
     }
 }
diff --git a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/preference/CarUiPrimarySwitchPreference.java b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/preference/CarUiPrimarySwitchPreference.java
new file mode 100644
index 0000000..6586464
--- /dev/null
+++ b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/preference/CarUiPrimarySwitchPreference.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.ui.preference;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.ui.R;
+
+/**
+ * This class is the same as the base {@link CarUiSwitchPreference} class, except supports separate
+ * distinguishing styling.
+ */
+public class CarUiPrimarySwitchPreference extends CarUiSwitchPreference {
+    private View mItemView;
+
+    public CarUiPrimarySwitchPreference(Context context,
+            AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        init();
+    }
+
+    public CarUiPrimarySwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init();
+    }
+
+    public CarUiPrimarySwitchPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    public CarUiPrimarySwitchPreference(Context context) {
+        super(context);
+        init();
+    }
+
+    private void init() {
+        setLayoutResource(R.layout.car_ui_preference_primary_switch);
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        mItemView = holder.itemView;
+        mItemView.setActivated(isChecked());
+    }
+
+    @Override
+    public void setChecked(boolean checked) {
+        super.setChecked(checked);
+        if (mItemView != null) {
+            mItemView.setActivated(checked);
+        }
+    }
+}
diff --git a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/preference/PreferenceFragment.java b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/preference/PreferenceFragment.java
index 58c0841..2d0b33f 100644
--- a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/preference/PreferenceFragment.java
+++ b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/preference/PreferenceFragment.java
@@ -26,6 +26,7 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.ViewParent;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -97,6 +98,8 @@
     @NonNull
     private CarUiRecyclerView mCarUiRecyclerView;
     @Nullable
+    private ViewParent mRecyclerView;
+    @Nullable
     private String mLastSelectedPrefKey;
     private int mLastFocusedAndSelectedPrefPosition;
 
@@ -264,8 +267,32 @@
     @Override
     public boolean onPreferenceTreeClick(Preference preference) {
         mLastSelectedPrefKey = preference.getKey();
-        View focus = getView().findFocus();
-        mLastFocusedAndSelectedPrefPosition = mCarUiRecyclerView.getChildLayoutPosition(focus);
+        if (mRecyclerView != null) {
+            // Search for RecyclerView's direct child that has focus, if any.
+            View fragmentRoot = getView();
+            View focusedChild = fragmentRoot.findFocus();
+            boolean childHasFocus = false;
+            while (focusedChild != null) {
+                ViewParent parent = focusedChild.getParent();
+                if (parent == mRecyclerView) {
+                    childHasFocus = true;
+                    break;
+                }
+                if (parent == null || !(parent instanceof View)) {
+                    break;
+                }
+                focusedChild = (View) parent;
+            }
+            if (childHasFocus) {
+                // Find the position of the focused element.
+                // Note: RecyclerView requires that the parameter passed to getChildLayoutPosition()
+                // must be a direct child of RecyclerView.
+                mLastFocusedAndSelectedPrefPosition =
+                        mCarUiRecyclerView.getChildLayoutPosition(focusedChild);
+                Log.d(TAG, "mLastFocusedAndSelectedPrefPosition is set to "
+                        + mLastFocusedAndSelectedPrefPosition);
+            }
+        }
 
         return super.onPreferenceTreeClick(preference);
     }
@@ -403,6 +430,13 @@
                         new RecyclerView.OnChildAttachStateChangeListener() {
                             @Override
                             public void onChildViewAttachedToWindow(View view) {
+                                // The RecyclerView in onCreateRecyclerView() might not be the real
+                                // RecyclerView in the view tree. However, when an item is attached
+                                // to window, its parent (a RecyclerView) must be the real
+                                // RecyclerView in the view tree, so update mRecyclerView here.
+                                if (mRecyclerView == null) {
+                                    mRecyclerView = view.getParent();
+                                }
                                 int position = mCarUiRecyclerView.getChildLayoutPosition(view);
                                 if (position == mLastFocusedAndSelectedPrefPosition) {
                                     view.requestFocus();
diff --git a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/utils/CarUiUtils.java b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/utils/CarUiUtils.java
index 54d22fa..17d01b9 100644
--- a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/utils/CarUiUtils.java
+++ b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/utils/CarUiUtils.java
@@ -334,7 +334,24 @@
             return;
         }
         initializeRestrictedState(view);
-        applyStatesToAllViews(view, restricted ? sRestrictedState : null, null);
+        applyDrawableStatesToAllViews(view, restricted ? sRestrictedState : null, null);
+    }
+
+    /**
+     * Traverses the view hierarchy, and whenever it sees a {@link DrawableStateView}, adds
+     * state_enabled to it.
+     *
+     * Note that this will remove any other drawable states added by other calls to
+     * {@link DrawableStateView#setExtraDrawableState(int[], int[])}
+     */
+    public static void makeAllViewsEnabled(@Nullable View view, boolean enabled) {
+        if (view == null) {
+            return;
+        }
+        initializeRestrictedState(view);
+        int[] statesToAdd = enabled ? new int[] {android.R.attr.state_enabled} : null;
+        int[] statesToRemove = enabled ? null : new int[] {android.R.attr.state_enabled};
+        applyDrawableStatesToAllViews(view, statesToAdd, statesToRemove);
     }
 
     /**
@@ -363,7 +380,27 @@
             statesToAdd = sRestrictedState;
         }
         int[] statesToRemove = enabled ? null : new int[] {android.R.attr.state_enabled};
-        applyStatesToAllViews(view, statesToAdd, statesToRemove);
+        applyDrawableStatesToAllViews(view, statesToAdd, statesToRemove);
+    }
+
+    /**
+     * Traverses the view hierarchy, and whenever it sees a {@link DrawableStateView}, adds and
+     * removes the specified states from the view.
+     *
+     * Note that this will remove any other drawable states added by other calls to
+     * {@link DrawableStateView#setExtraDrawableState(int[], int[])}
+     */
+    public static void applyDrawableStatesToAllViews(@NonNull View view, int[] statesToAdd,
+            int[] statesToRemove) {
+        if (view instanceof DrawableStateView) {
+            ((DrawableStateView) view).setExtraDrawableState(statesToAdd, statesToRemove);
+        }
+        if (view instanceof ViewGroup) {
+            ViewGroup vg = (ViewGroup) view;
+            for (int i = 0; i < vg.getChildCount(); i++) {
+                applyDrawableStatesToAllViews(vg.getChildAt(i), statesToAdd, statesToRemove);
+            }
+        }
     }
 
     private static void initializeRestrictedState(@NonNull View view) {
@@ -382,17 +419,4 @@
             };
         }
     }
-
-    private static void applyStatesToAllViews(@NonNull View view, int[] statesToAdd,
-            int[] statesToRemove) {
-        if (view instanceof DrawableStateView) {
-            ((DrawableStateView) view).setExtraDrawableState(statesToAdd, statesToRemove);
-        }
-        if (view instanceof ViewGroup) {
-            ViewGroup vg = (ViewGroup) view;
-            for (int i = 0; i < vg.getChildCount(); i++) {
-                applyStatesToAllViews(vg.getChildAt(i), statesToAdd, statesToRemove);
-            }
-        }
-    }
 }
diff --git a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/uxr/DrawableStateSeekBar.java b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/uxr/DrawableStateSeekBar.java
new file mode 100644
index 0000000..8df0366
--- /dev/null
+++ b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/uxr/DrawableStateSeekBar.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.ui.uxr;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.SeekBar;
+
+import androidx.annotation.Nullable;
+
+/**
+ * A {@link SeekBar} that implements {@link DrawableStateView}, for allowing additional states
+ * such as ux restriction.
+ */
+public class DrawableStateSeekBar extends SeekBar implements DrawableStateView {
+    private DrawableStateUtil mUtil;
+
+    public DrawableStateSeekBar(Context context) {
+        super(context);
+    }
+
+    public DrawableStateSeekBar(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public DrawableStateSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    public DrawableStateSeekBar(Context context, AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    @Override
+    public void setExtraDrawableState(@Nullable int[] stateToAdd, @Nullable int[] stateToRemove) {
+        if (mUtil == null) {
+            mUtil = new DrawableStateUtil(this);
+        }
+        mUtil.setExtraDrawableState(stateToAdd, stateToRemove);
+    }
+
+    @Override
+    public int[] onCreateDrawableState(int extraSpace) {
+        if (mUtil == null) {
+            mUtil = new DrawableStateUtil(this);
+        }
+        return mUtil.onCreateDrawableState(extraSpace, space -> super.onCreateDrawableState(space));
+    }
+}
diff --git a/car-ui-lib/car-ui-lib/src/main/res-overlayable/values/overlayable.xml b/car-ui-lib/car-ui-lib/src/main/res-overlayable/values/overlayable.xml
index 4682c96..9c077b3 100644
--- a/car-ui-lib/car-ui-lib/src/main/res-overlayable/values/overlayable.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res-overlayable/values/overlayable.xml
@@ -1,5 +1,5 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<!--Copyright (C) 2021 The Android Open Source Project
+<!--Copyright (C) 2022 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.
@@ -497,6 +497,7 @@
       <item type="layout" name="car_ui_preference_dropdown"/>
       <item type="layout" name="car_ui_preference_fragment"/>
       <item type="layout" name="car_ui_preference_fragment_with_toolbar"/>
+      <item type="layout" name="car_ui_preference_primary_switch"/>
       <item type="layout" name="car_ui_preference_two_action_icon"/>
       <item type="layout" name="car_ui_preference_two_action_switch"/>
       <item type="layout" name="car_ui_preference_two_action_text"/>
diff --git a/car-qc-lib/AndroidManifest.xml b/car-ui-lib/car-ui-lib/src/main/res-private/color/car_ui_preference_primary_switch_background_color.xml
similarity index 67%
rename from car-qc-lib/AndroidManifest.xml
rename to car-ui-lib/car-ui-lib/src/main/res-private/color/car_ui_preference_primary_switch_background_color.xml
index 166d9c0..3c93840 100644
--- a/car-qc-lib/AndroidManifest.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res-private/color/car_ui_preference_primary_switch_background_color.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2021 The Android Open Source Project
+  ~ Copyright (C) 2022 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.
@@ -14,6 +14,9 @@
   ~ 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.qc">
-</manifest>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_activated="false"
+        android:color="#202124"/>
+    <item android:color="?android:attr/colorAccent"
+        android:alpha="0.24"/>
+</selector>
diff --git a/car-ui-lib/car-ui-lib/src/main/res-private/drawable/car_ui_preference_primary_switch_background.xml b/car-ui-lib/car-ui-lib/src/main/res-private/drawable/car_ui_preference_primary_switch_background.xml
new file mode 100644
index 0000000..95f4e0c
--- /dev/null
+++ b/car-ui-lib/car-ui-lib/src/main/res-private/drawable/car_ui_preference_primary_switch_background.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2022 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:gravity="center">
+        <shape android:shape="rectangle">
+            <corners android:radius="24dp" />
+            <solid android:color="@color/car_ui_preference_primary_switch_background_color" />
+        </shape>
+    </item>
+    <item android:drawable="@drawable/car_ui_preference_primary_switch_rotary_highlight" />
+</layer-list>
diff --git a/car-qc-lib/res/drawable/qc_toggle_rotary_background.xml b/car-ui-lib/car-ui-lib/src/main/res-private/drawable/car_ui_preference_primary_switch_rotary_highlight.xml
similarity index 63%
rename from car-qc-lib/res/drawable/qc_toggle_rotary_background.xml
rename to car-ui-lib/car-ui-lib/src/main/res-private/drawable/car_ui_preference_primary_switch_rotary_highlight.xml
index 406c44c..af43b0e 100644
--- a/car-qc-lib/res/drawable/qc_toggle_rotary_background.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res-private/drawable/car_ui_preference_primary_switch_rotary_highlight.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2021 The Android Open Source Project
+  ~ Copyright 2022 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.
@@ -17,18 +17,23 @@
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_focused="true" android:state_pressed="true">
         <shape android:shape="rectangle">
-            <solid android:color="@color/car_ui_rotary_focus_pressed_fill_secondary_color"/>
-            <stroke android:width="@dimen/car_ui_rotary_focus_pressed_stroke_width"
-                    android:color="@color/car_ui_rotary_focus_pressed_stroke_secondary_color"/>
-            <corners android:radius="@dimen/qc_toggle_rotary_background_radius" />
+            <corners android:radius="24dp" />
+            <solid android:color="@color/car_ui_rotary_focus_pressed_fill_color" />
+            <stroke
+                android:width="@dimen/car_ui_rotary_focus_pressed_stroke_width"
+                android:color="@color/car_ui_rotary_focus_pressed_stroke_color" />
         </shape>
     </item>
     <item android:state_focused="true">
         <shape android:shape="rectangle">
-            <solid android:color="@color/car_ui_rotary_focus_fill_secondary_color"/>
-            <stroke android:width="@dimen/car_ui_rotary_focus_stroke_width"
-                    android:color="@color/car_ui_rotary_focus_stroke_secondary_color"/>
-            <corners android:radius="@dimen/qc_toggle_rotary_background_radius" />
+            <corners android:radius="24dp" />
+            <solid android:color="@color/car_ui_rotary_focus_fill_color" />
+            <stroke
+                android:width="@dimen/car_ui_rotary_focus_stroke_width"
+                android:color="@color/car_ui_rotary_focus_stroke_color" />
         </shape>
     </item>
-</selector>
\ No newline at end of file
+    <item>
+        <ripple android:color="?android:attr/colorControlHighlight" />
+    </item>
+</selector>
diff --git a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_primary_switch.xml b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_primary_switch.xml
new file mode 100644
index 0000000..a3b5f63
--- /dev/null
+++ b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_primary_switch.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2022 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.
+-->
+
+<com.android.car.ui.uxr.DrawableStateRelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/car_ui_preference_primary_switch_background"
+    android:clipToPadding="false"
+    android:minHeight="?android:attr/listPreferredItemHeightSmall"
+    android:tag="carUiPreference"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart">
+
+    <com.android.car.ui.uxr.DrawableStateImageView
+        android:id="@android:id/icon"
+        android:layout_width="@dimen/car_ui_preference_icon_size"
+        android:layout_height="@dimen/car_ui_preference_icon_size"
+        android:layout_alignParentStart="true"
+        android:layout_centerVertical="true"
+        android:layout_marginBottom="@dimen/car_ui_preference_content_margin_bottom"
+        android:layout_marginEnd="@dimen/car_ui_preference_icon_margin_end"
+        android:layout_marginTop="@dimen/car_ui_preference_content_margin_top"
+        android:scaleType="fitCenter"
+        style="@style/Preference.CarUi.Icon"/>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_marginBottom="@dimen/car_ui_preference_content_margin_bottom"
+        android:layout_marginTop="@dimen/car_ui_preference_content_margin_top"
+        android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"
+        android:layout_toEndOf="@android:id/icon"
+        android:layout_toStartOf="@android:id/widget_frame"
+        android:orientation="vertical">
+
+        <com.android.car.ui.uxr.DrawableStateTextView
+            android:id="@android:id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:textAppearance="@style/TextAppearance.CarUi.PreferenceTitle"/>
+
+        <com.android.car.ui.uxr.DrawableStateTextView
+            android:id="@android:id/summary"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textAppearance="@style/TextAppearance.CarUi.PreferenceSummary"/>
+
+    </LinearLayout>
+
+    <!-- Preference should place its actual preference widget here. -->
+    <FrameLayout
+        android:id="@android:id/widget_frame"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentEnd="true"
+        android:layout_centerVertical="true"/>
+
+</com.android.car.ui.uxr.DrawableStateRelativeLayout>
diff --git a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_icon.xml b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_icon.xml
index c5c4fee..aba8279 100644
--- a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_icon.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_icon.xml
@@ -25,7 +25,7 @@
 
     <com.android.car.ui.uxr.DrawableStateConstraintLayout
         android:id="@+id/car_ui_first_action_container"
-        android:layout_height="0dp"
+        android:layout_height="wrap_content"
         android:layout_width="0dp"
         android:background="?android:attr/selectableItemBackground"
         android:paddingStart="?android:attr/listPreferredItemPaddingStart"
@@ -76,7 +76,7 @@
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/car_ui_second_action_container"
-        android:layout_height="0dp"
+        android:layout_height="wrap_content"
         android:layout_width="wrap_content"
         app:layout_constraintStart_toEndOf="@id/car_ui_first_action_container"
         app:layout_constraintEnd_toEndOf="parent"
diff --git a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_switch.xml b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_switch.xml
index 3d7f6fa..82e1772 100644
--- a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_switch.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_switch.xml
@@ -25,7 +25,7 @@
 
     <com.android.car.ui.uxr.DrawableStateConstraintLayout
         android:id="@+id/car_ui_first_action_container"
-        android:layout_height="0dp"
+        android:layout_height="wrap_content"
         android:layout_width="0dp"
         android:background="?android:attr/selectableItemBackground"
         android:paddingStart="?android:attr/listPreferredItemPaddingStart"
@@ -76,7 +76,7 @@
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/car_ui_second_action_container"
-        android:layout_height="0dp"
+        android:layout_height="wrap_content"
         android:layout_width="wrap_content"
         app:layout_constraintStart_toEndOf="@id/car_ui_first_action_container"
         app:layout_constraintEnd_toEndOf="parent"
diff --git a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text.xml b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text.xml
index 6f568c0..0aab5d2 100644
--- a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text.xml
@@ -25,7 +25,7 @@
 
     <com.android.car.ui.uxr.DrawableStateConstraintLayout
         android:id="@+id/car_ui_first_action_container"
-        android:layout_height="0dp"
+        android:layout_height="wrap_content"
         android:layout_width="0dp"
         android:background="?android:attr/selectableItemBackground"
         android:paddingStart="?android:attr/listPreferredItemPaddingStart"
@@ -76,7 +76,7 @@
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/car_ui_second_action_container"
-        android:layout_height="0dp"
+        android:layout_height="wrap_content"
         android:layout_width="wrap_content"
         android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
         app:layout_constraintStart_toEndOf="@id/car_ui_first_action_container"
diff --git a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text_borderless.xml b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text_borderless.xml
index d329d98..0b00b1c 100644
--- a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text_borderless.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text_borderless.xml
@@ -25,7 +25,7 @@
 
     <com.android.car.ui.uxr.DrawableStateConstraintLayout
         android:id="@+id/car_ui_first_action_container"
-        android:layout_height="0dp"
+        android:layout_height="wrap_content"
         android:layout_width="0dp"
         android:background="?android:attr/selectableItemBackground"
         android:paddingStart="?android:attr/listPreferredItemPaddingStart"
@@ -76,7 +76,7 @@
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/car_ui_second_action_container"
-        android:layout_height="0dp"
+        android:layout_height="wrap_content"
         android:layout_width="wrap_content"
         android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
         app:layout_constraintStart_toEndOf="@id/car_ui_first_action_container"
diff --git a/car-ui-lib/paintbooth/src/main/res/values/strings.xml b/car-ui-lib/paintbooth/src/main/res/values/strings.xml
index fbd4fbc..cc724db 100644
--- a/car-ui-lib/paintbooth/src/main/res/values/strings.xml
+++ b/car-ui-lib/paintbooth/src/main/res/values/strings.xml
@@ -77,6 +77,8 @@
 
   <!-- Title of a switch preference [CHAR_LIMIT=28]-->
   <string name="title_switch_preference">Switch preference</string>
+  <!-- Title of a primary switch preference [CHAR_LIMIT=28]-->
+  <string name="title_primary_switch_preference">Primary switch preference</string>
   <!-- Summary of a switch preference [CHAR_LIMIT=78]-->
   <string name="summary_switch_preference">Tap anywhere in this preference to toggle state</string>
 
diff --git a/car-ui-lib/paintbooth/src/main/res/xml/preference_samples.xml b/car-ui-lib/paintbooth/src/main/res/xml/preference_samples.xml
index 4cc4ada..25f217b 100644
--- a/car-ui-lib/paintbooth/src/main/res/xml/preference_samples.xml
+++ b/car-ui-lib/paintbooth/src/main/res/xml/preference_samples.xml
@@ -77,6 +77,11 @@
             android:summary="@string/summary_switch_preference"
             android:title="@string/title_switch_preference"/>
 
+        <com.android.car.ui.preference.CarUiPrimarySwitchPreference
+            android:key="primaryswitch"
+            android:summary="@string/summary_switch_preference"
+            android:title="@string/title_primary_switch_preference"/>
+
         <com.android.car.ui.preference.CarUiTwoActionPreference
             android:key="twoaction"
             android:summary="@string/summary_deprecated_twoaction_preference"
diff --git a/car-ui-lib/tests/apitest/current.xml b/car-ui-lib/tests/apitest/current.xml
index 3ed394c..50e2a47 100644
--- a/car-ui-lib/tests/apitest/current.xml
+++ b/car-ui-lib/tests/apitest/current.xml
@@ -406,6 +406,7 @@
   <public type="layout" name="car_ui_preference_dropdown"/>
   <public type="layout" name="car_ui_preference_fragment"/>
   <public type="layout" name="car_ui_preference_fragment_with_toolbar"/>
+  <public type="layout" name="car_ui_preference_primary_switch"/>
   <public type="layout" name="car_ui_preference_two_action_icon"/>
   <public type="layout" name="car_ui_preference_two_action_switch"/>
   <public type="layout" name="car_ui_preference_two_action_text"/>
