Merge commit '0fb4e0fe9f5a1dca37eb3be2ab279601af2336de' of sso://googleplex-android/platform/packages/apps/Car/libs into HEAD
Change-Id: Ib3b335653a6ad145692f0e1bf895b889115eb607
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.
[email protected]
[email protected]
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
[email protected]
diff --git a/car-broadcastradio-support/res/values-af/strings.xml b/car-broadcastradio-support/res/values-af/strings.xml
deleted file mode 100644
index 0c08586..0000000
--- a/car-broadcastradio-support/res/values-af/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stasies"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Gunstelinge"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-am/strings.xml b/car-broadcastradio-support/res/values-am/strings.xml
deleted file mode 100644
index 81b128a..0000000
--- a/car-broadcastradio-support/res/values-am/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"ኤኤም"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"ኤፍኤም"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"ጣቢያዎች"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"ተወዳጆች"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ar/strings.xml b/car-broadcastradio-support/res/values-ar/strings.xml
deleted file mode 100644
index 129c8c5..0000000
--- a/car-broadcastradio-support/res/values-ar/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"المحطات"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"المفضّلة"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-as/strings.xml b/car-broadcastradio-support/res/values-as/strings.xml
deleted file mode 100644
index 862e9bb..0000000
--- a/car-broadcastradio-support/res/values-as/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"কেন্দ্ৰসমূহ"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"প্ৰিয় বস্তুসমূহ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-az/strings.xml b/car-broadcastradio-support/res/values-az/strings.xml
deleted file mode 100644
index 3b40ff9..0000000
--- a/car-broadcastradio-support/res/values-az/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stansiyalar"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Sevimlilər"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-b+sr+Latn/strings.xml b/car-broadcastradio-support/res/values-b+sr+Latn/strings.xml
deleted file mode 100644
index e29e90e..0000000
--- a/car-broadcastradio-support/res/values-b+sr+Latn/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stanice"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Omiljeno"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-be/strings.xml b/car-broadcastradio-support/res/values-be/strings.xml
deleted file mode 100644
index cde54f4..0000000
--- a/car-broadcastradio-support/res/values-be/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Радыёстанцыі"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Абранае"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-bg/strings.xml b/car-broadcastradio-support/res/values-bg/strings.xml
deleted file mode 100644
index 6d7b2a0..0000000
--- a/car-broadcastradio-support/res/values-bg/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"Цифрово радиоразпръскване"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Станции"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Любими"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-bn/strings.xml b/car-broadcastradio-support/res/values-bn/strings.xml
deleted file mode 100644
index 245ce98..0000000
--- a/car-broadcastradio-support/res/values-bn/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"স্টেশন"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"পছন্দসই"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-bs/strings.xml b/car-broadcastradio-support/res/values-bs/strings.xml
deleted file mode 100644
index e29e90e..0000000
--- a/car-broadcastradio-support/res/values-bs/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stanice"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Omiljeno"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ca/strings.xml b/car-broadcastradio-support/res/values-ca/strings.xml
deleted file mode 100644
index 3737632..0000000
--- a/car-broadcastradio-support/res/values-ca/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Emissores"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Preferides"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-cs/strings.xml b/car-broadcastradio-support/res/values-cs/strings.xml
deleted file mode 100644
index db20752..0000000
--- a/car-broadcastradio-support/res/values-cs/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stanice"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Oblíbené"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-da/strings.xml b/car-broadcastradio-support/res/values-da/strings.xml
deleted file mode 100644
index 46d1603..0000000
--- a/car-broadcastradio-support/res/values-da/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Kanaler"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favoritter"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-de/strings.xml b/car-broadcastradio-support/res/values-de/strings.xml
deleted file mode 100644
index c6e2e9f..0000000
--- a/car-broadcastradio-support/res/values-de/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"MW"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"UKW"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Sender"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favoriten"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-el/strings.xml b/car-broadcastradio-support/res/values-el/strings.xml
deleted file mode 100644
index f5452ec..0000000
--- a/car-broadcastradio-support/res/values-el/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Σταθμοί"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Αγαπημένα"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-en-rAU/strings.xml b/car-broadcastradio-support/res/values-en-rAU/strings.xml
deleted file mode 100644
index 806c9c8..0000000
--- a/car-broadcastradio-support/res/values-en-rAU/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"a.m."</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stations"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favourites"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-en-rCA/strings.xml b/car-broadcastradio-support/res/values-en-rCA/strings.xml
deleted file mode 100644
index 806c9c8..0000000
--- a/car-broadcastradio-support/res/values-en-rCA/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"a.m."</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stations"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favourites"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-en-rGB/strings.xml b/car-broadcastradio-support/res/values-en-rGB/strings.xml
deleted file mode 100644
index 806c9c8..0000000
--- a/car-broadcastradio-support/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"a.m."</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stations"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favourites"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-en-rIN/strings.xml b/car-broadcastradio-support/res/values-en-rIN/strings.xml
deleted file mode 100644
index 806c9c8..0000000
--- a/car-broadcastradio-support/res/values-en-rIN/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"a.m."</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stations"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favourites"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-en-rXC/strings.xml b/car-broadcastradio-support/res/values-en-rXC/strings.xml
deleted file mode 100644
index b06db6c..0000000
--- a/car-broadcastradio-support/res/values-en-rXC/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stations"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favorites"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-es-rUS/strings.xml b/car-broadcastradio-support/res/values-es-rUS/strings.xml
deleted file mode 100644
index 4862ab2..0000000
--- a/car-broadcastradio-support/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Estaciones"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favoritos"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-es/strings.xml b/car-broadcastradio-support/res/values-es/strings.xml
deleted file mode 100644
index f0f383e..0000000
--- a/car-broadcastradio-support/res/values-es/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Emisoras"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favoritos"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-et/strings.xml b/car-broadcastradio-support/res/values-et/strings.xml
deleted file mode 100644
index 810c07e..0000000
--- a/car-broadcastradio-support/res/values-et/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Jaamad"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Lemmikud"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-eu/strings.xml b/car-broadcastradio-support/res/values-eu/strings.xml
deleted file mode 100644
index 999d986..0000000
--- a/car-broadcastradio-support/res/values-eu/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Kateak"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Gogokoak"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-fa/strings.xml b/car-broadcastradio-support/res/values-fa/strings.xml
deleted file mode 100644
index 1828fc3..0000000
--- a/car-broadcastradio-support/res/values-fa/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"ایستگاهها"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"موارد دلخواه"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-fi/strings.xml b/car-broadcastradio-support/res/values-fi/strings.xml
deleted file mode 100644
index a1b60db..0000000
--- a/car-broadcastradio-support/res/values-fi/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Kanavat"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Suosikit"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-fr-rCA/strings.xml b/car-broadcastradio-support/res/values-fr-rCA/strings.xml
deleted file mode 100644
index 89bd122..0000000
--- a/car-broadcastradio-support/res/values-fr-rCA/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stations"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favorites"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-fr/strings.xml b/car-broadcastradio-support/res/values-fr/strings.xml
deleted file mode 100644
index f12123f..0000000
--- a/car-broadcastradio-support/res/values-fr/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Radios"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favoris"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-gl/strings.xml b/car-broadcastradio-support/res/values-gl/strings.xml
deleted file mode 100644
index beccab0..0000000
--- a/car-broadcastradio-support/res/values-gl/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Emisoras"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Programas favoritos"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-gu/strings.xml b/car-broadcastradio-support/res/values-gu/strings.xml
deleted file mode 100644
index 8da5f9d..0000000
--- a/car-broadcastradio-support/res/values-gu/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"સ્ટેશન"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"મનપસંદ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-hi/strings.xml b/car-broadcastradio-support/res/values-hi/strings.xml
deleted file mode 100644
index 230e18b..0000000
--- a/car-broadcastradio-support/res/values-hi/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"एएम रेडियो"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"एफ़एम रेडियो"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"डीएबी"</string>
- <string name="program_list_text" msgid="4414150317304422313">"स्टेशन"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"पसंदीदा"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-hr/strings.xml b/car-broadcastradio-support/res/values-hr/strings.xml
deleted file mode 100644
index 63cc855..0000000
--- a/car-broadcastradio-support/res/values-hr/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Postaje"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favoriti"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-hu/strings.xml b/car-broadcastradio-support/res/values-hu/strings.xml
deleted file mode 100644
index 5a16d62..0000000
--- a/car-broadcastradio-support/res/values-hu/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Állomások"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Kedvencek"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-hy/strings.xml b/car-broadcastradio-support/res/values-hy/strings.xml
deleted file mode 100644
index 77efc29..0000000
--- a/car-broadcastradio-support/res/values-hy/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Ռադիոկայաններ"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Ընտրանի"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-in/strings.xml b/car-broadcastradio-support/res/values-in/strings.xml
deleted file mode 100644
index e40e53f..0000000
--- a/car-broadcastradio-support/res/values-in/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stasiun"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favorit"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-is/strings.xml b/car-broadcastradio-support/res/values-is/strings.xml
deleted file mode 100644
index b7e9135..0000000
--- a/car-broadcastradio-support/res/values-is/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stöðvar"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Uppáhald"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-it/strings.xml b/car-broadcastradio-support/res/values-it/strings.xml
deleted file mode 100644
index eef0a6e..0000000
--- a/car-broadcastradio-support/res/values-it/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stazioni"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Preferiti"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-iw/strings.xml b/car-broadcastradio-support/res/values-iw/strings.xml
deleted file mode 100644
index e990b26..0000000
--- a/car-broadcastradio-support/res/values-iw/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB (Digital Audio Broadcasting)"</string>
- <string name="program_list_text" msgid="4414150317304422313">"תחנות"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"מועדפים"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ja/strings.xml b/car-broadcastradio-support/res/values-ja/strings.xml
deleted file mode 100644
index 21582d0..0000000
--- a/car-broadcastradio-support/res/values-ja/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"ステーション"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"お気に入り"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ka/strings.xml b/car-broadcastradio-support/res/values-ka/strings.xml
deleted file mode 100644
index 2f26b0a..0000000
--- a/car-broadcastradio-support/res/values-ka/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"ციფრული აუდიომაუწყებლობა"</string>
- <string name="program_list_text" msgid="4414150317304422313">"სადგურები"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"რჩეულები"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-kk/strings.xml b/car-broadcastradio-support/res/values-kk/strings.xml
deleted file mode 100644
index 740afce..0000000
--- a/car-broadcastradio-support/res/values-kk/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Станциялар"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Таңдаулылар"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-km/strings.xml b/car-broadcastradio-support/res/values-km/strings.xml
deleted file mode 100644
index be70353..0000000
--- a/car-broadcastradio-support/res/values-km/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"ស្ថានីយ"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"សំណព្វ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-kn/strings.xml b/car-broadcastradio-support/res/values-kn/strings.xml
deleted file mode 100644
index 9dadc54..0000000
--- a/car-broadcastradio-support/res/values-kn/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"ಬೆಳಿಗ್ಗೆ"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"ಸ್ಟೇಶನ್ಗಳು"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"ಮೆಚ್ಚಿನವುಗಳು"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ko/strings.xml b/car-broadcastradio-support/res/values-ko/strings.xml
deleted file mode 100644
index abebfa4..0000000
--- a/car-broadcastradio-support/res/values-ko/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"채널"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"즐겨찾기"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ky/strings.xml b/car-broadcastradio-support/res/values-ky/strings.xml
deleted file mode 100644
index ee67f46..0000000
--- a/car-broadcastradio-support/res/values-ky/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Станциялар"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Тандалмалар"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-lo/strings.xml b/car-broadcastradio-support/res/values-lo/strings.xml
deleted file mode 100644
index fbfe882..0000000
--- a/car-broadcastradio-support/res/values-lo/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"ສະຖານີ"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"ລາຍການທີ່ມັກ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-lt/strings.xml b/car-broadcastradio-support/res/values-lt/strings.xml
deleted file mode 100644
index 6a68328..0000000
--- a/car-broadcastradio-support/res/values-lt/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stotys"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Mėgstamiausi"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-lv/strings.xml b/car-broadcastradio-support/res/values-lv/strings.xml
deleted file mode 100644
index 75db93a..0000000
--- a/car-broadcastradio-support/res/values-lv/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Programmas"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Izlase"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-mk/strings.xml b/car-broadcastradio-support/res/values-mk/strings.xml
deleted file mode 100644
index c7410af..0000000
--- a/car-broadcastradio-support/res/values-mk/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Станици"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Омилени"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ml/strings.xml b/car-broadcastradio-support/res/values-ml/strings.xml
deleted file mode 100644
index 498bfd7..0000000
--- a/car-broadcastradio-support/res/values-ml/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"രാവിലെ"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"സ്റ്റേഷനുകള്"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"പ്രിയപ്പെട്ടവ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-mn/strings.xml b/car-broadcastradio-support/res/values-mn/strings.xml
deleted file mode 100644
index 3deca28..0000000
--- a/car-broadcastradio-support/res/values-mn/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"ӨГЛӨӨ"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Станцууд"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Дуртай"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-mr/strings.xml b/car-broadcastradio-support/res/values-mr/strings.xml
deleted file mode 100644
index 0fc95e4..0000000
--- a/car-broadcastradio-support/res/values-mr/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"स्टेशन"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"आवडीचे"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ms/strings.xml b/car-broadcastradio-support/res/values-ms/strings.xml
deleted file mode 100644
index 257cb5e..0000000
--- a/car-broadcastradio-support/res/values-ms/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stesen"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Kegemaran"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-my/strings.xml b/car-broadcastradio-support/res/values-my/strings.xml
deleted file mode 100644
index 692d19d..0000000
--- a/car-broadcastradio-support/res/values-my/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"အသံလွှင့်ရုံများ"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"အသုံးအများဆုံးများ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-nb/strings.xml b/car-broadcastradio-support/res/values-nb/strings.xml
deleted file mode 100644
index 79544cb..0000000
--- a/car-broadcastradio-support/res/values-nb/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stasjoner"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favoritter"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ne/strings.xml b/car-broadcastradio-support/res/values-ne/strings.xml
deleted file mode 100644
index ee1887b..0000000
--- a/car-broadcastradio-support/res/values-ne/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"पूर्वाह्न"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"एफएम"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"स्टेसनहरू"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"मन पर्ने कार्यक्रमहरू"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-nl/strings.xml b/car-broadcastradio-support/res/values-nl/strings.xml
deleted file mode 100644
index 2f1a5e1..0000000
--- a/car-broadcastradio-support/res/values-nl/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Zenders"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favorieten"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-or/strings.xml b/car-broadcastradio-support/res/values-or/strings.xml
deleted file mode 100644
index ab448c8..0000000
--- a/car-broadcastradio-support/res/values-or/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"ଷ୍ଟେଶନ୍"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"ପସନ୍ଦର"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-pa/strings.xml b/car-broadcastradio-support/res/values-pa/strings.xml
deleted file mode 100644
index 5f7ce46..0000000
--- a/car-broadcastradio-support/res/values-pa/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"ਸਟੇਸ਼ਨ"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"ਮਨਪਸੰਦ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-pl/strings.xml b/car-broadcastradio-support/res/values-pl/strings.xml
deleted file mode 100644
index 1fc4d67..0000000
--- a/car-broadcastradio-support/res/values-pl/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stacje"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Ulubione"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-pt-rPT/strings.xml b/car-broadcastradio-support/res/values-pt-rPT/strings.xml
deleted file mode 100644
index a4b120a..0000000
--- a/car-broadcastradio-support/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Estações"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favoritas"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-pt/strings.xml b/car-broadcastradio-support/res/values-pt/strings.xml
deleted file mode 100644
index 9d72f03..0000000
--- a/car-broadcastradio-support/res/values-pt/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Estações"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favoritos"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ro/strings.xml b/car-broadcastradio-support/res/values-ro/strings.xml
deleted file mode 100644
index 7ab0b50..0000000
--- a/car-broadcastradio-support/res/values-ro/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Posturi"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Preferate"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ru/strings.xml b/car-broadcastradio-support/res/values-ru/strings.xml
deleted file mode 100644
index 2fed0f4..0000000
--- a/car-broadcastradio-support/res/values-ru/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"Цифровое радио"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Радиостанции"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Избранное"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-si/strings.xml b/car-broadcastradio-support/res/values-si/strings.xml
deleted file mode 100644
index 53f72c6..0000000
--- a/car-broadcastradio-support/res/values-si/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"නාලිකා"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"ප්රියතම"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-sk/strings.xml b/car-broadcastradio-support/res/values-sk/strings.xml
deleted file mode 100644
index fcdab92..0000000
--- a/car-broadcastradio-support/res/values-sk/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stanice"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Obľúbené"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-sl/strings.xml b/car-broadcastradio-support/res/values-sl/strings.xml
deleted file mode 100644
index f0d3770..0000000
--- a/car-broadcastradio-support/res/values-sl/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Postaje"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Priljubljene"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-sq/strings.xml b/car-broadcastradio-support/res/values-sq/strings.xml
deleted file mode 100644
index a4c1c95..0000000
--- a/car-broadcastradio-support/res/values-sq/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stacionet"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Të preferuarat"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-sr/strings.xml b/car-broadcastradio-support/res/values-sr/strings.xml
deleted file mode 100644
index 8321b8c..0000000
--- a/car-broadcastradio-support/res/values-sr/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Станице"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Омиљено"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-sv/strings.xml b/car-broadcastradio-support/res/values-sv/strings.xml
deleted file mode 100644
index 5475b03..0000000
--- a/car-broadcastradio-support/res/values-sv/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Kanaler"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favoriter"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-sw/strings.xml b/car-broadcastradio-support/res/values-sw/strings.xml
deleted file mode 100644
index 879df73..0000000
--- a/car-broadcastradio-support/res/values-sw/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Stesheni"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Unavyopenda"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ta/strings.xml b/car-broadcastradio-support/res/values-ta/strings.xml
deleted file mode 100644
index 6b91b37..0000000
--- a/car-broadcastradio-support/res/values-ta/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"நிலையங்கள்"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"பிடித்தவை"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-te/strings.xml b/car-broadcastradio-support/res/values-te/strings.xml
deleted file mode 100644
index 864e222..0000000
--- a/car-broadcastradio-support/res/values-te/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"స్టేషన్లు"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"ఇష్టమైనవి"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-th/strings.xml b/car-broadcastradio-support/res/values-th/strings.xml
deleted file mode 100644
index 0370e76..0000000
--- a/car-broadcastradio-support/res/values-th/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"สถานี"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"รายการโปรด"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-tl/strings.xml b/car-broadcastradio-support/res/values-tl/strings.xml
deleted file mode 100644
index 932e133..0000000
--- a/car-broadcastradio-support/res/values-tl/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Mga Istasyon"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Mga Paborito"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-tr/strings.xml b/car-broadcastradio-support/res/values-tr/strings.xml
deleted file mode 100644
index 136387f..0000000
--- a/car-broadcastradio-support/res/values-tr/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"İstasyonlar"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Favoriler"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-uk/strings.xml b/car-broadcastradio-support/res/values-uk/strings.xml
deleted file mode 100644
index cdd259a..0000000
--- a/car-broadcastradio-support/res/values-uk/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Станції"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Вибране"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-ur/strings.xml b/car-broadcastradio-support/res/values-ur/strings.xml
deleted file mode 100644
index a511d89..0000000
--- a/car-broadcastradio-support/res/values-ur/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"اسٹیشنز"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"پسندیدہ"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-uz/strings.xml b/car-broadcastradio-support/res/values-uz/strings.xml
deleted file mode 100644
index bfb89d7..0000000
--- a/car-broadcastradio-support/res/values-uz/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"Raqamli radio"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Radiostansiyalar"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Saralangan"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-vi/strings.xml b/car-broadcastradio-support/res/values-vi/strings.xml
deleted file mode 100644
index 067c179..0000000
--- a/car-broadcastradio-support/res/values-vi/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"Phát thanh kỹ thuật số"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Đài"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Đài yêu thích"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-zh-rCN/strings.xml b/car-broadcastradio-support/res/values-zh-rCN/strings.xml
deleted file mode 100644
index 1789a58..0000000
--- a/car-broadcastradio-support/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"电台"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"收藏"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-zh-rHK/strings.xml b/car-broadcastradio-support/res/values-zh-rHK/strings.xml
deleted file mode 100644
index bb596c2..0000000
--- a/car-broadcastradio-support/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"數碼聲音廣播"</string>
- <string name="program_list_text" msgid="4414150317304422313">"電台"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"收藏"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-zh-rTW/strings.xml b/car-broadcastradio-support/res/values-zh-rTW/strings.xml
deleted file mode 100644
index 0ba44bc..0000000
--- a/car-broadcastradio-support/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"電台"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"收藏"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values-zu/strings.xml b/car-broadcastradio-support/res/values-zu/strings.xml
deleted file mode 100644
index dd5578b..0000000
--- a/car-broadcastradio-support/res/values-zu/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="radio_am_text" msgid="571324921988967868">"AM"</string>
- <string name="radio_fm_text" msgid="1973045042281933494">"FM"</string>
- <string name="radio_dab_text" msgid="8456449462266648979">"I-DAB"</string>
- <string name="program_list_text" msgid="4414150317304422313">"Iziteshi"</string>
- <string name="favorites_list_text" msgid="7829827713977109155">"Izintandokazi"</string>
-</resources>
diff --git a/car-broadcastradio-support/res/values/strings.xml b/car-broadcastradio-support/res/values/strings.xml
deleted file mode 100644
index 9151c21..0000000
--- a/car-broadcastradio-support/res/values/strings.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Text to denote the AM radio band. -->
- <string name="radio_am_text">AM</string>
-
- <!-- Text to denote the FM radio band. -->
- <string name="radio_fm_text">FM</string>
-
- <!-- Text to denote the DAB radio band. -->
- <string name="radio_dab_text">DAB</string>
-
- <!-- Text to denote the list of programs (stations). -->
- <string name="program_list_text">Stations</string>
-
- <!-- Text to denote the list of favorite programs (stations). -->
- <string name="favorites_list_text">Favorites</string>
-</resources>
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.aidl b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.aidl
deleted file mode 100644
index 99c9a93..0000000
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.aidl
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.broadcastradio.support;
-
-parcelable Program;
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.java
deleted file mode 100644
index af57c90..0000000
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.broadcastradio.support;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.graphics.Bitmap;
-import android.hardware.radio.ProgramSelector;
-import android.hardware.radio.RadioManager.ProgramInfo;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.android.car.broadcastradio.support.platform.ProgramInfoExt;
-
-import java.util.Objects;
-
-/**
- * Holds storable information about a Program.
- *
- * Contrary to {@link android.hardware.radio.RadioManager.ProgramInfo}, it doesn't hold runtime
- * information, like artist or signal quality.
- */
-public final class Program implements Parcelable {
- private final @NonNull ProgramSelector mSelector;
- private final @NonNull String mName;
-
- public Program(@NonNull ProgramSelector selector, @NonNull String name) {
- mSelector = Objects.requireNonNull(selector);
- mName = Objects.requireNonNull(name);
- }
-
- public @NonNull ProgramSelector getSelector() {
- return mSelector;
- }
-
- public @NonNull String getName() {
- return mName;
- }
-
- /** @hide */
- public @Nullable Bitmap getIcon() {
- // TODO(b/73950974): implement saving icons
- return null;
- }
-
- @Override
- public String toString() {
- return "Program(\"" + mName + "\", " + mSelector + ")";
- }
-
- @Override
- public int hashCode() {
- return mSelector.hashCode();
- }
-
- /**
- * Two programs are considered equal if their selectors are equal.
- */
- @Override
- public boolean equals(Object obj) {
- if (this == obj) return true;
- if (!(obj instanceof Program)) return false;
- Program other = (Program) obj;
- return mSelector.equals(other.mSelector);
- }
-
- /**
- * Builds a new {@link Program} object from {@link ProgramInfo}.
- */
- public static @NonNull Program fromProgramInfo(@NonNull ProgramInfo info) {
- return new Program(info.getSelector(), ProgramInfoExt.getProgramName(info, 0));
- }
-
- private Program(Parcel in) {
- mSelector = Objects.requireNonNull(in.readTypedObject(ProgramSelector.CREATOR));
- mName = Objects.requireNonNull(in.readString());
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeTypedObject(mSelector, 0);
- dest.writeString(mName);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- public static final Parcelable.Creator<Program> CREATOR = new Parcelable.Creator<Program>() {
- public Program createFromParcel(Parcel in) {
- return new Program(in);
- }
-
- public Program[] newArray(int size) {
- return new Program[size];
- }
- };
-}
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/media/BrowseTree.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/media/BrowseTree.java
deleted file mode 100644
index 39d23dc..0000000
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/media/BrowseTree.java
+++ /dev/null
@@ -1,505 +0,0 @@
-/**
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.broadcastradio.support.media;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.StringRes;
-import android.graphics.Bitmap;
-import android.hardware.radio.ProgramList;
-import android.hardware.radio.ProgramSelector;
-import android.hardware.radio.RadioManager;
-import android.hardware.radio.RadioManager.BandDescriptor;
-import android.hardware.radio.RadioMetadata;
-import android.media.MediaDescription;
-import android.media.browse.MediaBrowser.MediaItem;
-import android.os.Bundle;
-import android.service.media.MediaBrowserService;
-import android.service.media.MediaBrowserService.BrowserRoot;
-import android.service.media.MediaBrowserService.Result;
-import android.util.Log;
-
-import com.android.car.broadcastradio.support.Program;
-import com.android.car.broadcastradio.support.R;
-import com.android.car.broadcastradio.support.platform.ImageResolver;
-import com.android.car.broadcastradio.support.platform.ProgramInfoExt;
-import com.android.car.broadcastradio.support.platform.ProgramSelectorExt;
-import com.android.car.broadcastradio.support.platform.RadioMetadataExt;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-
-/**
- * Implementation of MediaBrowserService logic regarding browser tree.
- */
-public class BrowseTree {
- private static final String TAG = "BcRadioApp.BrowseTree";
-
- /**
- * Used as a long extra field to indicate the Broadcast Radio folder type of the media item.
- * The value should be one of the following:
- * <ul>
- * <li>{@link #BCRADIO_FOLDER_TYPE_PROGRAMS}</li>
- * <li>{@link #BCRADIO_FOLDER_TYPE_FAVORITES}</li>
- * <li>{@link #BCRADIO_FOLDER_TYPE_BAND}</li>
- * </ul>
- *
- * @see android.media.MediaDescription#getExtras()
- */
- public static final String EXTRA_BCRADIO_FOLDER_TYPE =
- "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE";
-
- /**
- * The type of folder that contains a list of Broadcast Radio programs available
- * to tune at the moment.
- */
- public static final long BCRADIO_FOLDER_TYPE_PROGRAMS = 1;
-
- /**
- * The type of folder that contains a list of Broadcast Radio programs added
- * to favorites (not necessarily available to tune at the moment).
- *
- * If this folder has {@link android.media.browse.MediaBrowser.MediaItem#FLAG_PLAYABLE} flag
- * set, it can be used to play some program from the favorite list (selection depends on the
- * radio app implementation).
- */
- public static final long BCRADIO_FOLDER_TYPE_FAVORITES = 2;
-
- /**
- * The type of folder that contains the list of all Broadcast Radio channels
- * (frequency values valid in the current region) for a given band.
- * Each band (like AM, FM) has its own, separate folder.
- * These lists include all channels, whether or not some program is tunable through it.
- *
- * If this folder has {@link android.media.browse.MediaBrowser.MediaItem#FLAG_PLAYABLE} flag
- * set, it can be used to tune to some channel within a given band (selection depends on the
- * radio app implementation).
- */
- public static final long BCRADIO_FOLDER_TYPE_BAND = 3;
-
- /**
- * Non-localized name of the band.
- *
- * For now, it can only take one of the following values:
- * - AM;
- * - FM;
- * - DAB;
- * - SXM.
- *
- * However, in future releases the list might get extended.
- */
- public static final String EXTRA_BCRADIO_BAND_NAME_EN =
- "android.media.extra.EXTRA_BCRADIO_BAND_NAME_EN";
-
- /**
- * General play intent action.
- *
- * MediaBrowserService of the radio app must handle this command to perform general
- * "play" command. It usually means starting playback of recently tuned station.
- */
- public static final String ACTION_PLAY_BROADCASTRADIO =
- "android.car.intent.action.PLAY_BROADCASTRADIO";
-
- private static final String NODE_ROOT = "root_id";
- public static final String NODE_PROGRAMS = "programs_id";
- public static final String NODE_FAVORITES = "favorites_id";
-
- private static final String NODEPREFIX_BAND = "band:";
- public static final String NODE_BAND_AM = NODEPREFIX_BAND + "am";
- public static final String NODE_BAND_FM = NODEPREFIX_BAND + "fm";
- public static final String NODE_BAND_DAB = NODEPREFIX_BAND + "dab";
-
- private static final String NODEPREFIX_AMFMCHANNEL = "amfm:";
- private static final String NODEPREFIX_PROGRAM = "program:";
-
- private final BrowserRoot mRoot = new BrowserRoot(NODE_ROOT, null);
-
- private final Object mLock = new Object();
- private final @NonNull MediaBrowserService mBrowserService;
- private final @Nullable ImageResolver mImageResolver;
-
- private List<MediaItem> mRootChildren;
-
- private final AmFmChannelList mAmChannels = new AmFmChannelList(
- NODE_BAND_AM, R.string.radio_am_text, "AM");
- private final AmFmChannelList mFmChannels = new AmFmChannelList(
- NODE_BAND_FM, R.string.radio_fm_text, "FM");
- private boolean mDABEnabled;
-
- private final ProgramList.OnCompleteListener mProgramListCompleteListener =
- this::onProgramListUpdated;
- @Nullable private ProgramList mProgramList;
- @Nullable private List<RadioManager.ProgramInfo> mProgramListSnapshot;
- @Nullable private List<MediaItem> mProgramListCache;
- private final List<Runnable> mProgramListTasks = new ArrayList<>();
- private final Map<String, ProgramSelector> mProgramSelectors = new HashMap<>();
-
- @Nullable Set<Program> mFavorites;
- @Nullable private List<MediaItem> mFavoritesCache;
-
- public BrowseTree(@NonNull MediaBrowserService browserService,
- @Nullable ImageResolver imageResolver) {
- mBrowserService = Objects.requireNonNull(browserService);
- mImageResolver = imageResolver;
- }
-
- public BrowserRoot getRoot() {
- return mRoot;
- }
-
- private static MediaItem createChild(MediaDescription.Builder descBuilder,
- String mediaId, String title, ProgramSelector sel, Bitmap icon) {
- MediaDescription desc = descBuilder
- .setMediaId(mediaId)
- .setMediaUri(ProgramSelectorExt.toUri(sel))
- .setTitle(title)
- .setIconBitmap(icon)
- .build();
- return new MediaItem(desc, MediaItem.FLAG_PLAYABLE);
- }
-
- private static MediaItem createFolder(MediaDescription.Builder descBuilder, String mediaId,
- String title, boolean isBrowseable, boolean isPlayable, long folderType,
- Bundle extras) {
- if (extras == null) extras = new Bundle();
- extras.putLong(EXTRA_BCRADIO_FOLDER_TYPE, folderType);
-
- MediaDescription desc = descBuilder
- .setMediaId(mediaId).setTitle(title).setExtras(extras).build();
-
- int flags = 0;
- if (isBrowseable) flags |= MediaItem.FLAG_BROWSABLE;
- if (isPlayable) flags |= MediaItem.FLAG_PLAYABLE;
- return new MediaItem(desc, flags);
- }
-
- /**
- * Sets AM/FM region configuration.
- *
- * This method is meant to be called shortly after initialization, if AM/FM is supported.
- */
- public void setAmFmRegionConfig(@Nullable List<BandDescriptor> amFmBands) {
- List<BandDescriptor> amBands = new ArrayList<>();
- List<BandDescriptor> fmBands = new ArrayList<>();
-
- if (amFmBands != null) {
- for (BandDescriptor band : amFmBands) {
- final int freq = band.getLowerLimit();
- if (ProgramSelectorExt.isAmFrequency(freq)) {
- amBands.add(band);
- } else if (ProgramSelectorExt.isFmFrequency(freq)) {
- fmBands.add(band);
- }
- }
- }
-
- synchronized (mLock) {
- mAmChannels.setBands(amBands);
- mFmChannels.setBands(fmBands);
- mRootChildren = null;
- mBrowserService.notifyChildrenChanged(NODE_ROOT);
- }
- }
-
- /**
- * Configures the BrowseTree to include a DAB node or not
- */
- public void setDABEnabled(boolean enabled) {
- synchronized (mLock) {
- if (mDABEnabled != enabled) {
- mDABEnabled = enabled;
- mRootChildren = null;
- mBrowserService.notifyChildrenChanged(NODE_ROOT);
- }
- }
- }
-
- private void onProgramListUpdated() {
- synchronized (mLock) {
- mProgramListSnapshot = mProgramList.toList();
- mProgramListCache = null;
- mBrowserService.notifyChildrenChanged(NODE_PROGRAMS);
-
- for (Runnable task : mProgramListTasks) {
- task.run();
- }
- mProgramListTasks.clear();
- }
- }
-
- /**
- * Binds program list.
- *
- * This method is meant to be called shortly after opening a new tuner session.
- */
- public void setProgramList(@Nullable ProgramList programList) {
- synchronized (mLock) {
- if (mProgramList != null) {
- mProgramList.removeOnCompleteListener(mProgramListCompleteListener);
- }
- mProgramList = programList;
- if (programList != null) {
- mProgramList.addOnCompleteListener(mProgramListCompleteListener);
- }
- mBrowserService.notifyChildrenChanged(NODE_ROOT);
- }
- }
-
- private List<MediaItem> getPrograms() {
- synchronized (mLock) {
- if (mProgramListSnapshot == null) {
- Log.w(TAG, "There is no snapshot of the program list");
- return null;
- }
-
- if (mProgramListCache != null) return mProgramListCache;
- mProgramListCache = new ArrayList<>();
-
- MediaDescription.Builder dbld = new MediaDescription.Builder();
-
- for (RadioManager.ProgramInfo program : mProgramListSnapshot) {
- ProgramSelector sel = program.getSelector();
- String mediaId = selectorToMediaId(sel);
- mProgramSelectors.put(mediaId, sel);
-
- Bitmap icon = null;
- RadioMetadata meta = program.getMetadata();
- if (meta != null && mImageResolver != null) {
- long id = RadioMetadataExt.getGlobalBitmapId(meta,
- RadioMetadata.METADATA_KEY_ICON);
- if (id != 0) icon = mImageResolver.resolve(id);
- }
-
- mProgramListCache.add(createChild(dbld, mediaId,
- ProgramInfoExt.getProgramName(program, 0), program.getSelector(), icon));
- }
-
- if (mProgramListCache.size() == 0) {
- Log.v(TAG, "Program list is empty");
- }
- return mProgramListCache;
- }
- }
-
- private void sendPrograms(final Result<List<MediaItem>> result) {
- synchronized (mLock) {
- if (mProgramListSnapshot != null) {
- result.sendResult(getPrograms());
- } else {
- Log.d(TAG, "Program list is not ready yet");
- result.detach();
- mProgramListTasks.add(() -> result.sendResult(getPrograms()));
- }
- }
- }
-
- /**
- * Updates favorites list.
- */
- public void setFavorites(@Nullable Set<Program> favorites) {
- synchronized (mLock) {
- boolean rootChanged = (mFavorites == null) != (favorites == null);
- mFavorites = favorites;
- mFavoritesCache = null;
- mBrowserService.notifyChildrenChanged(NODE_FAVORITES);
- if (rootChanged) mBrowserService.notifyChildrenChanged(NODE_ROOT);
- }
- }
-
- private List<MediaItem> getFavorites() {
- synchronized (mLock) {
- if (mFavorites == null) return null;
- if (mFavoritesCache != null) return mFavoritesCache;
- mFavoritesCache = new ArrayList<>();
-
- MediaDescription.Builder dbld = new MediaDescription.Builder();
-
- for (Program fav : mFavorites) {
- ProgramSelector sel = fav.getSelector();
- String mediaId = selectorToMediaId(sel);
- mProgramSelectors.putIfAbsent(mediaId, sel); // prefer program list entries
- mFavoritesCache.add(createChild(dbld, mediaId, fav.getName(), sel, fav.getIcon()));
- }
-
- return mFavoritesCache;
- }
- }
-
- private List<MediaItem> getRootChildren() {
- synchronized (mLock) {
- if (mRootChildren != null) return mRootChildren;
- mRootChildren = new ArrayList<>();
-
- MediaDescription.Builder dbld = new MediaDescription.Builder();
- if (mProgramList != null) {
- mRootChildren.add(createFolder(dbld, NODE_PROGRAMS,
- mBrowserService.getString(R.string.program_list_text),
- true, false, BCRADIO_FOLDER_TYPE_PROGRAMS, null));
- }
- if (mFavorites != null) {
- mRootChildren.add(createFolder(dbld, NODE_FAVORITES,
- mBrowserService.getString(R.string.favorites_list_text),
- true, true, BCRADIO_FOLDER_TYPE_FAVORITES, null));
- }
-
- MediaItem amRoot = mAmChannels.getBandRoot();
- if (amRoot != null) mRootChildren.add(amRoot);
- MediaItem fmRoot = mFmChannels.getBandRoot();
- if (fmRoot != null) mRootChildren.add(fmRoot);
-
- if (mDABEnabled) {
- mRootChildren.add(createFolder(dbld, NODE_BAND_DAB,
- mBrowserService.getString(R.string.radio_dab_text),
- false, true, BCRADIO_FOLDER_TYPE_BAND, null));
- }
-
- return mRootChildren;
- }
- }
-
- private class AmFmChannelList {
- public final @NonNull String mMediaId;
- private final @StringRes int mBandName;
- private final @NonNull String mBandNameEn;
- private @Nullable List<BandDescriptor> mBands;
- private @Nullable List<MediaItem> mChannels;
-
- private AmFmChannelList(@NonNull String mediaId, @StringRes int bandName,
- @NonNull String bandNameEn) {
- mMediaId = Objects.requireNonNull(mediaId);
- mBandName = bandName;
- mBandNameEn = Objects.requireNonNull(bandNameEn);
- }
-
- public void setBands(List<BandDescriptor> bands) {
- synchronized (mLock) {
- mBands = bands;
- mChannels = null;
- mBrowserService.notifyChildrenChanged(mMediaId);
- }
- }
-
- private boolean isEmpty() {
- if (mBands == null) {
- Log.w(TAG, "AM/FM configuration not set");
- return true;
- }
- return mBands.isEmpty();
- }
-
- public @Nullable MediaItem getBandRoot() {
- if (isEmpty()) return null;
- Bundle extras = new Bundle();
- extras.putString(EXTRA_BCRADIO_BAND_NAME_EN, mBandNameEn);
- return createFolder(new MediaDescription.Builder(), mMediaId,
- mBrowserService.getString(mBandName), true, true, BCRADIO_FOLDER_TYPE_BAND,
- extras);
- }
-
- public List<MediaItem> getChannels() {
- synchronized (mLock) {
- if (mChannels != null) return mChannels;
- if (isEmpty()) return null;
- mChannels = new ArrayList<>();
-
- MediaDescription.Builder dbld = new MediaDescription.Builder();
-
- for (BandDescriptor band : mBands) {
- final int lowerLimit = band.getLowerLimit();
- final int upperLimit = band.getUpperLimit();
- final int spacing = band.getSpacing();
- for (int ch = lowerLimit; ch <= upperLimit; ch += spacing) {
- ProgramSelector sel = ProgramSelectorExt.createAmFmSelector(ch);
- mChannels.add(createChild(dbld, NODEPREFIX_AMFMCHANNEL + ch,
- ProgramSelectorExt.getDisplayName(sel, 0), sel, null));
- }
- }
-
- return mChannels;
- }
- }
- }
-
- /**
- * Loads subtree children.
- *
- * This method is meant to be used in MediaBrowserService's onLoadChildren callback.
- */
- public void loadChildren(final String parentMediaId, final Result<List<MediaItem>> result) {
- if (parentMediaId == null || result == null) return;
-
- if (NODE_ROOT.equals(parentMediaId)) {
- result.sendResult(getRootChildren());
- } else if (NODE_PROGRAMS.equals(parentMediaId)) {
- sendPrograms(result);
- } else if (NODE_FAVORITES.equals(parentMediaId)) {
- result.sendResult(getFavorites());
- } else if (parentMediaId.equals(mAmChannels.mMediaId)) {
- result.sendResult(mAmChannels.getChannels());
- } else if (parentMediaId.equals(mFmChannels.mMediaId)) {
- result.sendResult(mFmChannels.getChannels());
- } else {
- Log.w(TAG, "Invalid parent media ID: " + parentMediaId);
- result.sendResult(null);
- }
- }
-
- private static @NonNull String selectorToMediaId(@NonNull ProgramSelector sel) {
- ProgramSelector.Identifier id = sel.getPrimaryId();
- return NODEPREFIX_PROGRAM + id.getType() + '/' + id.getValue();
- }
-
- /**
- * Resolves mediaId to a tunable {@link ProgramSelector}.
- *
- * This method is meant to be used in MediaSession's onPlayFromMediaId callback.
- */
- public @Nullable ProgramSelector parseMediaId(@Nullable String mediaId) {
- if (mediaId == null) return null;
-
- if (mediaId.startsWith(NODEPREFIX_AMFMCHANNEL)) {
- String freqStr = mediaId.substring(NODEPREFIX_AMFMCHANNEL.length());
- int freqInt;
- try {
- freqInt = Integer.parseInt(freqStr);
- } catch (NumberFormatException ex) {
- Log.e(TAG, "Invalid frequency", ex);
- return null;
- }
- return ProgramSelectorExt.createAmFmSelector(freqInt);
- } else if (mediaId.startsWith(NODEPREFIX_PROGRAM)) {
- return mProgramSelectors.get(mediaId);
- } else if (mediaId.equals(NODE_FAVORITES)) {
- if (mFavorites == null || mFavorites.isEmpty()) return null;
- return mFavorites.iterator().next().getSelector();
- } else if (mediaId.equals(NODE_PROGRAMS)) {
- if (mProgramListSnapshot == null || mProgramListSnapshot.isEmpty()) return null;
- return mProgramListSnapshot.get(0).getSelector();
- } else if (mediaId.equals(NODE_BAND_AM)) {
- if (mAmChannels.mBands == null || mAmChannels.mBands.isEmpty()) return null;
- return ProgramSelectorExt.createAmFmSelector(mAmChannels.mBands.get(0).getLowerLimit());
- } else if (mediaId.equals(NODE_BAND_FM)) {
- if (mFmChannels.mBands == null || mFmChannels.mBands.isEmpty()) return null;
- return ProgramSelectorExt.createAmFmSelector(mFmChannels.mBands.get(0).getLowerLimit());
- }
- return null;
- }
-}
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ImageResolver.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ImageResolver.java
deleted file mode 100644
index 5538a58..0000000
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ImageResolver.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.broadcastradio.support.platform;
-
-import android.annotation.Nullable;
-import android.graphics.Bitmap;
-
-/**
- * Resolves metadata images.
- */
-public interface ImageResolver {
- /**
- * Resolve a given metadata image global id to a bitmap.
- *
- * @param globalId metadata image id
- * @return A bitmap, or null if it was not available or invalid
- */
- @Nullable Bitmap resolve(long globalId);
-}
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramInfoExt.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramInfoExt.java
deleted file mode 100644
index ce3d014..0000000
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramInfoExt.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/**
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.broadcastradio.support.platform;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.graphics.Bitmap;
-import android.hardware.radio.ProgramSelector;
-import android.hardware.radio.RadioManager.ProgramInfo;
-import android.hardware.radio.RadioMetadata;
-import android.media.MediaMetadata;
-import android.media.Rating;
-import android.util.Log;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Proposed extensions to android.hardware.radio.RadioManager.ProgramInfo.
- *
- * They might eventually get pushed to the framework.
- */
-public class ProgramInfoExt {
- private static final String TAG = "BcRadioApp.pinfoext";
-
- /**
- * If there is no suitable program name, return null instead of doing
- * a fallback to channel display name.
- */
- public static final int NAME_NO_CHANNEL_FALLBACK = 1 << 16;
-
- /**
- * Flags to control how to fetch program name with {@link #getProgramName}.
- *
- * Lower 16 bits are reserved for {@link ProgramSelectorExt#NameFlag}.
- */
- @IntDef(prefix = { "NAME_" }, flag = true, value = {
- ProgramSelectorExt.NAME_NO_MODULATION,
- ProgramSelectorExt.NAME_MODULATION_ONLY,
- NAME_NO_CHANNEL_FALLBACK,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface NameFlag {}
-
- private static final char EN_DASH = '\u2013';
- private static final String TITLE_SEPARATOR = " " + EN_DASH + " ";
-
- private static final String[] PROGRAM_NAME_ORDER = new String[] {
- RadioMetadata.METADATA_KEY_PROGRAM_NAME,
- RadioMetadata.METADATA_KEY_DAB_COMPONENT_NAME,
- RadioMetadata.METADATA_KEY_DAB_SERVICE_NAME,
- RadioMetadata.METADATA_KEY_DAB_ENSEMBLE_NAME,
- RadioMetadata.METADATA_KEY_RDS_PS,
- };
-
- /**
- * Returns program name suitable to display.
- *
- * If there is no program name, it falls back to channel name. Flags related to
- * the channel name display will be forwarded to the channel name generation method.
- */
- public static @NonNull String getProgramName(@NonNull ProgramInfo info, @NameFlag int flags) {
- RadioMetadata meta = info.getMetadata();
- if (meta != null) {
- for (String key : PROGRAM_NAME_ORDER) {
- String value = meta.getString(key);
- if (value != null) return value;
- }
- }
-
- if ((flags & NAME_NO_CHANNEL_FALLBACK) != 0) return "";
-
- ProgramSelector sel = info.getSelector();
-
- // if it's AM/FM program, prefer to display currently used AF frequency
- if (ProgramSelectorExt.isAmFmProgram(sel)) {
- ProgramSelector.Identifier phy = info.getPhysicallyTunedTo();
- if (phy != null && phy.getType() == ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY) {
- String chName = ProgramSelectorExt.formatAmFmFrequency(phy.getValue(), flags);
- if (chName != null) return chName;
- }
- }
-
- String selName = ProgramSelectorExt.getDisplayName(sel, flags);
- if (selName != null) return selName;
-
- Log.w(TAG, "ProgramInfo without a name nor channel name");
- return "";
- }
-
- /**
- * Proposed reimplementation of {@link RadioManager#ProgramInfo#getMetadata}.
- *
- * As opposed to the original implementation, it never returns null.
- */
- public static @NonNull RadioMetadata getMetadata(@NonNull ProgramInfo info) {
- RadioMetadata meta = info.getMetadata();
- if (meta != null) return meta;
-
- /* Creating new Metadata object on each get won't be necessary after we
- * push this code to the framework. */
- return (new RadioMetadata.Builder()).build();
- }
-
- /**
- * Converts {@ProgramInfo} to {@MediaMetadata}.
- *
- * This method is meant to be used for currently playing station in {@link MediaSession}.
- *
- * @param info {@link ProgramInfo} to convert
- * @param isFavorite true, if a given program is a favorite
- * @param imageResolver metadata images resolver/cache
- * @return {@link MediaMetadata} object
- */
- public static @NonNull MediaMetadata toMediaMetadata(@NonNull ProgramInfo info,
- boolean isFavorite, @Nullable ImageResolver imageResolver) {
- MediaMetadata.Builder bld = new MediaMetadata.Builder();
-
- bld.putString(MediaMetadata.METADATA_KEY_DISPLAY_TITLE, getProgramName(info, 0));
-
- RadioMetadata meta = info.getMetadata();
- if (meta != null) {
- String title = meta.getString(RadioMetadata.METADATA_KEY_TITLE);
- if (title != null) {
- bld.putString(MediaMetadata.METADATA_KEY_TITLE, title);
- }
- String artist = meta.getString(RadioMetadata.METADATA_KEY_ARTIST);
- if (artist != null) {
- bld.putString(MediaMetadata.METADATA_KEY_ARTIST, artist);
- }
- String album = meta.getString(RadioMetadata.METADATA_KEY_ALBUM);
- if (album != null) {
- bld.putString(MediaMetadata.METADATA_KEY_ALBUM, album);
- }
- if (title != null || artist != null) {
- String subtitle;
- if (title == null) {
- subtitle = artist;
- } else if (artist == null) {
- subtitle = title;
- } else {
- subtitle = title + TITLE_SEPARATOR + artist;
- }
- bld.putString(MediaMetadata.METADATA_KEY_DISPLAY_SUBTITLE, subtitle);
- }
- long albumArtId = RadioMetadataExt.getGlobalBitmapId(meta,
- RadioMetadata.METADATA_KEY_ART);
- if (albumArtId != 0 && imageResolver != null) {
- Bitmap bm = imageResolver.resolve(albumArtId);
- if (bm != null) bld.putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, bm);
- }
- }
-
- bld.putRating(MediaMetadata.METADATA_KEY_USER_RATING, Rating.newHeartRating(isFavorite));
-
- return bld.build();
- }
-}
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramSelectorExt.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramSelectorExt.java
deleted file mode 100644
index 4b3583b..0000000
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramSelectorExt.java
+++ /dev/null
@@ -1,486 +0,0 @@
-/**
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.broadcastradio.support.platform;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.hardware.radio.ProgramSelector;
-import android.hardware.radio.ProgramSelector.Identifier;
-import android.hardware.radio.RadioManager;
-import android.net.Uri;
-import android.util.Log;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.BiConsumer;
-import java.util.function.BiFunction;
-
-/**
- * Proposed extensions to android.hardware.radio.ProgramSelector.
- *
- * They might eventually get pushed to the framework.
- */
-public class ProgramSelectorExt {
- private static final String TAG = "BcRadioApp.pselext";
-
- /**
- * If this is AM/FM channel (or any other technology using different modulations),
- * don't return modulation part.
- */
- public static final int NAME_NO_MODULATION = 1 << 0;
-
- /**
- * Return only modulation part of channel name.
- *
- * If this is not a radio technology using modulation, return nothing
- * (unless combined with other _ONLY flags in the future).
- *
- * If this returns non-null string, it's guaranteed that {@link #NAME_NO_MODULATION}
- * will return the complement of channel name.
- */
- public static final int NAME_MODULATION_ONLY = 1 << 1;
-
- /**
- * If the channel name is not human-readable (i.e. DAB SId), radio technology is displayed
- * instead. This flag prevents that.
- *
- * With radio technology fallback, null pointer may still be returned in case of unsupported
- * radio technologies.
- */
- public static final int NAME_NO_PROGRAM_TYPE_FALLBACK = 1 << 2;
-
- /**
- * Flags to control how channel values are converted to string with {@link #getDisplayName}.
- *
- * Upper 16 bits are reserved for {@link ProgramInfoExt#NameFlag}.
- */
- @IntDef(prefix = { "NAME_" }, flag = true, value = {
- NAME_NO_MODULATION,
- NAME_MODULATION_ONLY,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface NameFlag {}
-
- private static final String URI_SCHEME_BROADCASTRADIO = "broadcastradio";
- private static final String URI_AUTHORITY_PROGRAM = "program";
- private static final String URI_VENDOR_PREFIX = "VENDOR_";
- private static final String URI_HEX_PREFIX = "0x";
-
- private static final DecimalFormat FORMAT_FM = new DecimalFormat("###.#");
-
- private static final Map<Integer, String> ID_TO_URI = new HashMap<>();
- private static final Map<String, Integer> URI_TO_ID = new HashMap<>();
-
- /**
- * New proposed constructor for {@link ProgramSelector}.
- *
- * As opposed to the current platform API, this one matches more closely simplified HAL 2.0.
- *
- * @param primaryId primary program identifier.
- * @param secondaryIds list of secondary program identifiers.
- */
- public static @NonNull ProgramSelector newProgramSelector(@NonNull Identifier primaryId,
- @Nullable Identifier[] secondaryIds) {
- return new ProgramSelector(
- identifierToProgramType(primaryId),
- primaryId, secondaryIds, null);
- }
-
- // when pushed to the framework, remove similar code from HAL 2.0 service
- private static @ProgramSelector.ProgramType int identifierToProgramType(
- @NonNull Identifier primaryId) {
- int idType = primaryId.getType();
- switch (idType) {
- case ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY:
- if (isAmFrequency(primaryId.getValue())) {
- return ProgramSelector.PROGRAM_TYPE_AM;
- } else {
- return ProgramSelector.PROGRAM_TYPE_FM;
- }
- case ProgramSelector.IDENTIFIER_TYPE_RDS_PI:
- return ProgramSelector.PROGRAM_TYPE_FM;
- case ProgramSelector.IDENTIFIER_TYPE_HD_STATION_ID_EXT:
- if (isAmFrequency(IdentifierExt.asHdPrimary(primaryId).getFrequency())) {
- return ProgramSelector.PROGRAM_TYPE_AM_HD;
- } else {
- return ProgramSelector.PROGRAM_TYPE_FM_HD;
- }
- case ProgramSelector.IDENTIFIER_TYPE_DAB_SIDECC:
- case ProgramSelector.IDENTIFIER_TYPE_DAB_ENSEMBLE:
- case ProgramSelector.IDENTIFIER_TYPE_DAB_SCID:
- case ProgramSelector.IDENTIFIER_TYPE_DAB_FREQUENCY:
- return ProgramSelector.PROGRAM_TYPE_DAB;
- case ProgramSelector.IDENTIFIER_TYPE_DRMO_SERVICE_ID:
- case ProgramSelector.IDENTIFIER_TYPE_DRMO_FREQUENCY:
- return ProgramSelector.PROGRAM_TYPE_DRMO;
- case ProgramSelector.IDENTIFIER_TYPE_SXM_SERVICE_ID:
- case ProgramSelector.IDENTIFIER_TYPE_SXM_CHANNEL:
- return ProgramSelector.PROGRAM_TYPE_SXM;
- }
- if (idType >= ProgramSelector.IDENTIFIER_TYPE_VENDOR_PRIMARY_START
- && idType <= ProgramSelector.IDENTIFIER_TYPE_VENDOR_PRIMARY_END) {
- return idType;
- }
- return ProgramSelector.PROGRAM_TYPE_INVALID;
- }
-
- /**
- * Checks, if a given AM frequency is roughly valid and in correct unit.
- *
- * It does not check the range precisely: it may provide false positives, but not false
- * negatives. In particular, it may be way off for certain regions.
- * The main purpose is to avoid passing inproper units, ie. MHz instead of kHz.
- * It also can be used to check if a given frequency is likely to be used
- * with AM or FM modulation.
- *
- * @param frequencyKhz the frequency in kHz.
- * @return true, if the frequency is rougly valid.
- */
- public static boolean isAmFrequency(long frequencyKhz) {
- return frequencyKhz > 150 && frequencyKhz <= 30000;
- }
-
- /**
- * Checks, if a given FM frequency is roughly valid and in correct unit.
- *
- * It does not check the range precisely: it may provide false positives, but not false
- * negatives. In particular, it may be way off for certain regions.
- * The main purpose is to avoid passing inproper units, ie. MHz instead of kHz.
- * It also can be used to check if a given frequency is likely to be used
- * with AM or FM modulation.
- *
- * @param frequencyKhz the frequency in kHz.
- * @return true, if the frequency is rougly valid.
- */
- public static boolean isFmFrequency(long frequencyKhz) {
- return frequencyKhz > 60000 && frequencyKhz < 110000;
- }
-
- /**
- * Provides human-readable representation of AM/FM frequency.
- *
- * @param frequencyKhz the frequency in kHz.
- * @param flags flags that affect display format
- * @return human-readable formatted frequency
- */
- public static @Nullable String formatAmFmFrequency(long frequencyKhz, @NameFlag int flags) {
- String channel;
- String modulation;
-
- if (isAmFrequency(frequencyKhz)) {
- channel = Long.toString(frequencyKhz);
- modulation = "AM";
- } else if (isFmFrequency(frequencyKhz)) {
- channel = FORMAT_FM.format(frequencyKhz / 1000f);
- modulation = "FM";
- } else {
- Log.w(TAG, "AM/FM frequency out of range: " + frequencyKhz);
- return null;
- }
-
- if ((flags & NAME_MODULATION_ONLY) != 0) return modulation;
- if ((flags & NAME_NO_MODULATION) != 0) return channel;
- return channel + ' ' + modulation;
- }
-
- /**
- * Builds new ProgramSelector for AM/FM frequency.
- *
- * @param frequencyKhz the frequency in kHz.
- * @return new ProgramSelector object representing given frequency.
- * @throws IllegalArgumentException if provided frequency is out of bounds.
- */
- public static @NonNull ProgramSelector createAmFmSelector(long frequencyKhz) {
- if (frequencyKhz < 0 || frequencyKhz > Integer.MAX_VALUE) {
- throw new IllegalArgumentException("illegal frequency value: " + frequencyKhz);
- }
- return ProgramSelector.createAmFmSelector(RadioManager.BAND_INVALID, (int) frequencyKhz);
- }
-
- /**
- * Checks, if {@link ProgramSelector} contains an id of a given type.
- *
- * @param sel selector being checked
- * @param type identifier type to check for
- * @return true, if sel contains any identifier of a given type
- */
- public static boolean hasId(@NonNull ProgramSelector sel,
- @ProgramSelector.IdentifierType int type) {
- try {
- sel.getFirstId(type);
- return true;
- } catch (IllegalArgumentException e) {
- return false;
- }
- }
-
- /**
- * Checks, if {@link ProgramSelector} is a AM/FM program.
- *
- * @return true, if the primary identifier of a selector belongs to one of the following
- * technologies:
- * - Analogue AM/FM
- * - FM RDS
- * - HD Radio AM/FM
- */
- public static boolean isAmFmProgram(@NonNull ProgramSelector sel) {
- int priType = sel.getPrimaryId().getType();
- return priType == ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY
- || priType == ProgramSelector.IDENTIFIER_TYPE_RDS_PI
- || priType == ProgramSelector.IDENTIFIER_TYPE_HD_STATION_ID_EXT;
- }
-
- /**
- * Returns a channel name that can be displayed to the user.
- *
- * It's implemented only for radio technologies where the channel is meant
- * to be presented to the user.
- *
- * @param sel the program selector
- * @return Channel name or null, if radio technology doesn't present channel names to the user.
- */
- public static @Nullable String getDisplayName(@NonNull ProgramSelector sel,
- @NameFlag int flags) {
- boolean noProgramTypeFallback = (flags & NAME_NO_PROGRAM_TYPE_FALLBACK) != 0;
-
- if (isAmFmProgram(sel)) {
- if (!hasId(sel, ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY)) {
- if (noProgramTypeFallback) return null;
- // if there is no frequency assigned, let's assume it's a malformed RDS selector
- return "FM";
- }
- long freq = sel.getFirstId(ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY);
- return formatAmFmFrequency(freq, flags);
- }
-
- if ((flags & NAME_MODULATION_ONLY) != 0) return null;
-
- if (sel.getPrimaryId().getType() == ProgramSelector.IDENTIFIER_TYPE_SXM_SERVICE_ID
- && hasId(sel, ProgramSelector.IDENTIFIER_TYPE_SXM_CHANNEL)) {
- return Long.toString(sel.getFirstId(ProgramSelector.IDENTIFIER_TYPE_SXM_CHANNEL));
- }
-
- if (noProgramTypeFallback) return null;
-
- switch (sel.getPrimaryId().getType()) {
- case ProgramSelector.IDENTIFIER_TYPE_SXM_SERVICE_ID:
- return "SXM";
- case ProgramSelector.IDENTIFIER_TYPE_DAB_SIDECC:
- return "DAB";
- case ProgramSelector.IDENTIFIER_TYPE_DRMO_SERVICE_ID:
- return "DRMO";
- default:
- return null;
- }
- }
-
- static {
- BiConsumer<Integer, String> add = (idType, name) -> {
- ID_TO_URI.put(idType, name);
- URI_TO_ID.put(name, idType);
- };
-
- add.accept(ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY, "AMFM_FREQUENCY");
- add.accept(ProgramSelector.IDENTIFIER_TYPE_RDS_PI, "RDS_PI");
- add.accept(ProgramSelector.IDENTIFIER_TYPE_HD_STATION_ID_EXT, "HD_STATION_ID_EXT");
- add.accept(ProgramSelector.IDENTIFIER_TYPE_HD_STATION_NAME, "HD_STATION_NAME");
- add.accept(ProgramSelector.IDENTIFIER_TYPE_DAB_SID_EXT, "DAB_SID_EXT");
- add.accept(ProgramSelector.IDENTIFIER_TYPE_DAB_ENSEMBLE, "DAB_ENSEMBLE");
- add.accept(ProgramSelector.IDENTIFIER_TYPE_DAB_SCID, "DAB_SCID");
- add.accept(ProgramSelector.IDENTIFIER_TYPE_DAB_FREQUENCY, "DAB_FREQUENCY");
- add.accept(ProgramSelector.IDENTIFIER_TYPE_DRMO_SERVICE_ID, "DRMO_SERVICE_ID");
- add.accept(ProgramSelector.IDENTIFIER_TYPE_DRMO_FREQUENCY, "DRMO_FREQUENCY");
- add.accept(ProgramSelector.IDENTIFIER_TYPE_SXM_SERVICE_ID, "SXM_SERVICE_ID");
- add.accept(ProgramSelector.IDENTIFIER_TYPE_SXM_CHANNEL, "SXM_CHANNEL");
- }
-
- private static @Nullable String typeToUri(int identifierType) {
- if (identifierType >= ProgramSelector.IDENTIFIER_TYPE_VENDOR_START
- && identifierType <= ProgramSelector.IDENTIFIER_TYPE_VENDOR_END) {
- int idx = identifierType - ProgramSelector.IDENTIFIER_TYPE_VENDOR_START;
- return URI_VENDOR_PREFIX + idx;
- }
- return ID_TO_URI.get(identifierType);
- }
-
- private static int uriToType(@Nullable String typeUri) {
- if (typeUri == null) return ProgramSelector.IDENTIFIER_TYPE_INVALID;
- if (typeUri.startsWith(URI_VENDOR_PREFIX)) {
- int idx;
- try {
- idx = Integer.parseInt(typeUri.substring(URI_VENDOR_PREFIX.length()));
- } catch (NumberFormatException ex) {
- return ProgramSelector.IDENTIFIER_TYPE_INVALID;
- }
- if (idx > ProgramSelector.IDENTIFIER_TYPE_VENDOR_END
- - ProgramSelector.IDENTIFIER_TYPE_VENDOR_START) {
- return ProgramSelector.IDENTIFIER_TYPE_INVALID;
- }
- return ProgramSelector.IDENTIFIER_TYPE_VENDOR_START + idx;
- }
- return URI_TO_ID.get(typeUri);
- }
-
- private static @NonNull String valueToUri(@NonNull Identifier id) {
- long val = id.getValue();
- switch (id.getType()) {
- case ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY:
- case ProgramSelector.IDENTIFIER_TYPE_DAB_FREQUENCY:
- case ProgramSelector.IDENTIFIER_TYPE_DRMO_FREQUENCY:
- case ProgramSelector.IDENTIFIER_TYPE_SXM_CHANNEL:
- return Long.toString(val);
- default:
- return URI_HEX_PREFIX + Long.toHexString(val);
- }
- }
-
- private static @Nullable Long uriToValue(@Nullable String valUri) {
- if (valUri == null) return null;
- try {
- if (valUri.startsWith(URI_HEX_PREFIX)) {
- return Long.parseLong(valUri.substring(URI_HEX_PREFIX.length()), 16);
- } else {
- return Long.parseLong(valUri, 10);
- }
- } catch (NumberFormatException ex) {
- return null;
- }
- }
-
- /**
- * Serialize {@link ProgramSelector} to URI.
- *
- * @param sel selector to serialize
- * @return serialized form of selector
- */
- public static @Nullable Uri toUri(@NonNull ProgramSelector sel) {
- Identifier pri = sel.getPrimaryId();
- String priType = typeToUri(pri.getType());
- // unsupported primary identifier, might be from future HAL revision
- if (priType == null) return null;
-
- Uri.Builder uri = new Uri.Builder()
- .scheme(URI_SCHEME_BROADCASTRADIO)
- .authority(URI_AUTHORITY_PROGRAM)
- .appendPath(priType)
- .appendPath(valueToUri(pri));
-
- for (Identifier sec : sel.getSecondaryIds()) {
- String secType = typeToUri(sec.getType());
- if (secType == null) continue; // skip unsupported secondary identifier
- uri.appendQueryParameter(secType, valueToUri(sec));
- }
- return uri.build();
- }
-
- /**
- * Parse serialized {@link ProgramSelector}.
- *
- * @param uri URI-zed form of ProgramSelector
- * @return de-serialized object or null, if couldn't parse
- */
- public static @Nullable ProgramSelector fromUri(@Nullable Uri uri) {
- if (uri == null) return null;
-
- if (!URI_SCHEME_BROADCASTRADIO.equals(uri.getScheme())) return null;
- if (!URI_AUTHORITY_PROGRAM.equals(uri.getAuthority())) {
- Log.w(TAG, "Unknown URI authority part (might be a future, unsupported version): "
- + uri.getAuthority());
- return null;
- }
-
- BiFunction<String, String, Identifier> parseComponents = (typeStr, valueStr) -> {
- int type = uriToType(typeStr);
- Long value = uriToValue(valueStr);
- if (type == ProgramSelector.IDENTIFIER_TYPE_INVALID || value == null) return null;
- return new Identifier(type, value);
- };
-
- List<String> priUri = uri.getPathSegments();
- if (priUri.size() != 2) return null;
- Identifier pri = parseComponents.apply(priUri.get(0), priUri.get(1));
- if (pri == null) return null;
-
- String query = uri.getQuery();
- List<Identifier> secIds = new ArrayList<>();
- if (query != null) {
- for (String secPair : query.split("&")) {
- String[] secStr = secPair.split("=");
- if (secStr.length != 2) continue;
- Identifier sec = parseComponents.apply(secStr[0], secStr[1]);
- if (sec != null) secIds.add(sec);
- }
- }
-
- return newProgramSelector(pri, secIds.toArray(new Identifier[secIds.size()]));
- }
-
- /**
- * Proposed extensions to android.hardware.radio.ProgramSelector.Identifier.
- *
- * They might eventually get pushed to the framework.
- */
- public static class IdentifierExt {
- /**
- * Decode {@link ProgramSelector#IDENTIFIER_TYPE_HD_STATION_ID_EXT} value.
- *
- * @param id identifier to decode
- * @return value decoder
- */
- public static @Nullable HdPrimary asHdPrimary(@NonNull Identifier id) {
- if (id.getType() == ProgramSelector.IDENTIFIER_TYPE_HD_STATION_ID_EXT) {
- return new HdPrimary(id.getValue());
- }
- return null;
- }
-
- /**
- * Decoder of {@link ProgramSelector#IDENTIFIER_TYPE_HD_STATION_ID_EXT} value.
- *
- * When pushed to the framework, it will be non-static class referring
- * to the original value.
- */
- public static class HdPrimary {
- /* For mValue format (bit shifts and bit masks), please refer to
- * HD_STATION_ID_EXT from broadcastradio HAL 2.0.
- */
- private final long mValue;
-
- private HdPrimary(long value) {
- mValue = value;
- }
-
- public long getStationId() {
- return mValue & 0xFFFFFFFF;
- }
-
- public int getSubchannel() {
- return (int) ((mValue >>> 32) & 0xF);
- }
-
- public int getFrequency() {
- return (int) ((mValue >>> (32 + 4)) & 0x3FFFF);
- }
- }
- }
-}
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/RadioMetadataExt.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/RadioMetadataExt.java
deleted file mode 100644
index e7b6f3b..0000000
--- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/RadioMetadataExt.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.broadcastradio.support.platform;
-
-import android.annotation.NonNull;
-import android.hardware.radio.RadioMetadata;
-
-/**
- * Proposed extensions to android.hardware.radio.RadioMetadata.
- *
- * They might eventually get pushed to the framework.
- */
-public class RadioMetadataExt {
- private static int sModuleId;
-
- /**
- * A hack to inject module ID for getGlobalBitmapId. When pushed to the framework,
- * it will be set with RadioMetadata object creation or just separate int field.
- * @hide
- */
- public static void setModuleId(int id) {
- sModuleId = id;
- }
-
- /**
- * Proposed redefinition of {@link RadioMetadata#getBitmapId}.
- *
- * {@link RadioMetadata#getBitmapId} isn't part of the system API yet, so we can skip
- * deprecation here and jump straight to the correct solution.
- */
- public static long getGlobalBitmapId(@NonNull RadioMetadata meta, @NonNull String key) {
- int localId = meta.getBitmapId(key);
- if (localId == 0) return 0;
-
- /* When generating global bitmap ID, we want them to remain stable between sessions
- * (radio app might cache images to disk between sessions).
- *
- * Local IDs are already stable, but module ID is not guaranteed to be stable (i.e. some
- * module might be not available at each boot, due to HW failure).
- *
- * When we push this to the framework, we will need persistence mechanism at the radio
- * service to permanently match modules to their IDs.
- */
- return ((long) sModuleId << 32) | localId;
- }
-}
diff --git a/car-media-common/res/values-te/strings.xml b/car-media-common/res/values-te/strings.xml
index f3dec11..265d667 100644
--- a/car-media-common/res/values-te/strings.xml
+++ b/car-media-common/res/values-te/strings.xml
@@ -30,5 +30,5 @@
<string name="error_code_content_already_playing" msgid="1306236349553004461">"ఇప్పటికే ఆ కంటెంట్ ప్లే అవుతోంది"</string>
<string name="error_code_skip_limit_reached" msgid="4203743406433151146">"ఇంక ఏ ట్రాక్లనూ స్కిప్ చేయడం సాధ్యపడదు"</string>
<string name="error_code_action_aborted" msgid="8611777981356536501">"పూర్తి చేయడం సాధ్యపడలేదు. మళ్లీ ట్రై చేయండి."</string>
- <string name="error_code_end_of_queue" msgid="6935022448319288887">"క్రమ వరుసలో ఏమీ లేదు"</string>
+ <string name="error_code_end_of_queue" msgid="6935022448319288887">"క్యూలో ఏమీ లేదు"</string>
</resources>
diff --git a/car-media-common/res/values/overlayable.xml b/car-media-common/res/values/overlayable.xml
new file mode 100644
index 0000000..ae5d970
--- /dev/null
+++ b/car-media-common/res/values/overlayable.xml
@@ -0,0 +1,150 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Copyright (C) 2022 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.-->
+<!--
+THIS FILE WAS AUTO GENERATED, DO NOT EDIT MANUALLY.
+REGENERATE USING packages/apps/Car/tests/tools/rro/generate-overlayable.py
+-->
+<resources>
+ <overlayable name="CarMediaCommon">
+ <policy type="system|product|signature">
+ <item type="anim" name="trim_end_interpolator"/>
+ <item type="anim" name="trim_start_interpolator"/>
+ <item type="array" name="custom_media_packages"/>
+ <item type="array" name="placeholder_backgrounds"/>
+ <item type="array" name="placeholder_images"/>
+ <item type="array" name="preferred_media_sources"/>
+ <item type="attr" name="align_horizontal"/>
+ <item type="attr" name="aspect_ratio"/>
+ <item type="attr" name="columns"/>
+ <item type="attr" name="show_expand_button"/>
+ <item type="attr" name="state_disabled"/>
+ <item type="attr" name="state_pause"/>
+ <item type="attr" name="state_play"/>
+ <item type="attr" name="state_stop"/>
+ <item type="bool" name="show_circular_progress_bar"/>
+ <item type="bool" name="show_linear_progress_bar"/>
+ <item type="bool" name="use_media_source_color_for_fab_spinner"/>
+ <item type="bool" name="use_media_source_logo_for_app_selector"/>
+ <item type="color" name="album_art_placeholder_color"/>
+ <item type="color" name="album_art_scrim"/>
+ <item type="color" name="appbar_view_icon_background_color"/>
+ <item type="color" name="fab_spinner_indeterminate_color"/>
+ <item type="color" name="media_button_tint_disabled"/>
+ <item type="color" name="media_source_default_color"/>
+ <item type="color" name="minimized_progress_bar_highlight"/>
+ <item type="color" name="placeholder_color_0"/>
+ <item type="color" name="placeholder_color_1"/>
+ <item type="color" name="placeholder_color_2"/>
+ <item type="color" name="placeholder_color_3"/>
+ <item type="color" name="placeholder_color_4"/>
+ <item type="color" name="placeholder_color_5"/>
+ <item type="color" name="placeholder_color_6"/>
+ <item type="color" name="placeholder_color_7"/>
+ <item type="color" name="playback_control_color"/>
+ <item type="dimen" name="album_art_scrim_alpha"/>
+ <item type="dimen" name="app_selector_icon_size"/>
+ <item type="dimen" name="app_selector_icon_touch_target"/>
+ <item type="dimen" name="app_selector_margin_x"/>
+ <item type="dimen" name="appbar_2_rows_height"/>
+ <item type="dimen" name="appbar_view_icon_background_corner_radius"/>
+ <item type="dimen" name="appbar_view_icon_background_radius"/>
+ <item type="dimen" name="appbar_view_icon_padding"/>
+ <item type="dimen" name="appbar_view_icon_touch_target_size"/>
+ <item type="dimen" name="appbar_view_search_app_icon_margin"/>
+ <item type="dimen" name="appbar_view_search_bar_end_margin"/>
+ <item type="dimen" name="appbar_view_search_close_icon_margin"/>
+ <item type="dimen" name="fab_spinner_size"/>
+ <item type="dimen" name="minimized_progress_bar_track_thickness"/>
+ <item type="dimen" name="playback_fragment_app_icon_margin_right"/>
+ <item type="dimen" name="playback_fragment_controls_margin_bottom"/>
+ <item type="dimen" name="playback_fragment_error_button_margin_bottom"/>
+ <item type="dimen" name="playback_fragment_error_button_margin_top"/>
+ <item type="dimen" name="playback_fragment_text_margin_top"/>
+ <item type="dimen" name="playback_fragment_text_margin_x"/>
+ <item type="drawable" name="appbar_view_icon_background"/>
+ <item type="drawable" name="circular_progress_bar"/>
+ <item type="drawable" name="ic_app_switch"/>
+ <item type="drawable" name="ic_music"/>
+ <item type="drawable" name="ic_pause"/>
+ <item type="drawable" name="ic_placeholder"/>
+ <item type="drawable" name="ic_placeholder_0"/>
+ <item type="drawable" name="ic_placeholder_1"/>
+ <item type="drawable" name="ic_placeholder_2"/>
+ <item type="drawable" name="ic_placeholder_3"/>
+ <item type="drawable" name="ic_placeholder_4"/>
+ <item type="drawable" name="ic_placeholder_5"/>
+ <item type="drawable" name="ic_placeholder_6"/>
+ <item type="drawable" name="ic_placeholder_7"/>
+ <item type="drawable" name="ic_play_arrow"/>
+ <item type="drawable" name="ic_play_arrow_off"/>
+ <item type="drawable" name="ic_play_pause_stop_animated"/>
+ <item type="drawable" name="ic_skip_next"/>
+ <item type="drawable" name="ic_skip_previous"/>
+ <item type="drawable" name="ic_star_empty"/>
+ <item type="drawable" name="ic_star_filled"/>
+ <item type="drawable" name="ic_stop"/>
+ <item type="drawable" name="ic_tracklist"/>
+ <item type="drawable" name="minimized_progress_bar_background"/>
+ <item type="drawable" name="music_buffering"/>
+ <item type="drawable" name="placeholder_color_drawable_0"/>
+ <item type="drawable" name="placeholder_color_drawable_1"/>
+ <item type="drawable" name="placeholder_color_drawable_2"/>
+ <item type="drawable" name="placeholder_color_drawable_3"/>
+ <item type="drawable" name="placeholder_color_drawable_4"/>
+ <item type="drawable" name="placeholder_color_drawable_5"/>
+ <item type="drawable" name="placeholder_color_drawable_6"/>
+ <item type="drawable" name="placeholder_color_drawable_7"/>
+ <item type="drawable" name="vector_drawable_progress_bar_medium_thin"/>
+ <item type="id" name="album_background"/>
+ <item type="id" name="app_selector"/>
+ <item type="id" name="app_selector_container"/>
+ <item type="id" name="circular_progress_bar"/>
+ <item type="id" name="linear_progress_bar"/>
+ <item type="id" name="minimized_control_bar"/>
+ <item type="id" name="overflow"/>
+ <item type="id" name="play_pause_container"/>
+ <item type="id" name="play_pause_stop"/>
+ <item type="id" name="playback_scrim"/>
+ <item type="id" name="skip_next"/>
+ <item type="id" name="skip_prev"/>
+ <item type="id" name="track_list"/>
+ <item type="integer" name="media_items_bitmap_max_size_px"/>
+ <item type="integer" name="new_album_art_fade_in_duration"/>
+ <item type="integer" name="num_app_selector_columns"/>
+ <item type="integer" name="playback_subtitle_text_max_lines"/>
+ <item type="integer" name="playback_title_text_max_lines"/>
+ <item type="integer" name="widget_error_text_max_lines"/>
+ <item type="layout" name="minimized_play_pause_stop_button_layout"/>
+ <item type="layout" name="minimized_playback_control_bar"/>
+ <item type="layout" name="play_pause_stop_button_layout"/>
+ <item type="layout" name="playback_fragment"/>
+ <item type="string" name="album_art"/>
+ <item type="string" name="default_error_message"/>
+ <item type="string" name="error_code_action_aborted"/>
+ <item type="string" name="error_code_app_error"/>
+ <item type="string" name="error_code_authentication_expired"/>
+ <item type="string" name="error_code_concurrent_stream_limit"/>
+ <item type="string" name="error_code_content_already_playing"/>
+ <item type="string" name="error_code_end_of_queue"/>
+ <item type="string" name="error_code_not_available_in_region"/>
+ <item type="string" name="error_code_not_supported"/>
+ <item type="string" name="error_code_parental_control_restricted"/>
+ <item type="string" name="error_code_premium_account_required"/>
+ <item type="string" name="error_code_skip_limit_reached"/>
+ <item type="string" name="launcher_intent"/>
+ <item type="string" name="launcher_popup_intent"/>
+ <item type="string" name="metadata_default_title"/>
+ <item type="style" name="PlaybackSubtitleStyle"/>
+ <item type="style" name="PlaybackTitleStyle"/>
+ </policy>
+ </overlayable>
+</resources>
diff --git a/car-media-common/tools/generate-overlayable.sh b/car-media-common/tools/generate-overlayable.sh
new file mode 100755
index 0000000..7566e7e
--- /dev/null
+++ b/car-media-common/tools/generate-overlayable.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+# Copyright (C) 2021 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Run this script to regenerate the overlayable.xml file.
+
+if [[ -z "$ANDROID_BUILD_TOP" ]]; then
+ echo 'ANDROID_BUILD_TOP environment variable is empty; did you forget to run `lunch`?'
+ exit 1
+fi
+
+PROJECT_TOP=$ANDROID_BUILD_TOP/packages/apps/Car/libs/car-media-common
+
+python3 $ANDROID_BUILD_TOP/packages/apps/Car/tests/tools/rro/generate-overlayable.py \
+ -n car-media-common \
+ -r $PROJECT_TOP/res \
+ -e $PROJECT_TOP/res/values/overlayable.xml \
+ -o $PROJECT_TOP/res/values/overlayable.xml
diff --git a/car-qc-lib/Android.bp b/car-qc-lib/Android.bp
deleted file mode 100644
index c12fd28..0000000
--- a/car-qc-lib/Android.bp
+++ /dev/null
@@ -1,31 +0,0 @@
-//
-// Copyright (C) 2021 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package {
- default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-android_library {
- name: "car-qc-lib",
- platform_apis: true,
- srcs: ["src/**/*.java"],
- optimize: {
- enabled: false,
- },
- static_libs: [
- "androidx.annotation_annotation",
- "car-ui-lib"
- ],
-}
diff --git a/car-qc-lib/OWNERS b/car-qc-lib/OWNERS
deleted file mode 100644
index 7f8081c..0000000
--- a/car-qc-lib/OWNERS
+++ /dev/null
@@ -1,8 +0,0 @@
-# People who can approve changes for submission.
-
-# Primary
[email protected]
-
-# Secondary (only if people in Primary are unreachable)
[email protected]
[email protected]
diff --git a/car-qc-lib/PREUPLOAD.cfg b/car-qc-lib/PREUPLOAD.cfg
deleted file mode 100644
index 38f9800..0000000
--- a/car-qc-lib/PREUPLOAD.cfg
+++ /dev/null
@@ -1,7 +0,0 @@
-[Hook Scripts]
-checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPLOAD_COMMIT}
-ktlint_hook = ${REPO_ROOT}/prebuilts/ktlint/ktlint.py -f ${PREUPLOAD_FILES}
-
-[Builtin Hooks]
-commit_msg_changeid_field = true
-commit_msg_test_field = true
diff --git a/car-qc-lib/res/color/qc_toggle_background_color.xml b/car-qc-lib/res/color/qc_toggle_background_color.xml
deleted file mode 100644
index 15253ad..0000000
--- a/car-qc-lib/res/color/qc_toggle_background_color.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_checked="false" android:state_enabled="false"
- android:alpha="?android:attr/disabledAlpha"
- android:color="@color/qc_toggle_off_background_color"/>
- <item android:state_checked="false"
- android:color="@color/qc_toggle_off_background_color"/>
- <item android:state_enabled="false"
- android:alpha="?android:attr/disabledAlpha"
- android:color="?android:attr/colorAccent"/>
- <item android:color="?android:attr/colorAccent"/>
-</selector>
diff --git a/car-qc-lib/res/color/qc_toggle_icon_fill_color.xml b/car-qc-lib/res/color/qc_toggle_icon_fill_color.xml
deleted file mode 100644
index bdb5433..0000000
--- a/car-qc-lib/res/color/qc_toggle_icon_fill_color.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_checked="false" android:state_enabled="false"
- android:alpha="?android:attr/disabledAlpha"
- android:color="@android:color/white"/>
- <item android:state_checked="false"
- android:color="@android:color/white"/>
- <item android:state_enabled="false"
- android:alpha="?android:attr/disabledAlpha"
- android:color="@android:color/black"/>
- <item android:color="@android:color/black"/>
-</selector>
diff --git a/car-qc-lib/res/drawable/qc_row_action_divider.xml b/car-qc-lib/res/drawable/qc_row_action_divider.xml
deleted file mode 100644
index 75ffd46..0000000
--- a/car-qc-lib/res/drawable/qc_row_action_divider.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <size
- android:height="0dp"
- android:width="@dimen/qc_toggle_margin"/>
-</shape>
diff --git a/car-qc-lib/res/drawable/qc_seekbar_wrapper_background.xml b/car-qc-lib/res/drawable/qc_seekbar_wrapper_background.xml
deleted file mode 100644
index 58b9c65..0000000
--- a/car-qc-lib/res/drawable/qc_seekbar_wrapper_background.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- Highlight the wrapper when it's focused but not selected. The wrapper is selected in
- direct manipulation mode. -->
- <item android:state_focused="true" android:state_selected="false">
- <shape android:shape="rectangle">
- <solid android:color="@color/car_ui_rotary_focus_fill_color"/>
- <stroke android:width="@dimen/car_ui_rotary_focus_stroke_width"
- android:color="@color/car_ui_rotary_focus_stroke_color"/>
- </shape>
- </item>
-</selector>
\ No newline at end of file
diff --git a/car-qc-lib/res/drawable/qc_toggle_background.xml b/car-qc-lib/res/drawable/qc_toggle_background.xml
deleted file mode 100644
index c139590..0000000
--- a/car-qc-lib/res/drawable/qc_toggle_background.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@android:id/background"
- android:width="@dimen/qc_toggle_size"
- android:height="@dimen/qc_toggle_size">
- <shape android:shape="rectangle">
- <solid android:color="@color/qc_toggle_background_color" />
- <corners android:radius="@dimen/qc_toggle_background_radius" />
- </shape>
- </item>
- <item android:width="@dimen/qc_toggle_size"
- android:height="@dimen/qc_toggle_size"
- android:drawable="@drawable/qc_toggle_rotary_background"/>
-</layer-list>
\ No newline at end of file
diff --git a/car-qc-lib/res/drawable/qc_toggle_unavailable_background.xml b/car-qc-lib/res/drawable/qc_toggle_unavailable_background.xml
deleted file mode 100644
index 98cbded..0000000
--- a/car-qc-lib/res/drawable/qc_toggle_unavailable_background.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@android:id/background"
- android:width="@dimen/qc_toggle_size"
- android:height="@dimen/qc_toggle_size">
- <shape android:shape="rectangle">
- <solid android:color="@color/qc_toggle_unavailable_background_color" />
- <stroke android:color="@color/qc_toggle_unavailable_color"
- android:width="@dimen/qc_toggle_unavailable_outline_width" />
- <corners android:radius="@dimen/qc_toggle_background_radius" />
- </shape>
- </item>
- <item android:width="@dimen/qc_toggle_size"
- android:height="@dimen/qc_toggle_size"
- android:drawable="@drawable/qc_toggle_rotary_background"/>
-</layer-list>
diff --git a/car-qc-lib/res/layout/qc_action_switch.xml b/car-qc-lib/res/layout/qc_action_switch.xml
deleted file mode 100644
index d51b61d..0000000
--- a/car-qc-lib/res/layout/qc_action_switch.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<Switch
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/switch_widget"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
-
diff --git a/car-qc-lib/res/layout/qc_action_toggle.xml b/car-qc-lib/res/layout/qc_action_toggle.xml
deleted file mode 100644
index 301e0c4..0000000
--- a/car-qc-lib/res/layout/qc_action_toggle.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<com.android.car.ui.uxr.DrawableStateToggleButton
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/qc_toggle_button"
- android:background="@android:color/transparent"
- android:defaultFocusHighlightEnabled="false"
- android:minHeight="0dp"
- android:minWidth="0dp"
- android:layout_width="@dimen/qc_toggle_size"
- android:layout_height="@dimen/qc_toggle_size"/>
\ No newline at end of file
diff --git a/car-qc-lib/res/layout/qc_row_view.xml b/car-qc-lib/res/layout/qc_row_view.xml
deleted file mode 100644
index 5975426..0000000
--- a/car-qc-lib/res/layout/qc_row_view.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<com.android.car.ui.uxr.DrawableStateConstraintLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:layout_marginVertical="@dimen/qc_row_margin_vertical"
- android:clipToPadding="false"
- android:minHeight="@dimen/qc_row_min_height"
- android:paddingEnd="@dimen/qc_row_padding_end"
- android:paddingStart="@dimen/qc_row_padding_start">
-
- <LinearLayout
- android:id="@+id/qc_row_start_items"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginEnd="@dimen/qc_action_items_horizontal_margin"
- android:orientation="horizontal"
- android:divider="@drawable/qc_row_action_divider"
- android:showDividers="middle"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintEnd_toStartOf="@+id/qc_row_content"
- app:layout_constraintHorizontal_chainStyle="spread_inside"/>
-
- <com.android.car.ui.uxr.DrawableStateConstraintLayout
- android:id="@+id/qc_row_content"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:background="?android:attr/selectableItemBackground"
- app:layout_constraintStart_toEndOf="@+id/qc_row_start_items"
- app:layout_constraintEnd_toStartOf="@+id/qc_row_end_items"
- app:layout_constraintTop_toTopOf="parent"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintHeight_default="wrap"
- app:layout_constraintHeight_min="@dimen/qc_row_min_height">
-
- <com.android.car.ui.uxr.DrawableStateImageView
- android:id="@+id/qc_icon"
- android:layout_width="@dimen/qc_row_icon_size"
- android:layout_height="@dimen/qc_row_icon_size"
- android:layout_marginEnd="@dimen/qc_row_icon_margin_end"
- android:scaleType="fitCenter"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintEnd_toStartOf="@+id/barrier1"
- app:layout_constraintTop_toTopOf="parent"
- app:layout_constraintBottom_toTopOf="@+id/barrier2"/>
-
- <androidx.constraintlayout.widget.Barrier
- android:id="@+id/barrier1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- app:barrierDirection="end"
- app:constraint_referenced_ids="qc_icon"
- app:barrierAllowsGoneWidgets="false"/>
-
- <com.android.car.ui.uxr.DrawableStateTextView
- android:id="@+id/qc_title"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:singleLine="true"
- android:textAppearance="@style/TextAppearance.QC.Title"
- app:layout_constraintStart_toEndOf="@+id/barrier1"
- app:layout_constraintTop_toTopOf="parent"
- app:layout_constraintBottom_toTopOf="@+id/qc_summary"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintVertical_chainStyle="packed"/>
-
- <com.android.car.ui.uxr.DrawableStateTextView
- android:id="@+id/qc_summary"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:textAppearance="@style/TextAppearance.QC.Subtitle"
- app:layout_constraintStart_toEndOf="@+id/barrier1"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/qc_title"
- app:layout_constraintBottom_toTopOf="@+id/barrier2"/>
-
- <androidx.constraintlayout.widget.Barrier
- android:id="@+id/barrier2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- app:barrierDirection="top"
- app:constraint_referenced_ids="qc_seekbar_wrapper"
- app:barrierAllowsGoneWidgets="false"/>
-
- <androidx.preference.UnPressableLinearLayout
- android:id="@+id/qc_seekbar_wrapper"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:paddingTop="@dimen/qc_seekbar_padding_top"
- android:focusable="true"
- android:background="@drawable/qc_seekbar_wrapper_background"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:layout_centerVertical="true"
- android:orientation="vertical"
- android:visibility="gone"
- app:layout_constraintStart_toEndOf="@+id/barrier1"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/barrier2"
- app:layout_constraintBottom_toBottomOf="parent">
- <SeekBar
- android:id="@+id/seekbar"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- style="@style/Widget.QC.SeekBar"/>
- </androidx.preference.UnPressableLinearLayout>
-
- </com.android.car.ui.uxr.DrawableStateConstraintLayout>
-
- <LinearLayout
- android:id="@+id/qc_row_end_items"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/qc_action_items_horizontal_margin"
- android:orientation="horizontal"
- android:divider="@drawable/qc_row_action_divider"
- android:showDividers="middle"
- app:layout_constraintStart_toEndOf="@+id/qc_row_content"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintTop_toTopOf="parent"
- app:layout_constraintBottom_toBottomOf="parent"/>
-
-</com.android.car.ui.uxr.DrawableStateConstraintLayout>
diff --git a/car-qc-lib/res/layout/qc_tile_view.xml b/car-qc-lib/res/layout/qc_tile_view.xml
deleted file mode 100644
index 7fb0884..0000000
--- a/car-qc-lib/res/layout/qc_tile_view.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<com.android.car.ui.uxr.DrawableStateLinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/qc_tile_wrapper"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:orientation="vertical"
- android:background="?android:attr/selectableItemBackground">
- <com.android.car.ui.uxr.DrawableStateToggleButton
- android:id="@+id/qc_tile_toggle_button"
- android:background="@android:color/transparent"
- android:layout_width="@dimen/qc_toggle_size"
- android:layout_height="@dimen/qc_toggle_size"
- android:layout_marginTop="@dimen/qc_toggle_margin"
- android:layout_marginBottom="@dimen/qc_toggle_margin"
- android:layout_marginStart="@dimen/qc_toggle_margin"
- android:layout_marginEnd="@dimen/qc_toggle_margin"
- android:clickable="false"
- android:focusable="false"/>
- <com.android.car.ui.uxr.DrawableStateTextView
- android:id="@android:id/summary"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="@style/TextAppearance.QC.Subtitle"/>
-</com.android.car.ui.uxr.DrawableStateLinearLayout>
\ No newline at end of file
diff --git a/car-qc-lib/res/values/colors.xml b/car-qc-lib/res/values/colors.xml
deleted file mode 100644
index e3fbd6f..0000000
--- a/car-qc-lib/res/values/colors.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<resources>
- <color name="qc_start_icon_color">@android:color/white</color>
- <color name="qc_toggle_off_background_color">#626262</color>
- <color name="qc_toggle_unavailable_background_color">@android:color/transparent</color>
- <color name="qc_toggle_unavailable_color">#75FFFFFF</color>
-</resources>
\ No newline at end of file
diff --git a/car-qc-lib/res/values/dimens.xml b/car-qc-lib/res/values/dimens.xml
deleted file mode 100644
index 6247561..0000000
--- a/car-qc-lib/res/values/dimens.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<resources>
- <dimen name="qc_row_padding_start">32dp</dimen>
- <dimen name="qc_row_padding_end">32dp</dimen>
- <dimen name="qc_row_min_height">76dp</dimen>
- <dimen name="qc_row_margin_vertical">10dp</dimen>
- <dimen name="qc_row_icon_size">44dp</dimen>
- <dimen name="qc_row_icon_margin_end">32dp</dimen>
- <dimen name="qc_row_content_margin">16dp</dimen>
-
- <dimen name="qc_action_items_horizontal_margin">32dp</dimen>
- <dimen name="qc_toggle_size">72dp</dimen>
- <dimen name="qc_toggle_margin">12dp</dimen>
- <dimen name="qc_toggle_background_radius">16dp</dimen>
- <dimen name="qc_toggle_rotary_background_radius">11dp</dimen>
- <dimen name="qc_toggle_foreground_icon_inset">14dp</dimen>
- <dimen name="qc_toggle_unavailable_outline_width">2dp</dimen>
-
- <dimen name="qc_seekbar_padding_top">16dp</dimen>
-</resources>
\ No newline at end of file
diff --git a/car-qc-lib/res/values/styles.xml b/car-qc-lib/res/values/styles.xml
deleted file mode 100644
index 587b522..0000000
--- a/car-qc-lib/res/values/styles.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<resources>
- <style name="TextAppearance.QC" parent="android:TextAppearance.DeviceDefault">
- <item name="android:textColor">@color/car_ui_text_color_primary</item>
- </style>
-
- <style name="TextAppearance.QC.Title">
- <item name="android:textSize">@dimen/car_ui_body1_size</item>
- </style>
-
- <style name="TextAppearance.QC.Subtitle">
- <item name="android:textColor">@color/car_ui_text_color_secondary</item>
- <item name="android:textSize">@dimen/car_ui_body3_size</item>
- </style>
-
- <style name="Widget.QC" parent="android:Widget.DeviceDefault"/>
-
- <style name="Widget.QC.SeekBar">
- <item name="android:background">@null</item>
- <item name="android:clickable">false</item>
- <item name="android:focusable">false</item>
- <item name="android:splitTrack">false</item>
- </style>
-</resources>
diff --git a/car-qc-lib/src/com/android/car/qc/QCActionItem.java b/car-qc-lib/src/com/android/car/qc/QCActionItem.java
deleted file mode 100644
index 4c66bea..0000000
--- a/car-qc-lib/src/com/android/car/qc/QCActionItem.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc;
-
-import android.app.PendingIntent;
-import android.graphics.drawable.Icon;
-import android.os.Parcel;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-/**
- * Quick Control Action that are includes as either start or end actions in {@link QCRow}
- */
-public class QCActionItem extends QCItem {
- private final boolean mIsChecked;
- private final boolean mIsEnabled;
- private final boolean mIsAvailable;
- private Icon mIcon;
- private PendingIntent mAction;
-
- public QCActionItem(@NonNull @QCItemType String type, boolean isChecked, boolean isEnabled,
- boolean isAvailable, @Nullable Icon icon, @Nullable PendingIntent action) {
- super(type);
- mIsEnabled = isEnabled;
- mIsChecked = isChecked;
- mIsAvailable = isAvailable;
- mIcon = icon;
- mAction = action;
- }
-
- public QCActionItem(@NonNull Parcel in) {
- super(in);
- mIsChecked = in.readBoolean();
- mIsEnabled = in.readBoolean();
- mIsAvailable = in.readBoolean();
- boolean hasIcon = in.readBoolean();
- if (hasIcon) {
- mIcon = Icon.CREATOR.createFromParcel(in);
- }
- boolean hasAction = in.readBoolean();
- if (hasAction) {
- mAction = PendingIntent.CREATOR.createFromParcel(in);
- }
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
- dest.writeBoolean(mIsChecked);
- dest.writeBoolean(mIsEnabled);
- dest.writeBoolean(mIsAvailable);
- boolean includeIcon = getType().equals(QC_TYPE_ACTION_TOGGLE) && mIcon != null;
- dest.writeBoolean(includeIcon);
- if (includeIcon) {
- mIcon.writeToParcel(dest, flags);
- }
- boolean hasAction = mAction != null;
- dest.writeBoolean(hasAction);
- if (hasAction) {
- mAction.writeToParcel(dest, flags);
- }
- }
-
- @Override
- public PendingIntent getPrimaryAction() {
- return mAction;
- }
-
- public boolean isChecked() {
- return mIsChecked;
- }
-
- public boolean isEnabled() {
- return mIsEnabled;
- }
-
- public boolean isAvailable() {
- return mIsAvailable;
- }
-
- @Nullable
- public Icon getIcon() {
- return mIcon;
- }
-
- public static Creator<QCActionItem> CREATOR = new Creator<QCActionItem>() {
- @Override
- public QCActionItem createFromParcel(Parcel source) {
- return new QCActionItem(source);
- }
-
- @Override
- public QCActionItem[] newArray(int size) {
- return new QCActionItem[size];
- }
- };
-
- /**
- * Builder for {@link QCActionItem}.
- */
- public static class Builder {
- private final String mType;
- private boolean mIsChecked;
- private boolean mIsEnabled = true;
- private boolean mIsAvailable = true;
- private Icon mIcon;
- private PendingIntent mAction;
-
- public Builder(@NonNull @QCItemType String type) {
- if (!isValidType(type)) {
- throw new IllegalArgumentException("Invalid QCActionItem type provided" + type);
- }
- mType = type;
- }
-
- /**
- * Sets whether or not the action item should be checked.
- */
- public Builder setChecked(boolean checked) {
- mIsChecked = checked;
- return this;
- }
-
- /**
- * Sets whether or not the action item should be enabled.
- */
- public Builder setEnabled(boolean enabled) {
- mIsEnabled = enabled;
- return this;
- }
-
- /**
- * Sets whether or not the action item is available.
- */
- public Builder setAvailable(boolean available) {
- mIsAvailable = available;
- return this;
- }
-
- /**
- * Sets the icon for {@link QC_TYPE_ACTION_TOGGLE} actions
- */
- public Builder setIcon(@Nullable Icon icon) {
- mIcon = icon;
- return this;
- }
-
- /**
- * Sets the PendingIntent to be sent when the action item is clicked.
- */
- public Builder setAction(@Nullable PendingIntent action) {
- mAction = action;
- return this;
- }
-
- /**
- * Builds the final {@link QCActionItem}.
- */
- public QCActionItem build() {
- return new QCActionItem(mType, mIsChecked, mIsEnabled, mIsAvailable, mIcon, mAction);
- }
-
- private boolean isValidType(String type) {
- return type.equals(QC_TYPE_ACTION_SWITCH) || type.equals(QC_TYPE_ACTION_TOGGLE);
- }
- }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/QCItem.java b/car-qc-lib/src/com/android/car/qc/QCItem.java
deleted file mode 100644
index 77fe30f..0000000
--- a/car-qc-lib/src/com/android/car/qc/QCItem.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc;
-
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.StringDef;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Base class for all quick controls elements.
- */
-public abstract class QCItem implements Parcelable {
- public static final String QC_TYPE_LIST = "QC_TYPE_LIST";
- public static final String QC_TYPE_ROW = "QC_TYPE_ROW";
- public static final String QC_TYPE_TILE = "QC_TYPE_TILE";
- public static final String QC_TYPE_SLIDER = "QC_TYPE_SLIDER";
- public static final String QC_TYPE_ACTION_SWITCH = "QC_TYPE_ACTION_SWITCH";
- public static final String QC_TYPE_ACTION_TOGGLE = "QC_TYPE_ACTION_TOGGLE";
-
- public static final String QC_ACTION_TOGGLE_STATE = "QC_ACTION_TOGGLE_STATE";
- public static final String QC_ACTION_SLIDER_VALUE = "QC_ACTION_SLIDER_VALUE";
-
- @StringDef(value = {
- QC_TYPE_LIST,
- QC_TYPE_ROW,
- QC_TYPE_TILE,
- QC_TYPE_SLIDER,
- QC_TYPE_ACTION_SWITCH,
- QC_TYPE_ACTION_TOGGLE,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface QCItemType {
- }
-
- private final String mType;
- private ActionHandler mActionHandler;
-
- public QCItem(@NonNull @QCItemType String type) {
- mType = type;
- }
-
- public QCItem(@NonNull Parcel in) {
- mType = in.readString();
- }
-
- @NonNull
- @QCItemType
- public String getType() {
- return mType;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(mType);
- }
-
- public void setActionHandler(@Nullable ActionHandler handler) {
- mActionHandler = handler;
- }
-
- @Nullable
- public ActionHandler getActionHandler() {
- return mActionHandler;
- }
-
- /**
- * Returns the PendingIntent that is sent when the item is clicked.
- */
- @Nullable
- public abstract PendingIntent getPrimaryAction();
-
- /**
- * Action handler that can listen for an action to occur and notify listeners.
- */
- public interface ActionHandler {
- /**
- * Callback when an action occurs.
- * @param item the QCItem that sent the action
- * @param context the context for the action
- * @param intent the intent that was sent with the action
- */
- void onAction(@NonNull QCItem item, @NonNull Context context, @NonNull Intent intent);
-
- default boolean isActivity() {
- return false;
- }
- }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/QCList.java b/car-qc-lib/src/com/android/car/qc/QCList.java
deleted file mode 100644
index 250b5d8..0000000
--- a/car-qc-lib/src/com/android/car/qc/QCList.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc;
-
-import android.app.PendingIntent;
-import android.os.Parcel;
-
-import androidx.annotation.NonNull;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Wrapping quick controls element that contains QCRow elements.
- */
-public class QCList extends QCItem {
- private final List<QCRow> mRows;
-
- public QCList(@NonNull List<QCRow> rows) {
- super(QC_TYPE_LIST);
- mRows = Collections.unmodifiableList(rows);
- }
-
- public QCList(@NonNull Parcel in) {
- super(in);
- int rowCount = in.readInt();
- List<QCRow> rows = new ArrayList<>();
- for (int i = 0; i < rowCount; i++) {
- rows.add(QCRow.CREATOR.createFromParcel(in));
- }
- mRows = Collections.unmodifiableList(rows);
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
- dest.writeInt(mRows.size());
- for (QCRow row : mRows) {
- row.writeToParcel(dest, flags);
- }
- }
-
- @Override
- public PendingIntent getPrimaryAction() {
- return null;
- }
-
- @NonNull
- public List<QCRow> getRows() {
- return mRows;
- }
-
- public static Creator<QCList> CREATOR = new Creator<QCList>() {
- @Override
- public QCList createFromParcel(Parcel source) {
- return new QCList(source);
- }
-
- @Override
- public QCList[] newArray(int size) {
- return new QCList[size];
- }
- };
-
- /**
- * Builder for {@link QCList}.
- */
- public static class Builder {
- private final List<QCRow> mRows = new ArrayList<>();
-
- /**
- * Adds a {@link QCRow} to the list.
- */
- public Builder addRow(@NonNull QCRow row) {
- mRows.add(row);
- return this;
- }
-
- /**
- * Builds the final {@link QCList}.
- */
- public QCList build() {
- return new QCList(mRows);
- }
- }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/QCRow.java b/car-qc-lib/src/com/android/car/qc/QCRow.java
deleted file mode 100644
index deb4429..0000000
--- a/car-qc-lib/src/com/android/car/qc/QCRow.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc;
-
-import android.app.PendingIntent;
-import android.graphics.drawable.Icon;
-import android.os.Parcel;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Quick Control Row Element
- * ------------------------------------
- * | | Title | |
- * | StartItems | Subtitle | EndItems |
- * | | Sliders | |
- * ------------------------------------
- */
-public class QCRow extends QCItem {
- private final String mTitle;
- private final String mSubtitle;
- private final Icon mStartIcon;
- private final boolean mIsStartIconTintable;
- private final QCSlider mSlider;
- private final List<QCActionItem> mStartItems;
- private final List<QCActionItem> mEndItems;
- private final PendingIntent mPrimaryAction;
-
- public QCRow(@Nullable String title, @Nullable String subtitle,
- @Nullable PendingIntent primaryAction, @Nullable Icon startIcon, boolean isIconTintable,
- @Nullable QCSlider slider, @NonNull List<QCActionItem> startItems,
- @NonNull List<QCActionItem> endItems) {
- super(QC_TYPE_ROW);
- mTitle = title;
- mSubtitle = subtitle;
- mPrimaryAction = primaryAction;
- mStartIcon = startIcon;
- mIsStartIconTintable = isIconTintable;
- mSlider = slider;
- mStartItems = Collections.unmodifiableList(startItems);
- mEndItems = Collections.unmodifiableList(endItems);
- }
-
- public QCRow(@NonNull Parcel in) {
- super(in);
- mTitle = in.readString();
- mSubtitle = in.readString();
- boolean hasIcon = in.readBoolean();
- if (hasIcon) {
- mStartIcon = Icon.CREATOR.createFromParcel(in);
- } else {
- mStartIcon = null;
- }
- mIsStartIconTintable = in.readBoolean();
- boolean hasSlider = in.readBoolean();
- if (hasSlider) {
- mSlider = QCSlider.CREATOR.createFromParcel(in);
- } else {
- mSlider = null;
- }
- List<QCActionItem> startItems = new ArrayList<>();
- int startItemCount = in.readInt();
- for (int i = 0; i < startItemCount; i++) {
- startItems.add(QCActionItem.CREATOR.createFromParcel(in));
- }
- mStartItems = Collections.unmodifiableList(startItems);
- List<QCActionItem> endItems = new ArrayList<>();
- int endItemCount = in.readInt();
- for (int i = 0; i < endItemCount; i++) {
- endItems.add(QCActionItem.CREATOR.createFromParcel(in));
- }
- mEndItems = Collections.unmodifiableList(endItems);
- boolean hasPrimaryAction = in.readBoolean();
- if (hasPrimaryAction) {
- mPrimaryAction = PendingIntent.CREATOR.createFromParcel(in);
- } else {
- mPrimaryAction = null;
- }
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
- dest.writeString(mTitle);
- dest.writeString(mSubtitle);
- boolean hasStartIcon = mStartIcon != null;
- dest.writeBoolean(hasStartIcon);
- if (hasStartIcon) {
- mStartIcon.writeToParcel(dest, flags);
- }
- dest.writeBoolean(mIsStartIconTintable);
- boolean hasSlider = mSlider != null;
- dest.writeBoolean(hasSlider);
- if (hasSlider) {
- mSlider.writeToParcel(dest, flags);
- }
- dest.writeInt(mStartItems.size());
- for (QCActionItem startItem : mStartItems) {
- startItem.writeToParcel(dest, flags);
- }
- dest.writeInt(mEndItems.size());
- for (QCActionItem endItem : mEndItems) {
- endItem.writeToParcel(dest, flags);
- }
- dest.writeBoolean(mPrimaryAction != null);
- boolean hasPrimaryAction = mPrimaryAction != null;
- if (hasPrimaryAction) {
- mPrimaryAction.writeToParcel(dest, flags);
- }
- }
-
- @Override
- public PendingIntent getPrimaryAction() {
- return mPrimaryAction;
- }
-
- @Nullable
- public String getTitle() {
- return mTitle;
- }
-
- @Nullable
- public String getSubtitle() {
- return mSubtitle;
- }
-
- @Nullable
- public Icon getStartIcon() {
- return mStartIcon;
- }
-
- public boolean isStartIconTintable() {
- return mIsStartIconTintable;
- }
-
- @Nullable
- public QCSlider getSlider() {
- return mSlider;
- }
-
- @NonNull
- public List<QCActionItem> getStartItems() {
- return mStartItems;
- }
-
- @NonNull
- public List<QCActionItem> getEndItems() {
- return mEndItems;
- }
-
- public static Creator<QCRow> CREATOR = new Creator<QCRow>() {
- @Override
- public QCRow createFromParcel(Parcel source) {
- return new QCRow(source);
- }
-
- @Override
- public QCRow[] newArray(int size) {
- return new QCRow[size];
- }
- };
-
- /**
- * Builder for {@link QCRow}.
- */
- public static class Builder {
- private final List<QCActionItem> mStartItems = new ArrayList<>();
- private final List<QCActionItem> mEndItems = new ArrayList<>();
- private Icon mStartIcon;
- private boolean mIsStartIconTintable = true;
- private String mTitle;
- private String mSubtitle;
- private QCSlider mSlider;
- private PendingIntent mPrimaryAction;
-
- /**
- * Sets the row title.
- */
- public Builder setTitle(@Nullable String title) {
- mTitle = title;
- return this;
- }
-
- /**
- * Sets the row subtitle.
- */
- public Builder setSubtitle(@Nullable String subtitle) {
- mSubtitle = subtitle;
- return this;
- }
-
- /**
- * Sets the row icon.
- */
- public Builder setIcon(@Nullable Icon icon) {
- mStartIcon = icon;
- return this;
- }
-
- /**
- * Sets whether or not the row icon is tintable.
- */
- public Builder setIconTintable(boolean tintable) {
- mIsStartIconTintable = tintable;
- return this;
- }
-
- /**
- * Adds a {@link QCSlider} to the slider area.
- */
- public Builder addSlider(@Nullable QCSlider slider) {
- mSlider = slider;
- return this;
- }
-
- /**
- * Sets the PendingIntent to be sent when the row is clicked.
- */
- public Builder setPrimaryAction(@Nullable PendingIntent action) {
- mPrimaryAction = action;
- return this;
- }
-
- /**
- * Adds a {@link QCActionItem} to the start items area.
- */
- public Builder addStartItem(@NonNull QCActionItem item) {
- mStartItems.add(item);
- return this;
- }
-
- /**
- * Adds a {@link QCActionItem} to the end items area.
- */
- public Builder addEndItem(@NonNull QCActionItem item) {
- mEndItems.add(item);
- return this;
- }
-
- /**
- * Builds the final {@link QCRow}.
- */
- public QCRow build() {
- return new QCRow(mTitle, mSubtitle, mPrimaryAction, mStartIcon, mIsStartIconTintable,
- mSlider, mStartItems, mEndItems);
- }
- }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/QCSlider.java b/car-qc-lib/src/com/android/car/qc/QCSlider.java
deleted file mode 100644
index 16be5e7..0000000
--- a/car-qc-lib/src/com/android/car/qc/QCSlider.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc;
-
-import android.app.PendingIntent;
-import android.os.Parcel;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-/**
- * Quick Control Slider included in {@link QCRow}
- */
-public class QCSlider extends QCItem {
- private int mMin = 0;
- private int mMax = 100;
- private int mValue = 0;
- private PendingIntent mInputAction;
-
- public QCSlider(int min, int max, int value, @Nullable PendingIntent inputAction) {
- super(QC_TYPE_SLIDER);
- mMin = min;
- mMax = max;
- mValue = value;
- mInputAction = inputAction;
- }
-
- public QCSlider(@NonNull Parcel in) {
- super(in);
- mMin = in.readInt();
- mMax = in.readInt();
- mValue = in.readInt();
- boolean hasAction = in.readBoolean();
- if (hasAction) {
- mInputAction = PendingIntent.CREATOR.createFromParcel(in);
- }
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
- dest.writeInt(mMin);
- dest.writeInt(mMax);
- dest.writeInt(mValue);
- boolean hasAction = mInputAction != null;
- dest.writeBoolean(hasAction);
- if (hasAction) {
- mInputAction.writeToParcel(dest, flags);
- }
- }
-
- @Override
- public PendingIntent getPrimaryAction() {
- return mInputAction;
- }
-
- public int getMin() {
- return mMin;
- }
-
- public int getMax() {
- return mMax;
- }
-
- public int getValue() {
- return mValue;
- }
-
- public static Creator<QCSlider> CREATOR = new Creator<QCSlider>() {
- @Override
- public QCSlider createFromParcel(Parcel source) {
- return new QCSlider(source);
- }
-
- @Override
- public QCSlider[] newArray(int size) {
- return new QCSlider[size];
- }
- };
-
- /**
- * Builder for {@link QCSlider}.
- */
- public static class Builder {
- private int mMin = 0;
- private int mMax = 100;
- private int mValue = 0;
- private PendingIntent mInputAction;
-
- /**
- * Set the minimum allowed value for the slider input.
- */
- public Builder setMin(int min) {
- mMin = min;
- return this;
- }
-
- /**
- * Set the maximum allowed value for the slider input.
- */
- public Builder setMax(int max) {
- mMax = max;
- return this;
- }
-
- /**
- * Set the current value for the slider input.
- */
- public Builder setValue(int value) {
- mValue = value;
- return this;
- }
-
- /**
- * Set the PendingIntent to be sent when the slider value is changed.
- */
- public Builder setInputAction(@Nullable PendingIntent inputAction) {
- mInputAction = inputAction;
- return this;
- }
-
- /**
- * Builds the final {@link QCSlider}.
- */
- public QCSlider build() {
- return new QCSlider(mMin, mMax, mValue, mInputAction);
- }
- }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/QCTile.java b/car-qc-lib/src/com/android/car/qc/QCTile.java
deleted file mode 100644
index 5f891e6..0000000
--- a/car-qc-lib/src/com/android/car/qc/QCTile.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc;
-
-import android.app.PendingIntent;
-import android.graphics.drawable.Icon;
-import android.os.Parcel;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-/**
- * Quick Control Tile Element
- * ------------
- * | -------- |
- * | | Icon | |
- * | -------- |
- * | Subtitle |
- * ------------
- */
-public class QCTile extends QCItem {
- private final boolean mIsChecked;
- private final boolean mIsEnabled;
- private final boolean mIsAvailable;
- private final String mSubtitle;
- private Icon mIcon;
- private PendingIntent mAction;
-
- public QCTile(boolean isChecked, boolean isEnabled, boolean isAvailable,
- @Nullable String subtitle, @Nullable Icon icon, @Nullable PendingIntent action) {
- super(QC_TYPE_TILE);
- mIsEnabled = isEnabled;
- mIsChecked = isChecked;
- mIsAvailable = isAvailable;
- mSubtitle = subtitle;
- mIcon = icon;
- mAction = action;
- }
-
- public QCTile(@NonNull Parcel in) {
- super(in);
- mIsChecked = in.readBoolean();
- mIsEnabled = in.readBoolean();
- mIsAvailable = in.readBoolean();
- mSubtitle = in.readString();
- boolean hasIcon = in.readBoolean();
- if (hasIcon) {
- mIcon = Icon.CREATOR.createFromParcel(in);
- }
- boolean hasAction = in.readBoolean();
- if (hasAction) {
- mAction = PendingIntent.CREATOR.createFromParcel(in);
- }
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
- dest.writeBoolean(mIsChecked);
- dest.writeBoolean(mIsEnabled);
- dest.writeBoolean(mIsAvailable);
- dest.writeString(mSubtitle);
- boolean hasIcon = mIcon != null;
- dest.writeBoolean(hasIcon);
- if (hasIcon) {
- mIcon.writeToParcel(dest, flags);
- }
- boolean hasAction = mAction != null;
- dest.writeBoolean(hasAction);
- if (hasAction) {
- mAction.writeToParcel(dest, flags);
- }
- }
-
- @Override
- public PendingIntent getPrimaryAction() {
- return mAction;
- }
-
- public boolean isChecked() {
- return mIsChecked;
- }
-
- public boolean isEnabled() {
- return mIsEnabled;
- }
-
- public boolean isAvailable() {
- return mIsAvailable;
- }
-
- @Nullable
- public String getSubtitle() {
- return mSubtitle;
- }
-
- @Nullable
- public Icon getIcon() {
- return mIcon;
- }
-
- public static Creator<QCTile> CREATOR = new Creator<QCTile>() {
- @Override
- public QCTile createFromParcel(Parcel source) {
- return new QCTile(source);
- }
-
- @Override
- public QCTile[] newArray(int size) {
- return new QCTile[size];
- }
- };
-
- /**
- * Builder for {@link QCTile}.
- */
- public static class Builder {
- private boolean mIsChecked;
- private boolean mIsEnabled = true;
- private boolean mIsAvailable = true;
- private String mSubtitle;
- private Icon mIcon;
- private PendingIntent mAction;
-
- /**
- * Sets whether or not the tile should be checked.
- */
- public Builder setChecked(boolean checked) {
- mIsChecked = checked;
- return this;
- }
-
- /**
- * Sets whether or not the tile should be enabled.
- */
- public Builder setEnabled(boolean enabled) {
- mIsEnabled = enabled;
- return this;
- }
-
- /**
- * Sets whether or not the action item is available.
- */
- public Builder setAvailable(boolean available) {
- mIsAvailable = available;
- return this;
- }
-
- /**
- * Sets the tile's subtitle.
- */
- public Builder setSubtitle(@Nullable String subtitle) {
- mSubtitle = subtitle;
- return this;
- }
-
- /**
- * Sets the tile's icon.
- */
- public Builder setIcon(@Nullable Icon icon) {
- mIcon = icon;
- return this;
- }
-
- /**
- * Sets the PendingIntent to be sent when the tile is clicked.
- */
- public Builder setAction(@Nullable PendingIntent action) {
- mAction = action;
- return this;
- }
-
- /**
- * Builds the final {@link QCTile}.
- */
- public QCTile build() {
- return new QCTile(mIsChecked, mIsEnabled, mIsAvailable, mSubtitle, mIcon, mAction);
- }
- }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/controller/BaseQCController.java b/car-qc-lib/src/com/android/car/qc/controller/BaseQCController.java
deleted file mode 100644
index ce2bea3..0000000
--- a/car-qc-lib/src/com/android/car/qc/controller/BaseQCController.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.controller;
-
-import android.content.Context;
-
-import androidx.annotation.Nullable;
-import androidx.annotation.UiThread;
-import androidx.lifecycle.Observer;
-
-import com.android.car.qc.QCItem;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Base controller class for Quick Controls.
- */
-public abstract class BaseQCController implements QCItemCallback {
- protected final Context mContext;
- protected final List<Observer<QCItem>> mObservers = new ArrayList<>();
- protected boolean mShouldListen = false;
- protected boolean mWasListening = false;
- protected QCItem mQCItem;
-
- public BaseQCController(Context context) {
- mContext = context;
- }
-
- /**
- * Update whether or not the controller should be listening to updates from the provider.
- */
- public void listen(boolean shouldListen) {
- mShouldListen = shouldListen;
- updateListening();
- }
-
- /**
- * Add a QCItem observer to the controller.
- */
- @UiThread
- public void addObserver(Observer<QCItem> observer) {
- mObservers.add(observer);
- updateListening();
- }
-
- /**
- * Remove a QCItem observer from the controller.
- */
- @UiThread
- public void removeObserver(Observer<QCItem> observer) {
- mObservers.remove(observer);
- updateListening();
- }
-
- @UiThread
- @Override
- public void onQCItemUpdated(@Nullable QCItem item) {
- mQCItem = item;
- mObservers.forEach(o -> o.onChanged(mQCItem));
- }
-
- /**
- * Destroy the controller. This should be called when the controller is no longer needed so
- * the listeners can be cleaned up.
- */
- public void destroy() {
- mShouldListen = false;
- mObservers.clear();
- updateListening();
- }
-
- /**
- * Subclasses must override this method to handle a listening update.
- */
- protected abstract void updateListening();
-}
diff --git a/car-qc-lib/src/com/android/car/qc/controller/LocalQCController.java b/car-qc-lib/src/com/android/car/qc/controller/LocalQCController.java
deleted file mode 100644
index 01bd6f8..0000000
--- a/car-qc-lib/src/com/android/car/qc/controller/LocalQCController.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.controller;
-
-import android.content.Context;
-
-import com.android.car.qc.provider.BaseLocalQCProvider;
-
-/**
- * Controller for binding to local quick control providers.
- */
-public class LocalQCController extends BaseQCController {
-
- private final BaseLocalQCProvider mProvider;
-
- private final BaseLocalQCProvider.Notifier mProviderNotifier =
- new BaseLocalQCProvider.Notifier() {
- @Override
- public void notifyUpdate() {
- if (mShouldListen && !mObservers.isEmpty()) {
- onQCItemUpdated(mProvider.getQCItem());
- }
- }
- };
-
- public LocalQCController(Context context, BaseLocalQCProvider provider) {
- super(context);
- mProvider = provider;
- mProvider.setNotifier(mProviderNotifier);
- mQCItem = mProvider.getQCItem();
- }
-
- @Override
- protected void updateListening() {
- boolean listen = mShouldListen && !mObservers.isEmpty();
- if (mWasListening != listen) {
- mWasListening = listen;
- mProvider.shouldListen(listen);
- if (listen) {
- mQCItem = mProvider.getQCItem();
- onQCItemUpdated(mQCItem);
- }
- }
- }
-
- @Override
- public void destroy() {
- super.destroy();
- mProvider.onDestroy();
- }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/controller/QCItemCallback.java b/car-qc-lib/src/com/android/car/qc/controller/QCItemCallback.java
deleted file mode 100644
index b5efdef..0000000
--- a/car-qc-lib/src/com/android/car/qc/controller/QCItemCallback.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.controller;
-
-import androidx.annotation.Nullable;
-
-import com.android.car.qc.QCItem;
-
-/**
- * Callback to be executed when a QCItem changes.
- */
-public interface QCItemCallback {
- /**
- * Called when QCItem is updated.
- *
- * @param item The updated QCItem.
- */
- void onQCItemUpdated(@Nullable QCItem item);
-}
diff --git a/car-qc-lib/src/com/android/car/qc/controller/RemoteQCController.java b/car-qc-lib/src/com/android/car/qc/controller/RemoteQCController.java
deleted file mode 100644
index c98ca86..0000000
--- a/car-qc-lib/src/com/android/car/qc/controller/RemoteQCController.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.controller;
-
-import static com.android.car.qc.provider.BaseQCProvider.EXTRA_ITEM;
-import static com.android.car.qc.provider.BaseQCProvider.EXTRA_URI;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_BIND;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_DESTROY;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_SUBSCRIBE;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_UNSUBSCRIBE;
-
-import android.content.ContentProviderClient;
-import android.content.Context;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.HandlerExecutor;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.Parcelable;
-import android.os.RemoteException;
-import android.util.ArrayMap;
-import android.util.Log;
-import android.util.Pair;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.VisibleForTesting;
-import androidx.annotation.WorkerThread;
-
-import com.android.car.qc.QCItem;
-
-import java.util.concurrent.Executor;
-
-/**
- * Controller for binding to remote quick control providers.
- */
-public class RemoteQCController extends BaseQCController {
- private static final String TAG = "RemoteQCController";
- private static final long PROVIDER_ANR_TIMEOUT = 3000L;
-
- private final Uri mUri;
- private final Executor mBackgroundExecutor;
- private final HandlerThread mBackgroundHandlerThread;
- private final ArrayMap<Pair<Uri, QCItemCallback>, QCObserver> mObserverLookup =
- new ArrayMap<>();
-
- public RemoteQCController(Context context, Uri uri) {
- super(context);
- mUri = uri;
- mBackgroundHandlerThread = new HandlerThread(/* name= */ TAG + "HandlerThread");
- mBackgroundHandlerThread.start();
- mBackgroundExecutor = new HandlerExecutor(
- new Handler(mBackgroundHandlerThread.getLooper()));
- }
-
- @VisibleForTesting
- RemoteQCController(Context context, Uri uri, Executor backgroundExecutor) {
- super(context);
- mUri = uri;
- mBackgroundHandlerThread = null;
- mBackgroundExecutor = backgroundExecutor;
- }
-
- @Override
- protected void updateListening() {
- boolean listen = mShouldListen && !mObservers.isEmpty();
- mBackgroundExecutor.execute(() -> updateListeningBg(listen));
- }
-
- @Override
- public void destroy() {
- super.destroy();
- if (mBackgroundHandlerThread != null) {
- mBackgroundHandlerThread.quit();
- }
- try (ContentProviderClient client = getClient()) {
- if (client == null) {
- return;
- }
- Bundle b = new Bundle();
- b.putParcelable(EXTRA_URI, mUri);
- try {
- client.call(METHOD_DESTROY, /* arg= */ null, b);
- } catch (Exception e) {
- Log.d(TAG, "Error destroying QCItem", e);
- }
- }
- }
-
- @WorkerThread
- private void updateListeningBg(boolean isListening) {
- if (mWasListening != isListening) {
- mWasListening = isListening;
- if (isListening) {
- registerQCCallback(mContext.getMainExecutor(), /* callback= */ this);
- // Update one-time on a different thread so that it can display in parallel
- mBackgroundExecutor.execute(this::updateQCItem);
- } else {
- unregisterQCCallback(this);
- }
- }
- }
-
- @WorkerThread
- private void updateQCItem() {
- try {
- QCItem item = bind();
- mContext.getMainExecutor().execute(() -> onQCItemUpdated(item));
- } catch (Exception e) {
- Log.d(TAG, "Error fetching QCItem", e);
- }
- }
-
- private QCItem bind() {
- try (ContentProviderClient provider = getClient()) {
- if (provider == null) {
- return null;
- }
- Bundle extras = new Bundle();
- extras.putParcelable(EXTRA_URI, mUri);
- Bundle res = provider.call(METHOD_BIND, /* arg= */ null, extras);
- if (res == null) {
- return null;
- }
- res.setDefusable(true);
- res.setClassLoader(QCItem.class.getClassLoader());
- Parcelable parcelable = res.getParcelable(EXTRA_ITEM);
- if (parcelable instanceof QCItem) {
- return (QCItem) parcelable;
- }
- return null;
- } catch (RemoteException e) {
- Log.d(TAG, "Error binding QCItem", e);
- return null;
- }
- }
-
- private void subscribe() {
- try (ContentProviderClient client = getClient()) {
- if (client == null) {
- return;
- }
- Bundle b = new Bundle();
- b.putParcelable(EXTRA_URI, mUri);
- try {
- client.call(METHOD_SUBSCRIBE, /* arg= */ null, b);
- } catch (Exception e) {
- Log.d(TAG, "Error subscribing to QCItem", e);
- }
- }
- }
-
- private void unsubscribe() {
- try (ContentProviderClient client = getClient()) {
- if (client == null) {
- return;
- }
- Bundle b = new Bundle();
- b.putParcelable(EXTRA_URI, mUri);
- try {
- client.call(METHOD_UNSUBSCRIBE, /* arg= */ null, b);
- } catch (Exception e) {
- Log.d(TAG, "Error unsubscribing from QCItem", e);
- }
- }
- }
-
- @VisibleForTesting
- ContentProviderClient getClient() {
- ContentProviderClient client = mContext.getContentResolver()
- .acquireContentProviderClient(mUri);
- if (client == null) {
- return null;
- }
- client.setDetectNotResponding(PROVIDER_ANR_TIMEOUT);
- return client;
- }
-
- private void registerQCCallback(@NonNull Executor executor, @NonNull QCItemCallback callback) {
- getObserver(callback, new QCObserver(mUri, executor, callback)).startObserving();
- }
-
- private void unregisterQCCallback(@NonNull QCItemCallback callback) {
- synchronized (mObserverLookup) {
- QCObserver observer = mObserverLookup.remove(new Pair<>(mUri, callback));
- if (observer != null) {
- observer.stopObserving();
- }
- }
- }
-
- private QCObserver getObserver(QCItemCallback callback, QCObserver observer) {
- Pair<Uri, QCItemCallback> key = new Pair<>(mUri, callback);
- synchronized (mObserverLookup) {
- QCObserver oldObserver = mObserverLookup.put(key, observer);
- if (oldObserver != null) {
- oldObserver.stopObserving();
- }
- }
- return observer;
- }
-
- private class QCObserver {
- private final Uri mUri;
- private final Executor mExecutor;
- private final QCItemCallback mCallback;
- private boolean mIsSubscribed;
-
- private final Runnable mUpdateItem = new Runnable() {
- @Override
- public void run() {
- trySubscribe();
- QCItem item = bind();
- mExecutor.execute(() -> mCallback.onQCItemUpdated(item));
- }
- };
-
- private final ContentObserver mObserver = new ContentObserver(
- new Handler(Looper.getMainLooper())) {
- @Override
- public void onChange(boolean selfChange) {
- android.os.AsyncTask.execute(mUpdateItem);
- }
- };
-
- QCObserver(Uri uri, Executor executor, QCItemCallback callback) {
- mUri = uri;
- mExecutor = executor;
- mCallback = callback;
- }
-
- void startObserving() {
- ContentProviderClient provider =
- mContext.getContentResolver().acquireContentProviderClient(mUri);
- if (provider != null) {
- provider.close();
- mContext.getContentResolver().registerContentObserver(
- mUri, /* notifyForDescendants= */ true, mObserver);
- trySubscribe();
- }
- }
-
- void trySubscribe() {
- if (!mIsSubscribed) {
- subscribe();
- mIsSubscribed = true;
- }
- }
-
- void stopObserving() {
- mContext.getContentResolver().unregisterContentObserver(mObserver);
- if (mIsSubscribed) {
- unsubscribe();
- mIsSubscribed = false;
- }
- }
- }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/provider/BaseLocalQCProvider.java b/car-qc-lib/src/com/android/car/qc/provider/BaseLocalQCProvider.java
deleted file mode 100644
index 764d2a3..0000000
--- a/car-qc-lib/src/com/android/car/qc/provider/BaseLocalQCProvider.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.provider;
-
-import android.content.Context;
-
-import com.android.car.qc.QCItem;
-
-/**
- * Base class for local Quick Control providers.
- */
-public abstract class BaseLocalQCProvider {
-
- /**
- * Callback to be executed when the QCItem updates.
- */
- public interface Notifier {
- /**
- * Called when the QCItem has been updated.
- */
- default void notifyUpdate() {
- }
- }
-
- private Notifier mNotifier;
- private boolean mIsListening;
- protected final Context mContext;
-
- public BaseLocalQCProvider(Context context) {
- mContext = context;
- }
-
- /**
- * Set the notifier that should be called when the QCItem updates.
- */
- public void setNotifier(Notifier notifier) {
- mNotifier = notifier;
- }
-
- /**
- * Update whether or not the provider should be listening for live updates.
- */
- public void shouldListen(boolean listen) {
- if (mIsListening == listen) {
- return;
- }
- mIsListening = listen;
- if (listen) {
- onSubscribed();
- } else {
- onUnsubscribed();
- }
- }
-
- /**
- * Method to create and return a {@link QCItem}.
- */
- public abstract QCItem getQCItem();
-
- /**
- * Called to inform the provider that it has been subscribed to.
- */
- protected void onSubscribed() {
- }
-
- /**
- * Called to inform the provider that it has been unsubscribed from.
- */
- protected void onUnsubscribed() {
- }
-
- /**
- * Called to inform the provider that it is being destroyed.
- */
- public void onDestroy() {
- }
-
- protected void notifyChange() {
- if (mNotifier != null) {
- mNotifier.notifyUpdate();
- }
- }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/provider/BaseQCProvider.java b/car-qc-lib/src/com/android/car/qc/provider/BaseQCProvider.java
deleted file mode 100644
index 61db361..0000000
--- a/car-qc-lib/src/com/android/car/qc/provider/BaseQCProvider.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.provider;
-
-import android.content.ContentProvider;
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Process;
-import android.os.StrictMode;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.car.qc.QCItem;
-
-import java.util.Set;
-
-/**
- * Base Quick Controls provider implementation.
- */
-public abstract class BaseQCProvider extends ContentProvider {
- public static final String METHOD_BIND = "QC_METHOD_BIND";
- public static final String METHOD_SUBSCRIBE = "QC_METHOD_SUBSCRIBE";
- public static final String METHOD_UNSUBSCRIBE = "QC_METHOD_UNSUBSCRIBE";
- public static final String METHOD_DESTROY = "QC_METHOD_DESTROY";
- public static final String EXTRA_URI = "QC_EXTRA_URI";
- public static final String EXTRA_ITEM = "QC_EXTRA_ITEM";
-
- private static final String TAG = "BaseQCProvider";
- private static final long QC_ANR_TIMEOUT = 3000L;
- private static final Handler MAIN_THREAD_HANDLER = new Handler(Looper.getMainLooper());
- private String mCallbackMethod;
- private final Runnable mAnr = () -> {
- Process.sendSignal(Process.myPid(), Process.SIGNAL_QUIT);
- Log.e(TAG, "Timed out while handling QC method " + mCallbackMethod);
- };
-
- @Override
- public boolean onCreate() {
- return true;
- }
-
- @Override
- public Bundle call(String method, String arg, Bundle extras) {
- enforceCallingPermissions();
-
- Uri uri = getUriWithoutUserId(validateIncomingUriOrNull(
- extras.getParcelable(EXTRA_URI)));
- switch(method) {
- case METHOD_BIND:
- QCItem item = handleBind(uri);
- Bundle b = new Bundle();
- b.putParcelable(EXTRA_ITEM, item);
- return b;
- case METHOD_SUBSCRIBE:
- handleSubscribe(uri);
- break;
- case METHOD_UNSUBSCRIBE:
- handleUnsubscribe(uri);
- break;
- case METHOD_DESTROY:
- handleDestroy(uri);
- break;
- }
- return super.call(method, arg, extras);
- }
-
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
- return null;
- }
-
- @Override
- public String getType(Uri uri) {
- return null;
- }
-
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- return null;
- }
-
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- return 0;
- }
-
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- return 0;
- }
-
- /**
- * Method to create and return a {@link QCItem}.
- *
- * onBind is expected to return as quickly as possible. Therefore, no network or other IO
- * will be allowed. Any loading that needs to be done should happen in the background and
- * should then notify the content resolver of the change when ready to provide the
- * complete data in onBind.
- */
- @Nullable
- protected QCItem onBind(@NonNull Uri uri) {
- return null;
- }
-
- /**
- * Called to inform an app that an item has been subscribed to.
- *
- * Subscribing is a way that a host can notify apps of which QCItems they would like to
- * receive updates for. The providing apps are expected to keep the content up to date
- * and notify of change via the content resolver.
- */
- protected void onSubscribed(@NonNull Uri uri) {
- }
-
- /**
- * Called to inform an app that an item has been unsubscribed from.
- *
- * This is used to notify providing apps that a host is no longer listening
- * to updates, so any background processes and/or listeners should be removed.
- */
- protected void onUnsubscribed(@NonNull Uri uri) {
- }
-
- /**
- * Called to inform an app that an item is being destroyed.
- *
- * This is used to notify providing apps that a host is no longer going to use this QCItem
- * instance, so the relevant elements should be cleaned up.
- */
- protected void onDestroy(@NonNull Uri uri) {
- }
-
- /**
- * Returns a Set of packages that are allowed to call this provider.
- */
- @NonNull
- protected abstract Set<String> getAllowlistedPackages();
-
- private QCItem handleBind(Uri uri) {
- mCallbackMethod = "handleBind";
- MAIN_THREAD_HANDLER.postDelayed(mAnr, QC_ANR_TIMEOUT);
- try {
- return onBindStrict(uri);
- } finally {
- MAIN_THREAD_HANDLER.removeCallbacks(mAnr);
- }
- }
-
- private QCItem onBindStrict(@NonNull Uri uri) {
- StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
- try {
- StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
- .detectAll()
- .penaltyDeath()
- .build());
- return onBind(uri);
- } finally {
- StrictMode.setThreadPolicy(oldPolicy);
- }
- }
-
- private void handleSubscribe(@NonNull Uri uri) {
- mCallbackMethod = "handleSubscribe";
- MAIN_THREAD_HANDLER.postDelayed(mAnr, QC_ANR_TIMEOUT);
- try {
- onSubscribed(uri);
- } finally {
- MAIN_THREAD_HANDLER.removeCallbacks(mAnr);
- }
- }
-
- private void handleUnsubscribe(@NonNull Uri uri) {
- mCallbackMethod = "handleUnsubscribe";
- MAIN_THREAD_HANDLER.postDelayed(mAnr, QC_ANR_TIMEOUT);
- try {
- onUnsubscribed(uri);
- } finally {
- MAIN_THREAD_HANDLER.removeCallbacks(mAnr);
- }
- }
-
- private void handleDestroy(@NonNull Uri uri) {
- mCallbackMethod = "handleDestroy";
- MAIN_THREAD_HANDLER.postDelayed(mAnr, QC_ANR_TIMEOUT);
- try {
- onDestroy(uri);
- } finally {
- MAIN_THREAD_HANDLER.removeCallbacks(mAnr);
- }
- }
-
- private Uri validateIncomingUriOrNull(Uri uri) {
- if (uri == null) {
- throw new IllegalArgumentException("Uri cannot be null");
- }
- return validateIncomingUri(uri);
- }
-
- private void enforceCallingPermissions() {
- String callingPackage = getCallingPackage();
- if (callingPackage == null) {
- throw new IllegalArgumentException("Calling package cannot be null");
- }
- if (!getAllowlistedPackages().contains(callingPackage)) {
- throw new SecurityException(
- String.format("%s is not permitted to access provider: %s", callingPackage,
- getClass().getName()));
- }
- }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/view/QCListView.java b/car-qc-lib/src/com/android/car/qc/view/QCListView.java
deleted file mode 100644
index 9aba976..0000000
--- a/car-qc-lib/src/com/android/car/qc/view/QCListView.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.view;
-
-import static com.android.car.qc.view.QCView.QCActionListener;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.LinearLayout;
-
-import androidx.lifecycle.Observer;
-
-import com.android.car.qc.QCItem;
-import com.android.car.qc.QCList;
-
-/**
- * Quick Controls view for {@link QCList} instances.
- */
-public class QCListView extends LinearLayout implements Observer<QCItem> {
-
- private QCActionListener mActionListener;
-
- public QCListView(Context context) {
- super(context);
- init();
- }
-
- public QCListView(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
-
- public QCListView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- init();
- }
-
- public QCListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- init();
- }
-
- private void init() {
- setOrientation(VERTICAL);
- }
-
- /**
- * Set the view's {@link QCActionListener}. This listener will propagate to all QCRows.
- */
- public void setActionListener(QCActionListener listener) {
- mActionListener = listener;
- for (int i = 0; i < getChildCount(); i++) {
- QCRowView view = (QCRowView) getChildAt(i);
- view.setActionListener(mActionListener);
- }
- }
-
- @Override
- public void onChanged(QCItem qcItem) {
- if (qcItem == null) {
- removeAllViews();
- return;
- }
- if (!qcItem.getType().equals(QCItem.QC_TYPE_LIST)) {
- throw new IllegalArgumentException("Expected QCList type for QCListView but got "
- + qcItem.getType());
- }
- QCList qcList = (QCList) qcItem;
- int rowCount = qcList.getRows().size();
- for (int i = 0; i < rowCount; i++) {
- if (getChildAt(i) != null) {
- QCRowView view = (QCRowView) getChildAt(i);
- view.setRow(qcList.getRows().get(i));
- view.setActionListener(mActionListener);
- } else {
- QCRowView view = new QCRowView(getContext());
- view.setRow(qcList.getRows().get(i));
- view.setActionListener(mActionListener);
- addView(view);
- }
- }
- if (getChildCount() > rowCount) {
- // remove extra rows
- removeViews(rowCount, getChildCount() - rowCount);
- }
- }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/view/QCRowView.java b/car-qc-lib/src/com/android/car/qc/view/QCRowView.java
deleted file mode 100644
index 14d4b19..0000000
--- a/car-qc-lib/src/com/android/car/qc/view/QCRowView.java
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.view;
-
-import static com.android.car.qc.QCItem.QC_ACTION_SLIDER_VALUE;
-import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
-import static com.android.car.qc.QCItem.QC_TYPE_ACTION_SWITCH;
-import static com.android.car.qc.view.QCView.QCActionListener;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.text.BidiFormatter;
-import android.text.TextDirectionHeuristics;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.SeekBar;
-import android.widget.Switch;
-import android.widget.TextView;
-
-import androidx.annotation.ColorInt;
-import androidx.annotation.LayoutRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.car.qc.QCActionItem;
-import com.android.car.qc.QCItem;
-import com.android.car.qc.QCRow;
-import com.android.car.qc.QCSlider;
-import com.android.car.qc.R;
-import com.android.car.ui.utils.DirectManipulationHelper;
-import com.android.car.ui.uxr.DrawableStateToggleButton;
-
-/**
- * Quick Controls view for {@link QCRow} instances.
- */
-public class QCRowView extends FrameLayout {
- private static final String TAG = "QCRowView";
-
- private LayoutInflater mLayoutInflater;
- private BidiFormatter mBidiFormatter;
- private View mContentView;
- private TextView mTitle;
- private TextView mSubtitle;
- private ImageView mStartIcon;
- @ColorInt
- private int mStartIconTint;
- private LinearLayout mStartItemsContainer;
- private LinearLayout mEndItemsContainer;
- private LinearLayout mSeekBarContainer;
- private SeekBar mSeekBar;
- private QCActionListener mActionListener;
- private boolean mInDirectManipulationMode;
-
- private QCSeekbarChangeListener mSeekbarChangeListener;
- private final View.OnKeyListener mSeekBarKeyListener = new View.OnKeyListener() {
- @Override
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- if (mSeekBar == null) {
- return false;
- }
- // Consume nudge events in direct manipulation mode.
- if (mInDirectManipulationMode
- && (keyCode == KeyEvent.KEYCODE_DPAD_LEFT
- || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT
- || keyCode == KeyEvent.KEYCODE_DPAD_UP
- || keyCode == KeyEvent.KEYCODE_DPAD_DOWN)) {
- return true;
- }
-
- // Handle events to enter or exit direct manipulation mode.
- if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
- if (event.getAction() == KeyEvent.ACTION_DOWN) {
- setInDirectManipulationMode(v, mSeekBar, !mInDirectManipulationMode);
- }
- return true;
- }
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- if (mInDirectManipulationMode) {
- if (event.getAction() == KeyEvent.ACTION_DOWN) {
- setInDirectManipulationMode(v, mSeekBar, false);
- }
- return true;
- }
- }
-
- // Don't propagate confirm keys to the SeekBar to prevent a ripple effect on the thumb.
- if (KeyEvent.isConfirmKey(keyCode)) {
- return false;
- }
-
- if (event.getAction() == KeyEvent.ACTION_DOWN) {
- return mSeekBar.onKeyDown(keyCode, event);
- } else {
- return mSeekBar.onKeyUp(keyCode, event);
- }
- }
- };
-
- private final View.OnFocusChangeListener mSeekBarFocusChangeListener =
- (v, hasFocus) -> {
- if (!hasFocus && mInDirectManipulationMode && mSeekBar != null) {
- setInDirectManipulationMode(v, mSeekBar, false);
- }
- };
-
- private final View.OnGenericMotionListener mSeekBarScrollListener =
- (v, event) -> {
- if (!mInDirectManipulationMode || mSeekBar == null) {
- return false;
- }
- int adjustment = Math.round(event.getAxisValue(MotionEvent.AXIS_SCROLL));
- if (adjustment == 0) {
- return false;
- }
- int count = Math.abs(adjustment);
- int keyCode =
- adjustment < 0 ? KeyEvent.KEYCODE_DPAD_LEFT : KeyEvent.KEYCODE_DPAD_RIGHT;
- KeyEvent downEvent = new KeyEvent(event.getDownTime(), event.getEventTime(),
- KeyEvent.ACTION_DOWN, keyCode, /* repeat= */ 0);
- KeyEvent upEvent = new KeyEvent(event.getDownTime(), event.getEventTime(),
- KeyEvent.ACTION_UP, keyCode, /* repeat= */ 0);
- for (int i = 0; i < count; i++) {
- mSeekBar.onKeyDown(keyCode, downEvent);
- mSeekBar.onKeyUp(keyCode, upEvent);
- }
- return true;
- };
-
- QCRowView(Context context) {
- super(context);
- init(context);
- }
-
- QCRowView(Context context, AttributeSet attrs) {
- super(context, attrs);
- init(context);
- }
-
- QCRowView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- init(context);
- }
-
- QCRowView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- init(context);
- }
-
- private void init(Context context) {
- mLayoutInflater = LayoutInflater.from(context);
- mBidiFormatter = BidiFormatter.getInstance();
- mLayoutInflater.inflate(R.layout.qc_row_view, /* root= */ this);
- mContentView = findViewById(R.id.qc_row_content);
- mTitle = findViewById(R.id.qc_title);
- mSubtitle = findViewById(R.id.qc_summary);
- mStartIcon = findViewById(R.id.qc_icon);
- mStartItemsContainer = findViewById(R.id.qc_row_start_items);
- mEndItemsContainer = findViewById(R.id.qc_row_end_items);
- mSeekBarContainer = findViewById(R.id.qc_seekbar_wrapper);
- mSeekBar = findViewById(R.id.seekbar);
- }
-
- void setActionListener(QCActionListener listener) {
- mActionListener = listener;
- }
-
- void setRow(QCRow row) {
- if (row == null) {
- setVisibility(GONE);
- return;
- }
- setVisibility(VISIBLE);
- if (row.getPrimaryAction() != null || row.getActionHandler() != null) {
- mContentView.setOnClickListener(v -> {
- fireAction(row, /* intent= */ null);
- });
- }
- if (!TextUtils.isEmpty(row.getTitle())) {
- mTitle.setVisibility(VISIBLE);
- mTitle.setText(
- mBidiFormatter.unicodeWrap(row.getTitle(), TextDirectionHeuristics.LOCALE));
- } else {
- mTitle.setVisibility(GONE);
- }
- if (!TextUtils.isEmpty(row.getSubtitle())) {
- mSubtitle.setVisibility(VISIBLE);
- mSubtitle.setText(
- mBidiFormatter.unicodeWrap(row.getSubtitle(), TextDirectionHeuristics.LOCALE));
- } else {
- mSubtitle.setVisibility(GONE);
- }
- if (row.getStartIcon() != null) {
- mStartIcon.setVisibility(VISIBLE);
- Drawable drawable = row.getStartIcon().loadDrawable(getContext());
- if (drawable != null && row.isStartIconTintable()) {
- if (mStartIconTint == 0) {
- mStartIconTint = getContext().getColor(R.color.qc_start_icon_color);
- }
- drawable.setTint(mStartIconTint);
- }
- mStartIcon.setImageDrawable(drawable);
- } else {
- mStartIcon.setImageDrawable(null);
- mStartIcon.setVisibility(GONE);
- }
- QCSlider slider = row.getSlider();
- if (slider != null) {
- mSeekBarContainer.setVisibility(View.VISIBLE);
- initSlider(slider);
- } else {
- mSeekBarContainer.setVisibility(View.GONE);
- }
-
- int startItemCount = row.getStartItems().size();
- for (int i = 0; i < startItemCount; i++) {
- QCActionItem action = row.getStartItems().get(i);
- initActionItem(mStartItemsContainer, mStartItemsContainer.getChildAt(i), action);
- }
- if (mStartItemsContainer.getChildCount() > startItemCount) {
- // remove extra items
- mStartItemsContainer.removeViews(startItemCount,
- mStartItemsContainer.getChildCount() - startItemCount);
- }
- if (startItemCount == 0) {
- mStartItemsContainer.setVisibility(View.GONE);
- } else {
- mStartItemsContainer.setVisibility(View.VISIBLE);
- }
-
- int endItemCount = row.getEndItems().size();
- for (int i = 0; i < endItemCount; i++) {
- QCActionItem action = row.getEndItems().get(i);
- initActionItem(mEndItemsContainer, mEndItemsContainer.getChildAt(i), action);
- }
- if (mEndItemsContainer.getChildCount() > endItemCount) {
- // remove extra items
- mEndItemsContainer.removeViews(endItemCount,
- mEndItemsContainer.getChildCount() - endItemCount);
- }
- if (endItemCount == 0) {
- mEndItemsContainer.setVisibility(View.GONE);
- } else {
- mEndItemsContainer.setVisibility(View.VISIBLE);
- }
- }
-
- private void initActionItem(@NonNull ViewGroup root, @Nullable View actionView,
- @NonNull QCActionItem action) {
- if (action.getType().equals(QC_TYPE_ACTION_SWITCH)) {
- initSwitchView(action, root, actionView);
- } else {
- initToggleView(action, root, actionView);
- }
- }
-
- private void initSwitchView(QCActionItem action, ViewGroup root, View actionView) {
- Switch switchView = actionView == null ? null : actionView.findViewById(
- android.R.id.switch_widget);
- if (switchView == null) {
- actionView = createActionView(root, actionView, R.layout.qc_action_switch);
- switchView = actionView.requireViewById(android.R.id.switch_widget);
- }
-
- switchView.setOnCheckedChangeListener(null);
- switchView.setEnabled(action.isEnabled());
- switchView.setChecked(action.isChecked());
- switchView.setOnCheckedChangeListener(
- (buttonView, isChecked) -> {
- Intent intent = new Intent();
- intent.putExtra(QC_ACTION_TOGGLE_STATE, isChecked);
- fireAction(action, intent);
- });
- }
-
- private void initToggleView(QCActionItem action, ViewGroup root, View actionView) {
- DrawableStateToggleButton toggleButton =
- actionView == null ? null : actionView.findViewById(R.id.qc_toggle_button);
- if (toggleButton == null) {
- actionView = createActionView(root, actionView, R.layout.qc_action_toggle);
- toggleButton = actionView.requireViewById(R.id.qc_toggle_button);
- }
- toggleButton.setText(null);
- toggleButton.setTextOn(null);
- toggleButton.setTextOff(null);
- toggleButton.setOnCheckedChangeListener(null);
- Drawable icon = QCViewUtils.getInstance(mContext).getToggleIcon(
- action.getIcon(), action.isAvailable());
- toggleButton.setButtonDrawable(icon);
- toggleButton.setChecked(action.isChecked());
- toggleButton.setEnabled(action.isEnabled() && action.isAvailable());
- toggleButton.setOnCheckedChangeListener(
- (buttonView, isChecked) -> {
- Intent intent = new Intent();
- intent.putExtra(QC_ACTION_TOGGLE_STATE, isChecked);
- fireAction(action, intent);
- });
- }
-
- @NonNull
- private View createActionView(@NonNull ViewGroup root, @Nullable View actionView,
- @LayoutRes int resId) {
- if (actionView != null) {
- // remove current action view
- root.removeView(actionView);
- }
- actionView = mLayoutInflater.inflate(resId, /* root = */ null);
- root.addView(actionView);
- return actionView;
- }
-
- private void initSlider(QCSlider slider) {
- mSeekBar.setOnSeekBarChangeListener(null);
- mSeekBar.setMin(slider.getMin());
- mSeekBar.setMax(slider.getMax());
- mSeekBar.setProgress(slider.getValue());
- if (mSeekbarChangeListener == null) {
- mSeekbarChangeListener = new QCSeekbarChangeListener();
- }
- mSeekbarChangeListener.setSlider(slider);
- mSeekBar.setOnSeekBarChangeListener(mSeekbarChangeListener);
- // set up rotary support
- mSeekBarContainer.setOnKeyListener(mSeekBarKeyListener);
- mSeekBarContainer.setOnFocusChangeListener(mSeekBarFocusChangeListener);
- mSeekBarContainer.setOnGenericMotionListener(mSeekBarScrollListener);
- }
-
- private void setInDirectManipulationMode(View view, SeekBar seekbar, boolean enable) {
- mInDirectManipulationMode = enable;
- DirectManipulationHelper.enableDirectManipulationMode(seekbar, enable);
- view.setSelected(enable);
- seekbar.setSelected(enable);
- }
-
- private void fireAction(QCItem item, Intent intent) {
- if (item.getPrimaryAction() != null) {
- try {
- item.getPrimaryAction().send(getContext(), 0, intent);
- if (mActionListener != null) {
- mActionListener.onQCAction(item);
- }
- } catch (PendingIntent.CanceledException e) {
- Log.d(TAG, "Error sending intent", e);
- }
- } else if (item.getActionHandler() != null) {
- item.getActionHandler().onAction(item, getContext(), intent);
- if (mActionListener != null) {
- mActionListener.onQCAction(item);
- }
- }
- }
-
- private class QCSeekbarChangeListener implements SeekBar.OnSeekBarChangeListener {
- // Interval of updates (in ms) sent in response to seekbar moving.
- private static final int SLIDER_UPDATE_INTERVAL = 200;
-
- private final Handler mSliderUpdateHandler;
- private QCSlider mSlider;
- private int mCurrSliderValue;
- private boolean mSliderUpdaterRunning;
- private long mLastSentSliderUpdate;
- private final Runnable mSliderUpdater = () -> {
- sendSliderValue();
- mSliderUpdaterRunning = false;
- };
-
- QCSeekbarChangeListener() {
- mSliderUpdateHandler = new Handler();
- }
-
- void setSlider(QCSlider slider) {
- mSlider = slider;
- }
-
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- mCurrSliderValue = progress;
- long now = System.currentTimeMillis();
- if (mLastSentSliderUpdate != 0
- && now - mLastSentSliderUpdate > SLIDER_UPDATE_INTERVAL) {
- mSliderUpdaterRunning = false;
- mSliderUpdateHandler.removeCallbacks(mSliderUpdater);
- sendSliderValue();
- } else if (!mSliderUpdaterRunning) {
- mSliderUpdaterRunning = true;
- mSliderUpdateHandler.postDelayed(mSliderUpdater, SLIDER_UPDATE_INTERVAL);
- }
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- if (mSliderUpdaterRunning) {
- mSliderUpdaterRunning = false;
- mSliderUpdateHandler.removeCallbacks(mSliderUpdater);
- }
- mCurrSliderValue = seekBar.getProgress();
- sendSliderValue();
- }
-
- private void sendSliderValue() {
- if (mSlider == null) {
- return;
- }
- mLastSentSliderUpdate = System.currentTimeMillis();
- Intent intent = new Intent();
- intent.putExtra(QC_ACTION_SLIDER_VALUE, mCurrSliderValue);
- fireAction(mSlider, intent);
- }
- }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/view/QCTileView.java b/car-qc-lib/src/com/android/car/qc/view/QCTileView.java
deleted file mode 100644
index 233c81a..0000000
--- a/car-qc-lib/src/com/android/car/qc/view/QCTileView.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.view;
-
-import static com.android.car.qc.QCItem.QC_ACTION_TOGGLE_STATE;
-import static com.android.car.qc.view.QCView.QCActionListener;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.View;
-import android.widget.FrameLayout;
-import android.widget.TextView;
-
-import androidx.lifecycle.Observer;
-
-import com.android.car.qc.QCItem;
-import com.android.car.qc.QCTile;
-import com.android.car.qc.R;
-import com.android.car.ui.uxr.DrawableStateToggleButton;
-
-/**
- * Quick Controls view for {@link QCTile} instances.
- */
-public class QCTileView extends FrameLayout implements Observer<QCItem> {
- private static final String TAG = "QCTileView";
-
- private View mTileWrapper;
- private DrawableStateToggleButton mToggleButton;
- private TextView mSubtitle;
- private QCActionListener mActionListener;
-
- public QCTileView(Context context) {
- super(context);
- init(context);
- }
-
- public QCTileView(Context context, AttributeSet attrs) {
- super(context, attrs);
- init(context);
- }
-
- public QCTileView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- init(context);
- }
-
- public QCTileView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- init(context);
- }
-
- /**
- * Set the tile's {@link QCActionListener}.
- */
- public void setActionListener(QCActionListener listener) {
- mActionListener = listener;
- }
-
- private void init(Context context) {
- View.inflate(context, R.layout.qc_tile_view, /* root= */ this);
- mTileWrapper = findViewById(R.id.qc_tile_wrapper);
- mToggleButton = findViewById(R.id.qc_tile_toggle_button);
- mSubtitle = findViewById(android.R.id.summary);
- mToggleButton.setText(null);
- mToggleButton.setTextOn(null);
- mToggleButton.setTextOff(null);
-
- }
-
- @Override
- public void onChanged(QCItem qcItem) {
- if (qcItem == null) {
- removeAllViews();
- return;
- }
- if (!qcItem.getType().equals(QCItem.QC_TYPE_TILE)) {
- throw new IllegalArgumentException("Expected QCTile type for QCTileView but got "
- + qcItem.getType());
- }
- QCTile qcTile = (QCTile) qcItem;
- mSubtitle.setText(qcTile.getSubtitle());
- mToggleButton.setOnCheckedChangeListener(null);
- mToggleButton.setChecked(qcTile.isChecked());
- mToggleButton.setEnabled(qcTile.isEnabled());
- mTileWrapper.setEnabled(qcTile.isEnabled() && qcTile.isAvailable());
- mTileWrapper.setOnClickListener(v -> mToggleButton.toggle());
- Drawable icon = QCViewUtils.getInstance(mContext).getToggleIcon(
- qcTile.getIcon(), qcTile.isAvailable());
- mToggleButton.setButtonDrawable(icon);
- mToggleButton.setOnCheckedChangeListener(
- (buttonView, isChecked) -> {
- Intent intent = new Intent();
- intent.putExtra(QC_ACTION_TOGGLE_STATE, isChecked);
- if (qcTile.getPrimaryAction() != null) {
- try {
- qcTile.getPrimaryAction().send(getContext(), 0, intent);
- if (mActionListener != null) {
- mActionListener.onQCAction(qcTile);
- }
- } catch (PendingIntent.CanceledException e) {
- Log.d(TAG, "Error sending intent", e);
- }
- } else if (qcTile.getActionHandler() != null) {
- qcTile.getActionHandler().onAction(qcTile, getContext(), intent);
- if (mActionListener != null) {
- mActionListener.onQCAction(qcTile);
- }
- }
- });
- }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/view/QCView.java b/car-qc-lib/src/com/android/car/qc/view/QCView.java
deleted file mode 100644
index 73b909e..0000000
--- a/car-qc-lib/src/com/android/car/qc/view/QCView.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.view;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.widget.FrameLayout;
-
-import androidx.annotation.NonNull;
-import androidx.lifecycle.Observer;
-
-import com.android.car.qc.QCItem;
-
-/**
- * Base Quick Controls View - supports {@link QCItem.QC_TYPE_TILE} and {@link QCItem.QC_TYPE_LIST}
- */
-public class QCView extends FrameLayout implements Observer<QCItem> {
- @QCItem.QCItemType
- private String mType;
- private Observer<QCItem> mChildObserver;
- private QCActionListener mActionListener;
-
- public QCView(Context context) {
- super(context);
- }
-
- public QCView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public QCView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- public QCView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
-
- /**
- * Set the view's {@link QCActionListener}. This listener will propagate to all sub-views.
- */
- public void setActionListener(QCActionListener listener) {
- mActionListener = listener;
- if (mChildObserver instanceof QCTileView) {
- ((QCTileView) mChildObserver).setActionListener(mActionListener);
- } else if (mChildObserver instanceof QCListView) {
- ((QCListView) mChildObserver).setActionListener(mActionListener);
- }
- }
-
- @Override
- public void onChanged(QCItem qcItem) {
- if (qcItem == null) {
- removeAllViews();
- mChildObserver = null;
- mType = null;
- return;
- }
- if (!isValidQCItemType(qcItem)) {
- throw new IllegalArgumentException("Expected QCTile or QCList type but got "
- + qcItem.getType());
- }
- if (qcItem.getType().equals(mType)) {
- mChildObserver.onChanged(qcItem);
- return;
- }
- removeAllViews();
- mType = qcItem.getType();
- if (mType.equals(QCItem.QC_TYPE_TILE)) {
- QCTileView view = new QCTileView(getContext());
- FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
- LayoutParams.WRAP_CONTENT,
- LayoutParams.WRAP_CONTENT,
- Gravity.CENTER_HORIZONTAL);
- view.onChanged(qcItem);
- view.setActionListener(mActionListener);
- addView(view, params);
- mChildObserver = view;
- } else {
- QCListView view = new QCListView(getContext());
- view.onChanged(qcItem);
- view.setActionListener(mActionListener);
- addView(view);
- mChildObserver = view;
- }
- }
-
- private boolean isValidQCItemType(QCItem qcItem) {
- String type = qcItem.getType();
- return type.equals(QCItem.QC_TYPE_TILE) || type.equals(QCItem.QC_TYPE_LIST);
- }
-
- /**
- * Listener to be called when an action occurs on a QCView.
- */
- public interface QCActionListener {
- /**
- * Called when an interaction has occurred with an element in this view.
- * @param item the specific item within the {@link QCItem} that was interacted with.
- */
- void onQCAction(@NonNull QCItem item);
- }
-}
diff --git a/car-qc-lib/src/com/android/car/qc/view/QCViewUtils.java b/car-qc-lib/src/com/android/car/qc/view/QCViewUtils.java
deleted file mode 100644
index 366c724..0000000
--- a/car-qc-lib/src/com/android/car/qc/view/QCViewUtils.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.view;
-
-import android.annotation.ColorInt;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-import android.graphics.drawable.LayerDrawable;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.car.qc.R;
-
-/**
- * Utility class used by {@link QCTileView} and {@link QCRowView}
- */
-public class QCViewUtils {
- private static QCViewUtils sInstance;
-
- private final Context mContext;
- private final Drawable mDefaultToggleBackground;
- private final Drawable mUnavailableToggleBackground;
- private final ColorStateList mDefaultToggleIconTint;
- @ColorInt
- private final int mUnavailableToggleIconTint;
- private final int mToggleForegroundIconInset;
-
- private QCViewUtils(@NonNull Context context) {
- mContext = context.getApplicationContext();
- mDefaultToggleBackground = mContext.getDrawable(R.drawable.qc_toggle_background);
- mUnavailableToggleBackground = mContext.getDrawable(
- R.drawable.qc_toggle_unavailable_background);
- mDefaultToggleIconTint = mContext.getColorStateList(R.color.qc_toggle_icon_fill_color);
- mUnavailableToggleIconTint = mContext.getColor(R.color.qc_toggle_unavailable_color);
- mToggleForegroundIconInset = mContext.getResources()
- .getDimensionPixelSize(R.dimen.qc_toggle_foreground_icon_inset);
- }
-
- /**
- * Get an instance of {@link QCViewUtils}
- */
- public static QCViewUtils getInstance(@NonNull Context context) {
- if (sInstance == null) {
- sInstance = new QCViewUtils(context);
- }
- return sInstance;
- }
-
- /**
- * Create a return a Quick Control toggle icon - used for tiles and action toggles.
- */
- public Drawable getToggleIcon(@Nullable Icon icon, boolean available) {
- Drawable background = available
- ? mDefaultToggleBackground.getConstantState().newDrawable().mutate()
- : mUnavailableToggleBackground.getConstantState().newDrawable().mutate();
- if (icon == null) {
- return background;
- }
-
- Drawable iconDrawable = icon.loadDrawable(mContext);
- if (iconDrawable == null) {
- return background;
- }
-
- if (!available) {
- iconDrawable.setTint(mUnavailableToggleIconTint);
- } else {
- iconDrawable.setTintList(mDefaultToggleIconTint);
- }
-
- Drawable[] layers = {background, iconDrawable};
- LayerDrawable drawable = new LayerDrawable(layers);
- drawable.setLayerInsetRelative(/* index= */ 1, mToggleForegroundIconInset,
- mToggleForegroundIconInset, mToggleForegroundIconInset,
- mToggleForegroundIconInset);
- return drawable;
- }
-}
diff --git a/car-qc-lib/tests/unit/Android.bp b/car-qc-lib/tests/unit/Android.bp
deleted file mode 100644
index b1f107a..0000000
--- a/car-qc-lib/tests/unit/Android.bp
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-// Copyright (C) 2021 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package {
- default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-android_test {
- name: "CarQCLibUnitTests",
-
- certificate: "platform",
- privileged: true,
-
- srcs: ["src/**/*.java"],
-
- libs: [
- "android.test.runner",
- "android.test.base",
- "android.test.mock",
- ],
-
- static_libs: [
- "car-qc-lib",
- "androidx.test.core",
- "androidx.test.rules",
- "androidx.test.ext.junit",
- "androidx.test.ext.truth",
- "mockito-target-extended-minus-junit4",
- "platform-test-annotations",
- "truth-prebuilt",
- "testng",
- ],
-
- jni_libs: ["libdexmakerjvmtiagent", "libstaticjvmtiagent"],
-}
diff --git a/car-qc-lib/tests/unit/AndroidManifest.xml b/car-qc-lib/tests/unit/AndroidManifest.xml
deleted file mode 100644
index e500c4d..0000000
--- a/car-qc-lib/tests/unit/AndroidManifest.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.car.qc.tests.unit">
-
- <application android:debuggable="true">
- <uses-library android:name="android.test.runner" />
-
- <provider
- android:name="com.android.car.qc.testutils.AllowedTestQCProvider"
- android:authorities="com.android.car.qc.testutils.AllowedTestQCProvider"
- android:exported="true">
- </provider>
-
- <provider
- android:name="com.android.car.qc.testutils.DeniedTestQCProvider"
- android:authorities="com.android.car.qc.testutils.DeniedTestQCProvider"
- android:exported="true">
- </provider>
- </application>
-
- <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.car.qc.tests.unit"
- android:label="Quick Controls Library Unit Tests"/>
-</manifest>
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/QCActionItemTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/QCActionItemTest.java
deleted file mode 100644
index 588144f..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/QCActionItemTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc;
-
-import static com.android.car.qc.QCItem.QC_TYPE_ACTION_SWITCH;
-import static com.android.car.qc.QCItem.QC_TYPE_ACTION_TOGGLE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.testng.Assert.assertThrows;
-
-import android.app.PendingIntent;
-import android.graphics.drawable.Icon;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class QCActionItemTest extends QCItemTestCase<QCActionItem> {
-
- @Test
- public void onCreate_invalidType_throwsException() {
- assertThrows(IllegalArgumentException.class,
- () -> createAction("INVALID_TYPE", /* action= */ null, /* icon= */ null));
- }
-
- @Test
- public void onCreateSwitch_hasCorrectType() {
- QCActionItem action = createAction(QC_TYPE_ACTION_SWITCH, /* action= */ null,
- /* icon= */null);
- assertThat(action.getType()).isEqualTo(QC_TYPE_ACTION_SWITCH);
- }
-
- @Test
- public void onCreateToggle_hasCorrectType() {
- QCActionItem action = createAction(QC_TYPE_ACTION_TOGGLE, /* action= */ null,
- /* icon= */ null);
- assertThat(action.getType()).isEqualTo(QC_TYPE_ACTION_TOGGLE);
- }
-
- @Test
- public void onBundle_nullAction_noCrash() {
- QCActionItem action = createAction(QC_TYPE_ACTION_TOGGLE, /* action= */ null, mDefaultIcon);
- writeAndLoadFromBundle(action);
- // Test passes if this doesn't crash
- }
-
- @Test
- public void onBundle_nullIcon_noCrash() {
- QCActionItem action = createAction(QC_TYPE_ACTION_TOGGLE, mDefaultAction, /* icon= */ null);
- writeAndLoadFromBundle(action);
- // Test passes if this doesn't crash
- }
-
- @Test
- public void onBundle_switch_accurateData() {
- QCActionItem action = createAction(QC_TYPE_ACTION_SWITCH, mDefaultAction, /* icon= */ null);
- QCActionItem newAction = writeAndLoadFromBundle(action);
- assertThat(newAction.getType()).isEqualTo(QC_TYPE_ACTION_SWITCH);
- assertThat(newAction.isChecked()).isTrue();
- assertThat(newAction.isEnabled()).isTrue();
- assertThat(newAction.getPrimaryAction()).isNotNull();
- assertThat(newAction.getIcon()).isNull();
- }
-
- @Test
- public void onBundle_toggle_accurateDate() {
- QCActionItem action = createAction(QC_TYPE_ACTION_TOGGLE, mDefaultAction, mDefaultIcon);
- QCActionItem newAction = writeAndLoadFromBundle(action);
- assertThat(newAction.getType()).isEqualTo(QC_TYPE_ACTION_TOGGLE);
- assertThat(newAction.isChecked()).isTrue();
- assertThat(newAction.isEnabled()).isTrue();
- assertThat(newAction.getPrimaryAction()).isNotNull();
- assertThat(newAction.getIcon()).isNotNull();
- }
-
- private QCActionItem createAction(String type, PendingIntent action, Icon icon) {
- return new QCActionItem.Builder(type)
- .setChecked(true)
- .setEnabled(true)
- .setAction(action)
- .setIcon(icon)
- .build();
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/QCItemTestCase.java b/car-qc-lib/tests/unit/src/com/android/car/qc/QCItemTestCase.java
deleted file mode 100644
index fab8302..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/QCItemTestCase.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc;
-
-import android.R;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Icon;
-import android.os.Bundle;
-
-import androidx.test.core.app.ApplicationProvider;
-
-public abstract class QCItemTestCase<T extends QCItem> {
- protected static final String BUNDLE_KEY = "BUNDLE_KEY";
- protected static final String TEST_TITLE = "TEST TITLE";
- protected static final String TEST_SUBTITLE = "TEST SUBTITLE";
-
- protected final Context mContext = ApplicationProvider.getApplicationContext();
-
- protected PendingIntent mDefaultAction = PendingIntent.getActivity(mContext,
- /* requestCode= */ 0, new Intent(), PendingIntent.FLAG_IMMUTABLE);
- protected Icon mDefaultIcon = Icon.createWithResource(mContext, R.drawable.btn_star);
-
- protected T writeAndLoadFromBundle(T item) {
- Bundle bundle = new Bundle();
- bundle.putParcelable(BUNDLE_KEY, item);
- return bundle.getParcelable(BUNDLE_KEY);
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/QCListTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/QCListTest.java
deleted file mode 100644
index 766d82c..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/QCListTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc;
-
-import static com.android.car.qc.QCItem.QC_TYPE_LIST;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.Collections;
-import java.util.List;
-
-@RunWith(AndroidJUnit4.class)
-public class QCListTest extends QCItemTestCase<QCList> {
-
- @Test
- public void onCreate_hasCorrectType() {
- QCList list = createList(Collections.emptyList());
- assertThat(list.getType()).isEqualTo(QC_TYPE_LIST);
- }
-
- @Test
- public void createFromParcel_accurateData() {
- QCRow row = new QCRow.Builder()
- .setTitle(TEST_TITLE)
- .setSubtitle(TEST_SUBTITLE)
- .setIcon(mDefaultIcon)
- .setPrimaryAction(mDefaultAction)
- .build();
-
- QCList list = createList(Collections.singletonList(row));
- QCList newList = writeAndLoadFromBundle(list);
- assertThat(newList.getType()).isEqualTo(QC_TYPE_LIST);
- assertThat(newList.getRows().size()).isEqualTo(1);
- }
-
- private QCList createList(List<QCRow> rows) {
- QCList.Builder builder = new QCList.Builder();
- for (QCRow row : rows) {
- builder.addRow(row);
- }
- return builder.build();
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/QCRowTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/QCRowTest.java
deleted file mode 100644
index 816c1d6..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/QCRowTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc;
-
-import static com.android.car.qc.QCItem.QC_TYPE_ACTION_SWITCH;
-import static com.android.car.qc.QCItem.QC_TYPE_ROW;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.PendingIntent;
-import android.graphics.drawable.Icon;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.Collections;
-import java.util.List;
-
-@RunWith(AndroidJUnit4.class)
-public class QCRowTest extends QCItemTestCase<QCRow> {
-
- @Test
- public void onCreate_hasCorrectType() {
- QCRow row = createRow(/* action= */ null, /* icon= */ null);
- assertThat(row.getType()).isEqualTo(QC_TYPE_ROW);
- }
-
- @Test
- public void onBundle_nullAction_noCrash() {
- QCRow row = createRow(/* action= */ null, mDefaultIcon);
- writeAndLoadFromBundle(row);
- // Test passes if this doesn't crash
- }
-
- @Test
- public void onBundle_nullIcon_noCrash() {
- QCRow row = createRow(mDefaultAction, /* icon= */ null);
- writeAndLoadFromBundle(row);
- // Test passes if this doesn't crash
- }
-
- @Test
- public void createFromParcel_accurateData() {
- QCRow row = createRow(mDefaultAction, mDefaultIcon);
- QCRow newRow = writeAndLoadFromBundle(row);
- assertThat(newRow.getType()).isEqualTo(QC_TYPE_ROW);
- assertThat(newRow.getTitle()).isEqualTo(TEST_TITLE);
- assertThat(newRow.getSubtitle()).isEqualTo(TEST_SUBTITLE);
- assertThat(newRow.getPrimaryAction()).isNotNull();
- assertThat(newRow.getStartIcon()).isNotNull();
- }
-
- @Test
- public void createFromParcel_accurateData_startItem() {
- QCActionItem item = new QCActionItem.Builder(QC_TYPE_ACTION_SWITCH).build();
-
- QCRow row = createRow(/* action= */ null, /* icon= */ null, Collections.singletonList(item),
- Collections.emptyList(), Collections.emptyList());
- QCRow newRow = writeAndLoadFromBundle(row);
- assertThat(newRow.getStartItems().size()).isEqualTo(1);
- }
-
- @Test
- public void createFromParcel_accurateData_endItem() {
- QCActionItem item = new QCActionItem.Builder(QC_TYPE_ACTION_SWITCH).build();
-
- QCRow row = createRow(/* action= */ null, /* icon= */ null, Collections.emptyList(),
- Collections.singletonList(item), Collections.emptyList());
- QCRow newRow = writeAndLoadFromBundle(row);
- assertThat(newRow.getEndItems().size()).isEqualTo(1);
- }
-
- @Test
- public void createFromParcel_accurateData_slider() {
- QCSlider slider = new QCSlider.Builder().build();
-
- QCRow row = createRow(/* action= */ null, /* icon= */ null, Collections.emptyList(),
- Collections.emptyList(), Collections.singletonList(slider));
- QCRow newRow = writeAndLoadFromBundle(row);
- assertThat(newRow.getSlider()).isNotNull();
- }
-
- private QCRow createRow(PendingIntent action, Icon icon) {
- return createRow(action, icon, Collections.emptyList(), Collections.emptyList(),
- Collections.emptyList());
- }
-
- private QCRow createRow(PendingIntent action, Icon icon, List<QCActionItem> startItems,
- List<QCActionItem> endItems, List<QCSlider> sliders) {
- QCRow.Builder builder = new QCRow.Builder()
- .setTitle(TEST_TITLE)
- .setSubtitle(TEST_SUBTITLE)
- .setIcon(icon)
- .setPrimaryAction(action);
- for (QCActionItem item : startItems) {
- builder.addStartItem(item);
- }
- for (QCActionItem item : endItems) {
- builder.addEndItem(item);
- }
- for (QCSlider slider : sliders) {
- builder.addSlider(slider);
- }
- return builder.build();
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/QCSliderTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/QCSliderTest.java
deleted file mode 100644
index 97bf191..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/QCSliderTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc;
-
-import static com.android.car.qc.QCItem.QC_TYPE_SLIDER;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.PendingIntent;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class QCSliderTest extends QCItemTestCase<QCSlider> {
- private static final int MIN = 50;
- private static final int MAX = 150;
- private static final int VALUE = 75;
-
- @Test
- public void onCreate_hasCorrectType() {
- QCSlider slider = createSlider(/* action= */ null);
- assertThat(slider.getType()).isEqualTo(QC_TYPE_SLIDER);
- }
-
- @Test
- public void onBundle_nullAction_noCrash() {
- QCSlider slider = createSlider(/* action= */ null);
- writeAndLoadFromBundle(slider);
- // Test passes if this doesn't crash
- }
-
- @Test
- public void createFromParcel_accurateData() {
- QCSlider slider = createSlider(mDefaultAction);
- QCSlider newSlider = writeAndLoadFromBundle(slider);
- assertThat(newSlider.getType()).isEqualTo(QC_TYPE_SLIDER);
- assertThat(newSlider.getPrimaryAction()).isNotNull();
- assertThat(newSlider.getMin()).isEqualTo(MIN);
- assertThat(newSlider.getMax()).isEqualTo(MAX);
- assertThat(newSlider.getValue()).isEqualTo(VALUE);
- }
-
- private QCSlider createSlider(PendingIntent action) {
- return new QCSlider.Builder()
- .setMin(MIN)
- .setMax(MAX)
- .setValue(VALUE)
- .setInputAction(action)
- .build();
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/QCTileTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/QCTileTest.java
deleted file mode 100644
index e9530d5..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/QCTileTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc;
-
-import static com.android.car.qc.QCItem.QC_TYPE_TILE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.PendingIntent;
-import android.graphics.drawable.Icon;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class QCTileTest extends QCItemTestCase<QCTile> {
-
- @Test
- public void onCreate_hasCorrectType() {
- QCTile tile = createTile(/* action= */ null, /* icon= */ null);
- assertThat(tile.getType()).isEqualTo(QC_TYPE_TILE);
- }
-
- @Test
- public void onBundle_nullAction_noCrash() {
- QCTile tile = createTile(/* action= */ null, mDefaultIcon);
- writeAndLoadFromBundle(tile);
- // Test passes if this doesn't crash
- }
-
- @Test
- public void onBundle_nullIcon_noCrash() {
- QCTile tile = createTile(mDefaultAction, /* icon= */ null);
- writeAndLoadFromBundle(tile);
- // Test passes if this doesn't crash
- }
-
- @Test
- public void createFromParcel_accurateData() {
- QCTile tile = createTile(mDefaultAction, mDefaultIcon);
- QCTile newTile = writeAndLoadFromBundle(tile);
- assertThat(newTile.getType()).isEqualTo(QC_TYPE_TILE);
- assertThat(newTile.getSubtitle()).isEqualTo(TEST_SUBTITLE);
- assertThat(newTile.isChecked()).isTrue();
- assertThat(newTile.isEnabled()).isTrue();
- assertThat(newTile.getPrimaryAction()).isNotNull();
- assertThat(newTile.getIcon()).isNotNull();
- }
-
- private QCTile createTile(PendingIntent action, Icon icon) {
- return new QCTile.Builder()
- .setSubtitle(TEST_SUBTITLE)
- .setChecked(true)
- .setEnabled(true)
- .setAction(action)
- .setIcon(icon)
- .build();
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/controller/BaseQCControllerTestCase.java b/car-qc-lib/tests/unit/src/com/android/car/qc/controller/BaseQCControllerTestCase.java
deleted file mode 100644
index 095b192..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/controller/BaseQCControllerTestCase.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.controller;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-
-import androidx.lifecycle.Observer;
-import androidx.test.core.app.ApplicationProvider;
-
-import com.android.car.qc.QCItem;
-import com.android.car.qc.QCTile;
-
-import org.junit.Test;
-
-public abstract class BaseQCControllerTestCase<T extends BaseQCController> {
-
- protected final Context mContext = spy(ApplicationProvider.getApplicationContext());
-
- protected abstract T getController();
-
- @Test
- public void listen_updateListeningCalled() {
- T spiedController = spy(getController());
- spiedController.listen(true);
- verify(spiedController).updateListening();
- }
-
- @Test
- public void addObserver_updateListeningCalled() {
- Observer<QCItem> observer = mock(Observer.class);
- T spiedController = spy(getController());
- spiedController.addObserver(observer);
- verify(spiedController).updateListening();
- }
-
- @Test
- public void removeObserver_updateListeningCalled() {
- Observer<QCItem> observer = mock(Observer.class);
- T spiedController = spy(getController());
- spiedController.removeObserver(observer);
- verify(spiedController).updateListening();
- }
-
- @Test
- public void onQCItemUpdated_observersNotified() {
- Observer<QCItem> observer = mock(Observer.class);
- getController().addObserver(observer);
- getController().onQCItemUpdated(new QCTile.Builder().build());
- verify(observer).onChanged(any(QCItem.class));
- }
-
- @Test
- public void onDestroy_cleanUpController() {
- Observer<QCItem> observer = mock(Observer.class);
- getController().addObserver(observer);
- getController().listen(true);
- getController().destroy();
- assertThat(getController().mObservers.size()).isEqualTo(0);
- assertThat(getController().mShouldListen).isFalse();
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/controller/LocalQCControllerTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/controller/LocalQCControllerTest.java
deleted file mode 100644
index 17d7392..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/controller/LocalQCControllerTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.controller;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import androidx.lifecycle.Observer;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.qc.QCItem;
-import com.android.car.qc.provider.BaseLocalQCProvider;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mockito;
-
-@RunWith(AndroidJUnit4.class)
-public class LocalQCControllerTest extends BaseQCControllerTestCase<LocalQCController> {
-
- private LocalQCController mController;
- private BaseLocalQCProvider mProvider;
-
- @Override
- protected LocalQCController getController() {
- if (mController == null) {
- mProvider = mock(BaseLocalQCProvider.class);
- mController = new LocalQCController(mContext, mProvider);
- }
- return mController;
- }
-
- @Test
- public void onCreate_setsProviderNotifier() {
- getController(); // instantiate
- verify(mProvider).setNotifier(any());
- }
-
- @Test
- public void updateListening_updatesProviderListening() {
- Observer<QCItem> observer = mock(Observer.class);
- getController().addObserver(observer);
- getController().listen(true);
- verify(mProvider).shouldListen(true);
- getController().listen(false);
- verify(mProvider).shouldListen(false);
- }
-
- @Test
- public void updateListening_listen_updatesQCItem() {
- Observer<QCItem> observer = mock(Observer.class);
- LocalQCController spiedController = spy(getController());
- spiedController.addObserver(observer);
- Mockito.reset(mProvider);
- spiedController.listen(true);
- verify(mProvider).getQCItem();
- verify(spiedController).onQCItemUpdated(any());
- }
-
- @Test
- public void onDestroy_callsProviderDestroy() {
- getController().destroy();
- verify(mProvider).onDestroy();
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/controller/RemoteQCControllerTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/controller/RemoteQCControllerTest.java
deleted file mode 100644
index a1db602..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/controller/RemoteQCControllerTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.controller;
-
-import static com.android.car.qc.provider.BaseQCProvider.EXTRA_URI;
-import static com.android.car.qc.testutils.TestQCProvider.IS_DESTROYED_KEY;
-import static com.android.car.qc.testutils.TestQCProvider.IS_SUBSCRIBED_KEY;
-import static com.android.car.qc.testutils.TestQCProvider.KEY_DEFAULT;
-import static com.android.car.qc.testutils.TestQCProvider.METHOD_IS_DESTROYED;
-import static com.android.car.qc.testutils.TestQCProvider.METHOD_IS_SUBSCRIBED;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.notNull;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.ContentProviderClient;
-import android.content.ContentResolver;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.RemoteException;
-
-import androidx.lifecycle.Observer;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.platform.app.InstrumentationRegistry;
-
-import com.android.car.qc.QCItem;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class RemoteQCControllerTest extends BaseQCControllerTestCase<RemoteQCController> {
-
- private final Uri mDefaultUri = Uri.parse(
- "content://com.android.car.qc.testutils.AllowedTestQCProvider/" + KEY_DEFAULT);
-
- private RemoteQCController mController;
-
- @Override
- protected RemoteQCController getController() {
- if (mController == null) {
- mController = new RemoteQCController(mContext, mDefaultUri, mContext.getMainExecutor());
- }
- return mController;
- }
-
- @Test
- public void updateListening_listen_updatesQCItem() {
- Observer<QCItem> observer = mock(Observer.class);
- RemoteQCController spiedController = spy(getController());
- spiedController.addObserver(observer);
- spiedController.listen(true);
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
- verify(spiedController).onQCItemUpdated(notNull());
- }
-
- @Test
- public void updateListening_listen_providerSubscribed() throws RemoteException {
- Observer<QCItem> observer = mock(Observer.class);
- getController().addObserver(observer);
- getController().listen(true);
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
- Bundle extras = new Bundle();
- extras.putParcelable(EXTRA_URI, mDefaultUri);
- Bundle res = getController().getClient().call(METHOD_IS_SUBSCRIBED, null, extras);
- assertThat(res).isNotNull();
- boolean isSubscribed = res.getBoolean(IS_SUBSCRIBED_KEY, false);
- assertThat(isSubscribed).isTrue();
- }
-
- @Test
- public void updateListening_doNotListen_providerUnsubscribed() throws RemoteException {
- Observer<QCItem> observer = mock(Observer.class);
- getController().addObserver(observer);
- getController().listen(true);
- getController().listen(false);
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
- Bundle extras = new Bundle();
- extras.putParcelable(EXTRA_URI, mDefaultUri);
- Bundle res = getController().getClient().call(METHOD_IS_SUBSCRIBED, null, extras);
- assertThat(res).isNotNull();
- boolean isSubscribed = res.getBoolean(IS_SUBSCRIBED_KEY, true);
- assertThat(isSubscribed).isFalse();
- }
-
- @Test
- public void updateListening_listen_registerContentObserver() {
- ContentResolver resolver = mock(ContentResolver.class);
- when(mContext.getContentResolver()).thenReturn(resolver);
- when(resolver.acquireContentProviderClient(mDefaultUri)).thenReturn(
- mock(ContentProviderClient.class));
- Observer<QCItem> observer = mock(Observer.class);
- getController().addObserver(observer);
- getController().listen(true);
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
- verify(resolver).registerContentObserver(eq(mDefaultUri), eq(true),
- any(ContentObserver.class));
- }
-
- @Test
- public void updateListening_doNotListen_unregisterContentObserver() {
- ContentResolver resolver = mock(ContentResolver.class);
- when(mContext.getContentResolver()).thenReturn(resolver);
- when(resolver.acquireContentProviderClient(mDefaultUri)).thenReturn(
- mock(ContentProviderClient.class));
- Observer<QCItem> observer = mock(Observer.class);
- getController().addObserver(observer);
- getController().listen(true);
- getController().listen(false);
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
- verify(resolver).unregisterContentObserver(any(ContentObserver.class));
- }
-
- @Test
- public void onDestroy_callsProviderOnDestroy() throws RemoteException {
- Observer<QCItem> observer = mock(Observer.class);
- getController().addObserver(observer);
- getController().listen(true);
- getController().listen(false);
- getController().destroy();
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
- Bundle extras = new Bundle();
- extras.putParcelable(EXTRA_URI, mDefaultUri);
- Bundle res = getController().getClient().call(METHOD_IS_DESTROYED, null, extras);
- assertThat(res).isNotNull();
- boolean isDestroyed = res.getBoolean(IS_DESTROYED_KEY, false);
- assertThat(isDestroyed).isTrue();
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/provider/BaseLocalQCProviderTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/provider/BaseLocalQCProviderTest.java
deleted file mode 100644
index 6defad7..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/provider/BaseLocalQCProviderTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.provider;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.qc.QCItem;
-import com.android.car.qc.QCTile;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class BaseLocalQCProviderTest {
-
- private final Context mContext = ApplicationProvider.getApplicationContext();
- private TestBaseLocalQCProvider mProvider;
-
- @Before
- public void setUp() {
- mProvider = new TestBaseLocalQCProvider(mContext);
- }
-
- @Test
- public void getQCItem_returnsItem() {
- QCItem item = mProvider.getQCItem();
- assertThat(item).isNotNull();
- assertThat(item instanceof QCTile).isTrue();
- }
-
- @Test
- public void listen_callsOnSubscribed() {
- mProvider.shouldListen(true);
- assertThat(mProvider.isSubscribed()).isTrue();
- }
-
- @Test
- public void stopListening_callsOnUnsubscribed() {
- mProvider.shouldListen(true);
- mProvider.shouldListen(false);
- assertThat(mProvider.isSubscribed()).isFalse();
- }
-
- @Test
- public void notifyChange_updateNotified() {
- BaseLocalQCProvider.Notifier notifier = mock(BaseLocalQCProvider.Notifier.class);
- mProvider.setNotifier(notifier);
- mProvider.notifyChange();
- verify(notifier).notifyUpdate();
- }
-
- private static class TestBaseLocalQCProvider extends BaseLocalQCProvider {
-
- private boolean mIsSubscribed;
-
- TestBaseLocalQCProvider(Context context) {
- super(context);
- }
-
- @Override
- public QCItem getQCItem() {
- return new QCTile.Builder().build();
- }
-
- @Override
- protected void onSubscribed() {
- mIsSubscribed = true;
- }
-
- @Override
- protected void onUnsubscribed() {
- mIsSubscribed = false;
- }
-
- boolean isSubscribed() {
- return mIsSubscribed;
- }
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/provider/BaseQCProviderTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/provider/BaseQCProviderTest.java
deleted file mode 100644
index 30607fa..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/provider/BaseQCProviderTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.provider;
-
-import static com.android.car.qc.provider.BaseQCProvider.EXTRA_ITEM;
-import static com.android.car.qc.provider.BaseQCProvider.EXTRA_URI;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_BIND;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_DESTROY;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_SUBSCRIBE;
-import static com.android.car.qc.provider.BaseQCProvider.METHOD_UNSUBSCRIBE;
-import static com.android.car.qc.testutils.TestQCProvider.IS_DESTROYED_KEY;
-import static com.android.car.qc.testutils.TestQCProvider.IS_SUBSCRIBED_KEY;
-import static com.android.car.qc.testutils.TestQCProvider.KEY_DEFAULT;
-import static com.android.car.qc.testutils.TestQCProvider.KEY_SLOW;
-import static com.android.car.qc.testutils.TestQCProvider.METHOD_IS_DESTROYED;
-import static com.android.car.qc.testutils.TestQCProvider.METHOD_IS_SUBSCRIBED;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.testng.Assert.assertThrows;
-
-import android.content.ContentProviderClient;
-import android.content.Context;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.os.RemoteException;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.qc.QCItem;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class BaseQCProviderTest {
-
- private final Context mContext = ApplicationProvider.getApplicationContext();
- private final Uri mDefaultUri = Uri.parse(
- "content://com.android.car.qc.testutils.AllowedTestQCProvider/" + KEY_DEFAULT);
- private final Uri mSlowUri =
- Uri.parse("content://com.android.car.qc.testutils.AllowedTestQCProvider/" + KEY_SLOW);
- private final Uri mDeniedUri =
- Uri.parse("content://com.android.car.qc.testutils.DeniedTestQCProvider");
-
- @Test
- public void callOnBind_allowed_returnsItem() throws RemoteException {
- ContentProviderClient provider = getClient(mDefaultUri);
- assertThat(provider).isNotNull();
- Bundle extras = new Bundle();
- extras.putParcelable(EXTRA_URI, mDefaultUri);
- Bundle res = provider.call(METHOD_BIND, null, extras);
- assertThat(res).isNotNull();
- res.setClassLoader(QCItem.class.getClassLoader());
- Parcelable parcelable = res.getParcelable(EXTRA_ITEM);
- assertThat(parcelable).isNotNull();
- assertThat(parcelable instanceof QCItem).isTrue();
- }
-
- @Test
- public void callOnBind_noUri_throwsIllegalArgumentException() throws RemoteException {
- ContentProviderClient provider = getClient(mDefaultUri);
- assertThat(provider).isNotNull();
- Bundle extras = new Bundle();
- assertThrows(IllegalArgumentException.class,
- () -> provider.call(METHOD_BIND, null, extras));
- }
-
- @Test
- public void callOnBind_slowOperation_throwsRuntimeException() {
- ContentProviderClient provider = getClient(mSlowUri);
- assertThat(provider).isNotNull();
- Bundle extras = new Bundle();
- extras.putParcelable(EXTRA_URI, mSlowUri);
- assertThrows(RuntimeException.class,
- () -> provider.call(METHOD_BIND, null, extras));
- }
-
- @Test
- public void callOnBind_notAllowed_throwsSecurityException() {
- ContentProviderClient provider = getClient(mDeniedUri);
- assertThat(provider).isNotNull();
- Bundle extras = new Bundle();
- extras.putParcelable(EXTRA_URI, mDeniedUri);
- assertThrows(SecurityException.class,
- () -> provider.call(METHOD_BIND, null, extras));
- }
-
- @Test
- public void callOnSubscribed_isSubscribed() throws RemoteException {
- ContentProviderClient provider = getClient(mDefaultUri);
- assertThat(provider).isNotNull();
- Bundle extras = new Bundle();
- extras.putParcelable(EXTRA_URI, mDefaultUri);
- provider.call(METHOD_SUBSCRIBE, null, extras);
-
- Bundle res = provider.call(METHOD_IS_SUBSCRIBED, null, extras);
- assertThat(res).isNotNull();
- boolean isSubscribed = res.getBoolean(IS_SUBSCRIBED_KEY, false);
- assertThat(isSubscribed).isTrue();
- }
-
- @Test
- public void callOnUnsubscribed_isUnsubscribed() throws RemoteException {
- ContentProviderClient provider = getClient(mDefaultUri);
- assertThat(provider).isNotNull();
- Bundle extras = new Bundle();
- extras.putParcelable(EXTRA_URI, mDefaultUri);
- provider.call(METHOD_SUBSCRIBE, null, extras);
- provider.call(METHOD_UNSUBSCRIBE, null, extras);
-
- Bundle res = provider.call(METHOD_IS_SUBSCRIBED, null, extras);
- assertThat(res).isNotNull();
- boolean isSubscribed = res.getBoolean(IS_SUBSCRIBED_KEY, true);
- assertThat(isSubscribed).isFalse();
- }
-
- @Test
- public void callDestroy_isDestroyed() throws RemoteException {
- ContentProviderClient provider = getClient(mDefaultUri);
- assertThat(provider).isNotNull();
- Bundle extras = new Bundle();
- extras.putParcelable(EXTRA_URI, mDefaultUri);
- provider.call(METHOD_SUBSCRIBE, null, extras);
- provider.call(METHOD_UNSUBSCRIBE, null, extras);
- provider.call(METHOD_DESTROY, null, extras);
-
- Bundle res = provider.call(METHOD_IS_DESTROYED, null, extras);
- assertThat(res).isNotNull();
- boolean isDestroyed = res.getBoolean(IS_DESTROYED_KEY, false);
- assertThat(isDestroyed).isTrue();
- }
-
- private ContentProviderClient getClient(Uri uri) {
- return mContext.getContentResolver().acquireContentProviderClient(uri);
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/AllowedTestQCProvider.java b/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/AllowedTestQCProvider.java
deleted file mode 100644
index d3cbf87..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/AllowedTestQCProvider.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.testutils;
-
-import java.util.HashSet;
-import java.util.Set;
-
-public class AllowedTestQCProvider extends TestQCProvider {
- @Override
- protected Set<String> getAllowlistedPackages() {
- Set<String> allowlist = new HashSet<>();
- allowlist.add("com.android.car.qc.tests.unit");
- return allowlist;
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/DeniedTestQCProvider.java b/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/DeniedTestQCProvider.java
deleted file mode 100644
index a9c56ce..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/DeniedTestQCProvider.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.testutils;
-
-import java.util.HashSet;
-import java.util.Set;
-
-public class DeniedTestQCProvider extends TestQCProvider {
- @Override
- protected Set<String> getAllowlistedPackages() {
- return new HashSet<>();
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/TestQCProvider.java b/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/TestQCProvider.java
deleted file mode 100644
index 8248832..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/testutils/TestQCProvider.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.testutils;
-
-import android.R;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-import android.net.Uri;
-import android.os.Bundle;
-
-import androidx.annotation.NonNull;
-
-import com.android.car.qc.QCItem;
-import com.android.car.qc.QCTile;
-import com.android.car.qc.provider.BaseQCProvider;
-
-import java.io.ByteArrayOutputStream;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public abstract class TestQCProvider extends BaseQCProvider {
-
- public static final String METHOD_IS_SUBSCRIBED = "METHOD_IS_SUBSCRIBED";
- public static final String IS_SUBSCRIBED_KEY = "IS_SUBSCRIBED";
- public static final String METHOD_IS_DESTROYED = "METHOD_IS_DESTROYED";
- public static final String IS_DESTROYED_KEY = "IS_DESTROYED";
-
- public static final String KEY_DEFAULT = "DEFAULT";
- public static final String KEY_SLOW = "SLOW";
-
- private final Set<Uri> mSubscribedUris = new HashSet<>();
- private final Set<Uri> mDestroyedUris = new HashSet<>();
-
- @Override
- public Bundle call(String method, String arg, Bundle extras) {
- if (METHOD_IS_SUBSCRIBED.equals(method)) {
- Uri uri = getUriWithoutUserId(extras.getParcelable(EXTRA_URI));
- Bundle bundle = new Bundle();
- bundle.putBoolean(IS_SUBSCRIBED_KEY, mSubscribedUris.contains(uri));
- return bundle;
- }
- if (METHOD_IS_DESTROYED.equals(method)) {
- Uri uri = getUriWithoutUserId(extras.getParcelable(EXTRA_URI));
- Bundle bundle = new Bundle();
- bundle.putBoolean(IS_DESTROYED_KEY, mDestroyedUris.contains(uri));
- return bundle;
- }
- return super.call(method, arg, extras);
- }
-
- @Override
- protected QCItem onBind(@NonNull Uri uri) {
- List<String> pathSegments = uri.getPathSegments();
- String key = pathSegments.get(0);
-
- if (KEY_DEFAULT.equals(key)) {
- return new QCTile.Builder()
- .setIcon(Icon.createWithResource(getContext(), R.drawable.btn_star))
- .build();
- } else if (KEY_SLOW.equals(key)) {
- // perform a slow operation that should trigger the strict thread policy
- Drawable d = getContext().getDrawable(R.drawable.btn_star);
- Bitmap bitmap = drawableToBitmap(d);
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
- byte[] b = baos.toByteArray();
- Icon icon = Icon.createWithData(b, 0, b.length);
- return new QCTile.Builder()
- .setIcon(icon)
- .build();
- }
- return null;
- }
-
- @Override
- protected void onSubscribed(@NonNull Uri uri) {
- mSubscribedUris.add(uri);
- }
-
- @Override
- protected void onUnsubscribed(@NonNull Uri uri) {
- mSubscribedUris.remove(uri);
- }
-
- @Override
- protected void onDestroy(@NonNull Uri uri) {
- mDestroyedUris.add(uri);
- }
-
- private static Bitmap drawableToBitmap(Drawable drawable) {
-
- if (drawable instanceof BitmapDrawable) {
- return ((BitmapDrawable) drawable).getBitmap();
- }
-
- Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
- drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
- drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
- drawable.draw(canvas);
-
- return bitmap;
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCListViewTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCListViewTest.java
deleted file mode 100644
index a1065e8..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCListViewTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.view;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-import static org.testng.Assert.assertThrows;
-
-import android.content.Context;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.qc.QCList;
-import com.android.car.qc.QCRow;
-import com.android.dx.mockito.inline.extended.ExtendedMockito;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class QCListViewTest {
-
- private final Context mContext = ApplicationProvider.getApplicationContext();
- private QCListView mView;
-
- @Before
- public void setUp() {
- mView = new QCListView(mContext);
- }
-
- @Test
- public void onChanged_null_noViews() {
- mView.onChanged(null);
- assertThat(mView.getChildCount()).isEqualTo(0);
- }
-
- @Test
- public void onChanged_invalidType_throwsIllegalArgumentException() {
- QCRow row = new QCRow.Builder().build();
- assertThrows(IllegalArgumentException.class,
- () -> mView.onChanged(row));
- }
-
- @Test
- public void onChanged_createsRows() {
- QCList list = new QCList.Builder()
- .addRow(new QCRow.Builder().build())
- .addRow(new QCRow.Builder().build())
- .build();
- mView.onChanged(list);
- assertThat(mView.getChildCount()).isEqualTo(2);
- assertThat(mView.getChildAt(0) instanceof QCRowView).isTrue();
- assertThat(mView.getChildAt(1) instanceof QCRowView).isTrue();
- }
-
- @Test
- public void onChanged_decreasedRowCount_removesExtraRows() {
- QCList list = new QCList.Builder()
- .addRow(new QCRow.Builder().build())
- .addRow(new QCRow.Builder().build())
- .build();
- mView.onChanged(list);
- assertThat(mView.getChildCount()).isEqualTo(2);
- list = new QCList.Builder()
- .addRow(new QCRow.Builder().build())
- .build();
- mView.onChanged(list);
- assertThat(mView.getChildCount()).isEqualTo(1);
- }
-
- @Test
- public void setActionListener_setsOnChildView() {
- QCList list = new QCList.Builder()
- .addRow(new QCRow.Builder().build())
- .addRow(new QCRow.Builder().build())
- .build();
- mView.onChanged(list);
- assertThat(mView.getChildCount()).isEqualTo(2);
- QCRowView row1 = (QCRowView) mView.getChildAt(0);
- QCRowView row2 = (QCRowView) mView.getChildAt(1);
- ExtendedMockito.spyOn(row1);
- ExtendedMockito.spyOn(row2);
- QCView.QCActionListener listener = mock(QCView.QCActionListener.class);
- mView.setActionListener(listener);
- ExtendedMockito.verify(row1).setActionListener(listener);
- ExtendedMockito.verify(row2).setActionListener(listener);
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCRowViewTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCRowViewTest.java
deleted file mode 100644
index 6e1639c..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCRowViewTest.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.view;
-
-import static com.android.car.qc.QCItem.QC_TYPE_ACTION_SWITCH;
-import static com.android.car.qc.QCItem.QC_TYPE_ACTION_TOGGLE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Icon;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import androidx.test.annotation.UiThreadTest;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.qc.QCActionItem;
-import com.android.car.qc.QCRow;
-import com.android.car.qc.QCSlider;
-import com.android.car.qc.R;
-import com.android.dx.mockito.inline.extended.ExtendedMockito;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class QCRowViewTest {
-
- private final Context mContext = ApplicationProvider.getApplicationContext();
- private QCRowView mView;
-
- @Before
- public void setUp() {
- mView = new QCRowView(mContext);
- }
-
- @Test
- public void setRow_null_notVisible() {
- mView.setRow(null);
- assertThat(mView.getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void setRow_notNull_visible() {
- QCRow row = new QCRow.Builder().build();
- mView.setRow(row);
- assertThat(mView.getVisibility()).isEqualTo(View.VISIBLE);
- }
-
- @Test
- public void setRow_setsTitle() {
- String title = "TEST_TITLE";
- QCRow row = new QCRow.Builder().setTitle(title).build();
- mView.setRow(row);
- TextView titleView = mView.findViewById(R.id.qc_title);
- assertThat(titleView.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(titleView.getText().toString()).isEqualTo(title);
- }
-
- @Test
- public void setRow_setsSubtitle() {
- String subtitle = "TEST_TITLE";
- QCRow row = new QCRow.Builder().setSubtitle(subtitle).build();
- mView.setRow(row);
- TextView subtitleView = mView.findViewById(R.id.qc_summary);
- assertThat(subtitleView.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(subtitleView.getText().toString()).isEqualTo(subtitle);
- }
-
- @Test
- public void setRow_setsIcon() {
- Icon icon = Icon.createWithResource(mContext, android.R.drawable.btn_star);
- QCRow row = new QCRow.Builder().setIcon(icon).build();
- mView.setRow(row);
- ImageView iconView = mView.findViewById(R.id.qc_icon);
- assertThat(iconView.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(iconView.getDrawable()).isNotNull();
- }
-
- @Test
- public void setRow_createsStartItems() {
- QCRow row = new QCRow.Builder()
- .addStartItem(new QCActionItem.Builder(QC_TYPE_ACTION_SWITCH).build())
- .addStartItem(new QCActionItem.Builder(QC_TYPE_ACTION_TOGGLE).build())
- .build();
- mView.setRow(row);
- LinearLayout startContainer = mView.findViewById(R.id.qc_row_start_items);
- assertThat(startContainer.getChildCount()).isEqualTo(2);
- assertThat((View) startContainer.getChildAt(0).findViewById(
- android.R.id.switch_widget)).isNotNull();
- assertThat((View) startContainer.getChildAt(1).findViewById(
- R.id.qc_toggle_button)).isNotNull();
- }
-
- @Test
- public void setRow_createsEndItems() {
- QCRow row = new QCRow.Builder()
- .addEndItem(new QCActionItem.Builder(QC_TYPE_ACTION_SWITCH).build())
- .addEndItem(new QCActionItem.Builder(QC_TYPE_ACTION_TOGGLE).build())
- .build();
- mView.setRow(row);
- LinearLayout endContainer = mView.findViewById(R.id.qc_row_end_items);
- assertThat(endContainer.getChildCount()).isEqualTo(2);
- assertThat((View) endContainer.getChildAt(0).findViewById(
- android.R.id.switch_widget)).isNotNull();
- assertThat((View) endContainer.getChildAt(1).findViewById(
- R.id.qc_toggle_button)).isNotNull();
- }
-
- @Test
- public void setRow_noSlider_sliderViewNotVisible() {
- QCRow row = new QCRow.Builder().build();
- mView.setRow(row);
- LinearLayout sliderContainer = mView.findViewById(R.id.qc_seekbar_wrapper);
- assertThat(sliderContainer.getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- @UiThreadTest
- public void setRow_hasSlider_sliderViewVisible() {
- QCRow row = new QCRow.Builder()
- .addSlider(new QCSlider.Builder().build())
- .build();
- mView.setRow(row);
- LinearLayout sliderContainer = mView.findViewById(R.id.qc_seekbar_wrapper);
- assertThat(sliderContainer.getVisibility()).isEqualTo(View.VISIBLE);
- }
-
- @Test
- public void onRowClick_firesAction() throws PendingIntent.CanceledException {
- PendingIntent action = mock(PendingIntent.class);
- QCRow row = new QCRow.Builder().setPrimaryAction(action).build();
- mView.setRow(row);
- mView.findViewById(R.id.qc_row_content).performClick();
- verify(action).send(any(Context.class), anyInt(), eq(null));
- }
-
- @Test
- public void onSwitchClick_firesAction() throws PendingIntent.CanceledException {
- PendingIntent action = mock(PendingIntent.class);
- QCRow row = new QCRow.Builder()
- .addEndItem(
- new QCActionItem.Builder(QC_TYPE_ACTION_SWITCH).setAction(action).build())
- .build();
- mView.setRow(row);
- LinearLayout endContainer = mView.findViewById(R.id.qc_row_end_items);
- assertThat(endContainer.getChildCount()).isEqualTo(1);
- endContainer.getChildAt(0).performClick();
- verify(action).send(any(Context.class), anyInt(), any(Intent.class));
- }
-
- @Test
- @UiThreadTest
- public void onToggleClick_firesAction() throws PendingIntent.CanceledException {
- PendingIntent action = mock(PendingIntent.class);
- QCRow row = new QCRow.Builder()
- .addEndItem(
- new QCActionItem.Builder(QC_TYPE_ACTION_TOGGLE).setAction(action).build())
- .build();
- mView.setRow(row);
- LinearLayout endContainer = mView.findViewById(R.id.qc_row_end_items);
- assertThat(endContainer.getChildCount()).isEqualTo(1);
- endContainer.getChildAt(0).performClick();
- verify(action).send(any(Context.class), anyInt(), any(Intent.class));
- }
-
- @Test
- @UiThreadTest
- public void onSliderChange_firesAction() throws PendingIntent.CanceledException {
- PendingIntent action = mock(PendingIntent.class);
- QCRow row = new QCRow.Builder()
- .addSlider(new QCSlider.Builder().setInputAction(action).build())
- .build();
- mView.setRow(row);
- SeekBar seekBar = mView.findViewById(R.id.seekbar);
- seekBar.setProgress(50);
- MotionEvent motionEvent = ExtendedMockito.mock(MotionEvent.class);
- ExtendedMockito.when(motionEvent.getAction()).thenReturn(MotionEvent.ACTION_UP);
- seekBar.onTouchEvent(motionEvent);
- verify(action).send(any(Context.class), anyInt(), any(Intent.class));
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCTileViewTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCTileViewTest.java
deleted file mode 100644
index 9104520..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCTileViewTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.view;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.testng.Assert.assertThrows;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-import android.graphics.drawable.LayerDrawable;
-import android.widget.TextView;
-
-import androidx.test.annotation.UiThreadTest;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.qc.QCRow;
-import com.android.car.qc.QCTile;
-import com.android.car.qc.R;
-import com.android.car.ui.uxr.DrawableStateToggleButton;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class QCTileViewTest {
-
- private final Context mContext = ApplicationProvider.getApplicationContext();
- private QCTileView mView;
-
- @Before
- public void setUp() {
- mView = new QCTileView(mContext);
- }
-
- @Test
- public void onChanged_null_noViews() {
- mView.onChanged(null);
- assertThat(mView.getChildCount()).isEqualTo(0);
- }
-
- @Test
- public void onChanged_invalidType_throwsIllegalArgumentException() {
- QCRow row = new QCRow.Builder().build();
- assertThrows(IllegalArgumentException.class,
- () -> mView.onChanged(row));
- }
-
- @Test
- public void onChanged_setsSubtitleView() {
- String subtitle = "TEST_SUBTITLE";
- QCTile tile = new QCTile.Builder().setSubtitle(subtitle).build();
- mView.onChanged(tile);
- TextView subtitleView = mView.findViewById(android.R.id.summary);
- assertThat(subtitleView.getText().toString()).isEqualTo(subtitle);
- }
-
- @Test
- @UiThreadTest
- public void onChanged_setsButtonState() {
- QCTile tile = new QCTile.Builder().setChecked(true).setEnabled(true).build();
- mView.onChanged(tile);
- DrawableStateToggleButton button = mView.findViewById(R.id.qc_tile_toggle_button);
- assertThat(button.isEnabled()).isTrue();
- assertThat(button.isChecked()).isTrue();
- }
-
- @Test
- public void onChanged_setsIcon() {
- Icon icon = Icon.createWithResource(mContext, android.R.drawable.btn_star);
- QCTile tile = new QCTile.Builder().setIcon(icon).build();
- mView.onChanged(tile);
- DrawableStateToggleButton button = mView.findViewById(R.id.qc_tile_toggle_button);
- Drawable buttonDrawable = button.getButtonDrawable();
- assertThat(buttonDrawable).isNotNull();
- assertThat(buttonDrawable instanceof LayerDrawable).isTrue();
- assertThat(((LayerDrawable) buttonDrawable).getNumberOfLayers()).isEqualTo(2);
- }
-
- @Test
- @UiThreadTest
- public void onClick_firesAction() throws PendingIntent.CanceledException {
- PendingIntent action = mock(PendingIntent.class);
- QCTile tile = new QCTile.Builder().setChecked(false).setAction(action).build();
- mView.onChanged(tile);
- mView.findViewById(R.id.qc_tile_wrapper).performClick();
- DrawableStateToggleButton button = mView.findViewById(R.id.qc_tile_toggle_button);
- assertThat(button.isChecked()).isTrue();
- verify(action).send(any(Context.class), anyInt(), any(Intent.class));
- }
-}
diff --git a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCViewTest.java b/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCViewTest.java
deleted file mode 100644
index b2090cb..0000000
--- a/car-qc-lib/tests/unit/src/com/android/car/qc/view/QCViewTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.qc.view;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.testng.Assert.assertThrows;
-
-import android.content.Context;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.car.qc.QCList;
-import com.android.car.qc.QCRow;
-import com.android.car.qc.QCTile;
-import com.android.dx.mockito.inline.extended.ExtendedMockito;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class QCViewTest {
-
- private final Context mContext = ApplicationProvider.getApplicationContext();
- private QCView mView;
-
- @Before
- public void setUp() {
- mView = new QCView(mContext);
- }
-
- @Test
- public void onChanged_null_noViews() {
- mView.onChanged(null);
- assertThat(mView.getChildCount()).isEqualTo(0);
- }
-
- @Test
- public void onChanged_invalidType_throwsIllegalArgumentException() {
- QCRow row = new QCRow.Builder().build();
- assertThrows(IllegalArgumentException.class,
- () -> mView.onChanged(row));
- }
-
- @Test
- public void onChanged_list_createsListView() {
- QCList list = new QCList.Builder().build();
- mView.onChanged(list);
- assertThat(mView.getChildCount()).isEqualTo(1);
- assertThat(mView.getChildAt(0) instanceof QCListView).isTrue();
- }
-
- @Test
- public void onChanged_tile_createsTileView() {
- QCTile tile = new QCTile.Builder().build();
- mView.onChanged(tile);
- assertThat(mView.getChildCount()).isEqualTo(1);
- assertThat(mView.getChildAt(0) instanceof QCTileView).isTrue();
- }
-
- @Test
- public void onChanged_alreadyHasView_callsOnChanged() {
- QCTile tile = new QCTile.Builder().build();
- mView.onChanged(tile);
- assertThat(mView.getChildCount()).isEqualTo(1);
- assertThat(mView.getChildAt(0) instanceof QCTileView).isTrue();
- QCTileView tileView = (QCTileView) mView.getChildAt(0);
- ExtendedMockito.spyOn(tileView);
- mView.onChanged(tile);
- verify(tileView).onChanged(tile);
- }
-
- @Test
- public void setActionListener_setsOnChildView() {
- QCTile tile = new QCTile.Builder().build();
- mView.onChanged(tile);
- assertThat(mView.getChildCount()).isEqualTo(1);
- assertThat(mView.getChildAt(0) instanceof QCTileView).isTrue();
- QCTileView tileView = (QCTileView) mView.getChildAt(0);
- ExtendedMockito.spyOn(tileView);
- QCView.QCActionListener listener = mock(QCView.QCActionListener.class);
- mView.setActionListener(listener);
- ExtendedMockito.verify(tileView).setActionListener(listener);
- }
-}
diff --git a/car-ui-lib/Android.bp b/car-ui-lib/Android.bp
index b6dddd8..1ff7959 100644
--- a/car-ui-lib/Android.bp
+++ b/car-ui-lib/Android.bp
@@ -155,7 +155,6 @@
"libdexmakerjvmtiagent",
"libstaticjvmtiagent",
],
- required: ["car-ui-lib-plugin"],
platform_apis: true,
test_suites: ["device-tests"],
}
diff --git a/car-ui-lib/car-rotary-lib/src/main/java/com/android/car/ui/FocusParkingView.java b/car-ui-lib/car-rotary-lib/src/main/java/com/android/car/ui/FocusParkingView.java
index d1bb5ff..ec338d1 100644
--- a/car-ui-lib/car-rotary-lib/src/main/java/com/android/car/ui/FocusParkingView.java
+++ b/car-ui-lib/car-rotary-lib/src/main/java/com/android/car/ui/FocusParkingView.java
@@ -228,9 +228,11 @@
// OnGlobalFocusChangeListener won't be triggered when the window lost focus, so reset
// the focused view here.
updateFocusedView(null);
- } else if (isFocused() && mShouldRestoreFocus) {
- // When FocusParkingView is focused and the window just gets focused, transfer the view
- // focus to a non-FocusParkingView in the window.
+ } else if (mShouldRestoreFocus
+ && (isFocused() || getRootView().findFocus() instanceof FocusParkingView)) {
+ // When a FocusParkingView is focused and the window just gets focused, transfer
+ // the view focus to a non-FocusParkingView in the window. (Though not common,
+ // there might be multiple FocusParkingViews in the view tree.)
restoreFocusInRoot(/* checkForTouchMode= */ true);
}
super.onWindowFocusChanged(hasWindowFocus);
diff --git a/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/preference/PreferenceTest.java b/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/preference/PreferenceTest.java
index c675df7..ac0b765 100644
--- a/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/preference/PreferenceTest.java
+++ b/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/preference/PreferenceTest.java
@@ -31,6 +31,7 @@
import static com.android.car.ui.actions.ViewActions.setProgress;
import static com.android.car.ui.core.CarUi.MIN_TARGET_API;
+import static com.android.car.ui.matchers.ViewMatchers.isActivated;
import static com.android.car.ui.matchers.ViewMatchers.withIndex;
import static junit.framework.Assert.assertFalse;
@@ -331,7 +332,6 @@
// Scroll until list preference is visible
mActivity.runOnUiThread(() -> mActivity.scrollToPreference("switch"));
-
// Check title and summary are displayed as expected.
onView(withIndex(withId(android.R.id.title), 0)).check(matches(
withText(mActivity.getString(R.string.title_switch_preference))));
@@ -366,6 +366,54 @@
}
@Test
+ public void testPrimarySwitchPreference() {
+ // Create switch preference and add it to screen.
+ CarUiPrimarySwitchPreference preference = new CarUiPrimarySwitchPreference(mActivity);
+ preference.setOrder(0);
+ preference.setKey("switch");
+ preference.setTitle(R.string.title_switch_preference);
+ preference.setSummary(R.string.summary_compound_button_preference);
+ mActivity.addPreference(preference);
+
+ // Scroll until list preference is visible
+ mActivity.runOnUiThread(() -> mActivity.scrollToPreference("switch"));
+
+ // Check title and summary are displayed as expected.
+ onView(withIndex(withId(android.R.id.title), 0)).check(matches(
+ withText(mActivity.getString(R.string.title_switch_preference))));
+ onView(withIndex(withId(android.R.id.summary), 0)).check(matches(
+ withText(mActivity.getString(R.string.summary_compound_button_preference))));
+
+ // Ensure switch preference is initially not selected.
+ onView(withId(android.R.id.switch_widget)).check(matches(isNotChecked()));
+
+ Preference.OnPreferenceChangeListener mockListener = mock(
+ Preference.OnPreferenceChangeListener.class);
+ when(mockListener.onPreferenceChange(any(), any())).thenReturn(true);
+ mActivity.setOnPreferenceChangeListener("switch", mockListener);
+
+ // Select switch preference.
+ onView(withText(R.string.title_switch_preference)).perform(click());
+
+ // Verify preference value was updated.
+ verify(mockListener, times(1)).onPreferenceChange(any(), eq(true));
+
+ // Verify switch preference correctly indicates preference is selected.
+ onView(withId(android.R.id.switch_widget)).check(matches(isChecked()));
+ onView(withText(R.string.title_switch_preference)).check(matches(isActivated()));
+
+ // Un-select switch preference.
+ onView(withText(R.string.title_switch_preference)).perform(click());
+
+ // Verify preference value was updated.
+ verify(mockListener, times(1)).onPreferenceChange(any(), eq(false));
+
+ // Verify switch preference correctly indicates preference is selected.
+ onView(withId(android.R.id.switch_widget)).check(matches(isNotChecked()));
+ onView(withText(R.string.title_switch_preference)).check(matches(not(isActivated())));
+ }
+
+ @Test
public void testSwitchPreference_uxRestricted() {
// Create switch preference and add it to screen.
CarUiSwitchPreference preference = new CarUiSwitchPreference(mActivity);
diff --git a/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/recyclerview/CarUiRecyclerViewTest.java b/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/recyclerview/CarUiRecyclerViewTest.java
index 8257cad..01c66f0 100644
--- a/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/recyclerview/CarUiRecyclerViewTest.java
+++ b/car-ui-lib/car-ui-lib/src/androidTest/java/com/android/car/ui/recyclerview/CarUiRecyclerViewTest.java
@@ -33,6 +33,7 @@
import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.assertThat;
+import static androidx.test.espresso.matcher.ViewMatchers.hasDescendant;
import static androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.isEnabled;
@@ -40,6 +41,7 @@
import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static com.android.car.ui.actions.CarUiRecyclerViewActions.scrollToPosition;
import static com.android.car.ui.actions.LowLevelActions.performDrag;
@@ -56,7 +58,6 @@
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.lessThan;
import static org.hamcrest.Matchers.lessThanOrEqualTo;
import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertEquals;
@@ -102,7 +103,6 @@
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.LayoutManager;
import androidx.recyclerview.widget.RecyclerView.LayoutParams;
-import androidx.test.core.app.ActivityScenario;
import androidx.test.espresso.IdlingRegistry;
import androidx.test.espresso.IdlingResource;
import androidx.test.ext.junit.rules.ActivityScenarioRule;
@@ -115,11 +115,11 @@
import com.android.car.ui.utils.CarUxRestrictionsUtil;
import org.junit.After;
-import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
+import org.mockito.ArgumentCaptor;
import java.util.ArrayList;
import java.util.HashMap;
@@ -127,14 +127,15 @@
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
/**
* Unit tests for {@link CarUiRecyclerView}.
*/
-@TargetApi(MIN_TARGET_API)
@RunWith(Parameterized.class)
+@TargetApi(MIN_TARGET_API)
public class CarUiRecyclerViewTest {
-
@Parameterized.Parameters
public static Object[] data() {
// It's important to do no plugin first, so that the plugin will
@@ -146,14 +147,6 @@
public ActivityScenarioRule<TestActivity> mActivityRule =
new ActivityScenarioRule<>(TestActivity.class);
- ActivityScenario<TestActivity> mScenario;
-
- private TestActivity mActivity;
- private Context mTestableContext;
- private Resources mTestableResources;
-
-
- private Context mPluginContext;
private final boolean mIsPluginEnabled;
public CarUiRecyclerViewTest(boolean pluginEnabled) {
@@ -161,21 +154,6 @@
mIsPluginEnabled = pluginEnabled;
}
- @Before
- public void setUp() {
- if (mIsPluginEnabled) {
- mPluginContext = PluginFactorySingleton.getPluginContext();
- }
- mScenario = mActivityRule.getScenario();
- mScenario.onActivity(activity -> {
- mActivity = activity;
- mTestableContext = spy(mActivity);
- mTestableResources = spy(mActivity.getResources());
- });
-
- when(mTestableContext.getResources()).thenReturn(mTestableResources);
- }
-
@After
public void tearDown() {
for (IdlingResource idlingResource : IdlingRegistry.getInstance().getResources()) {
@@ -187,11 +165,19 @@
@Test
public void testIsScrollbarPresent_scrollbarDisabled() {
- if (isScrollbarEnabledNotAsExpected(false)) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
- container.post(() -> {
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ doReturn(false).when(testableResources)
+ .getBoolean(R.bool.car_ui_scrollbar_enable);
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
carUiRecyclerView.setAdapter(new TestAdapter(100));
});
@@ -201,21 +187,31 @@
@Test
public void testSmallRecyclerView_scrollbarDisabled() {
- if (isScrollbarEnabledNotAsExpected(false)) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
- null, R.styleable.CarUiRecyclerView));
- doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
- any(),
- eq(R.styleable.CarUiRecyclerView),
- anyInt(),
- anyInt());
- when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
- anyInt())).thenReturn(0); // Small size
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
- container.post(() -> {
+ TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+ null, R.styleable.CarUiRecyclerView));
+ doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+ any(),
+ eq(R.styleable.CarUiRecyclerView),
+ anyInt(),
+ anyInt());
+ when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
+ anyInt())).thenReturn(0); // Small size
+
+ // Disable scrollbar
+ doReturn(false).when(testableResources)
+ .getBoolean(R.bool.car_ui_scrollbar_enable);
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
carUiRecyclerView.setAdapter(new TestAdapter(100));
});
@@ -225,21 +221,31 @@
@Test
public void testMediumRecyclerView_scrollbarDisabled() {
- if (isScrollbarEnabledNotAsExpected(false)) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
- null, R.styleable.CarUiRecyclerView));
- doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
- any(),
- eq(R.styleable.CarUiRecyclerView),
- anyInt(),
- anyInt());
- when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
- anyInt())).thenReturn(1); // Medium size
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
- container.post(() -> {
+ TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+ null, R.styleable.CarUiRecyclerView));
+ doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+ any(),
+ eq(R.styleable.CarUiRecyclerView),
+ anyInt(),
+ anyInt());
+ when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
+ anyInt())).thenReturn(1); // Medium size
+
+ // Disable scrollbar
+ doReturn(false).when(testableResources)
+ .getBoolean(R.bool.car_ui_scrollbar_enable);
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
carUiRecyclerView.setAdapter(new TestAdapter(100));
});
@@ -249,21 +255,31 @@
@Test
public void testLargeRecyclerView_scrollbarDisabled() {
- if (isScrollbarEnabledNotAsExpected(false)) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
- null, R.styleable.CarUiRecyclerView));
- doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
- any(),
- eq(R.styleable.CarUiRecyclerView),
- anyInt(),
- anyInt());
- when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
- anyInt())).thenReturn(2); // Large size
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
- container.post(() -> {
+ TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+ null, R.styleable.CarUiRecyclerView));
+ doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+ any(),
+ eq(R.styleable.CarUiRecyclerView),
+ anyInt(),
+ anyInt());
+ when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
+ anyInt())).thenReturn(2); // Large size
+
+ // Disable scrollbar
+ doReturn(false).when(testableResources)
+ .getBoolean(R.bool.car_ui_scrollbar_enable);
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
carUiRecyclerView.setAdapter(new TestAdapter(100));
});
@@ -273,19 +289,19 @@
@Test
public void testPadding() {
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
- int padding = 100;
- carUiRecyclerView.setPadding(padding, padding, padding, padding);
- container.post(() -> {
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+ ViewGroup container = activity.findViewById(R.id.test_container);
+ int padding = 100;
+ carUiRecyclerView.setPadding(padding, padding, padding, padding);
container.addView(carUiRecyclerView.getView());
carUiRecyclerView.setAdapter(new TestAdapter(100));
- });
- assertEquals(padding, carUiRecyclerView.getPaddingLeft());
- assertEquals(padding, carUiRecyclerView.getPaddingRight());
- assertEquals(padding, carUiRecyclerView.getPaddingTop());
- assertEquals(padding, carUiRecyclerView.getPaddingBottom());
+ assertEquals(padding, carUiRecyclerView.getPaddingLeft());
+ assertEquals(padding, carUiRecyclerView.getPaddingRight());
+ assertEquals(padding, carUiRecyclerView.getPaddingTop());
+ assertEquals(padding, carUiRecyclerView.getPaddingBottom());
+ });
}
@Test
@@ -293,28 +309,35 @@
// Ensure the CarUiRecyclerViewLayout constant matches the styleable attribute enum value
assertEquals(CarUiRecyclerView.CarUiRecyclerViewLayout.GRID, 1);
- TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
- null, R.styleable.CarUiRecyclerView));
-
- doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
- any(),
- eq(R.styleable.CarUiRecyclerView),
- anyInt(),
- anyInt());
- when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_layoutStyle), anyInt()))
- .thenReturn(CarUiRecyclerView.CarUiRecyclerViewLayout.GRID);
- when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_numOfColumns), anyInt()))
- .thenReturn(3);
-
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(4);
- container.post(() -> {
- container.addView(carUiRecyclerView.getView());
- carUiRecyclerView.setAdapter(adapter);
- });
- assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiGridLayoutStyle);
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+
+ TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+ null, R.styleable.CarUiRecyclerView));
+
+ doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+ any(),
+ eq(R.styleable.CarUiRecyclerView),
+ anyInt(),
+ anyInt());
+ when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_layoutStyle), anyInt()))
+ .thenReturn(CarUiRecyclerView.CarUiRecyclerViewLayout.GRID);
+ when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_numOfColumns), anyInt()))
+ .thenReturn(3);
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
+ container.post(() -> {
+ container.addView(carUiRecyclerView.getView());
+ carUiRecyclerView.setAdapter(adapter);
+ });
+
+ assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiGridLayoutStyle);
+ });
// Check that all items in the first row are top-aligned.
onView(withText(adapter.getItemText(0))).check(
@@ -342,26 +365,33 @@
// Ensure the CarUiRecyclerViewLayout constant matches the styleable attribute enum value
assertEquals(CarUiRecyclerView.CarUiRecyclerViewLayout.LINEAR, 0);
- TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
- null, R.styleable.CarUiRecyclerView));
-
- doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
- any(),
- eq(R.styleable.CarUiRecyclerView),
- anyInt(),
- anyInt());
- when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_layoutStyle), anyInt()))
- .thenReturn(CarUiRecyclerView.CarUiRecyclerViewLayout.LINEAR);
-
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(4);
- container.post(() -> {
- container.addView(carUiRecyclerView.getView());
- carUiRecyclerView.setAdapter(adapter);
- });
- assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiLinearLayoutStyle);
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+
+ TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+ null, R.styleable.CarUiRecyclerView));
+
+ doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+ any(),
+ eq(R.styleable.CarUiRecyclerView),
+ anyInt(),
+ anyInt());
+ when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_layoutStyle), anyInt()))
+ .thenReturn(CarUiRecyclerView.CarUiRecyclerViewLayout.LINEAR);
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
+ container.post(() -> {
+ container.addView(carUiRecyclerView.getView());
+ carUiRecyclerView.setAdapter(adapter);
+ });
+
+ assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiLinearLayoutStyle);
+ });
// Check that item views are laid out linearly.
onView(withText(adapter.getItemText(0))).check(
@@ -374,151 +404,192 @@
@Test
public void testStartAtFirstPosition() {
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(100);
- container.post(() -> {
+ int listId = View.generateViewId();
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
});
// Check that the first item is completely displayed.
onView(withText(adapter.getItemText(0))).check(matches(isCompletelyDisplayed()));
- assertEquals(0, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertEquals(0, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+ });
}
@Test
public void testPositionAfterPadding() {
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(100);
int testPosition = 40;
- container.post(() -> {
- container.addView(carUiRecyclerView.getView());
+ int listId = View.generateViewId();
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
+ ViewGroup container = activity.findViewById(R.id.test_container);
+ container.addView(carUiRecyclerView.getView());
carUiRecyclerView.scrollToPosition(testPosition);
});
// Check that the scrolled to item is completely displayed.
onView(withText(adapter.getItemText(testPosition))).check(matches(isCompletelyDisplayed()));
- assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
- int padding = 150;
- container.post(() -> carUiRecyclerView.setPadding(padding, padding, padding, padding));
+ int padding = 150;
+ carUiRecyclerView.setPadding(padding, padding, padding, padding);
+ });
// Check that the scrolled to item is completely displayed.
onView(withText(adapter.getItemText(testPosition))).check(matches(isCompletelyDisplayed()));
- assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+ });
}
@Test
public void testPositionAfterPaddingRelative() {
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(100);
int testPosition = 40;
- container.post(() -> {
- container.addView(carUiRecyclerView.getView());
+ int listId = View.generateViewId();
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
+ ViewGroup container = activity.findViewById(R.id.test_container);
+ container.addView(carUiRecyclerView.getView());
carUiRecyclerView.scrollToPosition(testPosition);
});
// Check that the scrolled to item is completely displayed.
onView(withText(adapter.getItemText(testPosition))).check(matches(isCompletelyDisplayed()));
- assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
- int padding = 150;
- container.post(
- () -> carUiRecyclerView.setPaddingRelative(padding, padding, padding, padding));
+ int padding = 150;
+ carUiRecyclerView.setPaddingRelative(padding, padding, padding, padding);
+ });
// Check that the scrolled to item is completely displayed.
onView(withText(adapter.getItemText(testPosition))).check(matches(isCompletelyDisplayed()));
- assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertEquals(testPosition, carUiRecyclerView.findFirstCompletelyVisibleItemPosition());
+ });
}
@Test
public void testLayoutManagerSetInXml() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
// Inflate activity where a LayoutManger is set for a CarUiRecyclerView through a
// styleable attribute.
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(
- R.layout.car_ui_recycler_view_layout_manager_xml_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_layout_manager_xml_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
TestAdapter adapter = new TestAdapter(3);
- mActivity.runOnUiThread(() -> {
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
setRotaryScrollEnabled(carUiRecyclerView.getView(), /* isVertical= */ true);
carUiRecyclerView.setAdapter(adapter);
carUiRecyclerView.setVisibility(View.VISIBLE);
+
+ assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiGridLayoutStyle);
});
// Check that items in are displayed.
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
onView(withText(adapter.getItemText(1))).check(matches(isDisplayed()));
onView(withText(adapter.getItemText(2))).check(matches(isDisplayed()));
-
- assertTrue(carUiRecyclerView.getLayoutManager() instanceof GridLayoutManager);
}
@Test
public void testSetLayoutManager_shouldUpdateItemDecorations() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
- null, R.styleable.CarUiRecyclerView));
-
- doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
- any(),
- eq(R.styleable.CarUiRecyclerView),
- anyInt(),
- anyInt());
- when(typedArray.getBoolean(eq(R.styleable.CarUiRecyclerView_enableDivider), anyBoolean()))
- .thenReturn(true);
- when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_layoutStyle), anyInt()))
- .thenReturn(CarUiRecyclerView.CarUiRecyclerViewLayout.GRID);
- when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_numOfColumns), anyInt()))
- .thenReturn(3);
-
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(4);
- container.post(() -> {
+ int listId = View.generateViewId();
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+
+ TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+ null, R.styleable.CarUiRecyclerView));
+
+ doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+ any(),
+ eq(R.styleable.CarUiRecyclerView),
+ anyInt(),
+ anyInt());
+ when(typedArray.getBoolean(eq(R.styleable.CarUiRecyclerView_enableDivider),
+ anyBoolean()))
+ .thenReturn(true);
+ when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_layoutStyle), anyInt()))
+ .thenReturn(CarUiRecyclerView.CarUiRecyclerViewLayout.GRID);
+ when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_numOfColumns), anyInt()))
+ .thenReturn(3);
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ carUiRecyclerView.setId(listId);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
carUiRecyclerView.setAdapter(adapter);
});
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiGridLayoutStyle);
- assertEquals(carUiRecyclerView.getItemDecorationCount(), 1);
- assertTrue(carUiRecyclerView.getItemDecorationAt(0) instanceof GridDividerItemDecoration);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiGridLayoutStyle);
+ assertEquals(carUiRecyclerView.getItemDecorationCount(), 1);
+ assertTrue(
+ carUiRecyclerView.getItemDecorationAt(0) instanceof GridDividerItemDecoration);
- mActivity.runOnUiThread(() ->
- carUiRecyclerView.setLayoutStyle(new CarUiLinearLayoutStyle()));
+ carUiRecyclerView.setLayoutStyle(new CarUiLinearLayoutStyle());
+ });
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiLinearLayoutStyle);
- assertEquals(carUiRecyclerView.getItemDecorationCount(), 1);
- assertFalse(carUiRecyclerView.getItemDecorationAt(0)
- instanceof GridDividerItemDecoration);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiLinearLayoutStyle);
+ assertEquals(carUiRecyclerView.getItemDecorationCount(), 1);
+ assertFalse(carUiRecyclerView.getItemDecorationAt(0)
+ instanceof GridDividerItemDecoration);
+ });
}
@Test
public void testVisibility_goneAtInflationWithChangeToVisible() {
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(
- R.layout.car_ui_recycler_view_gone_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_gone_test_activity));
onView(withId(R.id.list)).check(matches(not(isDisplayed())));
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
TestAdapter adapter = new TestAdapter(3);
- mActivity.runOnUiThread(() -> {
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
carUiRecyclerView.setAdapter(adapter);
carUiRecyclerView.setVisibility(View.VISIBLE);
});
@@ -531,15 +602,15 @@
@Test
public void testVisibility_invisibleAtInflationWithChangeToVisible() {
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(
- R.layout.car_ui_recycler_view_invisible_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_invisible_test_activity));
onView(withId(R.id.list)).check(matches(not(isDisplayed())));
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
TestAdapter adapter = new TestAdapter(3);
- mActivity.runOnUiThread(() -> {
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
carUiRecyclerView.setAdapter(adapter);
carUiRecyclerView.setVisibility(View.VISIBLE);
});
@@ -552,68 +623,93 @@
@Test
public void testFirstItemAtTop_onInitialLoad() {
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
TestAdapter adapter = new TestAdapter(25);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ activity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+ });
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- assertEquals(carUiRecyclerView.findFirstVisibleItemPosition(), 0);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ assertEquals(carUiRecyclerView.findFirstVisibleItemPosition(), 0);
+ });
}
@Test
public void testPageUpAndDownMoveSameDistance() {
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ // Can't use OrientationHelper here, because it returns 0 when calling getTotalSpace
+ // methods
+ // until LayoutManager's onLayoutComplete is called. In this case waiting until the
+ // first
+ // item of the list is displayed guarantees that OrientationHelper is initialized
+ // properly.
+ int totalSpace = carUiRecyclerView.getHeight()
+ - carUiRecyclerView.getPaddingTop()
+ - carUiRecyclerView.getPaddingBottom();
+ PerfectFitTestAdapter adapter = new PerfectFitTestAdapter(5, totalSpace);
+ carUiRecyclerView.setAdapter(adapter);
- // Can't use OrientationHelper here, because it returns 0 when calling getTotalSpace methods
- // until LayoutManager's onLayoutComplete is called. In this case waiting until the first
- // item of the list is displayed guarantees that OrientationHelper is initialized properly.
- int totalSpace = carUiRecyclerView.getHeight()
- - carUiRecyclerView.getPaddingTop()
- - carUiRecyclerView.getPaddingBottom();
- PerfectFitTestAdapter adapter = new PerfectFitTestAdapter(5, totalSpace);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ });
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
- onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
+ onView(withText(PerfectFitTestAdapter.getItemText(0))).check(matches(isDisplayed()));
- assertEquals(totalSpace, carUiRecyclerView.getTotalSpace());
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ // Recalculate total space
+ int totalSpace = carUiRecyclerView.getHeight()
+ - carUiRecyclerView.getPaddingTop()
+ - carUiRecyclerView.getPaddingBottom();
+ assertEquals(totalSpace, carUiRecyclerView.getTotalSpace());
+ });
// Move down one page so there will be sufficient pages for up and downs.
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
- int topPosition = carUiRecyclerView.findFirstVisibleItemPosition();
for (int i = 0; i < 3; i++) {
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
}
- assertEquals(carUiRecyclerView.findFirstVisibleItemPosition(), topPosition);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ int topPosition = carUiRecyclerView.findFirstVisibleItemPosition();
+ assertEquals(carUiRecyclerView.findFirstVisibleItemPosition(), topPosition);
+ });
}
@Test
public void testContinuousScroll() {
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
TestAdapter adapter = new TestAdapter(50);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ carUiRecyclerView.setAdapter(adapter);
+
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ });
+
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
// Press and hold the down button for 2 seconds to scroll the list to bottom.
@@ -621,49 +717,69 @@
onView(isRoot()).perform(waitForView(withText("Sample item #49"), 3000));
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(release());
- assertEquals(carUiRecyclerView.findLastCompletelyVisibleItemPosition(), 49);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ assertEquals(carUiRecyclerView.findLastCompletelyVisibleItemPosition(), 49);
+ });
}
@Test
public void testAlphaJumpToMiddleForThumbWhenTrackClicked() {
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
TestAdapter adapter = new TestAdapter(50);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ carUiRecyclerView.setAdapter(adapter);
+
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ });
+
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- View trackView = mActivity.requireViewById(getId("car_ui_scrollbar_track"));
+ AtomicInteger trackViewHeight = new AtomicInteger();
+ mActivityRule.getScenario().onActivity(activity -> {
+ View trackView = activity.requireViewById(getId("car_ui_scrollbar_track"));
+ trackViewHeight.set(trackView.getHeight());
+ });
+
// scroll to the middle
onView(withId(getId("car_ui_scrollbar_track"))).perform(
- touchDownAndUp(0f, (trackView.getHeight() / 2f)));
+ touchDownAndUp(0f, (trackViewHeight.get() / 2f)));
onView(withText(adapter.getItemText(25))).check(matches(isDisplayed()));
}
@Test
public void testAlphaJumpToEndAndStartForThumbWhenTrackClicked() {
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
TestAdapter adapter = new TestAdapter(50);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ carUiRecyclerView.setAdapter(adapter);
+
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ });
+
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- View trackView = mActivity.requireViewById(getId("car_ui_scrollbar_track"));
- View thumbView = mActivity.requireViewById(getId("car_ui_scrollbar_thumb"));
+ AtomicInteger trackViewHeight = new AtomicInteger();
+ mActivityRule.getScenario().onActivity(activity -> {
+ View trackView = activity.requireViewById(getId("car_ui_scrollbar_track"));
+ trackViewHeight.set(trackView.getHeight());
+ });
+
// scroll to the end
onView(withId(getId("car_ui_scrollbar_track"))).perform(
- touchDownAndUp(0f, trackView.getHeight() - 1));
+ touchDownAndUp(0f, trackViewHeight.get() - 1));
onView(withText(adapter.getItemText(49))).check(matches(isDisplayed()));
// scroll to the start
@@ -674,45 +790,56 @@
@Test
public void testThumbDragToCenter() {
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
TestAdapter adapter = new TestAdapter(50);
- mActivity.runOnUiThread(() -> {
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
carUiRecyclerView.setAdapter(adapter);
+
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
});
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- View trackView = mActivity.requireViewById(getId("car_ui_scrollbar_track"));
- View thumbView = mActivity.requireViewById(getId("car_ui_scrollbar_thumb"));
+ AtomicInteger trackViewHeight = new AtomicInteger();
+ AtomicInteger thumbViewHeight = new AtomicInteger();
+ mActivityRule.getScenario().onActivity(activity -> {
+ View trackView = activity.requireViewById(getId("car_ui_scrollbar_track"));
+ View thumbView = activity.requireViewById(getId("car_ui_scrollbar_thumb"));
+
+ trackViewHeight.set(trackView.getHeight());
+ thumbViewHeight.set(thumbView.getHeight());
+ });
+
// if you drag too far in a single step you'll stop selecting the thumb view. Hence, drag
// 5 units at a time for 200 intervals and stop at the center of the track by limitY.
-
onView(withId(getId("car_ui_scrollbar_track"))).perform(
- performDrag(0f, (thumbView.getHeight() / 2f), 0,
+ performDrag(0f, (thumbViewHeight.get() / 2f), 0,
5, 200, Float.MAX_VALUE,
- trackView.getHeight() / 2f));
+ trackViewHeight.get() / 2f));
onView(withText(adapter.getItemText(25))).check(matches(isDisplayed()));
}
@Test
public void testPageUpButtonDisabledAtTop() {
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
- // 50, because needs to be big enough to make sure content is scrollable.
TestAdapter adapter = new TestAdapter(50);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ carUiRecyclerView.setAdapter(adapter);
+
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ });
// Initially page_up button is disabled.
onView(withId(getId("car_ui_scrollbar_page_up"))).check(matches(not(isEnabled())));
@@ -731,15 +858,17 @@
public void testPageUpScrollsWithoutSnap() {
CarUiRecyclerView.OnScrollListener scrollListener =
mock(CarUiRecyclerView.OnScrollListener.class);
+ int listId = View.generateViewId();
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
- container.post(() -> {
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(new TestAdapter(100));
- });
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ });
// Scroll down a few pages so that you can perform page up operations.
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
@@ -747,22 +876,35 @@
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
- // Set a mocked scroll listener on the CarUiRecyclerView
- carUiRecyclerView.addOnScrollListener(scrollListener);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ // Set a mocked scroll listener on the CarUiRecyclerView
+ carUiRecyclerView.addOnScrollListener(scrollListener);
+ });
onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
+ ArgumentCaptor<CarUiRecyclerView> captor = ArgumentCaptor.forClass(CarUiRecyclerView.class);
+
// Verify that scroll operation only settles on the destination once. This means a single
// smooth scroll to the destination. If the scroll includes a secondary snap after an
// initial scroll, this callback will have more than one invocation.
- verify(scrollListener, times(1)).onScrollStateChanged(
- carUiRecyclerView, SCROLL_STATE_SETTLING);
+ verify(scrollListener, times(1)).onScrollStateChanged(captor.capture(),
+ eq(SCROLL_STATE_SETTLING));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertEquals(carUiRecyclerView, captor.getValue());
+ });
onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
// Make same verification as above for a second page up operation.
verify(scrollListener, times(2)).onScrollStateChanged(
- carUiRecyclerView, SCROLL_STATE_SETTLING);
+ captor.capture(), eq(SCROLL_STATE_SETTLING));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertEquals(carUiRecyclerView, captor.getValue());
+ });
}
@Test
@@ -770,39 +912,45 @@
CarUiRecyclerView.OnScrollListener scrollListener =
mock(CarUiRecyclerView.OnScrollListener.class);
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
- container.post(() -> {
+ int listId = View.generateViewId();
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(new TestAdapter(100));
+
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+
+ // Set a mocked scroll listener on the CarUiRecyclerView
+ carUiRecyclerView.addOnScrollListener(scrollListener);
});
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
-
- // Set a mocked scroll listener on the CarUiRecyclerView
- carUiRecyclerView.addOnScrollListener(scrollListener);
-
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
// Verify that scroll operation only settles on the destination once. This means a single
// smooth scroll to the destination. If the scroll includes a secondary snap after an
// initial scroll, this callback will have more than one invocation.
+ ArgumentCaptor<CarUiRecyclerView> captor = ArgumentCaptor.forClass(CarUiRecyclerView.class);
verify(scrollListener, times(1)).onScrollStateChanged(
- carUiRecyclerView, SCROLL_STATE_SETTLING);
+ captor.capture(), eq(SCROLL_STATE_SETTLING));
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
// Make same verification as above for a second page down operation.
verify(scrollListener, times(2)).onScrollStateChanged(
- carUiRecyclerView, SCROLL_STATE_SETTLING);
+ captor.capture(), eq(SCROLL_STATE_SETTLING));
}
@Test
public void testPageDownScrollsOverLongItem() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
@@ -814,63 +962,83 @@
heightOverrides.put(longItemPosition, TestAdapter.ItemHeight.TALL);
TestAdapter adapter = new TestAdapter(itemCount, heightOverrides);
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ carUiRecyclerView.setAdapter(adapter);
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ });
+
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- OrientationHelper orientationHelper =
- OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
- int screenHeight = carUiRecyclerView.getTotalSpace();
-
// Scroll to a position where long item is partially visible.
// Scrolling from top, scrollToPosition() aligns the pos-1 item to bottom.
onView(withId(R.id.list)).perform(scrollToPosition(longItemPosition - 1));
// This is needed to make sure scroll is finished before looking for the long item.
onView(withText(adapter.getItemText(longItemPosition - 1))).check(matches(isDisplayed()));
- // Scroll by half the height of the screen so the long item is partially visible.
- mActivity.runOnUiThread(() -> carUiRecyclerView.scrollBy(0, screenHeight / 2));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ int screenHeight = carUiRecyclerView.getTotalSpace();
+
+ // Scroll by half the height of the screen so the long item is partially visible.
+ carUiRecyclerView.scrollBy(0, screenHeight / 2);
+ });
+
onView(withText(adapter.getItemText(longItemPosition))).check(matches(isDisplayed()));
- // Verify long item is partially shown.
- View longItem = getLongItem(carUiRecyclerView);
- assertThat(
- orientationHelper.getDecoratedStart(longItem),
- is(greaterThan(orientationHelper.getStartAfterPadding())));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ OrientationHelper orientationHelper =
+ OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+ // Verify long item is partially shown.
+ View longItem = getLongItem(carUiRecyclerView);
+ assertThat(
+ orientationHelper.getDecoratedStart(longItem),
+ is(greaterThan(carUiRecyclerView.getStartAfterPadding())));
+ });
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
- // Verify long item is snapped to top.
- assertThat(orientationHelper.getDecoratedStart(longItem),
- is(equalTo(orientationHelper.getStartAfterPadding())));
- assertThat(orientationHelper.getDecoratedEnd(longItem),
- is(greaterThan(orientationHelper.getEndAfterPadding())));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ OrientationHelper orientationHelper =
+ OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+ // Verify long item is snapped to top.
+ View longItem = getLongItem(carUiRecyclerView);
+ assertThat(orientationHelper.getDecoratedStart(longItem),
+ is(equalTo(carUiRecyclerView.getStartAfterPadding())));
+ assertThat(orientationHelper.getDecoratedEnd(longItem),
+ is(greaterThan(carUiRecyclerView.getEndAfterPadding())));
+ });
- // Set a limit to avoid test stuck in non-moving state.
- while (orientationHelper.getDecoratedEnd(longItem)
- > orientationHelper.getEndAfterPadding()) {
- onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
- }
+ onView(withText(adapter.getItemText(longItemPosition))).check(matches(isDisplayed()));
+ onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
- // Verify long item end is aligned to bottom.
- assertThat(orientationHelper.getDecoratedEnd(longItem),
- is(equalTo(orientationHelper.getEndAfterPadding())));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ OrientationHelper orientationHelper =
+ OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+ View longItem = getLongItem(carUiRecyclerView);
+ // Verify long item end is aligned to bottom.
+ assertThat(orientationHelper.getDecoratedEnd(longItem),
+ is(equalTo(carUiRecyclerView.getEndAfterPadding())));
+ });
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
// Verify that the long item is no longer visible; Should be on the next child
- assertThat(
- orientationHelper.getDecoratedStart(longItem),
- is(lessThan(orientationHelper.getStartAfterPadding())));
+ onView(hasDescendant(withText(adapter.getItemText(longItemPosition)))).check(
+ doesNotExistOrIsNotDisplayed());
}
@Test
public void testPageDownScrollsOverLongItemAtTheEnd() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
@@ -882,22 +1050,20 @@
heightOverrides.put(longItemPosition, TestAdapter.ItemHeight.TALL);
TestAdapter adapter = new TestAdapter(itemCount, heightOverrides);
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
- mActivity.runOnUiThread(() -> {
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
// Setting top padding to any number greater than 0.
// Not having padding will make this test pass all the time.
// Also adding bottom padding to make sure the padding
// after the last content is considered in calculations.
carUiRecyclerView.setPadding(0, 1, 0, 1);
carUiRecyclerView.setAdapter(adapter);
+
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
});
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- OrientationHelper orientationHelper =
- OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
-
// 20 is just an arbitrary number to make sure we reach the end of the recyclerview.
for (int i = 0; i < 20; i++) {
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
@@ -905,19 +1071,26 @@
onView(withId(getId("car_ui_scrollbar_page_down"))).check(matches(not(isEnabled())));
- View longItem = getLongItem(carUiRecyclerView);
- // Making sure we've reached end of the recyclerview, after
- // adding bottom padding
- assertThat(orientationHelper.getDecoratedEnd(longItem),
- is(equalTo(orientationHelper.getEndAfterPadding())));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ OrientationHelper orientationHelper =
+ OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+ View longItem = getLongItem(carUiRecyclerView);
+ // Making sure we've reached end of the recyclerview, after
+ // adding bottom padding
+ assertThat(orientationHelper.getDecoratedEnd(longItem),
+ is(equalTo(carUiRecyclerView.getEndAfterPadding())));
+ });
}
@Test
public void testPageUpScrollsOverLongItem() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
@@ -929,48 +1102,74 @@
heightOverrides.put(longItemPosition, TestAdapter.ItemHeight.TALL);
TestAdapter adapter = new TestAdapter(itemCount, heightOverrides);
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ carUiRecyclerView.setAdapter(adapter);
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ });
+
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- OrientationHelper orientationHelper =
- OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
-
// Scroll to a position just below the long item.
onView(withId(R.id.list)).perform(scrollToPosition(longItemPosition + 1));
onView(withText(adapter.getItemText(longItemPosition + 1))).check(matches(isDisplayed()));
- // Verify long item is off-screen.
- View longItem = getLongItem(carUiRecyclerView);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ OrientationHelper orientationHelper =
+ OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+ // Verify long item is off-screen.
+ View longItem = getLongItem(carUiRecyclerView);
+ assertThat(
+ orientationHelper.getDecoratedEnd(longItem),
+ is(lessThanOrEqualTo(carUiRecyclerView.getEndAfterPadding())));
+ });
- assertThat(
- orientationHelper.getDecoratedEnd(longItem),
- is(lessThanOrEqualTo(orientationHelper.getEndAfterPadding())));
+ final AtomicBoolean check = new AtomicBoolean();
+ final AtomicInteger topBeforeClick = new AtomicInteger();
- if (orientationHelper.getStartAfterPadding() - orientationHelper.getDecoratedStart(longItem)
- < orientationHelper.getTotalSpace()) {
- onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
- assertThat(orientationHelper.getDecoratedStart(longItem),
- is(greaterThanOrEqualTo(orientationHelper.getStartAfterPadding())));
- } else {
- int topBeforeClick = orientationHelper.getDecoratedStart(longItem);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ OrientationHelper orientationHelper =
+ OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+ View longItem = getLongItem(carUiRecyclerView);
+ if (carUiRecyclerView.getStartAfterPadding() - orientationHelper.getDecoratedStart(
+ longItem)
+ < carUiRecyclerView.getTotalSpace()) {
+ check.set(true);
+ } else {
+ topBeforeClick.set(orientationHelper.getDecoratedStart(longItem));
+ }
+ });
- onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
+ onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
- // Verify we scrolled 1 screen
- assertThat(orientationHelper.getStartAfterPadding() - topBeforeClick,
- is(equalTo(orientationHelper.getTotalSpace())));
- }
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ View longItem = getLongItem(carUiRecyclerView);
+ if (check.get()) {
+ OrientationHelper orientationHelper =
+ OrientationHelper.createVerticalHelper(
+ carUiRecyclerView.getLayoutManager());
+ assertThat(orientationHelper.getDecoratedStart(longItem),
+ is(greaterThanOrEqualTo(carUiRecyclerView.getStartAfterPadding())));
+ } else {
+ // Verify we scrolled 1 screen
+ assertThat(carUiRecyclerView.getStartAfterPadding() - topBeforeClick.get(),
+ is(equalTo(carUiRecyclerView.getTotalSpace())));
+ }
+ });
}
@Test
public void testPageDownScrollsOverVeryLongItem() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
@@ -982,15 +1181,15 @@
heightOverrides.put(longItemPosition, TestAdapter.ItemHeight.EXTRA_TALL);
TestAdapter adapter = new TestAdapter(itemCount, heightOverrides);
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ carUiRecyclerView.setAdapter(adapter);
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ });
+
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- OrientationHelper orientationHelper =
- OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
-
int screenHeight = Resources.getSystem().getDisplayMetrics().heightPixels;
// Scroll to a position where long item is partially visible.
// Scrolling from top, scrollToPosition() aligns the pos-1 item to bottom.
@@ -999,38 +1198,60 @@
onView(withText(adapter.getItemText(longItemPosition - 1)))
.check(matches(isDisplayed()));
- // Scroll by half the height of the screen so the long item is partially visible.
- mActivity.runOnUiThread(() -> carUiRecyclerView.scrollBy(0, screenHeight / 2));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ // Scroll by half the height of the screen so the long item is partially visible.
+ carUiRecyclerView.scrollBy(0, screenHeight / 2);
+ });
onView(withText(adapter.getItemText(longItemPosition))).check(matches(isDisplayed()));
- // Verify long item is partially shown.
- View longItem = getLongItem(carUiRecyclerView);
- assertThat(
- orientationHelper.getDecoratedStart(longItem),
- is(greaterThan(orientationHelper.getStartAfterPadding())));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ OrientationHelper orientationHelper =
+ OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+ // Verify long item is partially shown.
+ View longItem = getLongItem(carUiRecyclerView);
+ assertThat(
+ orientationHelper.getDecoratedStart(longItem),
+ is(greaterThan(carUiRecyclerView.getStartAfterPadding())));
+ });
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
- // Verify long item is snapped to top.
- assertThat(orientationHelper.getDecoratedStart(longItem),
- is(equalTo(orientationHelper.getStartAfterPadding())));
- assertThat(orientationHelper.getDecoratedEnd(longItem),
- is(greaterThan(orientationHelper.getEndAfterPadding())));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ View longItem = getLongItem(carUiRecyclerView);
+ OrientationHelper orientationHelper =
+ OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+ // Verify long item is snapped to top.
+ assertThat(orientationHelper.getDecoratedStart(longItem),
+ is(equalTo(carUiRecyclerView.getStartAfterPadding())));
+ assertThat(orientationHelper.getDecoratedEnd(longItem),
+ is(greaterThan(carUiRecyclerView.getEndAfterPadding())));
+ });
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
- // Verify long item does not snap to bottom.
- assertThat(orientationHelper.getDecoratedEnd(longItem),
- not(equalTo(orientationHelper.getEndAfterPadding())));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ OrientationHelper orientationHelper =
+ OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+ View longItem = getLongItem(carUiRecyclerView);
+ // Verify long item does not snap to bottom.
+ assertThat(orientationHelper.getDecoratedEnd(longItem),
+ not(equalTo(carUiRecyclerView.getEndAfterPadding())));
+ });
}
@Test
public void testPageDownScrollsOverVeryLongItemAtTheEnd() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
@@ -1042,22 +1263,20 @@
heightOverrides.put(longItemPosition, TestAdapter.ItemHeight.EXTRA_TALL);
TestAdapter adapter = new TestAdapter(itemCount, heightOverrides);
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
- mActivity.runOnUiThread(() -> {
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
// Setting top padding to any number greater than 0.
// Not having padding will make this test pass all the time.
// Also adding bottom padding to make sure the padding
// after the last content is considered in calculations.
carUiRecyclerView.setPadding(0, 1, 0, 1);
carUiRecyclerView.setAdapter(adapter);
+
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
});
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- OrientationHelper orientationHelper =
- OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
-
// 20 is just an arbitrary number to make sure we reach the end of the recyclerview.
for (int i = 0; i < 20; i++) {
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
@@ -1065,283 +1284,362 @@
onView(withId(getId("car_ui_scrollbar_page_down"))).check(matches(not(isEnabled())));
- View longItem = getLongItem(carUiRecyclerView);
- // Making sure we've reached end of the recyclerview, after
- // adding bottom padding
- assertThat(orientationHelper.getDecoratedEnd(longItem),
- is(equalTo(orientationHelper.getEndAfterPadding())));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ OrientationHelper orientationHelper =
+ OrientationHelper.createVerticalHelper(carUiRecyclerView.getLayoutManager());
+ View longItem = getLongItem(carUiRecyclerView);
+ // Making sure we've reached end of the recyclerview, after
+ // adding bottom padding
+ assertThat(orientationHelper.getDecoratedEnd(longItem),
+ is(equalTo(carUiRecyclerView.getEndAfterPadding())));
+ });
}
@Test
public void testPageDownMaintainsMinimumScrollThumbTrackHeight() {
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
int itemCount = 2500;
TestAdapter adapter = new TestAdapter(itemCount);
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
- mActivity.runOnUiThread(() -> carUiRecyclerView.requestLayout());
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ carUiRecyclerView.setAdapter(adapter);
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ carUiRecyclerView.requestLayout();
+ });
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
- // Check that thumb track maintains minimum height
- int minThumbViewHeight = (int) mActivity.getResources()
- .getDimension(R.dimen.car_ui_scrollbar_min_thumb_height);
- View thumbView = mActivity.requireViewById(getId("car_ui_scrollbar_thumb"));
- // Conversion from DP to pixel sometimes makes these two value differ by 1
- assertThat(abs(thumbView.getHeight() - minThumbViewHeight), is(lessThanOrEqualTo(1)));
+ mActivityRule.getScenario().onActivity(activity -> {
+ // Check that thumb track maintains minimum height
+ int minThumbViewHeight = (int) activity.getResources()
+ .getDimension(R.dimen.car_ui_scrollbar_min_thumb_height);
+ View thumbView = activity.requireViewById(getId("car_ui_scrollbar_thumb"));
+ // Conversion from DP to pixel sometimes makes these two value differ by 1
+ assertThat(abs(thumbView.getHeight() - minThumbViewHeight), is(lessThanOrEqualTo(1)));
+ });
}
@Test
public void testRecyclerView_canScrollVertically() {
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ // Can't use OrientationHelper here, because it returns 0 when calling getTotalSpace
+ // methods until LayoutManager's onLayoutComplete is called. In this case waiting until
+ // the first item of the list is displayed guarantees that OrientationHelper is
+ // initialized properly.
+ int totalSpace = carUiRecyclerView.getHeight()
+ - carUiRecyclerView.getPaddingTop()
+ - carUiRecyclerView.getPaddingBottom();
+ PerfectFitTestAdapter adapter = new PerfectFitTestAdapter(1, totalSpace);
+ carUiRecyclerView.setAdapter(adapter);
- // Can't use OrientationHelper here, because it returns 0 when calling getTotalSpace methods
- // until LayoutManager's onLayoutComplete is called. In this case waiting until the first
- // item of the list is displayed guarantees that OrientationHelper is initialized properly.
- int totalSpace = carUiRecyclerView.getHeight()
- - carUiRecyclerView.getPaddingTop()
- - carUiRecyclerView.getPaddingBottom();
- PerfectFitTestAdapter adapter = new PerfectFitTestAdapter(1, totalSpace);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ });
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
- onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
+ onView(withText(PerfectFitTestAdapter.getItemText(0))).check(matches(isDisplayed()));
- assertEquals(totalSpace, carUiRecyclerView.getTotalSpace());
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(R.id.list);
+ int totalSpace = carUiRecyclerView.getHeight()
+ - carUiRecyclerView.getPaddingTop()
+ - carUiRecyclerView.getPaddingBottom();
- // Both scroll up and down are disabled
- assertFalse(carUiRecyclerView.getView().canScrollVertically(1));
- assertFalse(carUiRecyclerView.getView().canScrollVertically(-1));
+ assertEquals(totalSpace, carUiRecyclerView.getTotalSpace());
+
+ // Both scroll up and down are disabled
+ assertFalse(carUiRecyclerView.getView().canScrollVertically(1));
+ assertFalse(carUiRecyclerView.getView().canScrollVertically(-1));
+ });
}
@Test
public void testSetPaddingToRecyclerViewContainerWithScrollbar() {
- if (isScrollbarEnabledNotAsExpected(true)) return;
-
TestAdapter adapter = new TestAdapter(50);
+ int listId = View.generateViewId();
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
- mActivity.runOnUiThread(() -> {
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
});
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
onView(withId(getId("car_ui_scroll_bar"))).check(matches(isDisplayed()));
- assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
- assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(0)));
- assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(0)));
- // available space in recyclerview after applying paddings.
- int screenHeight = carUiRecyclerView.getTotalSpace();
- assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
+ assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(0)));
+ assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(0)));
+ // available space in recyclerview after applying paddings.
+ int screenHeight = carUiRecyclerView.getTotalSpace();
+ assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
- View scrollbar = mActivity.findViewById(getId("car_ui_scroll_bar"));
- assertThat(scrollbar.getPaddingTop(), is(equalTo(0)));
- assertThat(scrollbar.getPaddingLeft(), is(equalTo(0)));
- assertThat(scrollbar.getPaddingRight(), is(equalTo(0)));
- assertThat(scrollbar.getPaddingBottom(), is(equalTo(0)));
+ View scrollbar = activity.findViewById(getId("car_ui_scroll_bar"));
+ assertThat(scrollbar.getPaddingTop(), is(equalTo(0)));
+ assertThat(scrollbar.getPaddingLeft(), is(equalTo(0)));
+ assertThat(scrollbar.getPaddingRight(), is(equalTo(0)));
+ assertThat(scrollbar.getPaddingBottom(), is(equalTo(0)));
- mActivity.runOnUiThread(() -> carUiRecyclerView.setPadding(20, 150, 30, 170));
+ carUiRecyclerView.setPadding(20, 150, 30, 170);
+ });
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(20)));
- assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(30)));
- assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
- // available space in recyclerview after applying paddings.
- screenHeight = carUiRecyclerView.getTotalSpace();
- assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(20)));
+ assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(30)));
+ assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
- assertThat(scrollbar.getPaddingTop(), is(equalTo(150)));
- assertThat(scrollbar.getPaddingLeft(), is(equalTo(0)));
- assertThat(scrollbar.getPaddingRight(), is(equalTo(0)));
- assertThat(scrollbar.getPaddingBottom(), is(equalTo(170)));
+ // available space in recyclerview after applying paddings.
+ int screenHeight = carUiRecyclerView.getTotalSpace();
+ assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
+
+ View scrollbar = activity.findViewById(getId("car_ui_scroll_bar"));
+ assertThat(scrollbar.getPaddingTop(), is(equalTo(150)));
+ assertThat(scrollbar.getPaddingLeft(), is(equalTo(0)));
+ assertThat(scrollbar.getPaddingRight(), is(equalTo(0)));
+ assertThat(scrollbar.getPaddingBottom(), is(equalTo(170)));
+ });
}
@Test
public void testSetPaddingToRecyclerViewContainerWithoutScrollbar() {
- if (isScrollbarEnabledNotAsExpected(false)) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
TestAdapter adapter = new TestAdapter(5);
+ int listId = View.generateViewId();
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
- mActivity.runOnUiThread(() -> {
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ // Disable scrollbar
+ doReturn(false).when(testableResources)
+ .getBoolean(R.bool.car_ui_scrollbar_enable);
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
});
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
onView(withId(getId("car_ui_scroll_bar"))).check(doesNotExist());
- assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
- assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(0)));
- assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(0)));
- // available space in recyclerview after applying paddings.
- int screenHeight = carUiRecyclerView.getTotalSpace();
- assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
+ assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(0)));
+ assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(0)));
+ // available space in recyclerview after applying paddings.
+ int screenHeight = carUiRecyclerView.getTotalSpace();
+ assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
- mActivity.runOnUiThread(() -> carUiRecyclerView.setPadding(20, 150, 30, 170));
+ carUiRecyclerView.setPadding(20, 150, 30, 170);
+ });
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(20)));
- assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(30)));
- assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
- // available space in recyclerview after applying paddings.
- screenHeight = carUiRecyclerView.getTotalSpace();
- assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertThat(carUiRecyclerView.getView().getPaddingLeft(), is(equalTo(20)));
+ assertThat(carUiRecyclerView.getView().getPaddingRight(), is(equalTo(30)));
+ assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
+ // available space in recyclerview after applying paddings.
+ int screenHeight = carUiRecyclerView.getTotalSpace();
+ assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
+ });
}
@Test
public void testSetPaddingRelativeToRecyclerViewContainerWithScrollbar() {
- if (isScrollbarEnabledNotAsExpected(true)) return;
-
TestAdapter adapter = new TestAdapter(50);
+ int listId = View.generateViewId();
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
- mActivity.runOnUiThread(() -> {
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
});
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
onView(withId(getId("car_ui_scroll_bar"))).check(matches(isDisplayed()));
- assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
- assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(0)));
- assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(0)));
- // available space in recyclerview after applying paddings.
- int screenHeight = carUiRecyclerView.getTotalSpace();
- assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
+ assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(0)));
+ assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(0)));
+ // available space in recyclerview after applying paddings.
+ int screenHeight = carUiRecyclerView.getTotalSpace();
+ assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
- View scrollbar = mActivity.findViewById(getId("car_ui_scroll_bar"));
- assertThat(scrollbar.getPaddingTop(), is(equalTo(0)));
- assertThat(scrollbar.getPaddingStart(), is(equalTo(0)));
- assertThat(scrollbar.getPaddingEnd(), is(equalTo(0)));
- assertThat(scrollbar.getPaddingBottom(), is(equalTo(0)));
+ View scrollbar = activity.findViewById(getId("car_ui_scroll_bar"));
+ assertThat(scrollbar.getPaddingTop(), is(equalTo(0)));
+ assertThat(scrollbar.getPaddingStart(), is(equalTo(0)));
+ assertThat(scrollbar.getPaddingEnd(), is(equalTo(0)));
+ assertThat(scrollbar.getPaddingBottom(), is(equalTo(0)));
- mActivity.runOnUiThread(() -> {
carUiRecyclerView.setPaddingRelative(20, 150, 30, 170);
});
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(20)));
- assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(30)));
- assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
- // available space in recyclerview after applying paddings.
- screenHeight = carUiRecyclerView.getTotalSpace();
- assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(20)));
+ assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(30)));
+ assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
+ // available space in recyclerview after applying paddings.
+ int screenHeight = carUiRecyclerView.getTotalSpace();
+ assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
- assertThat(scrollbar.getPaddingTop(), is(equalTo(150)));
- assertThat(scrollbar.getPaddingStart(), is(equalTo(0)));
- assertThat(scrollbar.getPaddingEnd(), is(equalTo(0)));
- assertThat(scrollbar.getPaddingBottom(), is(equalTo(170)));
+ View scrollbar = activity.findViewById(getId("car_ui_scroll_bar"));
+ assertThat(scrollbar.getPaddingTop(), is(equalTo(150)));
+ assertThat(scrollbar.getPaddingStart(), is(equalTo(0)));
+ assertThat(scrollbar.getPaddingEnd(), is(equalTo(0)));
+ assertThat(scrollbar.getPaddingBottom(), is(equalTo(170)));
+ });
}
@Test
public void testSetPaddingRelativeToRecyclerViewContainerWithoutScrollbar() {
- if (isScrollbarEnabledNotAsExpected(false)) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
TestAdapter adapter = new TestAdapter(5);
+ int listId = View.generateViewId();
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
- mActivity.runOnUiThread(() -> {
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ // Disable scrollbar
+ doReturn(false).when(testableResources)
+ .getBoolean(R.bool.car_ui_scrollbar_enable);
+
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
});
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
onView(withId(getId("car_ui_scroll_bar"))).check(doesNotExist());
- assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
- assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(0)));
- assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(0)));
- // available space in recyclerview after applying paddings.
- int screenHeight = carUiRecyclerView.getTotalSpace();
- assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(0)));
+ assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(0)));
+ assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(0)));
+ // available space in recyclerview after applying paddings.
+ int screenHeight = carUiRecyclerView.getTotalSpace();
+ assertThat(carUiRecyclerView.getHeight(), is(equalTo(screenHeight)));
- mActivity.runOnUiThread(() -> carUiRecyclerView.setPaddingRelative(20, 150, 30, 170));
+ carUiRecyclerView.setPaddingRelative(20, 150, 30, 170);
+ });
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(20)));
- assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(30)));
- assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
- // available space in recyclerview after applying paddings.
- screenHeight = carUiRecyclerView.getTotalSpace();
- assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertThat(carUiRecyclerView.getView().getPaddingStart(), is(equalTo(20)));
+ assertThat(carUiRecyclerView.getView().getPaddingEnd(), is(equalTo(30)));
+ assertThat(carUiRecyclerView.getStartAfterPadding(), is(equalTo(150)));
+ // available space in recyclerview after applying paddings.
+ int screenHeight = carUiRecyclerView.getTotalSpace();
+ assertThat(carUiRecyclerView.getHeight() - 150 - 170, is(equalTo(screenHeight)));
+ });
}
@Test
public void testSetAlphaToRecyclerView() {
- if (isScrollbarEnabledNotAsExpected(false)) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
-
- assertThat(carUiRecyclerView.getView().getAlpha(), is(equalTo(1.0f)));
-
- carUiRecyclerView.setAlpha(0.5f);
-
- assertThat(carUiRecyclerView.getView().getAlpha(), is(equalTo(0.5f)));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+ assertThat(carUiRecyclerView.getView().getAlpha(), is(equalTo(1.0f)));
+ carUiRecyclerView.setAlpha(0.5f);
+ assertThat(carUiRecyclerView.getView().getAlpha(), is(equalTo(0.5f)));
+ });
}
@Test
public void testScrollbarVisibility_tooSmallHeight() {
-
- if (isScrollbarEnabledNotAsExpected(true)) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
// Set to anything less than 2 * (minTouchSize + margin)
// minTouchSize = R.dimen.car_ui_touch_target_size
// margin is button up top margin or button down bottom margin
int recyclerviewHeight = 1;
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
- container.post(() -> {
+ int listId = View.generateViewId();
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+ ViewGroup container = activity.findViewById(R.id.test_container);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(-1, recyclerviewHeight);
container.addView(carUiRecyclerView.getView(), lp);
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(new TestAdapter(100));
});
onView(withId(getId("car_ui_scroll_bar"))).check(matches(not(isDisplayed())));
- assertEquals(recyclerviewHeight, carUiRecyclerView.getTotalSpace());
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertEquals(recyclerviewHeight, carUiRecyclerView.getTotalSpace());
+ });
}
@Test
public void testScrollbarVisibility_justEnoughToShowOnlyButtons() {
- if (isScrollbarEnabledNotAsExpected(true)) return;
+ Context context = getInstrumentation().getTargetContext();
+ int listId = View.generateViewId();
// R.dimen.car_ui_touch_target_size
- float minTouchSize = mTestableResources.getDimension(R.dimen.car_ui_touch_target_size);
+ float minTouchSize = context.getResources().getDimension(R.dimen.car_ui_touch_target_size);
// This value is hardcoded to 15dp in the layout.
- int margin = (int) dpToPixel(mTestableContext, 15)
- + (int) mTestableResources.getDimension(R.dimen.car_ui_scrollbar_separator_margin);
+ int margin = (int) dpToPixel(context, 15)
+ + (int) context.getResources().getDimension(
+ R.dimen.car_ui_scrollbar_separator_margin);
// Set to 2 * (minTouchSize + margin)
int recyclerviewHeight = 2 * (int) (minTouchSize + margin);
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
- container.post(() -> {
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+ ViewGroup container = activity.findViewById(R.id.test_container);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(-1, recyclerviewHeight);
container.addView(carUiRecyclerView.getView(), lp);
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(new TestAdapter(100));
});
@@ -1351,22 +1649,27 @@
onView(withId(getId("car_ui_scrollbar_page_down"))).check(matches(isDisplayed()));
onView(withId(getId("car_ui_scrollbar_page_up"))).check(matches(isDisplayed()));
- int screenHeight = carUiRecyclerView.getTotalSpace();
-
- assertEquals(recyclerviewHeight, screenHeight);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ int screenHeight = carUiRecyclerView.getTotalSpace();
+ assertEquals(recyclerviewHeight, screenHeight);
+ });
}
@Test
public void testScrollbarVisibility_enoughToShowEverything() {
- if (isScrollbarEnabledNotAsExpected(true)) return;
+ Context context = getInstrumentation().getTargetContext();
+ int listId = View.generateViewId();
- int minTouchSize = (int) mTestableResources.getDimension(R.dimen.car_ui_touch_target_size);
- int mScrollbarThumbMinHeight = (int) mTestableResources
+ int minTouchSize = (int) context.getResources().getDimension(
+ R.dimen.car_ui_touch_target_size);
+ int mScrollbarThumbMinHeight = (int) context.getResources()
.getDimension(R.dimen.car_ui_scrollbar_min_thumb_height);
// This value is hardcoded to 15dp in the layout.
- int margin = (int) dpToPixel(mTestableContext, 15)
- + (int) mTestableResources.getDimension(R.dimen.car_ui_scrollbar_separator_margin);
- int trackMargin = 2 * (int) mTestableResources
+ int margin = (int) dpToPixel(context, 15)
+ + (int) context.getResources().getDimension(
+ R.dimen.car_ui_scrollbar_separator_margin);
+ int trackMargin = 2 * (int) context.getResources()
.getDimension(R.dimen.car_ui_scrollbar_separator_margin);
// Set to anything greater or equal to
// 2 * minTouchSize + max(minTouchSize, mScrollbarThumbMinHeight) + 2 * margin
@@ -1375,11 +1678,12 @@
+ max(minTouchSize, mScrollbarThumbMinHeight)
+ 2 * margin + trackMargin;
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
- container.post(() -> {
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+ ViewGroup container = activity.findViewById(R.id.test_container);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(-1, recyclerviewHeight);
container.addView(carUiRecyclerView.getView(), lp);
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(new TestAdapter(100));
});
@@ -1389,18 +1693,32 @@
onView(withId(getId("car_ui_scrollbar_page_down"))).check(matches(isDisplayed()));
onView(withId(getId("car_ui_scrollbar_page_up"))).check(matches(isDisplayed()));
- assertEquals(recyclerviewHeight, carUiRecyclerView.getTotalSpace());
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertEquals(recyclerviewHeight, carUiRecyclerView.getTotalSpace());
+ });
}
@Test
public void testDefaultSize_noScrollbar() {
- if (isScrollbarEnabledNotAsExpected(false)) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
- int listId = View.generateViewId();
TestAdapter adapter = new TestAdapter(50);
- container.post(() -> {
+ int listId = View.generateViewId();
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ // Disable scrollbar
+ doReturn(false).when(testableResources)
+ .getBoolean(R.bool.car_ui_scrollbar_enable);
+
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
@@ -1413,24 +1731,26 @@
@Test
public void testLargeSize_withScrollbar() {
- if (isScrollbarEnabledNotAsExpected(true)) return;
-
- TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
- null, R.styleable.CarUiRecyclerView));
-
- doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
- any(),
- eq(R.styleable.CarUiRecyclerView),
- anyInt(),
- anyInt());
- when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
- anyInt())).thenReturn(2); // Large size
-
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- int listId = View.generateViewId();
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(50);
- container.post(() -> {
+ int listId = View.generateViewId();
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+ null, R.styleable.CarUiRecyclerView));
+
+ doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+ any(),
+ eq(R.styleable.CarUiRecyclerView),
+ anyInt(),
+ anyInt());
+ when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
+ anyInt())).thenReturn(2); // Large size
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
@@ -1445,24 +1765,27 @@
@Test
public void testMediumSize_withScrollbar() {
- if (isScrollbarEnabledNotAsExpected(true)) return;
- TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
- null, R.styleable.CarUiRecyclerView));
-
- doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
- any(),
- eq(R.styleable.CarUiRecyclerView),
- anyInt(),
- anyInt());
- when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
- anyInt())).thenReturn(1); // Medium size
-
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- int listId = View.generateViewId();
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(50);
- container.post(() -> {
+ int listId = View.generateViewId();
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+ null, R.styleable.CarUiRecyclerView));
+
+ doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+ any(),
+ eq(R.styleable.CarUiRecyclerView),
+ anyInt(),
+ anyInt());
+ when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
+ anyInt())).thenReturn(1); // Medium size
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
@@ -1476,24 +1799,26 @@
@Test
public void testSmallSize_oneItem() {
- if (isScrollbarEnabledNotAsExpected(true)) return;
-
- TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
- null, R.styleable.CarUiRecyclerView));
-
- doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
- any(),
- eq(R.styleable.CarUiRecyclerView),
- anyInt(),
- anyInt());
- when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
- anyInt())).thenReturn(0); // Small size
-
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- int listId = View.generateViewId();
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(1);
- container.post(() -> {
+ int listId = View.generateViewId();
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+ null, R.styleable.CarUiRecyclerView));
+
+ doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+ any(),
+ eq(R.styleable.CarUiRecyclerView),
+ anyInt(),
+ anyInt());
+ when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
+ anyInt())).thenReturn(0); // Small size
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
@@ -1506,24 +1831,26 @@
@Test
public void testSmallSize_multipleItem() {
- doReturn(true).when(mTestableResources).getBoolean(R.bool.car_ui_scrollbar_enable);
-
- TypedArray typedArray = spy(mActivity.getBaseContext().obtainStyledAttributes(
- null, R.styleable.CarUiRecyclerView));
-
- doReturn(typedArray).when(mTestableContext).obtainStyledAttributes(
- any(),
- eq(R.styleable.CarUiRecyclerView),
- anyInt(),
- anyInt());
- when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
- anyInt())).thenReturn(0); // Small size
-
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- int listId = View.generateViewId();
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(50);
- container.post(() -> {
+ int listId = View.generateViewId();
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ TypedArray typedArray = spy(activity.getBaseContext().obtainStyledAttributes(
+ null, R.styleable.CarUiRecyclerView));
+
+ doReturn(typedArray).when(testableContext).obtainStyledAttributes(
+ any(),
+ eq(R.styleable.CarUiRecyclerView),
+ anyInt(),
+ anyInt());
+ when(typedArray.getInt(eq(R.styleable.CarUiRecyclerView_carUiSize),
+ anyInt())).thenReturn(0); // Small size
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
@@ -1537,75 +1864,92 @@
@Test
public void testSameSizeItems_estimateNextPositionDiffForScrollDistance() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
int itemCount = 100;
TestAdapter adapter = new TestAdapter(itemCount);
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+ carUiRecyclerView.setAdapter(adapter);
+
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ });
+
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- // TODO:
- LayoutManager layoutManager = carUiRecyclerView.getLayoutManager();
- OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(layoutManager);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+ int firstViewHeight = carUiRecyclerView.getRecyclerViewChildAt(0).getHeight();
+ int itemsToScroll = 10;
+ OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(
+ carUiRecyclerView.getLayoutManager());
+ CarUiSnapHelper snapHelper = new CarUiSnapHelper(activity);
+ // Get an estimate of how many items CarUiSnapHelper says we need to scroll. The scroll
+ // distance is set to 10 * height of the first item. Since all items have the items have
+ // the same height, we're expecting to get exactly 10 back from CarUiSnapHelper.
+ int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(
+ orientationHelper, itemsToScroll * firstViewHeight);
- int firstViewHeight = layoutManager.getChildAt(0).getHeight();
- int itemsToScroll = 10;
- CarUiSnapHelper snapHelper = new CarUiSnapHelper(mActivity);
- // Get an estimate of how many items CarUiSnaphelpwer says we need to scroll. The scroll
- // distance is set to 10 * height of the first item. Since all items have the items have
- // the same height, we're expecting to get exactly 10 back from CarUiSnapHelper.
- int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(orientationHelper,
- itemsToScroll * firstViewHeight);
-
- assertEquals(estimate, itemsToScroll);
+ assertEquals(estimate, itemsToScroll);
+ });
}
@Test
public void testSameSizeItems_estimateNextPositionDiffForScrollDistance_zeroDistance() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
int itemCount = 100;
TestAdapter adapter = new TestAdapter(itemCount);
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+ carUiRecyclerView.setAdapter(adapter);
+
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ });
+
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- LayoutManager layoutManager = carUiRecyclerView.getLayoutManager();
- OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(layoutManager);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+ OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(
+ carUiRecyclerView.getLayoutManager());
+ int firstViewHeight = carUiRecyclerView.getRecyclerViewChildAt(0).getHeight();
+ // the scroll distance has to be less than half of the size of the first view so that
+ // recyclerview doesn't snap to the next view
+ int distantToScroll = (firstViewHeight / 2) - 1;
+ CarUiSnapHelper snapHelper = new CarUiSnapHelper(activity);
+ int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(
+ orientationHelper, distantToScroll);
- // TODO:
- int firstViewHeight = layoutManager.getChildAt(0).getHeight();
- // the scroll distance has to be less than half of the size of the first view so that
- // recyclerview doesn't snap to the next view
- int distantToScroll = (firstViewHeight / 2) - 1;
- CarUiSnapHelper snapHelper = new CarUiSnapHelper(mActivity);
- int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(orientationHelper,
- distantToScroll);
+ assertEquals(estimate, 0);
+ });
- assertEquals(estimate, 0);
}
@Test
public void testSameSizeItems_estimateNextPositionDiffForScrollDistance_zeroHeight() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
@@ -1614,241 +1958,316 @@
heightOverrides.put(0, TestAdapter.ItemHeight.ZERO);
TestAdapter adapter = new TestAdapter(itemCount, heightOverrides);
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+ carUiRecyclerView.setAdapter(adapter);
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ });
+
onView(withContentDescription("ZERO")).check(matches(isEnabled()));
- LayoutManager layoutManager = carUiRecyclerView.getLayoutManager();
- OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(layoutManager);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+ OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(
+ carUiRecyclerView.getLayoutManager());
+ // 10 is an arbitrary number
+ int distantToScroll = 10;
+ CarUiSnapHelper snapHelper = new CarUiSnapHelper(activity);
+ int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(
+ orientationHelper, distantToScroll);
- // 10 is an arbitrary number
- int distantToScroll = 10;
- CarUiSnapHelper snapHelper = new CarUiSnapHelper(mActivity);
- int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(orientationHelper,
- distantToScroll);
-
- assertEquals(estimate, 0);
+ assertEquals(estimate, 0);
+ });
}
@Test
public void testSameSizeItems_estimateNextPositionDiffForScrollDistance_zeroItems() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
int itemCount = 0;
TestAdapter adapter = new TestAdapter(itemCount);
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+ carUiRecyclerView.setAdapter(adapter);
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ });
- LayoutManager layoutManager = carUiRecyclerView.getLayoutManager();
- OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(layoutManager);
- CarUiSnapHelper snapHelper = new CarUiSnapHelper(mActivity);
- int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(orientationHelper, 50);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+ OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(
+ carUiRecyclerView.getLayoutManager());
+ CarUiSnapHelper snapHelper = new CarUiSnapHelper(activity);
+ int estimate = snapHelper.estimateNextPositionDiffForScrollDistance(
+ orientationHelper, 50);
- assertEquals(estimate, 50);
+ assertEquals(estimate, 50);
+ });
}
@Test
public void testEmptyList_calculateScrollDistanceClampToScreenSize() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
int itemCount = 0;
TestAdapter adapter = new TestAdapter(itemCount);
onView(withId(R.id.list)).check(matches(isDisplayed()));
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+ carUiRecyclerView.setAdapter(adapter);
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
- LayoutManager layoutManager = carUiRecyclerView.getLayoutManager();
+ LinearSnapHelper linearSnapHelper = new LinearSnapHelper();
+ carUiRecyclerView.setOnFlingListener(null);
+ linearSnapHelper.attachToRecyclerView(
+ ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
+ // 200 is just an arbitrary number. the intent is to make sure the return value is
+ // smaller
+ // than the layoutmanager height.
+ int[] baseOutDist = linearSnapHelper.calculateScrollDistance(200, -200);
- LinearSnapHelper linearSnapHelper = new LinearSnapHelper();
- carUiRecyclerView.setOnFlingListener(null);
- linearSnapHelper.attachToRecyclerView(
- ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
- // 200 is just an arbitrary number. the intent is to make sure the return value is smaller
- // than the layoutmanager height.
- int[] baseOutDist = linearSnapHelper.calculateScrollDistance(200, -200);
+ CarUiSnapHelper carUiSnapHelper = new CarUiSnapHelper(activity);
+ carUiRecyclerView.setOnFlingListener(null);
+ carUiSnapHelper.attachToRecyclerView(
+ ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
+ int[] outDist = carUiSnapHelper.calculateScrollDistance(200, -200);
- CarUiSnapHelper carUiSnapHelper = new CarUiSnapHelper(mTestableContext);
- carUiRecyclerView.setOnFlingListener(null);
- carUiSnapHelper.attachToRecyclerView(
- ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
- int[] outDist = carUiSnapHelper.calculateScrollDistance(200, -200);
-
- assertEquals(outDist[0], baseOutDist[0]);
- assertEquals(outDist[1], baseOutDist[1]);
+ assertEquals(outDist[0], baseOutDist[0]);
+ assertEquals(outDist[1], baseOutDist[1]);
+ });
}
@Test
public void testCalculateScrollDistanceClampToScreenSize() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- mActivity.runOnUiThread(
- () -> mActivity.setContentView(R.layout.car_ui_recycler_view_test_activity));
+ mActivityRule.getScenario().onActivity(activity -> activity.setContentView(
+ R.layout.car_ui_recycler_view_test_activity));
onView(withId(R.id.list)).check(matches(isDisplayed()));
int itemCount = 100;
TestAdapter adapter = new TestAdapter(itemCount);
- CarUiRecyclerView carUiRecyclerView = mActivity.requireViewById(R.id.list);
- mActivity.runOnUiThread(() -> carUiRecyclerView.setAdapter(adapter));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+ carUiRecyclerView.setAdapter(adapter);
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
+ });
+
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- LayoutManager layoutManager = carUiRecyclerView.getLayoutManager();
- OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(layoutManager);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(R.id.list);
+ LayoutManager layoutManager = carUiRecyclerView.getLayoutManager();
+ OrientationHelper orientationHelper = OrientationHelper.createVerticalHelper(
+ layoutManager);
- LinearSnapHelper linearSnapHelper = new LinearSnapHelper();
- carUiRecyclerView.setOnFlingListener(null);
- linearSnapHelper.attachToRecyclerView(
- ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
- // 8000 is just an arbitrary number. the intent is to make sure the return value is bigger
- // than the layoutmanager height.
- int[] baseOutDist = linearSnapHelper.calculateScrollDistance(8000, -8000);
+ LinearSnapHelper linearSnapHelper = new LinearSnapHelper();
+ carUiRecyclerView.setOnFlingListener(null);
+ linearSnapHelper.attachToRecyclerView(
+ ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
+ // 8000 is just an arbitrary number. the intent is to make sure the return value is
+ // bigger
+ // than the layoutmanager height.
+ int[] baseOutDist = linearSnapHelper.calculateScrollDistance(8000, -8000);
- CarUiSnapHelper carUiSnapHelper = new CarUiSnapHelper(mTestableContext);
- carUiRecyclerView.setOnFlingListener(null);
- carUiSnapHelper.attachToRecyclerView(
- ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
- int[] outDist = carUiSnapHelper.calculateScrollDistance(8000, -8000);
+ CarUiSnapHelper carUiSnapHelper = new CarUiSnapHelper(activity);
+ carUiRecyclerView.setOnFlingListener(null);
+ carUiSnapHelper.attachToRecyclerView(
+ ((CarUiRecyclerViewImpl) carUiRecyclerView).getRecyclerView());
+ int[] outDist = carUiSnapHelper.calculateScrollDistance(8000, -8000);
- int lastChildPosition = carUiSnapHelper.isAtEnd(layoutManager)
- ? 0 : layoutManager.getChildCount() - 1;
- View lastChild = Objects.requireNonNull(layoutManager.getChildAt(lastChildPosition));
- float percentageVisible = CarUiSnapHelper
- .getPercentageVisible(lastChild, orientationHelper);
+ int lastChildPosition = carUiSnapHelper.isAtEnd(carUiRecyclerView.getLayoutManager())
+ ? 0 : carUiRecyclerView.getRecyclerViewChildCount() - 1;
+ View lastChild = Objects.requireNonNull(
+ carUiRecyclerView.getRecyclerViewChildAt(lastChildPosition));
+ float percentageVisible = CarUiSnapHelper
+ .getPercentageVisible(lastChild, orientationHelper);
- int maxDistance = layoutManager.getHeight();
- if (percentageVisible > 0.f) {
- // The max and min distance is the total height of the RecyclerView minus the height of
- // the last child. This ensures that each scroll will never scroll more than a single
- // page on the RecyclerView. That is, the max scroll will make the last child the
- // first child and vice versa when scrolling the opposite way.
- maxDistance -= layoutManager.getDecoratedMeasuredHeight(lastChild);
- }
- int minDistance = -maxDistance;
+ int maxDistance = carUiRecyclerView.getTotalSpace();
+ if (percentageVisible > 0.f) {
+ // The max and min distance is the total height of the RecyclerView minus the
+ // height of
+ // the last child. This ensures that each scroll will never scroll more than a
+ // single
+ // page on the RecyclerView. That is, the max scroll will make the last child the
+ // first child and vice versa when scrolling the opposite way.
+ maxDistance -= carUiRecyclerView.getLayoutManager()
+ .getDecoratedMeasuredHeight(lastChild);
+ }
+ int minDistance = -maxDistance;
- assertEquals(clamp(baseOutDist[0], minDistance, maxDistance), outDist[0]);
- assertEquals(clamp(baseOutDist[1], minDistance, maxDistance), outDist[1]);
+ assertEquals(clamp(baseOutDist[0], minDistance, maxDistance), outDist[0]);
+ assertEquals(clamp(baseOutDist[1], minDistance, maxDistance), outDist[1]);
+ });
}
@Test
public void testContinuousScrollListenerConstructor_negativeInitialDelay() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- if (isScrollbarEnabledNotAsExpected(true)) return;
- doReturn(-1).when(mTestableResources)
- .getInteger(R.integer.car_ui_scrollbar_longpress_initial_delay);
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ doReturn(-1).when(testableResources)
+ .getInteger(R.integer.car_ui_scrollbar_longpress_initial_delay);
- IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
- () -> CarUiRecyclerView.create(mTestableContext));
- assertEquals("negative intervals are not allowed", ex.getMessage());
+ IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
+ () -> CarUiRecyclerView.create(testableContext));
+ assertEquals("negative intervals are not allowed", ex.getMessage());
+ });
}
@Test
public void testContinuousScrollListenerConstructor_negativeRepeatInterval() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- if (isScrollbarEnabledNotAsExpected(true)) return;
- doReturn(-1).when(mTestableResources)
- .getInteger(R.integer.car_ui_scrollbar_longpress_repeat_interval);
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ doReturn(-1).when(testableResources)
+ .getInteger(R.integer.car_ui_scrollbar_longpress_repeat_interval);
- IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
- () -> CarUiRecyclerView.create(mTestableContext));
- assertEquals("negative intervals are not allowed", ex.getMessage());
+ IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
+ () -> CarUiRecyclerView.create(testableContext));
+ assertEquals("negative intervals are not allowed", ex.getMessage());
+ });
}
@Test
public void testUnknownClass_createScrollBarFromConfig() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- doReturn("random.class").when(mTestableResources)
- .getString(R.string.car_ui_scrollbar_component);
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ doReturn("random.class").when(testableResources)
+ .getString(R.string.car_ui_scrollbar_component);
- RuntimeException ex = assertThrows(RuntimeException.class,
- () -> CarUiRecyclerView.create(mTestableContext));
- assertEquals("Error loading scroll bar component: random.class", ex.getMessage());
+ RuntimeException ex = assertThrows(RuntimeException.class,
+ () -> CarUiRecyclerView.create(testableContext));
+ assertEquals("Error loading scroll bar component: random.class", ex.getMessage());
+ });
}
@Test
public void testWrongType_createScrollBarFromConfig() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- // Basically return any class that exists but doesn't extend ScrollBar
- doReturn(CarUiRecyclerView.class.getName()).when(mTestableResources)
- .getString(R.string.car_ui_scrollbar_component);
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ // Basically return any class that exists but doesn't extend ScrollBar
+ doReturn(CarUiRecyclerView.class.getName()).when(testableResources)
+ .getString(R.string.car_ui_scrollbar_component);
- RuntimeException ex = assertThrows(RuntimeException.class,
- () -> CarUiRecyclerView.create(mTestableContext));
- assertEquals("Error creating scroll bar component: "
- + CarUiRecyclerView.class.getName(), ex.getMessage());
+ RuntimeException ex = assertThrows(RuntimeException.class,
+ () -> CarUiRecyclerView.create(testableContext));
+ assertEquals("Error creating scroll bar component: "
+ + CarUiRecyclerView.class.getName(), ex.getMessage());
+ });
}
@Test
public void testSetLinearLayoutStyle_setsLayoutManager() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- CarUiLayoutStyle layoutStyle = new CarUiLinearLayoutStyle();
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- carUiRecyclerView.setLayoutStyle(layoutStyle);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(50);
+ int listId = View.generateViewId();
+ CarUiLayoutStyle layoutStyle = new CarUiLinearLayoutStyle();
- container.post(() -> {
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView =
+ (CarUiRecyclerViewImpl) CarUiRecyclerView.create(activity);
+ carUiRecyclerView.setLayoutStyle(layoutStyle);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
});
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- assertTrue(carUiRecyclerView.getLayoutManager() instanceof LinearLayoutManager);
- assertEquals(((LinearLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
- layoutStyle.getOrientation());
- assertEquals(((LinearLayoutManager) carUiRecyclerView.getLayoutManager())
- .getReverseLayout(), layoutStyle.getReverseLayout());
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(listId);
+ assertTrue(carUiRecyclerView.getLayoutManager() instanceof LinearLayoutManager);
+ assertEquals(
+ ((LinearLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
+ layoutStyle.getOrientation());
+ assertEquals(((LinearLayoutManager) carUiRecyclerView.getLayoutManager())
+ .getReverseLayout(), layoutStyle.getReverseLayout());
+ });
}
@Test
public void testSetGridLayoutStyle_setsLayoutManager() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- CarUiLayoutStyle layoutStyle = new CarUiGridLayoutStyle();
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- carUiRecyclerView.setLayoutStyle(layoutStyle);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(50);
+ CarUiLayoutStyle layoutStyle = new CarUiGridLayoutStyle();
+ int listId = View.generateViewId();
- container.post(() -> {
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView =
+ (CarUiRecyclerViewImpl) CarUiRecyclerView.create(activity);
+ carUiRecyclerView.setLayoutStyle(layoutStyle);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
});
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- assertTrue(carUiRecyclerView.getLayoutManager() instanceof GridLayoutManager);
- assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
- layoutStyle.getOrientation());
- assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getReverseLayout(),
- layoutStyle.getReverseLayout());
- assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanCount(),
- layoutStyle.getSpanCount());
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(listId);
+ assertTrue(carUiRecyclerView.getLayoutManager() instanceof GridLayoutManager);
+ assertEquals(
+ ((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
+ layoutStyle.getOrientation());
+ assertEquals(
+ ((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getReverseLayout(),
+ layoutStyle.getReverseLayout());
+ assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanCount(),
+ layoutStyle.getSpanCount());
+ });
}
@Test
@@ -1861,7 +2280,6 @@
@Test
public void testSetGridLayoutStyle_setsLayoutManagerSpanSizeLookup() {
-
CarUiGridLayoutStyle layoutStyle = new CarUiGridLayoutStyle();
// has to bigger than span sizes for all the rows
layoutStyle.setSpanCount(20);
@@ -1879,80 +2297,105 @@
}
};
layoutStyle.setSpanSizeLookup(spanSizeLookup);
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- carUiRecyclerView.setLayoutStyle(layoutStyle);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(50);
+ int listId = View.generateViewId();
- container.post(() -> {
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+ carUiRecyclerView.setLayoutStyle(layoutStyle);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
});
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiGridLayoutStyle);
- assertEquals(((CarUiGridLayoutStyle) carUiRecyclerView.getLayoutStyle()).getSpanSizeLookup()
- .getSpanSize(0), spanSizeLookup.getSpanSize(0));
- assertEquals(((CarUiGridLayoutStyle) carUiRecyclerView.getLayoutStyle()).getSpanSizeLookup()
- .getSpanSize(1), spanSizeLookup.getSpanSize(1));
- assertEquals(((CarUiGridLayoutStyle) carUiRecyclerView.getLayoutStyle()).getSpanSizeLookup()
- .getSpanSize(2), spanSizeLookup.getSpanSize(2));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ assertTrue(carUiRecyclerView.getLayoutStyle() instanceof CarUiGridLayoutStyle);
+ assertEquals(
+ ((CarUiGridLayoutStyle) carUiRecyclerView.getLayoutStyle()).getSpanSizeLookup()
+ .getSpanSize(0), spanSizeLookup.getSpanSize(0));
+ assertEquals(
+ ((CarUiGridLayoutStyle) carUiRecyclerView.getLayoutStyle()).getSpanSizeLookup()
+ .getSpanSize(1), spanSizeLookup.getSpanSize(1));
+ assertEquals(
+ ((CarUiGridLayoutStyle) carUiRecyclerView.getLayoutStyle()).getSpanSizeLookup()
+ .getSpanSize(2), spanSizeLookup.getSpanSize(2));
+ });
}
@Test
public void testCarUiGridLayoutStyle_LayoutManagerFrom() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- GridLayoutManager layoutManager =
- new GridLayoutManager(mTestableContext, 20, RecyclerView.VERTICAL, true);
- layoutManager.setSpanSizeLookup(new SpanSizeLookup() {
- @Override
- public int getSpanSize(int position) {
- switch (position) {
- case 0:
- return 10;
- case 1:
- return 20;
- default:
- return 15;
- }
- }
- });
- CarUiGridLayoutStyle layoutStyle = CarUiGridLayoutStyle.from(layoutManager);
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- carUiRecyclerView.setLayoutStyle(layoutStyle);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(50);
+ int listId = View.generateViewId();
- container.post(() -> {
+ mActivityRule.getScenario().onActivity(activity -> {
+ GridLayoutManager layoutManager =
+ new GridLayoutManager(activity, 20, RecyclerView.VERTICAL, true);
+ layoutManager.setSpanSizeLookup(new SpanSizeLookup() {
+ @Override
+ public int getSpanSize(int position) {
+ switch (position) {
+ case 0:
+ return 10;
+ case 1:
+ return 20;
+ default:
+ return 15;
+ }
+ }
+ });
+ CarUiGridLayoutStyle layoutStyle = CarUiGridLayoutStyle.from(layoutManager);
+ CarUiRecyclerViewImpl carUiRecyclerView =
+ (CarUiRecyclerViewImpl) CarUiRecyclerView.create(activity);
+ carUiRecyclerView.setLayoutStyle(layoutStyle);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
});
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- assertTrue(carUiRecyclerView.getLayoutManager() instanceof GridLayoutManager);
- assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
- layoutManager.getOrientation());
- assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getReverseLayout(),
- layoutManager.getReverseLayout());
- assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanCount(),
- layoutManager.getSpanCount());
- assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanSizeLookup()
- .getSpanSize(0), layoutManager.getSpanSizeLookup().getSpanSize(0));
- assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanSizeLookup()
- .getSpanSize(1), layoutManager.getSpanSizeLookup().getSpanSize(1));
- assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanSizeLookup()
- .getSpanSize(2), layoutManager.getSpanSizeLookup().getSpanSize(2));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(listId);
+ assertTrue(carUiRecyclerView.getLayoutManager() instanceof GridLayoutManager);
+ GridLayoutManager layoutManager =
+ (GridLayoutManager) carUiRecyclerView.getLayoutManager();
+ assertEquals(
+ ((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
+ layoutManager.getOrientation());
+ assertEquals(
+ ((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getReverseLayout(),
+ layoutManager.getReverseLayout());
+ assertEquals(((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanCount(),
+ layoutManager.getSpanCount());
+ assertEquals(
+ ((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanSizeLookup()
+ .getSpanSize(0), layoutManager.getSpanSizeLookup().getSpanSize(0));
+ assertEquals(
+ ((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanSizeLookup()
+ .getSpanSize(1), layoutManager.getSpanSizeLookup().getSpanSize(1));
+ assertEquals(
+ ((GridLayoutManager) carUiRecyclerView.getLayoutManager()).getSpanSizeLookup()
+ .getSpanSize(2), layoutManager.getSpanSizeLookup().getSpanSize(2));
+ });
}
@Test
public void testCarUiGridLayoutStyle_fromLinearLayout_throwsException() {
- LinearLayoutManager layoutManager = new LinearLayoutManager(mTestableContext);
- AssertionError ex = assertThrows(AssertionError.class,
- () -> CarUiGridLayoutStyle.from(layoutManager));
- assertEquals("GridLayoutManager required.", ex.getMessage());
+ mActivityRule.getScenario().onActivity(activity -> {
+ LinearLayoutManager layoutManager = new LinearLayoutManager(activity);
+ AssertionError ex = assertThrows(AssertionError.class,
+ () -> CarUiGridLayoutStyle.from(layoutManager));
+ assertEquals("GridLayoutManager required.", ex.getMessage());
+ });
}
@Test
@@ -1962,36 +2405,49 @@
@Test
public void testCarUiLinearLayoutStyle_LayoutManagerFrom() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- LinearLayoutManager layoutManager =
- new LinearLayoutManager(mTestableContext, RecyclerView.VERTICAL, true);
- CarUiLinearLayoutStyle layoutStyle = CarUiLinearLayoutStyle.from(layoutManager);
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- carUiRecyclerView.setLayoutStyle(layoutStyle);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(50);
+ int listId = View.generateViewId();
- container.post(() -> {
+ mActivityRule.getScenario().onActivity(activity -> {
+ LinearLayoutManager layoutManager =
+ new LinearLayoutManager(activity, RecyclerView.VERTICAL, true);
+ CarUiLinearLayoutStyle layoutStyle = CarUiLinearLayoutStyle.from(layoutManager);
+ CarUiRecyclerViewImpl carUiRecyclerView =
+ (CarUiRecyclerViewImpl) CarUiRecyclerView.create(activity);
+ carUiRecyclerView.setLayoutStyle(layoutStyle);
+ ViewGroup container = activity.findViewById(R.id.test_container);
container.addView(carUiRecyclerView.getView());
+ carUiRecyclerView.setId(listId);
carUiRecyclerView.setAdapter(adapter);
});
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- assertTrue(carUiRecyclerView.getLayoutManager() instanceof LinearLayoutManager);
- assertEquals(((LinearLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
- layoutManager.getOrientation());
- assertEquals(((LinearLayoutManager) carUiRecyclerView.getLayoutManager())
- .getReverseLayout(), layoutManager.getReverseLayout());
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(listId);
+ LinearLayoutManager layoutManager =
+ (LinearLayoutManager) carUiRecyclerView.getLayoutManager();
+ assertTrue(carUiRecyclerView.getLayoutManager() instanceof LinearLayoutManager);
+ assertEquals(
+ ((LinearLayoutManager) carUiRecyclerView.getLayoutManager()).getOrientation(),
+ layoutManager.getOrientation());
+ assertEquals(((LinearLayoutManager) carUiRecyclerView.getLayoutManager())
+ .getReverseLayout(), layoutManager.getReverseLayout());
+ });
}
@Test
public void testCarUiLinearLayoutStyle_fromGridLayout_throwsException() {
- NotLinearLayoutManager layoutManager = new NotLinearLayoutManager(mTestableContext);
- AssertionError ex = assertThrows(AssertionError.class,
- () -> CarUiLinearLayoutStyle.from(layoutManager));
- assertEquals("LinearLayoutManager required.", ex.getMessage());
+ mActivityRule.getScenario().onActivity(activity -> {
+ NotLinearLayoutManager layoutManager = new NotLinearLayoutManager(activity);
+ AssertionError ex = assertThrows(AssertionError.class,
+ () -> CarUiLinearLayoutStyle.from(layoutManager));
+ assertEquals("LinearLayoutManager required.", ex.getMessage());
+ });
}
@Test
@@ -2001,186 +2457,252 @@
@Test
public void testOnContinuousScrollListener_cancelCallback() {
- doReturn(0).when(mTestableResources)
- .getInteger(R.integer.car_ui_scrollbar_longpress_initial_delay);
- View view = mock(View.class);
- OnClickListener clickListener = mock(OnClickListener.class);
- OnContinuousScrollListener listener = new OnContinuousScrollListener(
- mTestableContext, clickListener);
- MotionEvent motionEvent = mock(MotionEvent.class);
- when(motionEvent.getAction()).thenReturn(MotionEvent.ACTION_DOWN);
- listener.onTouch(view, motionEvent);
- when(view.isEnabled()).thenReturn(false);
- when(motionEvent.getAction()).thenReturn(MotionEvent.ACTION_UP);
- listener.onTouch(view, motionEvent);
- verify(clickListener, times(1)).onClick(view);
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ doReturn(0).when(testableResources)
+ .getInteger(R.integer.car_ui_scrollbar_longpress_initial_delay);
+ View view = mock(View.class);
+ OnClickListener clickListener = mock(OnClickListener.class);
+ OnContinuousScrollListener listener = new OnContinuousScrollListener(
+ testableContext, clickListener);
+ MotionEvent motionEvent = mock(MotionEvent.class);
+ when(motionEvent.getAction()).thenReturn(MotionEvent.ACTION_DOWN);
+ listener.onTouch(view, motionEvent);
+ when(view.isEnabled()).thenReturn(false);
+ when(motionEvent.getAction()).thenReturn(MotionEvent.ACTION_UP);
+ listener.onTouch(view, motionEvent);
+ verify(clickListener, times(1)).onClick(view);
+ });
}
@Test
public void testUxRestriction_withLimitedContent_setsMaxItems() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- CarUxRestrictionsUtil uxRestriction = CarUxRestrictionsUtil.getInstance(mTestableContext);
- CarUxRestrictions restriction = mock(CarUxRestrictions.class);
- when(restriction.getActiveRestrictions()).thenReturn(UX_RESTRICTIONS_LIMIT_CONTENT);
- when(restriction.getMaxCumulativeContentItems()).thenReturn(10);
-
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter.WithItemCap adapter = spy(new TestAdapter.WithItemCap(100));
- container.post(() -> {
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUxRestrictionsUtil uxRestriction = CarUxRestrictionsUtil.getInstance(activity);
+ CarUxRestrictions restriction = mock(CarUxRestrictions.class);
+ when(restriction.getActiveRestrictions()).thenReturn(UX_RESTRICTIONS_LIMIT_CONTENT);
+ when(restriction.getMaxCumulativeContentItems()).thenReturn(10);
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+ ViewGroup container = activity.findViewById(R.id.test_container);
uxRestriction.setUxRestrictions(restriction);
carUiRecyclerView.setAdapter(adapter);
container.addView(carUiRecyclerView.getView());
+
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
});
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
-
verify(adapter, atLeastOnce()).setMaxItems(10);
}
@Test
public void testUxRestriction_withoutLimitedContent_setsUnlimitedMaxItems() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- CarUxRestrictionsUtil uxRestriction = CarUxRestrictionsUtil.getInstance(mTestableContext);
- CarUxRestrictions restriction = mock(CarUxRestrictions.class);
- when(restriction.getMaxCumulativeContentItems()).thenReturn(10);
-
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter.WithItemCap adapter = spy(new TestAdapter.WithItemCap(100));
- container.post(() -> {
- uxRestriction.setUxRestrictions(restriction);
- carUiRecyclerView.setAdapter(adapter);
- container.addView(carUiRecyclerView.getView());
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUxRestrictionsUtil uxRestriction = CarUxRestrictionsUtil.getInstance(activity);
+ CarUxRestrictions restriction = mock(CarUxRestrictions.class);
+ when(restriction.getMaxCumulativeContentItems()).thenReturn(10);
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(activity);
+ ViewGroup container = activity.findViewById(R.id.test_container);
+ container.post(() -> {
+ uxRestriction.setUxRestrictions(restriction);
+ carUiRecyclerView.setAdapter(adapter);
+ container.addView(carUiRecyclerView.getView());
+ });
+
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
});
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
-
verify(adapter, atLeastOnce()).setMaxItems(UNLIMITED);
}
@Test
public void testPageUp_returnsWhen_verticalScrollOffsetIsZero() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- if (isScrollbarEnabledNotAsExpected(true)) return;
- doReturn(TestScrollBar.class.getName()).when(mTestableResources)
- .getString(R.string.car_ui_scrollbar_component);
-
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(100);
int listId = View.generateViewId();
- container.post(() -> {
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ doReturn(TestScrollBar.class.getName()).when(testableResources)
+ .getString(R.string.car_ui_scrollbar_component);
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
carUiRecyclerView.setAdapter(adapter);
carUiRecyclerView.setId(listId);
container.addView(carUiRecyclerView.getView());
+
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
});
onView(withId(listId)).check(matches(isDisplayed()));
-
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- // Scroll to a position so page up is enabled.
- container.post(() -> carUiRecyclerView.scrollToPosition(20));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ // Scroll to a position so page up is enabled.
+ carUiRecyclerView.scrollToPosition(20);
+ });
onView(withId(getId("car_ui_scrollbar_page_up"))).check(matches(isEnabled()));
- View v = mActivity.findViewById(getId("car_ui_scroll_bar"));
- TestScrollBar sb = (TestScrollBar) v.getTag();
- // We set this to simulate a case where layout manager is null
- sb.mReturnZeroVerticalScrollOffset = true;
+ mActivityRule.getScenario().onActivity(activity -> {
+ View v = activity.findViewById(getId("car_ui_scroll_bar"));
+ TestScrollBar sb = (TestScrollBar) v.getTag();
+ // We set this to simulate a case where layout manager is null
+ sb.mReturnZeroVerticalScrollOffset = true;
+ });
onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
- assertFalse(sb.mScrollWasCalled);
+ mActivityRule.getScenario().onActivity(activity -> {
+ View v = activity.findViewById(getId("car_ui_scroll_bar"));
+ TestScrollBar sb = (TestScrollBar) v.getTag();
+ assertFalse(sb.mScrollWasCalled);
+ });
}
@Test
public void testPageUp_returnsWhen_layoutManagerIsNull() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- if (isScrollbarEnabledNotAsExpected(true)) return;
- doReturn(TestScrollBar.class.getName()).when(mTestableResources)
- .getString(R.string.car_ui_scrollbar_component);
-
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(100);
- container.post(() -> {
+ int listId = View.generateViewId();
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ doReturn(TestScrollBar.class.getName()).when(testableResources)
+ .getString(R.string.car_ui_scrollbar_component);
+
+ CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
carUiRecyclerView.setAdapter(adapter);
+ carUiRecyclerView.setId(listId);
container.addView(carUiRecyclerView.getView());
+
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
});
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- // Scroll to a position so page up is enabled.
- container.post(() -> carUiRecyclerView.scrollToPosition(20));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ // Scroll to a position so page up is enabled.
+ carUiRecyclerView.scrollToPosition(20);
+ });
onView(withId(getId("car_ui_scrollbar_page_up"))).check(matches(isEnabled()));
- View v = mActivity.findViewById(getId("car_ui_scroll_bar"));
- TestScrollBar sb = (TestScrollBar) v.getTag();
- // We set this to simulate a case where layout manager is null
- sb.mReturnMockLayoutManager = true;
+ mActivityRule.getScenario().onActivity(activity -> {
+ View v = activity.findViewById(getId("car_ui_scroll_bar"));
+ TestScrollBar sb = (TestScrollBar) v.getTag();
+ // We set this to simulate a case where layout manager is null
+ sb.mReturnMockLayoutManager = true;
+ });
onView(withId(getId("car_ui_scrollbar_page_up"))).perform(click());
- assertFalse(sb.mScrollWasCalled);
+ mActivityRule.getScenario().onActivity(activity -> {
+ View v = activity.findViewById(getId("car_ui_scroll_bar"));
+ TestScrollBar sb = (TestScrollBar) v.getTag();
+ assertFalse(sb.mScrollWasCalled);
+ });
}
@Test
public void testPageDown_returnsWhen_layoutManagerIsNullOrEmpty() {
- if (mIsPluginEnabled) return;
+ if (mIsPluginEnabled) {
+ return;
+ }
- if (isScrollbarEnabledNotAsExpected(true)) return;
- doReturn(TestScrollBar.class.getName()).when(mTestableResources)
- .getString(R.string.car_ui_scrollbar_component);
-
- CarUiRecyclerView carUiRecyclerView = CarUiRecyclerView.create(mTestableContext);
- ViewGroup container = mActivity.findViewById(R.id.test_container);
TestAdapter adapter = new TestAdapter(100);
- container.post(() -> {
+ int listId = View.generateViewId();
+
+ mActivityRule.getScenario().onActivity(activity -> {
+ Context testableContext = spy(activity);
+ Resources testableResources = spy(activity.getResources());
+ when(testableContext.getResources()).thenReturn(testableResources);
+ doReturn(TestScrollBar.class.getName()).when(testableResources)
+ .getString(R.string.car_ui_scrollbar_component);
+
+ CarUiRecyclerViewImpl carUiRecyclerView =
+ (CarUiRecyclerViewImpl) CarUiRecyclerView.create(testableContext);
+ ViewGroup container = activity.findViewById(R.id.test_container);
carUiRecyclerView.setAdapter(adapter);
+ carUiRecyclerView.setId(listId);
container.addView(carUiRecyclerView.getView());
+
+ IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
});
- IdlingRegistry.getInstance().register(new ScrollIdlingResource(carUiRecyclerView));
onView(withText(adapter.getItemText(0))).check(matches(isDisplayed()));
- // Scroll to a position so page up is enabled.
- container.post(() -> carUiRecyclerView.scrollToPosition(20));
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerView carUiRecyclerView = activity.requireViewById(listId);
+ // Scroll to a position so page up is enabled.
+ carUiRecyclerView.scrollToPosition(20);
+ });
onView(withId(getId("car_ui_scrollbar_page_down"))).check(matches(isEnabled()));
- View v = mActivity.findViewById(getId("car_ui_scroll_bar"));
- TestScrollBar sb = (TestScrollBar) v.getTag();
- // We set this to simulate a case where layout manager is empty
- sb.mReturnMockLayoutManager = true;
- sb.mMockLayoutManager = spy(carUiRecyclerView.getLayoutManager());
- when(sb.mMockLayoutManager.getChildCount()).thenReturn(0);
+ mActivityRule.getScenario().onActivity(activity -> {
+ CarUiRecyclerViewImpl carUiRecyclerView = activity.requireViewById(listId);
+ View v = activity.findViewById(getId("car_ui_scroll_bar"));
+ TestScrollBar sb = (TestScrollBar) v.getTag();
+ // We set this to simulate a case where layout manager is empty
+ sb.mReturnMockLayoutManager = true;
+ sb.mMockLayoutManager = spy(carUiRecyclerView.getLayoutManager());
+ when(sb.mMockLayoutManager.getChildCount()).thenReturn(0);
+ });
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
- assertFalse(sb.mScrollWasCalled);
+ mActivityRule.getScenario().onActivity(activity -> {
+ View v = activity.findViewById(getId("car_ui_scroll_bar"));
+ TestScrollBar sb = (TestScrollBar) v.getTag();
+ assertFalse(sb.mScrollWasCalled);
- // We set this to simulate a case where layout manager is null
- sb.mReturnMockLayoutManager = true;
- sb.mMockLayoutManager = null;
+ // We set this to simulate a case where layout manager is null
+ sb.mReturnMockLayoutManager = true;
+ sb.mMockLayoutManager = null;
+ });
onView(withId(getId("car_ui_scrollbar_page_down"))).perform(click());
- assertFalse(sb.mScrollWasCalled);
+ mActivityRule.getScenario().onActivity(activity -> {
+ View v = activity.findViewById(getId("car_ui_scroll_bar"));
+ TestScrollBar sb = (TestScrollBar) v.getTag();
+ assertFalse(sb.mScrollWasCalled);
+ });
}
static class TestScrollBar extends DefaultScrollBar {
-
boolean mReturnMockLayoutManager = false;
LayoutManager mMockLayoutManager = null;
boolean mScrollWasCalled = false;
@@ -2229,12 +2751,10 @@
* @return An item that is taller than the CarUiRecyclerView.
*/
private View getLongItem(CarUiRecyclerView recyclerView) {
- OrientationHelper orientationHelper =
- OrientationHelper.createVerticalHelper(recyclerView.getLayoutManager());
- for (int i = 0; i < recyclerView.getLayoutManager().getChildCount(); i++) {
- View item = recyclerView.getLayoutManager().getChildAt(i);
+ for (int i = 0; i < recyclerView.getRecyclerViewChildCount(); i++) {
+ View item = recyclerView.getRecyclerViewChildAt(i);
- if (item.getHeight() > orientationHelper.getTotalSpace()) {
+ if (item.getHeight() > recyclerView.getTotalSpace()) {
return item;
}
}
@@ -2306,10 +2826,10 @@
case STANDARD:
break;
case TALL:
- holder.itemView.setMinimumHeight(screenHeight);
+ holder.itemView.setMinimumHeight((int) (screenHeight * 1.1));
break;
case EXTRA_TALL:
- holder.itemView.setMinimumHeight(screenHeight * 2);
+ holder.itemView.setMinimumHeight((int) (screenHeight * 2.1));
break;
default:
throw new IllegalStateException("Unexpected value: " + height);
@@ -2324,8 +2844,7 @@
}
static class WithItemCap extends TestAdapter implements CarUiRecyclerView.ItemCap {
-
- private int mMaxitems = -1;
+ private int mMaxItems = -1;
WithItemCap(int itemCount,
Map<Integer, ItemHeight> overrides) {
@@ -2338,18 +2857,17 @@
@Override
public void setMaxItems(int maxItems) {
- mMaxitems = maxItems;
+ mMaxItems = maxItems;
}
@Override
public int getItemCount() {
- return mMaxitems >= 0 ? mMaxitems : mData.size();
+ return mMaxItems >= 0 ? mMaxItems : mData.size();
}
}
}
private static class PerfectFitTestAdapter extends RecyclerView.Adapter<TestViewHolder> {
-
private static final int MIN_HEIGHT = 30;
private final List<String> mData;
private final int mItemHeight;
@@ -2376,7 +2894,7 @@
}
}
- String getItemText(int position) {
+ public static String getItemText(int position) {
return String.format(Locale.US, "Sample item #%d", position);
}
@@ -2400,7 +2918,7 @@
}
private static class TestViewHolder extends RecyclerView.ViewHolder {
- private TextView mTextView;
+ private final TextView mTextView;
TestViewHolder(LayoutInflater inflater, ViewGroup parent) {
super(inflater.inflate(R.layout.test_list_item, parent, false));
@@ -2439,8 +2957,8 @@
@Override
public void onScrolled(@NonNull CarUiRecyclerView recyclerView,
- int dx,
- int dy) {
+ int dx,
+ int dy) {
}
});
}
@@ -2462,8 +2980,8 @@
}
private static class NotLinearLayoutManager extends LayoutManager {
-
- NotLinearLayoutManager(Context mTestableContext) {}
+ NotLinearLayoutManager(Context mTestableContext) {
+ }
@Override
public LayoutParams generateDefaultLayoutParams() {
@@ -2471,25 +2989,15 @@
}
}
- private boolean isScrollbarEnabledNotAsExpected(boolean expectedValue) {
- if (mIsPluginEnabled) {
- int id = mPluginContext.getResources()
- .getIdentifier("scrollbar_enable", "bool", mPluginContext.getPackageName());
- return (mPluginContext.getResources().getBoolean(id) != expectedValue);
- } else {
- doReturn(expectedValue).when(mTestableResources)
- .getBoolean(R.bool.car_ui_scrollbar_enable);
- return false;
- }
- }
-
private int getId(String resourceName) {
if (mIsPluginEnabled) {
- return mPluginContext.getResources().getIdentifier(
- resourceName.replace("car_ui_", ""), "id", mPluginContext.getPackageName());
+ Context pluginContext = PluginFactorySingleton.getPluginContext();
+ return pluginContext.getResources().getIdentifier(
+ resourceName.replace("car_ui_", ""), "id", pluginContext.getPackageName());
} else {
- return mActivity.getResources()
- .getIdentifier(resourceName, "id", mActivity.getPackageName());
+ Context context = getInstrumentation().getTargetContext();
+ return context.getResources()
+ .getIdentifier(resourceName, "id", context.getPackageName());
}
}
}
diff --git a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/preference/CarUiPrimarySwitchPreference.java b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/preference/CarUiPrimarySwitchPreference.java
new file mode 100644
index 0000000..6586464
--- /dev/null
+++ b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/preference/CarUiPrimarySwitchPreference.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.ui.preference;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.ui.R;
+
+/**
+ * This class is the same as the base {@link CarUiSwitchPreference} class, except supports separate
+ * distinguishing styling.
+ */
+public class CarUiPrimarySwitchPreference extends CarUiSwitchPreference {
+ private View mItemView;
+
+ public CarUiPrimarySwitchPreference(Context context,
+ AttributeSet attrs,
+ int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init();
+ }
+
+ public CarUiPrimarySwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init();
+ }
+
+ public CarUiPrimarySwitchPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init();
+ }
+
+ public CarUiPrimarySwitchPreference(Context context) {
+ super(context);
+ init();
+ }
+
+ private void init() {
+ setLayoutResource(R.layout.car_ui_preference_primary_switch);
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+ mItemView = holder.itemView;
+ mItemView.setActivated(isChecked());
+ }
+
+ @Override
+ public void setChecked(boolean checked) {
+ super.setChecked(checked);
+ if (mItemView != null) {
+ mItemView.setActivated(checked);
+ }
+ }
+}
diff --git a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/preference/PreferenceFragment.java b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/preference/PreferenceFragment.java
index 58c0841..2d0b33f 100644
--- a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/preference/PreferenceFragment.java
+++ b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/preference/PreferenceFragment.java
@@ -26,6 +26,7 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewParent;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -97,6 +98,8 @@
@NonNull
private CarUiRecyclerView mCarUiRecyclerView;
@Nullable
+ private ViewParent mRecyclerView;
+ @Nullable
private String mLastSelectedPrefKey;
private int mLastFocusedAndSelectedPrefPosition;
@@ -264,8 +267,32 @@
@Override
public boolean onPreferenceTreeClick(Preference preference) {
mLastSelectedPrefKey = preference.getKey();
- View focus = getView().findFocus();
- mLastFocusedAndSelectedPrefPosition = mCarUiRecyclerView.getChildLayoutPosition(focus);
+ if (mRecyclerView != null) {
+ // Search for RecyclerView's direct child that has focus, if any.
+ View fragmentRoot = getView();
+ View focusedChild = fragmentRoot.findFocus();
+ boolean childHasFocus = false;
+ while (focusedChild != null) {
+ ViewParent parent = focusedChild.getParent();
+ if (parent == mRecyclerView) {
+ childHasFocus = true;
+ break;
+ }
+ if (parent == null || !(parent instanceof View)) {
+ break;
+ }
+ focusedChild = (View) parent;
+ }
+ if (childHasFocus) {
+ // Find the position of the focused element.
+ // Note: RecyclerView requires that the parameter passed to getChildLayoutPosition()
+ // must be a direct child of RecyclerView.
+ mLastFocusedAndSelectedPrefPosition =
+ mCarUiRecyclerView.getChildLayoutPosition(focusedChild);
+ Log.d(TAG, "mLastFocusedAndSelectedPrefPosition is set to "
+ + mLastFocusedAndSelectedPrefPosition);
+ }
+ }
return super.onPreferenceTreeClick(preference);
}
@@ -403,6 +430,13 @@
new RecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
+ // The RecyclerView in onCreateRecyclerView() might not be the real
+ // RecyclerView in the view tree. However, when an item is attached
+ // to window, its parent (a RecyclerView) must be the real
+ // RecyclerView in the view tree, so update mRecyclerView here.
+ if (mRecyclerView == null) {
+ mRecyclerView = view.getParent();
+ }
int position = mCarUiRecyclerView.getChildLayoutPosition(view);
if (position == mLastFocusedAndSelectedPrefPosition) {
view.requestFocus();
diff --git a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/utils/CarUiUtils.java b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/utils/CarUiUtils.java
index 54d22fa..17d01b9 100644
--- a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/utils/CarUiUtils.java
+++ b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/utils/CarUiUtils.java
@@ -334,7 +334,24 @@
return;
}
initializeRestrictedState(view);
- applyStatesToAllViews(view, restricted ? sRestrictedState : null, null);
+ applyDrawableStatesToAllViews(view, restricted ? sRestrictedState : null, null);
+ }
+
+ /**
+ * Traverses the view hierarchy, and whenever it sees a {@link DrawableStateView}, adds
+ * state_enabled to it.
+ *
+ * Note that this will remove any other drawable states added by other calls to
+ * {@link DrawableStateView#setExtraDrawableState(int[], int[])}
+ */
+ public static void makeAllViewsEnabled(@Nullable View view, boolean enabled) {
+ if (view == null) {
+ return;
+ }
+ initializeRestrictedState(view);
+ int[] statesToAdd = enabled ? new int[] {android.R.attr.state_enabled} : null;
+ int[] statesToRemove = enabled ? null : new int[] {android.R.attr.state_enabled};
+ applyDrawableStatesToAllViews(view, statesToAdd, statesToRemove);
}
/**
@@ -363,7 +380,27 @@
statesToAdd = sRestrictedState;
}
int[] statesToRemove = enabled ? null : new int[] {android.R.attr.state_enabled};
- applyStatesToAllViews(view, statesToAdd, statesToRemove);
+ applyDrawableStatesToAllViews(view, statesToAdd, statesToRemove);
+ }
+
+ /**
+ * Traverses the view hierarchy, and whenever it sees a {@link DrawableStateView}, adds and
+ * removes the specified states from the view.
+ *
+ * Note that this will remove any other drawable states added by other calls to
+ * {@link DrawableStateView#setExtraDrawableState(int[], int[])}
+ */
+ public static void applyDrawableStatesToAllViews(@NonNull View view, int[] statesToAdd,
+ int[] statesToRemove) {
+ if (view instanceof DrawableStateView) {
+ ((DrawableStateView) view).setExtraDrawableState(statesToAdd, statesToRemove);
+ }
+ if (view instanceof ViewGroup) {
+ ViewGroup vg = (ViewGroup) view;
+ for (int i = 0; i < vg.getChildCount(); i++) {
+ applyDrawableStatesToAllViews(vg.getChildAt(i), statesToAdd, statesToRemove);
+ }
+ }
}
private static void initializeRestrictedState(@NonNull View view) {
@@ -382,17 +419,4 @@
};
}
}
-
- private static void applyStatesToAllViews(@NonNull View view, int[] statesToAdd,
- int[] statesToRemove) {
- if (view instanceof DrawableStateView) {
- ((DrawableStateView) view).setExtraDrawableState(statesToAdd, statesToRemove);
- }
- if (view instanceof ViewGroup) {
- ViewGroup vg = (ViewGroup) view;
- for (int i = 0; i < vg.getChildCount(); i++) {
- applyStatesToAllViews(vg.getChildAt(i), statesToAdd, statesToRemove);
- }
- }
- }
}
diff --git a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/uxr/DrawableStateSeekBar.java b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/uxr/DrawableStateSeekBar.java
new file mode 100644
index 0000000..8df0366
--- /dev/null
+++ b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/uxr/DrawableStateSeekBar.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.ui.uxr;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.SeekBar;
+
+import androidx.annotation.Nullable;
+
+/**
+ * A {@link SeekBar} that implements {@link DrawableStateView}, for allowing additional states
+ * such as ux restriction.
+ */
+public class DrawableStateSeekBar extends SeekBar implements DrawableStateView {
+ private DrawableStateUtil mUtil;
+
+ public DrawableStateSeekBar(Context context) {
+ super(context);
+ }
+
+ public DrawableStateSeekBar(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public DrawableStateSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public DrawableStateSeekBar(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ public void setExtraDrawableState(@Nullable int[] stateToAdd, @Nullable int[] stateToRemove) {
+ if (mUtil == null) {
+ mUtil = new DrawableStateUtil(this);
+ }
+ mUtil.setExtraDrawableState(stateToAdd, stateToRemove);
+ }
+
+ @Override
+ public int[] onCreateDrawableState(int extraSpace) {
+ if (mUtil == null) {
+ mUtil = new DrawableStateUtil(this);
+ }
+ return mUtil.onCreateDrawableState(extraSpace, space -> super.onCreateDrawableState(space));
+ }
+}
diff --git a/car-ui-lib/car-ui-lib/src/main/res-overlayable/values/overlayable.xml b/car-ui-lib/car-ui-lib/src/main/res-overlayable/values/overlayable.xml
index 4682c96..9c077b3 100644
--- a/car-ui-lib/car-ui-lib/src/main/res-overlayable/values/overlayable.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res-overlayable/values/overlayable.xml
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='UTF-8'?>
-<!--Copyright (C) 2021 The Android Open Source Project
+<!--Copyright (C) 2022 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -497,6 +497,7 @@
<item type="layout" name="car_ui_preference_dropdown"/>
<item type="layout" name="car_ui_preference_fragment"/>
<item type="layout" name="car_ui_preference_fragment_with_toolbar"/>
+ <item type="layout" name="car_ui_preference_primary_switch"/>
<item type="layout" name="car_ui_preference_two_action_icon"/>
<item type="layout" name="car_ui_preference_two_action_switch"/>
<item type="layout" name="car_ui_preference_two_action_text"/>
diff --git a/car-qc-lib/AndroidManifest.xml b/car-ui-lib/car-ui-lib/src/main/res-private/color/car_ui_preference_primary_switch_background_color.xml
similarity index 67%
rename from car-qc-lib/AndroidManifest.xml
rename to car-ui-lib/car-ui-lib/src/main/res-private/color/car_ui_preference_primary_switch_background_color.xml
index 166d9c0..3c93840 100644
--- a/car-qc-lib/AndroidManifest.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res-private/color/car_ui_preference_primary_switch_background_color.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2021 The Android Open Source Project
+ ~ Copyright (C) 2022 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
@@ -14,6 +14,9 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.car.qc">
-</manifest>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_activated="false"
+ android:color="#202124"/>
+ <item android:color="?android:attr/colorAccent"
+ android:alpha="0.24"/>
+</selector>
diff --git a/car-ui-lib/car-ui-lib/src/main/res-private/drawable/car_ui_preference_primary_switch_background.xml b/car-ui-lib/car-ui-lib/src/main/res-private/drawable/car_ui_preference_primary_switch_background.xml
new file mode 100644
index 0000000..95f4e0c
--- /dev/null
+++ b/car-ui-lib/car-ui-lib/src/main/res-private/drawable/car_ui_preference_primary_switch_background.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:gravity="center">
+ <shape android:shape="rectangle">
+ <corners android:radius="24dp" />
+ <solid android:color="@color/car_ui_preference_primary_switch_background_color" />
+ </shape>
+ </item>
+ <item android:drawable="@drawable/car_ui_preference_primary_switch_rotary_highlight" />
+</layer-list>
diff --git a/car-qc-lib/res/drawable/qc_toggle_rotary_background.xml b/car-ui-lib/car-ui-lib/src/main/res-private/drawable/car_ui_preference_primary_switch_rotary_highlight.xml
similarity index 63%
rename from car-qc-lib/res/drawable/qc_toggle_rotary_background.xml
rename to car-ui-lib/car-ui-lib/src/main/res-private/drawable/car_ui_preference_primary_switch_rotary_highlight.xml
index 406c44c..af43b0e 100644
--- a/car-qc-lib/res/drawable/qc_toggle_rotary_background.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res-private/drawable/car_ui_preference_primary_switch_rotary_highlight.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2021 The Android Open Source Project
+ ~ Copyright 2022 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
@@ -17,18 +17,23 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:state_pressed="true">
<shape android:shape="rectangle">
- <solid android:color="@color/car_ui_rotary_focus_pressed_fill_secondary_color"/>
- <stroke android:width="@dimen/car_ui_rotary_focus_pressed_stroke_width"
- android:color="@color/car_ui_rotary_focus_pressed_stroke_secondary_color"/>
- <corners android:radius="@dimen/qc_toggle_rotary_background_radius" />
+ <corners android:radius="24dp" />
+ <solid android:color="@color/car_ui_rotary_focus_pressed_fill_color" />
+ <stroke
+ android:width="@dimen/car_ui_rotary_focus_pressed_stroke_width"
+ android:color="@color/car_ui_rotary_focus_pressed_stroke_color" />
</shape>
</item>
<item android:state_focused="true">
<shape android:shape="rectangle">
- <solid android:color="@color/car_ui_rotary_focus_fill_secondary_color"/>
- <stroke android:width="@dimen/car_ui_rotary_focus_stroke_width"
- android:color="@color/car_ui_rotary_focus_stroke_secondary_color"/>
- <corners android:radius="@dimen/qc_toggle_rotary_background_radius" />
+ <corners android:radius="24dp" />
+ <solid android:color="@color/car_ui_rotary_focus_fill_color" />
+ <stroke
+ android:width="@dimen/car_ui_rotary_focus_stroke_width"
+ android:color="@color/car_ui_rotary_focus_stroke_color" />
</shape>
</item>
-</selector>
\ No newline at end of file
+ <item>
+ <ripple android:color="?android:attr/colorControlHighlight" />
+ </item>
+</selector>
diff --git a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_primary_switch.xml b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_primary_switch.xml
new file mode 100644
index 0000000..a3b5f63
--- /dev/null
+++ b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_primary_switch.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2022 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<com.android.car.ui.uxr.DrawableStateRelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@drawable/car_ui_preference_primary_switch_background"
+ android:clipToPadding="false"
+ android:minHeight="?android:attr/listPreferredItemHeightSmall"
+ android:tag="carUiPreference"
+ android:paddingStart="?android:attr/listPreferredItemPaddingStart">
+
+ <com.android.car.ui.uxr.DrawableStateImageView
+ android:id="@android:id/icon"
+ android:layout_width="@dimen/car_ui_preference_icon_size"
+ android:layout_height="@dimen/car_ui_preference_icon_size"
+ android:layout_alignParentStart="true"
+ android:layout_centerVertical="true"
+ android:layout_marginBottom="@dimen/car_ui_preference_content_margin_bottom"
+ android:layout_marginEnd="@dimen/car_ui_preference_icon_margin_end"
+ android:layout_marginTop="@dimen/car_ui_preference_content_margin_top"
+ android:scaleType="fitCenter"
+ style="@style/Preference.CarUi.Icon"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_marginBottom="@dimen/car_ui_preference_content_margin_bottom"
+ android:layout_marginTop="@dimen/car_ui_preference_content_margin_top"
+ android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"
+ android:layout_toEndOf="@android:id/icon"
+ android:layout_toStartOf="@android:id/widget_frame"
+ android:orientation="vertical">
+
+ <com.android.car.ui.uxr.DrawableStateTextView
+ android:id="@android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:textAppearance="@style/TextAppearance.CarUi.PreferenceTitle"/>
+
+ <com.android.car.ui.uxr.DrawableStateTextView
+ android:id="@android:id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.CarUi.PreferenceSummary"/>
+
+ </LinearLayout>
+
+ <!-- Preference should place its actual preference widget here. -->
+ <FrameLayout
+ android:id="@android:id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentEnd="true"
+ android:layout_centerVertical="true"/>
+
+</com.android.car.ui.uxr.DrawableStateRelativeLayout>
diff --git a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_icon.xml b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_icon.xml
index c5c4fee..aba8279 100644
--- a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_icon.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_icon.xml
@@ -25,7 +25,7 @@
<com.android.car.ui.uxr.DrawableStateConstraintLayout
android:id="@+id/car_ui_first_action_container"
- android:layout_height="0dp"
+ android:layout_height="wrap_content"
android:layout_width="0dp"
android:background="?android:attr/selectableItemBackground"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
@@ -76,7 +76,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/car_ui_second_action_container"
- android:layout_height="0dp"
+ android:layout_height="wrap_content"
android:layout_width="wrap_content"
app:layout_constraintStart_toEndOf="@id/car_ui_first_action_container"
app:layout_constraintEnd_toEndOf="parent"
diff --git a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_switch.xml b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_switch.xml
index 3d7f6fa..82e1772 100644
--- a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_switch.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_switch.xml
@@ -25,7 +25,7 @@
<com.android.car.ui.uxr.DrawableStateConstraintLayout
android:id="@+id/car_ui_first_action_container"
- android:layout_height="0dp"
+ android:layout_height="wrap_content"
android:layout_width="0dp"
android:background="?android:attr/selectableItemBackground"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
@@ -76,7 +76,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/car_ui_second_action_container"
- android:layout_height="0dp"
+ android:layout_height="wrap_content"
android:layout_width="wrap_content"
app:layout_constraintStart_toEndOf="@id/car_ui_first_action_container"
app:layout_constraintEnd_toEndOf="parent"
diff --git a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text.xml b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text.xml
index 6f568c0..0aab5d2 100644
--- a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text.xml
@@ -25,7 +25,7 @@
<com.android.car.ui.uxr.DrawableStateConstraintLayout
android:id="@+id/car_ui_first_action_container"
- android:layout_height="0dp"
+ android:layout_height="wrap_content"
android:layout_width="0dp"
android:background="?android:attr/selectableItemBackground"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
@@ -76,7 +76,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/car_ui_second_action_container"
- android:layout_height="0dp"
+ android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
app:layout_constraintStart_toEndOf="@id/car_ui_first_action_container"
diff --git a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text_borderless.xml b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text_borderless.xml
index d329d98..0b00b1c 100644
--- a/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text_borderless.xml
+++ b/car-ui-lib/car-ui-lib/src/main/res/layout/car_ui_preference_two_action_text_borderless.xml
@@ -25,7 +25,7 @@
<com.android.car.ui.uxr.DrawableStateConstraintLayout
android:id="@+id/car_ui_first_action_container"
- android:layout_height="0dp"
+ android:layout_height="wrap_content"
android:layout_width="0dp"
android:background="?android:attr/selectableItemBackground"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
@@ -76,7 +76,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/car_ui_second_action_container"
- android:layout_height="0dp"
+ android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
app:layout_constraintStart_toEndOf="@id/car_ui_first_action_container"
diff --git a/car-ui-lib/paintbooth/src/main/res/values/strings.xml b/car-ui-lib/paintbooth/src/main/res/values/strings.xml
index fbd4fbc..cc724db 100644
--- a/car-ui-lib/paintbooth/src/main/res/values/strings.xml
+++ b/car-ui-lib/paintbooth/src/main/res/values/strings.xml
@@ -77,6 +77,8 @@
<!-- Title of a switch preference [CHAR_LIMIT=28]-->
<string name="title_switch_preference">Switch preference</string>
+ <!-- Title of a primary switch preference [CHAR_LIMIT=28]-->
+ <string name="title_primary_switch_preference">Primary switch preference</string>
<!-- Summary of a switch preference [CHAR_LIMIT=78]-->
<string name="summary_switch_preference">Tap anywhere in this preference to toggle state</string>
diff --git a/car-ui-lib/paintbooth/src/main/res/xml/preference_samples.xml b/car-ui-lib/paintbooth/src/main/res/xml/preference_samples.xml
index 4cc4ada..25f217b 100644
--- a/car-ui-lib/paintbooth/src/main/res/xml/preference_samples.xml
+++ b/car-ui-lib/paintbooth/src/main/res/xml/preference_samples.xml
@@ -77,6 +77,11 @@
android:summary="@string/summary_switch_preference"
android:title="@string/title_switch_preference"/>
+ <com.android.car.ui.preference.CarUiPrimarySwitchPreference
+ android:key="primaryswitch"
+ android:summary="@string/summary_switch_preference"
+ android:title="@string/title_primary_switch_preference"/>
+
<com.android.car.ui.preference.CarUiTwoActionPreference
android:key="twoaction"
android:summary="@string/summary_deprecated_twoaction_preference"
diff --git a/car-ui-lib/tests/apitest/current.xml b/car-ui-lib/tests/apitest/current.xml
index 3ed394c..50e2a47 100644
--- a/car-ui-lib/tests/apitest/current.xml
+++ b/car-ui-lib/tests/apitest/current.xml
@@ -406,6 +406,7 @@
<public type="layout" name="car_ui_preference_dropdown"/>
<public type="layout" name="car_ui_preference_fragment"/>
<public type="layout" name="car_ui_preference_fragment_with_toolbar"/>
+ <public type="layout" name="car_ui_preference_primary_switch"/>
<public type="layout" name="car_ui_preference_two_action_icon"/>
<public type="layout" name="car_ui_preference_two_action_switch"/>
<public type="layout" name="car_ui_preference_two_action_text"/>