Merge Android 12 QPR 3

Bug: 236045730
Merged-In: Id99ebcc6ae693f613dae3ddbdc8dbb28855171de
Change-Id: I379a1807b3ce4a802e7458cbe0655c7240159b64
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/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 da7ee1a..6bcb994 100644
--- a/car-ui-lib/Android.bp
+++ b/car-ui-lib/Android.bp
@@ -159,7 +159,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"/>