Merge "Update to use inline Mockito so we can mock Final class" into qt-dev
diff --git a/car-cluster-logging-renderer/Android.mk b/car-cluster-logging-renderer/Android.mk
deleted file mode 100644
index 5d88b48..0000000
--- a/car-cluster-logging-renderer/Android.mk
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-#
-ifneq ($(TARGET_BUILD_PDK),true)
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := android.car.cluster.loggingrenderer
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-# Each update should be signed by OEMs
-LOCAL_CERTIFICATE := platform
-LOCAL_PRIVILEGED_MODULE := true
-
-LOCAL_PROGUARD_FLAG_FILES := proguard.flags
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_JAVA_LIBRARIES += android.car
-
-LOCAL_STATIC_ANDROID_LIBRARIES += \
- androidx.car_car-cluster
-
-LOCAL_REQUIRED_MODULES := privapp_whitelist_android.car.cluster.loggingrenderer
-
-include $(BUILD_PACKAGE)
-endif
diff --git a/car-cluster-logging-renderer/AndroidManifest.xml b/car-cluster-logging-renderer/AndroidManifest.xml
deleted file mode 100644
index 81fa46d..0000000
--- a/car-cluster-logging-renderer/AndroidManifest.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="android.car.cluster.loggingrenderer"
- android:sharedUserId="android.uid.system"
- android:versionCode="1"
- android:versionName="1.0">
-
- <protected-broadcast android:name="android.car.cluster.NAVIGATION_STATE_UPDATE"/>
-
- <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/>
-
- <application android:label="@string/app_name"
- android:icon="@drawable/ic_launcher"
- android:directBootAware="true"
- android:persistent="true">
- <service android:name=".LoggingClusterRenderingService"
- android:exported="false"
- android:permission="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"
- />
- </application>
-</manifest>
diff --git a/car-cluster-logging-renderer/proguard.flags b/car-cluster-logging-renderer/proguard.flags
deleted file mode 100644
index 22cc22d..0000000
--- a/car-cluster-logging-renderer/proguard.flags
+++ /dev/null
@@ -1,3 +0,0 @@
--verbose
--keep @com.android.internal.annotations.VisibleForTesting class *
-
diff --git a/car-cluster-logging-renderer/res/drawable-hdpi/ic_launcher.png b/car-cluster-logging-renderer/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 96a442e..0000000
--- a/car-cluster-logging-renderer/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/car-cluster-logging-renderer/res/drawable-ldpi/ic_launcher.png b/car-cluster-logging-renderer/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 9923872..0000000
--- a/car-cluster-logging-renderer/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/car-cluster-logging-renderer/res/drawable-mdpi/ic_launcher.png b/car-cluster-logging-renderer/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index 359047d..0000000
--- a/car-cluster-logging-renderer/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/car-cluster-logging-renderer/res/drawable-xhdpi/ic_launcher.png b/car-cluster-logging-renderer/res/drawable-xhdpi/ic_launcher.png
deleted file mode 100644
index 71c6d76..0000000
--- a/car-cluster-logging-renderer/res/drawable-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/car-cluster-logging-renderer/res/values-af/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-am/strings.xml b/car-cluster-logging-renderer/res/values-am/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-am/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ar/strings.xml b/car-cluster-logging-renderer/res/values-ar/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ar/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-as/strings.xml b/car-cluster-logging-renderer/res/values-as/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-as/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-az/strings.xml b/car-cluster-logging-renderer/res/values-az/strings.xml
deleted file mode 100644
index a3ea5d3..0000000
--- a/car-cluster-logging-renderer/res/values-az/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"ALƏT_KLASTERİ_TƏCHİZATÇISI_GİRİŞİ"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-b+sr+Latn/strings.xml b/car-cluster-logging-renderer/res/values-b+sr+Latn/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-b+sr+Latn/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-be/strings.xml b/car-cluster-logging-renderer/res/values-be/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-be/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-bg/strings.xml b/car-cluster-logging-renderer/res/values-bg/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-bg/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-bn/strings.xml b/car-cluster-logging-renderer/res/values-bn/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-bn/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-bs/strings.xml b/car-cluster-logging-renderer/res/values-bs/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-bs/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ca/strings.xml b/car-cluster-logging-renderer/res/values-ca/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ca/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-cs/strings.xml b/car-cluster-logging-renderer/res/values-cs/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-cs/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-da/strings.xml b/car-cluster-logging-renderer/res/values-da/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-da/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-de/strings.xml b/car-cluster-logging-renderer/res/values-de/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-de/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-el/strings.xml b/car-cluster-logging-renderer/res/values-el/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-el/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-en-rAU/strings.xml b/car-cluster-logging-renderer/res/values-en-rAU/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-en-rAU/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-en-rCA/strings.xml b/car-cluster-logging-renderer/res/values-en-rCA/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-en-rCA/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-en-rGB/strings.xml b/car-cluster-logging-renderer/res/values-en-rGB/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-en-rIN/strings.xml b/car-cluster-logging-renderer/res/values-en-rIN/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-en-rIN/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-en-rXC/strings.xml b/car-cluster-logging-renderer/res/values-en-rXC/strings.xml
deleted file mode 100644
index 9cf17c1..0000000
--- a/car-cluster-logging-renderer/res/values-en-rXC/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-es-rUS/strings.xml b/car-cluster-logging-renderer/res/values-es-rUS/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-es/strings.xml b/car-cluster-logging-renderer/res/values-es/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-es/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-et/strings.xml b/car-cluster-logging-renderer/res/values-et/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-et/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-eu/strings.xml b/car-cluster-logging-renderer/res/values-eu/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-eu/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-fa/strings.xml b/car-cluster-logging-renderer/res/values-fa/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-fa/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-fi/strings.xml b/car-cluster-logging-renderer/res/values-fi/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-fi/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-fr-rCA/strings.xml b/car-cluster-logging-renderer/res/values-fr-rCA/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-fr-rCA/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-fr/strings.xml b/car-cluster-logging-renderer/res/values-fr/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-fr/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-gl/strings.xml b/car-cluster-logging-renderer/res/values-gl/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-gl/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-gu/strings.xml b/car-cluster-logging-renderer/res/values-gu/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-gu/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-hi/strings.xml b/car-cluster-logging-renderer/res/values-hi/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-hi/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-hr/strings.xml b/car-cluster-logging-renderer/res/values-hr/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-hr/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-hu/strings.xml b/car-cluster-logging-renderer/res/values-hu/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-hu/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-hy/strings.xml b/car-cluster-logging-renderer/res/values-hy/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-hy/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-in/strings.xml b/car-cluster-logging-renderer/res/values-in/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-in/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-is/strings.xml b/car-cluster-logging-renderer/res/values-is/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-is/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-it/strings.xml b/car-cluster-logging-renderer/res/values-it/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-it/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-iw/strings.xml b/car-cluster-logging-renderer/res/values-iw/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-iw/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ja/strings.xml b/car-cluster-logging-renderer/res/values-ja/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ja/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ka/strings.xml b/car-cluster-logging-renderer/res/values-ka/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ka/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-kk/strings.xml b/car-cluster-logging-renderer/res/values-kk/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-kk/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-km/strings.xml b/car-cluster-logging-renderer/res/values-km/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-km/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-kn/strings.xml b/car-cluster-logging-renderer/res/values-kn/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-kn/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ko/strings.xml b/car-cluster-logging-renderer/res/values-ko/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ko/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ky/strings.xml b/car-cluster-logging-renderer/res/values-ky/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ky/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-lo/strings.xml b/car-cluster-logging-renderer/res/values-lo/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-lo/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-lt/strings.xml b/car-cluster-logging-renderer/res/values-lt/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-lt/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-lv/strings.xml b/car-cluster-logging-renderer/res/values-lv/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-lv/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-mk/strings.xml b/car-cluster-logging-renderer/res/values-mk/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-mk/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ml/strings.xml b/car-cluster-logging-renderer/res/values-ml/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ml/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-mn/strings.xml b/car-cluster-logging-renderer/res/values-mn/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-mn/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-mr/strings.xml b/car-cluster-logging-renderer/res/values-mr/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-mr/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ms/strings.xml b/car-cluster-logging-renderer/res/values-ms/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ms/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-my/strings.xml b/car-cluster-logging-renderer/res/values-my/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-my/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-nb/strings.xml b/car-cluster-logging-renderer/res/values-nb/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-nb/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ne/strings.xml b/car-cluster-logging-renderer/res/values-ne/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ne/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-nl/strings.xml b/car-cluster-logging-renderer/res/values-nl/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-nl/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-or/strings.xml b/car-cluster-logging-renderer/res/values-or/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-or/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-pa/strings.xml b/car-cluster-logging-renderer/res/values-pa/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-pa/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-pl/strings.xml b/car-cluster-logging-renderer/res/values-pl/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-pl/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-pt-rPT/strings.xml b/car-cluster-logging-renderer/res/values-pt-rPT/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-pt/strings.xml b/car-cluster-logging-renderer/res/values-pt/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-pt/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ro/strings.xml b/car-cluster-logging-renderer/res/values-ro/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ro/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ru/strings.xml b/car-cluster-logging-renderer/res/values-ru/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ru/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-si/strings.xml b/car-cluster-logging-renderer/res/values-si/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-si/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-sk/strings.xml b/car-cluster-logging-renderer/res/values-sk/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-sk/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-sl/strings.xml b/car-cluster-logging-renderer/res/values-sl/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-sl/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-sq/strings.xml b/car-cluster-logging-renderer/res/values-sq/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-sq/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-sr/strings.xml b/car-cluster-logging-renderer/res/values-sr/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-sr/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-sv/strings.xml b/car-cluster-logging-renderer/res/values-sv/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-sv/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-sw/strings.xml b/car-cluster-logging-renderer/res/values-sw/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-sw/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ta/strings.xml b/car-cluster-logging-renderer/res/values-ta/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ta/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-te/strings.xml b/car-cluster-logging-renderer/res/values-te/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-te/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-th/strings.xml b/car-cluster-logging-renderer/res/values-th/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-th/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-tl/strings.xml b/car-cluster-logging-renderer/res/values-tl/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-tl/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-tr/strings.xml b/car-cluster-logging-renderer/res/values-tr/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-tr/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-uk/strings.xml b/car-cluster-logging-renderer/res/values-uk/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-uk/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-ur/strings.xml b/car-cluster-logging-renderer/res/values-ur/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-ur/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-uz/strings.xml b/car-cluster-logging-renderer/res/values-uz/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-uz/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-vi/strings.xml b/car-cluster-logging-renderer/res/values-vi/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-vi/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-zh-rCN/strings.xml b/car-cluster-logging-renderer/res/values-zh-rCN/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-zh-rHK/strings.xml b/car-cluster-logging-renderer/res/values-zh-rHK/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-zh-rTW/strings.xml b/car-cluster-logging-renderer/res/values-zh-rTW/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values-zu/strings.xml b/car-cluster-logging-renderer/res/values-zu/strings.xml
deleted file mode 100644
index daa61a3..0000000
--- a/car-cluster-logging-renderer/res/values-zu/strings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
-</resources>
diff --git a/car-cluster-logging-renderer/res/values/strings.xml b/car-cluster-logging-renderer/res/values/strings.xml
deleted file mode 100644
index f36db0d..0000000
--- a/car-cluster-logging-renderer/res/values/strings.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<resources>
- <string name="app_name">LOGGING_INSTRUMENT_CLUSTER_RENDERER</string>
-</resources>
diff --git a/car-cluster-logging-renderer/src/android/car/cluster/loggingrenderer/LoggingClusterRenderingService.java b/car-cluster-logging-renderer/src/android/car/cluster/loggingrenderer/LoggingClusterRenderingService.java
deleted file mode 100644
index c42ea5e..0000000
--- a/car-cluster-logging-renderer/src/android/car/cluster/loggingrenderer/LoggingClusterRenderingService.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.loggingrenderer;
-
-import android.car.cluster.renderer.InstrumentClusterRenderingService;
-import android.car.cluster.renderer.NavigationRenderer;
-import android.car.navigation.CarNavigationInstrumentCluster;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.util.Log;
-
-import androidx.car.cluster.navigation.NavigationState;
-import androidx.versionedparcelable.ParcelUtils;
-
-import com.google.android.collect.Lists;
-
-/**
- * Dummy implementation of {@link LoggingClusterRenderingService} to log all interaction.
- */
-public class LoggingClusterRenderingService extends InstrumentClusterRenderingService {
- private static final String TAG = LoggingClusterRenderingService.class.getSimpleName();
- private static final String NAV_STATE_BUNDLE_KEY = "navstate";
- private static final int NAV_STATE_EVENT_ID = 1;
-
- @Override
- public NavigationRenderer getNavigationRenderer() {
- NavigationRenderer navigationRenderer = new NavigationRenderer() {
- @Override
- public CarNavigationInstrumentCluster getNavigationProperties() {
- Log.i(TAG, "getNavigationProperties");
- CarNavigationInstrumentCluster config =
- CarNavigationInstrumentCluster.createCluster(1000);
- config.getExtra().putIntegerArrayList("dummy", Lists.newArrayList(1, 2, 3, 4));
- Log.i(TAG, "getNavigationProperties, returns: " + config);
- return config;
- }
-
- @Override
- public void onEvent(int eventType, Bundle bundle) {
- StringBuilder bundleSummary = new StringBuilder();
- if (eventType == NAV_STATE_EVENT_ID) {
- bundle.setClassLoader(ParcelUtils.class.getClassLoader());
- NavigationState navState = NavigationState
- .fromParcelable(bundle.getParcelable(NAV_STATE_BUNDLE_KEY));
- bundleSummary.append(navState.toString());
-
- // Sending broadcast for testing.
- Intent intent = new Intent("android.car.cluster.NAVIGATION_STATE_UPDATE");
- intent.putExtra(NAV_STATE_BUNDLE_KEY, bundle);
- sendBroadcastAsUser(intent, UserHandle.ALL);
- } else {
- for (String key : bundle.keySet()) {
- bundleSummary.append(key);
- bundleSummary.append("=");
- bundleSummary.append(bundle.get(key));
- bundleSummary.append(" ");
- }
- }
- Log.i(TAG, "onEvent(" + eventType + ", " + bundleSummary + ")");
- }
- };
-
- Log.i(TAG, "createNavigationRenderer, returns: " + navigationRenderer);
- return navigationRenderer;
- }
-}
diff --git a/car_product/build/car.mk b/car_product/build/car.mk
index 66577be..104d5d6 100644
--- a/car_product/build/car.mk
+++ b/car_product/build/car.mk
@@ -39,8 +39,7 @@
EmbeddedKitchenSinkApp \
VmsPublisherClientSample \
VmsSubscriberClientSample \
- android.car.cluster.loggingrenderer \
- DirectRenderingClusterSample \
+ DirectRenderingCluster \
GarageModeTestApp \
# SEPolicy for test apps / services
diff --git a/service/res/values/config.xml b/service/res/values/config.xml
index c03536f..9d90a7c 100644
--- a/service/res/values/config.xml
+++ b/service/res/values/config.xml
@@ -40,7 +40,8 @@
<string name="inputService" translatable="false">android.car.input.service/.DefaultInputService</string>
- <string name="instrumentClusterRendererService" translatable="false">android.car.cluster.sample/.ClusterRenderingServiceImpl</string>
+ <!-- Service responsible for displaying information on the car instrument cluster. -->
+ <string name="instrumentClusterRendererService" translatable="false">android.car.cluster/.ClusterRenderingService</string>
<!-- Whether to enable Activity blocking for safety. When Activity blocking is enabled,
only whitelisted safe Activities will be allowed while car is not parked. -->
diff --git a/service/src/com/android/car/CarMediaService.java b/service/src/com/android/car/CarMediaService.java
index a4e0d6e..10d5d91 100644
--- a/service/src/com/android/car/CarMediaService.java
+++ b/service/src/com/android/car/CarMediaService.java
@@ -34,6 +34,8 @@
import android.media.session.MediaSessionManager;
import android.media.session.MediaSessionManager.OnActiveSessionsChangedListener;
import android.media.session.PlaybackState;
+import android.os.Handler;
+import android.os.HandlerThread;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.service.media.MediaBrowserService;
@@ -85,6 +87,10 @@
private RemoteCallbackList<ICarMediaSourceListener> mMediaSourceListeners =
new RemoteCallbackList();
+ // Handler to receive PlaybackState callbacks from the active media controller.
+ private Handler mHandler;
+ private HandlerThread mHandlerThread;
+
/** The package name of the last media source that was removed while being primary. */
private String mRemovedMediaSourcePackage;
@@ -128,6 +134,10 @@
mMediaSessionManager = mContext.getSystemService(MediaSessionManager.class);
mMediaSessionUpdater = new MediaSessionUpdater();
+ mHandlerThread = new HandlerThread(CarLog.TAG_MEDIA);
+ mHandlerThread.start();
+ mHandler = new Handler(mHandlerThread.getLooper());
+
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
@@ -463,7 +473,11 @@
if (mPrimaryMediaPackage.equals(controller.getPackageName())) {
mActiveUserMediaController = controller;
savePlaybackState(mActiveUserMediaController.getPlaybackState());
- mActiveUserMediaController.registerCallback(mMediaControllerCallback);
+ // Specify Handler to receive callbacks on, to avoid defaulting to the calling
+ // thread; this method can be called from the MediaSessionManager callback.
+ // Using the version of this method without passing a handler causes a
+ // RuntimeException for failing to create a Handler.
+ mActiveUserMediaController.registerCallback(mMediaControllerCallback, mHandler);
return;
}
}
diff --git a/service/src/com/android/car/trust/BleManager.java b/service/src/com/android/car/trust/BleManager.java
index 61e1be6..fd319d6 100644
--- a/service/src/com/android/car/trust/BleManager.java
+++ b/service/src/com/android/car/trust/BleManager.java
@@ -54,6 +54,9 @@
private static final int BLE_RETRY_LIMIT = 5;
private static final int BLE_RETRY_INTERVAL_MS = 1000;
+ private static final int GATT_SERVER_RETRY_LIMIT = 20;
+ private static final int GATT_SERVER_RETRY_DELAY_MS = 200;
+
// https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth
// .service.generic_access.xml
private static final UUID GENERIC_ACCESS_PROFILE_UUID =
@@ -71,6 +74,10 @@
private BluetoothGattServer mGattServer;
private BluetoothGatt mBluetoothGatt;
private int mAdvertiserStartCount;
+ private int mGattServerRetryStartCount;
+ private BluetoothGattService mBluetoothGattService;
+ private AdvertiseCallback mAdvertiseCallback;
+ private AdvertiseData mData;
BleManager(Context context) {
mContext = context;
@@ -97,32 +104,38 @@
return;
}
+ mBluetoothGattService = service;
+ mAdvertiseCallback = advertiseCallback;
+ mData = data;
+ mGattServerRetryStartCount = 0;
+ mBluetoothManager = (BluetoothManager) mContext.getSystemService(
+ Context.BLUETOOTH_SERVICE);
+ openGattServer();
+ }
+
+ private void openGattServer() {
// Only open one Gatt server.
- if (mGattServer == null) {
+ if (mGattServer != null) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "Opening a new GATT Server");
+ Log.d(TAG, "Gatt Server created, retry count: " + mGattServerRetryStartCount);
}
- mBluetoothManager = (BluetoothManager) mContext.getSystemService(
- Context.BLUETOOTH_SERVICE);
- mGattServer = mBluetoothManager.openGattServer(mContext, mGattServerCallback);
-
- if (mGattServer == null) {
- Log.e(TAG, "Gatt Server not created");
- return;
- }
- }
-
- mGattServer.clearServices();
- mGattServer.addService(service);
-
- AdvertiseSettings settings = new AdvertiseSettings.Builder()
+ mGattServer.clearServices();
+ mGattServer.addService(mBluetoothGattService);
+ AdvertiseSettings settings = new AdvertiseSettings.Builder()
.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
.setConnectable(true)
.build();
-
- mAdvertiserStartCount = 0;
- startAdvertisingInternally(settings, data, advertiseCallback);
+ mAdvertiserStartCount = 0;
+ startAdvertisingInternally(settings, mData, mAdvertiseCallback);
+ mGattServerRetryStartCount = 0;
+ } else if (mGattServerRetryStartCount < GATT_SERVER_RETRY_LIMIT) {
+ mGattServer = mBluetoothManager.openGattServer(mContext, mGattServerCallback);
+ mGattServerRetryStartCount++;
+ mHandler.postDelayed(() -> openGattServer(), GATT_SERVER_RETRY_DELAY_MS);
+ } else {
+ Log.e(TAG, "Gatt server not created - exceeded retry limit.");
+ }
}
private void startAdvertisingInternally(AdvertiseSettings settings, AdvertiseData data,
@@ -132,6 +145,9 @@
}
if (mAdvertiser != null) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Advertiser created, retry count: " + mAdvertiserStartCount);
+ }
mAdvertiser.startAdvertising(settings, data, advertiseCallback);
mAdvertiserStartCount = 0;
} else if (mAdvertiserStartCount < BLE_RETRY_LIMIT) {
diff --git a/service/src/com/android/car/trust/CarTrustAgentBleManager.java b/service/src/com/android/car/trust/CarTrustAgentBleManager.java
index 3e073a0..f42c1e4 100644
--- a/service/src/com/android/car/trust/CarTrustAgentBleManager.java
+++ b/service/src/com/android/car/trust/CarTrustAgentBleManager.java
@@ -401,6 +401,9 @@
public void onStartFailure(int errorCode) {
Log.e(TAG, "Failed to advertise, errorCode: " + errorCode);
super.onStartFailure(errorCode);
+ if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_ALREADY_STARTED) {
+ return;
+ }
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Start unlock advertising fail, retry to advertising..");
}
diff --git a/tests/DirectRenderingClusterSample/Android.mk b/tests/DirectRenderingClusterSample/Android.mk
deleted file mode 100644
index aca5a75..0000000
--- a/tests/DirectRenderingClusterSample/Android.mk
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-#
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := DirectRenderingClusterSample
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-# Each update should be signed by OEMs
-LOCAL_CERTIFICATE := platform
-LOCAL_PRIVILEGED_MODULE := true
-
-LOCAL_PROGUARD_FLAG_FILES := proguard.flags
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_USE_AAPT2 := true
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_JAVA_LIBRARIES += android.car
-LOCAL_STATIC_ANDROID_LIBRARIES += \
- androidx.legacy_legacy-support-v4 \
- androidx-constraintlayout_constraintlayout \
- androidx.car_car-cluster \
- car-arch-common \
- car-media-common \
- car-telephony-common \
- car-apps-common
-
-LOCAL_REQUIRED_MODULES := privapp_whitelist_android.car.cluster.sample
-
-include $(BUILD_PACKAGE)
-
-# Use the following include to make our test apk.
-ifeq (,$(ONE_SHOT_MAKEFILE))
-include $(call all-makefiles-under,$(LOCAL_PATH))
-endif
-
diff --git a/tests/DirectRenderingClusterSample/AndroidManifest.xml b/tests/DirectRenderingClusterSample/AndroidManifest.xml
deleted file mode 100644
index 12c6bba..0000000
--- a/tests/DirectRenderingClusterSample/AndroidManifest.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- package="android.car.cluster.sample"
- android:sharedUserId="android.uid.system">
-
- <uses-sdk android:targetSdkVersion="25" android:minSdkVersion="25"/>
-
- <!-- We set TYPE_SYSTEM_ALERT window flag to presentation in order
- to show it outside of activity context -->
- <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
- <uses-permission android:name="android.permission.CONTROL_INCALL_EXPERIENCE"/>
- <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"
- tools:ignore="ProtectedPermissions"/>
- <uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS"/>
- <uses-permission android:name="android.permission.INJECT_EVENTS"/>
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"/>
- <!-- Required by 'singleUser' service attribute -->
- <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/>
- <!-- Required by 'startActivityAsUser' -->
- <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
- <!-- Required to detect the current user in the device -->
- <uses-permission android:name="android.permission.MANAGE_USERS" />
- <!-- Required to launch navigation apps -->
- <uses-permission android:name="android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL"/>
- <!-- Required to watch activities running on the cluster -->
- <uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER"/>
- <!-- Required to show car sensor data -->
- <uses-permission android:name="android.car.permission.CAR_ENERGY"/>
- <uses-permission android:name="android.car.permission.CAR_POWERTRAIN"/>
- <uses-permission android:name="android.car.permission.CAR_INFO"/>
- <uses-permission android:name="android.car.permission.CAR_SPEED"/>
- <uses-permission android:name="android.car.permission.CAR_ENGINE_DETAILED"/>
-
- <application android:label="@string/app_name"
- android:icon="@mipmap/ic_launcher"
- android:directBootAware="true">
- <service android:name=".ClusterRenderingServiceImpl"
- android:exported="false"
- android:singleUser="true"
- android:permission="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"/>
-
- <activity android:name=".MainClusterActivity"
- android:exported="false"
- android:showForAllUsers="true"
- android:theme="@style/Theme.ClusterTheme">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </activity>
- </application>
-</manifest>
diff --git a/tests/DirectRenderingClusterSample/res/color/icon_color.xml b/tests/DirectRenderingClusterSample/res/color/icon_color.xml
deleted file mode 100644
index 1ce35ee..0000000
--- a/tests/DirectRenderingClusterSample/res/color/icon_color.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android" >
- <item
- android:color="@color/icon_selected"
- android:state_selected="true"/>
- <item
- android:color="@color/icon_selected"
- android:state_focused="true"/>
- <item
- android:color="@color/icon_unselected"/>
-</selector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_car_info.png b/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_car_info.png
deleted file mode 100644
index adb07d6..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_car_info.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_music.png b/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_music.png
deleted file mode 100644
index f1b2533..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_music.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_nav.png b/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_nav.png
deleted file mode 100644
index 8036b89..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_nav.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_phone.png b/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_phone.png
deleted file mode 100644
index 2daaa8e..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-hdpi/ic_phone.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_car_info.png b/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_car_info.png
deleted file mode 100644
index 9c45d3e..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_car_info.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_music.png b/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_music.png
deleted file mode 100644
index fb0671a..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_music.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_nav.png b/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_nav.png
deleted file mode 100644
index 4844c89..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_nav.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_phone.png b/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_phone.png
deleted file mode 100644
index ef50db6..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-mdpi/ic_phone.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_car_info.png b/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_car_info.png
deleted file mode 100644
index 2db5645..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_car_info.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_music.png b/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_music.png
deleted file mode 100644
index 6154079..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_music.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_nav.png b/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_nav.png
deleted file mode 100644
index f94db1e..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_nav.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_phone.png b/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_phone.png
deleted file mode 100644
index ca0be39..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xhdpi/ic_phone.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_car_info.png b/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_car_info.png
deleted file mode 100644
index f00be30..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_car_info.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_music.png b/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_music.png
deleted file mode 100644
index 8a875ad..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_music.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_nav.png b/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_nav.png
deleted file mode 100644
index 7b2b514..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_nav.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_phone.png b/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_phone.png
deleted file mode 100644
index fce6fb7..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable-xxhdpi/ic_phone.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable/car_top_view.png b/tests/DirectRenderingClusterSample/res/drawable/car_top_view.png
deleted file mode 100644
index b19ee12..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/car_top_view.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive.xml
deleted file mode 100644
index c83d9f0..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M10,5a2,2,0,1,1,2-2a2,2,0,0,1-2,2Zm4.91284,8.35114l-4.90368-6.342839999999999l-4.903689999999999,6.342839999999999a.38659.38659,0,0,0,.40942.62354l2.95184-1.34375a.35542.35542,0,0,1,.5409600000000001.3690700000000007h-.007690000000000197v5.50006a.49992.49992,0,0,0,.4999400000000005.4999399999999987h1.00012a.49992.49992,0,0,0,.4999399999999987-.4999399999999987v-5.491760000000001h.00916a.35757.35757,0,0,1,.54242-.37738l2.95184,1.34375a.3866.3866,0,0,0,.4094200000000008-.6235300000000006Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_left.xml
deleted file mode 100644
index 3eba85d..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M3,12a2,2,0,1,1,2-2a2,2,0,0,1-2,2Zm10.00293-.96332a4.05782,4.05782,0,0,1,3.98877,4.07324h.008300000000001972v1.37775a.51232.51232,0,0,0,.5123299999999986.5123299999999986h.97534a.51232.51232,0,0,0,.5123300000000022-.5123299999999986v-1.4876700000000014h-.013850000000001472a6.05607,6.05607,0,0,0-5.9834-5.96332l-.011-.00183l.00012.02008h-.9918700000000005v-.009090000000000487a.35757.35757,0,0,1-.37738-.54242l1.34375-2.95184a.38659.38659,0,0,0-.62354-.40942l-6.342829999999999,4.90368l6.34283,4.90369a.3866.3866,0,0,0,.62354-.40942l-1.34375-2.95184a.35757.35757,0,0,1,.3773800000000005-.5424299999999977v.00909h1"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_right.xml
deleted file mode 100644
index 0401e8c..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M15,10a2,2,0,1,1,2,2a2,2,0,0,1-2-2Zm-8,1.0549300000000006h1v-.009090000000000487a.35757.35757,0,0,1,.37738.54242l-1.3437500000000009,2.9518400000000007a.3866.3866,0,0,0,.62354.40942l6.34283-4.903680000000001l-6.34283-4.90369a.38659.38659,0,0,0-.62354.40942l1.3437500000000009,2.9518500000000003a.35757.35757,0,0,1-.3773800000000005.5424199999999999v.009090000000000487h-.9918199999999997l.00011999999999989797-.020080000000000098l-.011.00183a6.05607,6.05607,0,0,0-5.98345,5.9633199999999995h-.013849999999999696v1.48767a.51232.51232,0,0,0,.51233.5123299999999986h.9753400000000001a.51232.51232,0,0,0,.51233-.5123299999999986v-1.3777500000000007h.008300000000000196a4.05782,4.05782,0,0,1,3.98877-4.07324"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_straight.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_straight.xml
deleted file mode 100644
index c83d9f0..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_straight.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M10,5a2,2,0,1,1,2-2a2,2,0,0,1-2,2Zm4.91284,8.35114l-4.90368-6.342839999999999l-4.903689999999999,6.342839999999999a.38659.38659,0,0,0,.40942.62354l2.95184-1.34375a.35542.35542,0,0,1,.5409600000000001.3690700000000007h-.007690000000000197v5.50006a.49992.49992,0,0,0,.4999400000000005.4999399999999987h1.00012a.49992.49992,0,0,0,.4999399999999987-.4999399999999987v-5.491760000000001h.00916a.35757.35757,0,0,1,.54242-.37738l2.95184,1.34375a.3866.3866,0,0,0,.4094200000000008-.6235300000000006Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_close.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_close.xml
deleted file mode 100644
index c531094..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_close.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M17.35551,4.05855l-5.589929999999999,5.589929999999999a.49713.49713,0,0,0,0,.703l5.58993,5.58993a.49713.49713,0,0,1,0,.703l-.711.711a.49713.49713,0,0,1-.703,0l-5.58993-5.58993a.49713.49713,0,0,0-.703,0l-5.590030000000002,5.590030000000002a.49713.49713,0,0,1-.703,0l-.711-.711a.49713.49713,0,0,1,0-.703l5.58993-5.58993a.49713.49713,0,0,0,0-.703l-5.589990000000002-5.590030000000002a.49713.49713,0,0,1,0-.703l.711-.711a.49713.49713,0,0,1,.703,0l5.58999,5.5898699999999995a.49713.49713,0,0,0,.703,0l5.58993-5.58993a.49713.49713,0,0,1,.703,0l.711.711a.49713.49713,0,0,1,.00010000000000331966.7030600000000002Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_continue.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_continue.xml
deleted file mode 100644
index 231dac0..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_continue.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M14.50342,8.96637l-2.9518500000000003-1.3437499999999991a.35755.35755,0,0,0-.5424100000000003.3773799999999996v9.49652a.50346.50346,0,0,1-.5034799999999997.5034799999999997h-.993a.50346.50346,0,0,1-.50348-.50348v-9.49652a.35756.35756,0,0,0-.54242-.37738l-2.9518899999999997,1.3437499999999991a.38659.38659,0,0,1-.40942-.62354l4.903689999999999-6.342829999999999l4.90369,6.34283a.3866.3866,0,0,1-.40942999999999863.6235400000000002Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_continue_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_continue_left.xml
deleted file mode 100644
index faa7027..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_continue_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M10,5.97986l.011.00183a6.06019,6.06019,0,0,1,5.989000000000001,6.07324v3.9450699999999994h-.003109999999999502l.002,1.50317a.49614.49614,0,0,1-.49620000000000175.4968299999999992h-1.0064700000000002a.49622.49622,0,0,1-.4962199999999992-.496220000000001v-5.448849999999998a4.05782,4.05782,0,0,0-3.98877-4.07324h-1.99878a.3576.3576,0,0,0-.37738.54248l1.3437500000000009,2.951830000000001a.38659.38659,0,0,1-.62354.40942l-6.34698-4.885420000000002l6.347-4.922a.38659.38659,0,0,1,.62354.40942l-1.3437700000000001,2.9518499999999994a.35757.35757,0,0,0,.37738.54242h1.9875500000000006"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_continue_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_continue_right.xml
deleted file mode 100644
index 6ef4749..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_continue_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M9.98877,7.98169a4.05782,4.05782,0,0,0-3.9887700000000006,4.07324v5.44885a.49622.49622,0,0,1-.4962200000000001.496220000000001h-1.0064700000000002a.49614.49614,0,0,1-.49615-.49683l.0019500000000007844-1.5031700000000008h-.0031100000000003902v-3.9450699999999994a6.06019,6.06019,0,0,1,5.989000000000001-6.07324l.010999999999999233-.0018299999999999983v.0018299999999999983h1.98755a.35757.35757,0,0,0,.37738-.54242l-1.3437500000000018-2.9518400000000007a.38659.38659,0,0,1,.6235300000000006-.40942999999999996l6.346990000000002,4.922000000000001l-6.347,4.88544a.38659.38659,0,0,1-.62354-.40942l1.34375-2.95184a.3576.3576,0,0,0-.37738-.54248h-1.998759999999999Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_depart.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_depart.xml
deleted file mode 100644
index 46c2408..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_depart.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M9.98172,19a2,2,0,1,1,2-2a2,2,0,0,1-2,2Zm4.912840000000001-11.65717l-4.903690000000001-6.342829999999999l-4.90368,6.34283a.38659.38659,0,0,0,.40942.62354l2.95184-1.34375a.35542.35542,0,0,1,.541.36908h-.007730000000000459v5.50006a.49992.49992,0,0,0,.49994.49994h1.00012a.49992.49992,0,0,0,.49994-.49994v-5.491760000000001h.00916a.35757.35757,0,0,1,.54242-.37738l2.95184,1.34375a.3866.3866,0,0,0,.409419999999999-.6235400000000002Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_fork_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_fork_left.xml
deleted file mode 100644
index 8ca9ced..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_fork_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M17.73611,6.57682a.30465.30465,0,0,1,.23032.10507l.649.74859a.30457.30457,0,0,1-.03369.43226l-2.06044,1.7384500000000012a5.4089,5.4089,0,0,0-1.73306,4.29459l.0047,3.60769a.29612.29612,0,0,1-.2961399999999994.2965300000000006h-1.0064700000000002a.29657.29657,0,0,1-.29623-.29622l-.00058-3.47624a6.99129,6.99129,0,0,1,2.269479999999998-5.626159999999999l2.077-1.75275a.30475.30475,0,0,1,.1962-.07182m0-.2a.50269.50269,0,0,0-.32516.119l-2.07704,1.7527300000000006a7.25157,7.25157,0,0,0-2.3398900000000005,5.794459999999999v3.46082a.49622.49622,0,0,0,.496220000000001.4961800000000025h1.0064700000000002a.49614.49614,0,0,0,.49615-.49681l-.0047-3.60767a5.2182,5.2182,0,0,1,1.665-4.14405l2.057410000000001-1.7358700000000002a.50455.50455,0,0,0,.05585-.71613l-.649-.74859a.50345.50345,0,0,0-.38147-.17406h0Zm-8.73542-.39511999999999947h-1.9875500000000006a.35757.35757,0,0,1-.37738-.54242l1.3437499999999991-2.9518400000000007a.38659.38659,0,0,0-.6235399999999993-.40942999999999996l-6.34698,4.922000000000001l6.347,4.88544a.38659.38659,0,0,0,.6235199999999992-.40943999999999825l-1.34375-2.951830000000001a.3576.3576,0,0,1,.37738-.54248h1.9987700000000013a4.05782,4.05782,0,0,1,3.98877,4.07324v5.44885a.49622.49622,0,0,0,.49622999999999884.496220000000001h1.00647a.49614.49614,0,0,0,.49615-.49683l-.001960000000000406-1.5031700000000008h.00311v-3.9450699999999994a6.06019,6.06019,0,0,0-5.989-6.07324l-.011-.00183"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_fork_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_fork_right.xml
deleted file mode 100644
index 9953608..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_fork_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M2.27386,6.57682a.30457.30457,0,0,1,.1961400000000002.07182000000000066l2.0739999999999994,1.7501800000000003a7.00218,7.00218,0,0,1,2.27186,5.644179999999999v3.46088a.29651.29651,0,0,1-.29617999999999967.29612000000000194h-1.0065a.29613.29613,0,0,1-.29618000000000055-.2965699999999991l.003790000000000404-3.5888300000000015a5.42,5.42,0,0,0-1.73517-4.316l-2.0573699999999997-1.7358600000000015a.30461.30461,0,0,1-.03372-.43226l.649-.74859a.30466.30466,0,0,1,.23035-.10507m0-.2a.50345.50345,0,0,0-.38147.17406l-.649.74859a.50458.50458,0,0,0,.05588.71613l2.0573699999999997,1.7358600000000006a5.2182,5.2182,0,0,1,1.665,4.14405l-.0046600000000003305,3.607660000000001a.49617.49617,0,0,0,.49617999999999984.4968299999999992h1.0065a.49616.49616,0,0,0,.49615-.49615v-3.4608500000000006a7.25157,7.25157,0,0,0-2.33983-5.794459999999999l-2.077-1.7527499999999998a.50264.50264,0,0,0-.32516-.119h0Zm8.73442,1.604870000000001h1.98755a.3576.3576,0,0,1,.37738.54248l-1.3437500000000018,2.951830000000001a.38659.38659,0,0,0,.62354.40942l6.34698-4.885420000000002l-6.3469999999999995-4.922000000000001a.38659.38659,0,0,0-.62354.40942l1.34375,2.95184a.35757.35757,0,0,1-.37738.54242h-1.9875299999999996v-.0018199999999986005l-.011.00183a6.06019,6.06019,0,0,0-5.989,6.07324v3.9450699999999994h.003109999999998614l-.002,1.50317a.49614.49614,0,0,0,.4962100000000005.4968299999999992h1.0064599999999997a.49622.49622,0,0,0,.49622-.49622v-5.448849999999998a4.05782,4.05782,0,0,1,3.98877-4.07324h.011229999999999407Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_merge_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_merge_left.xml
deleted file mode 100644
index b8954b8..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_merge_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M7.8,7.2v10.302520000000001a.2978.2978,0,0,1-.2974699999999997.2974800000000002h-1.0050600000000003a.2978.2978,0,0,1-.2974699999999997-.2974800000000002v-10.302520000000001h1.5999999999999996m.20000000000000018-.1999999999999993h-2v10.50252a.49747.49747,0,0,0,.49746999999999986.4974799999999995h1.0050600000000003a.49747.49747,0,0,0,.49746999999999986-.4974799999999995v-10.50252h0Zm-.018309999999999604,3v-1.9875500000000006a.3576.3576,0,0,1,.54248-.37738l2.951830000000001,1.3437500000000009a.38659.38659,0,0,0,.40942-.62354l-4.885420000000002-6.34698l-4.922,6.347a.38659.38659,0,0,0,.40942.62354l2.9518499999999994-1.3437700000000001a.35757.35757,0,0,1,.54242.37738v1.9875500000000006h-.0018299999999991101l.00183.011a6.06019,6.06019,0,0,0,6.07324,5.989000000000001h3.9450699999999994v-.003109999999999502l1.50317.002a.49614.49614,0,0,0,.4968299999999992-.49620000000000175v-1.0064700000000002a.49622.49622,0,0,0-.496220000000001-.4962199999999992h-5.448849999999998a4.05782,4.05782,0,0,1-4.07324-3.98877v-.011229999999999407Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_merge_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_merge_right.xml
deleted file mode 100644
index ab89d03..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_merge_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M13.8,7.2v10.299210000000002a.30112.30112,0,0,1-.30078.3008h-.9984300000000008a.30112.30112,0,0,1-.300790000000001-.30079999999999885v-10.299210000000002h1.6m.20000000000000107-.1999999999999993h-2v10.499210000000001a.50079.50079,0,0,0,.5007900000000003.5007899999999985h.99841a.50079.50079,0,0,0,.5007999999999999-.5007899999999985v-10.499210000000001h0Zm.01831,3v-1.9875500000000006a.35757.35757,0,0,1,.54242-.37738l2.95184,1.34375a.38659.38659,0,0,0,.4094300000000004-.6235299999999988l-4.922000000000001-6.34699l-4.88544,6.347a.38659.38659,0,0,0,.40942.62354l2.95184-1.34375a.3576.3576,0,0,1,.54248.37738v1.99878a4.05782,4.05782,0,0,1-4.0732300000000015,3.9887499999999996h-5.44885a.49622.49622,0,0,0-.4962200000000001.4962199999999992v1.00647a.49614.49614,0,0,0,.49683.49615l1.50317-.001949999999999008v.003109999999999502h3.9450700000000003a6.06019,6.06019,0,0,0,6.07324-5.989l.0018299999999999983-.010999999999999233"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_new_name_straight.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_new_name_straight.xml
deleted file mode 100644
index 231dac0..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_new_name_straight.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M14.50342,8.96637l-2.9518500000000003-1.3437499999999991a.35755.35755,0,0,0-.5424100000000003.3773799999999996v9.49652a.50346.50346,0,0,1-.5034799999999997.5034799999999997h-.993a.50346.50346,0,0,1-.50348-.50348v-9.49652a.35756.35756,0,0,0-.54242-.37738l-2.9518899999999997,1.3437499999999991a.38659.38659,0,0,1-.40942-.62354l4.903689999999999-6.342829999999999l4.90369,6.34283a.3866.3866,0,0,1-.40942999999999863.6235400000000002Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_left.xml
deleted file mode 100644
index 536fd22..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M14.5029,2.2a.29744.29744,0,0,1,.29710000000000036.2971199999999996v15.005760000000002a.29744.29744,0,0,1-.29710000000000036.2971199999999996h-1.0058000000000007a.29744.29744,0,0,1-.29710000000000036-.2971199999999996v-15.005760000000002a.29744.29744,0,0,1,.29710000000000036-.2971199999999987h1.0058m0-.2h-1.0058000000000007a.49711.49711,0,0,0-.49709999999999965.4971199999999998v15.005760000000002a.49711.49711,0,0,0,.49709999999999965.4971199999999989h1.0058a.49711.49711,0,0,0,.49709999999999965-.4971199999999989v-15.005760000000002a.49711.49711,0,0,0-.49709999999999965-.4971199999999989h0Zm-5.50212,3.9816900000000004h-1.9875500000000006a.35757.35757,0,0,1-.37738-.54242l1.3437499999999991-2.9518400000000007a.38659.38659,0,0,0-.6235399999999993-.40942999999999996l-6.34698,4.922000000000001l6.347,4.88544a.38659.38659,0,0,0,.6235199999999992-.40943999999999825l-1.34375-2.951830000000001a.3576.3576,0,0,1,.37738-.54248h1.9987700000000013a4.05782,4.05782,0,0,1,3.98877,4.07324v5.44885a.49622.49622,0,0,0,.49622999999999884.496220000000001h1.00647a.49614.49614,0,0,0,.49615-.49683l-.001960000000000406-1.5031700000000008h.00311v-3.9450699999999994a6.06019,6.06019,0,0,0-5.989-6.07324l-.011-.00183"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_right.xml
deleted file mode 100644
index 3048587..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M6.5029,2.2a.29744.29744,0,0,1,.2970999999999995.2971199999999996v15.005760000000002a.29744.29744,0,0,1-.2970999999999995.2971199999999996h-1.0058000000000007a.29744.29744,0,0,1-.2970999999999995-.2971199999999996v-15.005760000000002a.29744.29744,0,0,1,.2970999999999995-.2971199999999987h1.0058000000000007m0-.2h-1.0058000000000007a.49711.49711,0,0,0-.49709999999999965.4971199999999998v15.005760000000002a.49711.49711,0,0,0,.49709999999999965.4971199999999989h1.0058000000000007a.49711.49711,0,0,0,.49709999999999965-.4971199999999989v-15.005760000000002a.49711.49711,0,0,0-.49709999999999965-.4971199999999989h0Zm4.5054,5.98169h1.98755a.3576.3576,0,0,1,.37738.54248l-1.3437500000000018,2.951830000000001a.38659.38659,0,0,0,.62354.40942l6.34698-4.885420000000002l-6.3469999999999995-4.922000000000001a.38659.38659,0,0,0-.62354.40942l1.34375,2.95184a.35757.35757,0,0,1-.37738.54242h-1.9875299999999996v-.0018199999999986005l-.011.00183a6.06019,6.06019,0,0,0-5.989,6.07324v3.9450699999999994h.003109999999998614l-.002,1.50317a.49614.49614,0,0,0,.4962100000000005.4968299999999992h1.0064599999999997a.49622.49622,0,0,0,.49622-.49622v-5.448849999999998a4.05782,4.05782,0,0,1,3.98877-4.07324h.011229999999999407Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_left.xml
deleted file mode 100644
index 91ffc9c..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M14.5029,2.2a.29744.29744,0,0,1,.29710000000000036.2971199999999996v15.005760000000002a.29744.29744,0,0,1-.29710000000000036.2971199999999996h-1.0058000000000007a.29744.29744,0,0,1-.29710000000000036-.2971199999999996v-15.005760000000002a.29744.29744,0,0,1,.29710000000000036-.2971199999999987h1.0058m0-.2h-1.0058000000000007a.49711.49711,0,0,0-.49709999999999965.4971199999999998v15.005760000000002a.49711.49711,0,0,0,.49709999999999965.4971199999999989h1.0058a.49711.49711,0,0,0,.49709999999999965-.4971199999999989v-15.005760000000002a.49711.49711,0,0,0-.49709999999999965-.4971199999999989h0Zm-1.85684,6.24854l-2.457460000000001-2.07386a.3576.3576,0,0,1,.07019-.6571l2.9489100000000015-1.3501600000000007a.38658.38658,0,0,0-.20294-.71777l-8.004760000000001-.4496500000000001l1.58044,7.86a.38663.38663,0,0,0,.73938.09912l.9181799999999996-3.1106099999999985a.35758.35758,0,0,1,.6405-.16266l2.44818,2.06561a5.21819,5.21819,0,0,1,1.665,4.144l-.0047,3.60767a.49614.49614,0,0,0,.49624000000000024.49687000000000126h1.00653a.49621.49621,0,0,0,.49615-.49622v-3.4607799999999997a7.25157,7.25157,0,0,0-2.339839999999999-5.794459999999999Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_right.xml
deleted file mode 100644
index b549937..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M8.5029,2.2a.29744.29744,0,0,1,.29710000000000036.2971199999999996v15.005760000000002a.29744.29744,0,0,1-.29710000000000036.2971199999999996h-1.0058000000000007a.29744.29744,0,0,1-.2970999999999995-.2971199999999996v-15.005760000000002a.29744.29744,0,0,1,.2970999999999995-.2971199999999987h1.0058000000000007m0-.2h-1.0058000000000007a.49711.49711,0,0,0-.49709999999999965.4971199999999998v15.005760000000002a.49711.49711,0,0,0,.49709999999999965.4971199999999989h1.0058000000000007a.49711.49711,0,0,0,.49709999999999965-.4971199999999989v-15.005760000000002a.49711.49711,0,0,0-.49709999999999965-.4971199999999989h0Zm-1.4888000000000003,12.043v3.46082a.49621.49621,0,0,0,.4961500000000001.4961800000000025h1.0065300000000006a.49614.49614,0,0,0,.49615-.49683l-.0047-3.60767a5.21819,5.21819,0,0,1,1.665-4.144l2.44818-2.06561a.35758.35758,0,0,1,.6405.16266l.91821,3.1106a.38663.38663,0,0,0,.7394400000000001-.09915000000000163l1.5804399999999994-7.859999999999999l-8.00476.44965a.38658.38658,0,0,0-.20294.71777l2.94891,1.35016a.3576.3576,0,0,1,.07019.6571l-2.457460000000001,2.0738600000000007a7.25157,7.25157,0,0,0-2.3398399999999997,5.794459999999999Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_left.xml
deleted file mode 100644
index 65e66e2..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M9.00078,5.97986l.011.00183a6.06019,6.06019,0,0,1,5.989,6.07324v3.9450699999999994h-.0031199999999991235l.002,1.50317a.49614.49614,0,0,1-.4962.4968299999999992h-1.0064600000000006a.49622.49622,0,0,1-.49622-.49622v-5.448849999999998a4.05782,4.05782,0,0,0-3.98878-4.07324h-1.9987700000000004a.3576.3576,0,0,0-.37738.54248l1.3437499999999991,2.951830000000001a.38659.38659,0,0,1-.62354.40942l-6.346979999999999-4.885420000000002l6.347-4.922a.38659.38659,0,0,1,.62354.40942l-1.343770000000001,2.9518499999999994a.35757.35757,0,0,0,.37738.54242h1.9875500000000015"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_right.xml
deleted file mode 100644
index 1647927..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M10.99707,7.98169a4.05782,4.05782,0,0,0-3.9887700000000006,4.07324v5.44885a.49622.49622,0,0,1-.4962200000000001.496220000000001h-1.0064599999999997a.49614.49614,0,0,1-.49615-.49683l.0019399999999993867-1.5031700000000008h-.003109999999999502v-3.9450699999999994a6.06019,6.06019,0,0,1,5.989-6.07324l.011-.00183v.0018299999999999983h1.98755a.35757.35757,0,0,0,.37738-.54242l-1.34375-2.9518400000000007a.38659.38659,0,0,1,.623520000000001-.40942999999999996l6.3469999999999995,4.922000000000001l-6.347,4.88544a.38659.38659,0,0,1-.62354-.40942l1.34375-2.95184a.3576.3576,0,0,0-.37738-.54248h-1.9987599999999972Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_left.xml
deleted file mode 100644
index 83b821a..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M15.49771,18a.49779.49779,0,0,1-.49779-.49779v-12.4983l-.27979-.00635a2.56758,2.56758,0,0,0-2.0957.79l-5.39526,4.61285a.34918.34918,0,0,0,.08252.63177l2.92877,1.39331a.38658.38658,0,0,1-.21344.71472l-8.0105.33209l1.69568-7.836a.38661.38661,0,0,1,.74072-.0882l.8725,3.12372a.35757.35757,0,0,0,.638.17206l.0037800000000007827.00446999999999953l5.392099999999999-4.60909a4.46634,4.46634,0,0,1,3.38476-1.2412599999999996l.2641600000000004.0019999999999997797a1.92935,1.92935,0,0,1,1.43408.56885a2.10247,2.10247,0,0,1,.55713,1.46045l.00046999999999997044,12.47289a.49779.49779,0,0,1-.49779000000000195.4978100000000012h-1.0044Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_right.xml
deleted file mode 100644
index 3394364..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M3.49789,17.99542a.49779.49779,0,0,1-.49779-.49781l.00047000000000041453-12.472889999999998a2.10247,2.10247,0,0,1,.5571299999999999-1.4604500000000002a1.92935,1.92935,0,0,1,1.43408-.56885l.26416-.002a4.46634,4.46634,0,0,1,3.38476,1.2412599999999996l5.392099999999999,4.609089999999999l.00378-.00446a.35757.35757,0,0,0,.638-.17206l.8725-3.12372a.38661.38661,0,0,1,.74072.0882l1.69568,7.836l-8.01048-.3320899999999991a.38658.38658,0,0,1-.21344-.71472l2.92877-1.39331a.34918.34918,0,0,0,.08252-.63177l-5.395280000000001-4.612840000000001a2.56758,2.56758,0,0,0-2.0957-.79l-.27979.00635v12.4983a.49779.49779,0,0,1-.49779.49779h-1.0043999999999995Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_left.xml
deleted file mode 100644
index 385a519..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M12.9859,14.043v3.46082a.49621.49621,0,0,1-.4961500000000001.4961800000000025h-1.0065300000000015a.49614.49614,0,0,1-.49615-.49683l.0047-3.60767a5.21819,5.21819,0,0,0-1.665-4.144l-2.4482299999999997-2.0656499999999998a.35758.35758,0,0,0-.6405.16266l-.91821,3.1106a.38663.38663,0,0,1-.7393899999999993-.09910999999999959l-1.5804400000000003-7.859999999999999l8.00476.44965a.38658.38658,0,0,1,.20294.71777l-2.9489099999999997,1.3501599999999998a.3576.3576,0,0,0-.07019.6571l2.45746,2.07385a7.25157,7.25157,0,0,1,2.3398400000000024,5.7944700000000005Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_right.xml
deleted file mode 100644
index 2ee993c..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M9.35394,8.24854l2.457460000000001-2.07386a.3576.3576,0,0,0-.07019-.6571l-2.9489100000000015-1.3501600000000007a.38658.38658,0,0,1,.20294-.71777l8.004760000000001-.4496500000000001l-1.58044,7.86a.38663.38663,0,0,1-.73938.09912l-.9181799999999996-3.1106099999999985a.35758.35758,0,0,0-.6405-.16266l-2.448220000000001,2.0656099999999995a5.21819,5.21819,0,0,0-1.665,4.144l.0047,3.60767a.49614.49614,0,0,1-.4961999999999982.49687000000000126h-1.0065300000000006a.49621.49621,0,0,1-.49615-.49622v-3.4607799999999997a7.25157,7.25157,0,0,1,2.3398399999999997-5.794459999999999Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout.xml
deleted file mode 100644
index 5504491..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M5.5,10.002a.17879.17879,0,0,0,.27124.18866l1.47589-.67188a.1933.1933,0,0,1,.20471.31177l-2.45184,3.17145l-2.45184-3.1714900000000004a.1933.1933,0,0,1,.20471-.31177l1.476.67188a.17876.17876,0,0,0,.2711299999999994-.18862000000000023v-.002000000000000668a5.51888,5.51888,0,0,1,2.75293-4.76563l.5.86523a4.51856,4.51856,0,0,0-2.25293,3.9003999999999994v.002Zm6.75146-3.89941a4.51948,4.51948,0,0,1,2.24854,3.897409999999999h1a5.5223,5.5223,0,0,0-2.74756-4.7627l-.001440000000000552-.00006000000000039307a.17878.17878,0,0,1-.027789999999999537-.32923999999999953l1.3197899999999994-.9422400000000004a.19332.19332,0,0,0-.16766-.33319l-3.97247.53766l1.52063,3.70911a.19331.19331,0,0,0,.37238-.02142l.1561199999999996-1.6141500000000004a.17945.17945,0,0,1,.29945999999999984-.1412299999999993Zm.4954200000000011,8.663409999999999a.17879.17879,0,0,1,.299.14053l.1561,1.61412a.1933.1933,0,0,0,.37235.02141l1.520669999999999-3.709059999999999l-3.97245-.53766a.1933.1933,0,0,0-.16764.33317l1.31982.94225a.17879.17879,0,0,1-.02781.32923l.00361-.00254a4.57684,4.57684,0,0,1-4.502,0l-.501.86523a5.50442,5.50442,0,0,0,5.50391,0Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_left.xml
deleted file mode 100644
index e3337c5..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M13,6.2a3.8,3.8,0,1,1-3.8000000000000007,3.8a3.80428,3.80428,0,0,1,3.8000000000000007-3.8m0,7a3.2,3.2,0,1,0-3.1999999999999993-3.1999999999999993a3.20363,3.20363,0,0,0,3.1999999999999993,3.1999999999999993m0-7.199999999999999a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm2.82861-5.82813a4.0315,4.0315,0,0,0-.542-.45459a4.078,4.078,0,0,0-5.11475.4541a3.96842,3.96842,0,0,0-1.141099999999998,2.328619999999999h-4.030760000000001a.17879.17879,0,0,1-.18866-.27124l.6718799999999998-1.4758899999999997a.1933.1933,0,0,0-.31177-.20471l-3.17145,2.4518400000000007l3.17145,2.45184a.1933.1933,0,0,0,.31177-.20471l-.6718799999999998-1.4758899999999997a.17879.17879,0,0,1,.1886599999999996-.2712400000000006h5v-.5a2.98063,2.98063,0,0,1,.87891-2.12158a3.06088,3.06088,0,0,1,3.83545-.34082a3.02248,3.02248,0,0,1,.40723.34131a2.99976,2.99976,0,0,1-2.1215899999999994,5.12109h-.5v4h1v-3.030760000000001a4.00038,4.00038,0,0,0,2.3286099999999994-6.797369999999999Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_right.xml
deleted file mode 100644
index c4e3de7..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M7,6.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.1999999999999993a3.20363,3.20363,0,0,0,3.2,3.1999999999999993m0-7.199999999999999a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm7.83777-5.45184a.1933.1933,0,0,0-.31177.20471l.67188,1.47589a.17881.17881,0,0,1-.18872.2712399999999988h-5.00916v.5a2.99994,2.99994,0,0,1-3,3h-.5v4h1v-3.030760000000001a4.0032,4.0032,0,0,0,3.469239999999999-3.469239999999999h4.03992a.17881.17881,0,0,1,.18872.27124l-.6718799999999998,1.4758899999999997a.1933.1933,0,0,0,.31177.20471l3.1713900000000024-2.4518400000000007Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_left.xml
deleted file mode 100644
index f6b3999..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M10.994,5.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.1999999999999993a3.20363,3.20363,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm2.8291-5.82813a4.03583,4.03583,0,0,0-.54248-.45459a4.07906,4.07906,0,0,0-5.11475.4541a4.00058,4.00058,0,0,0-.33252,5.28076l-3.0657700000000023,3.06578a.17873.17873,0,0,1-.325-.05847l-.5685799999999994-1.518740000000001a.19332.19332,0,0,0-.36523.07568l-.5087700000000002,3.9762600000000017l3.97626-.50879a.19332.19332,0,0,0,.07568-.36523l-1.5187400000000002-.5685500000000001a.17879.17879,0,0,1-.05835-.3252l-.00037-.00037l3.40378-3.40567l.33838-.353l-.34521-.34619a2.9995,2.9995,0,0,1,.0014699999999994162-4.241229999999998a3.06063,3.06063,0,0,1,3.83545-.34082a3.02673,3.02673,0,0,1,.40771.34131a3,3,0,0,1-2.1220599999999994,5.12109h-.5v4h1v-3.030760000000001a4.00076,4.00076,0,0,0,2.3290900000000008-6.797369999999999Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_right.xml
deleted file mode 100644
index 820ddf3..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_sharp_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M8.97217,5.2a3.8,3.8,0,1,1-3.8,3.8a3.8043,3.8043,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.2a3.20362,3.20362,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm7.491,1.02374a.19328.19328,0,0,0-.36517-.07568l-.5685199999999995,1.5187399999999993a.17883.17883,0,0,1-.32526.05835l-.00018.00018l-3.75726-3.75726l-.35352.35352a2.98022,2.98022,0,0,1-2.121089999999999.8784100000000006h-.5v4h1v-3.030760000000001a3.95621,3.95621,0,0,0,1.95264-.80859l3.07312,3.07275a.17841.17841,0,0,1-.05914.324l-1.5186900000000012.5686000000000018a.1933.1933,0,0,0,.07568.36523l3.9762200000000014.5087699999999984Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_left.xml
deleted file mode 100644
index 7891bd7..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M10.97473,7.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.2a3.20363,3.20363,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm-5.499-9.20184a.17879.17879,0,0,1,.05835000000000079-.32515999999999945l1.51872-.5685899999999999a.1933.1933,0,0,0-.0757-.36521l-3.97624-.50881l.50881,3.97625a.1933.1933,0,0,0,.36521.0757l.56854-1.51872a.17879.17879,0,0,1,.32521-.05835m6.7061,9.464a4.00038,4.00038,0,0,0,2.32861-6.79736a4.0315,4.0315,0,0,0-.542-.45459a4.07671,4.07671,0,0,0-4.73975.12256l-3.75294-3.749l-.707.708l4.439,4.43311l.353-.35352a3.05971,3.05971,0,0,1,3.83545-.34082a3.02248,3.02248,0,0,1,.40723.34131a2.99976,2.99976,0,0,1-2.1216100000000004,5.121040000000001h-.5v4h1v-3.030760000000001Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_right.xml
deleted file mode 100644
index 028dc9f..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_slight_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M8.97128,7.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.2a3.20363,3.20363,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm4.081189999999999-10.548729999999999a.19328.19328,0,0,0-.07568.36517l1.51874.5686a.17878.17878,0,0,1,.05835.3252l.00006.00006l-3.8150899999999996,3.8150899999999988l.35352.35352a2.99976,2.99976,0,0,1-2.1210999999999984,5.121090000000001h-.5v3.97917h1v-3.0099300000000007a4.00123,4.00123,0,0,0,2.66016-6.42236l3.1295699999999993-3.1295399999999978a.17878.17878,0,0,1,.3252.05835l.5684999999999985,1.5187400000000002a.19332.19332,0,0,0,.36523-.07574l.50879-3.9762Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_straight.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_straight.xml
deleted file mode 100644
index 301ce6c..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_ccw_straight.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M10,8.2a3.8,3.8,0,1,1-3.8,3.8000000000000007a3.80427,3.80427,0,0,1,3.8-3.8000000000000007m0,7a3.2,3.2,0,1,0-3.2-3.1999999999999993a3.20363,3.20363,0,0,0,3.2,3.1999999999999993m0-7.199999999999999a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm2.83057-5.82666a3.97135,3.97135,0,0,0-2.33057-1.1425799999999988v-3.0266100000000007a.17881.17881,0,0,1,.27124-.18872l1.4758899999999997.6718700000000002a.19329.19329,0,0,0,.20471-.31177l-2.4518400000000007-3.17138l-2.45184,3.1713899999999997a.1933.1933,0,0,0,.20471.31177l1.476-.67187a.17879.17879,0,0,1,.2711299999999994.18871000000000038v3.99585h.5a3,3,0,1,1,0,6h-.5v3h1v-2.030760000000001a4.00076,4.00076,0,0,0,2.33057-6.7959Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw.xml
deleted file mode 100644
index fe948fc..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <group android:pivotX="10" android:scaleX="-1">
- <path android:fillColor="#FF000000"
- android:pathData="M5.5,10.002a.17879.17879,0,0,0,.27124.18866l1.47589-.67188a.1933.1933,0,0,1,.20471.31177l-2.45184,3.17145l-2.45184-3.1714900000000004a.1933.1933,0,0,1,.20471-.31177l1.476.67188a.17876.17876,0,0,0,.2711299999999994-.18862000000000023v-.002000000000000668a5.51888,5.51888,0,0,1,2.75293-4.76563l.5.86523a4.51856,4.51856,0,0,0-2.25293,3.9003999999999994v.002Zm6.75146-3.89941a4.51948,4.51948,0,0,1,2.24854,3.897409999999999h1a5.5223,5.5223,0,0,0-2.74756-4.7627l-.001440000000000552-.00006000000000039307a.17878.17878,0,0,1-.027789999999999537-.32923999999999953l1.3197899999999994-.9422400000000004a.19332.19332,0,0,0-.16766-.33319l-3.97247.53766l1.52063,3.70911a.19331.19331,0,0,0,.37238-.02142l.1561199999999996-1.6141500000000004a.17945.17945,0,0,1,.29945999999999984-.1412299999999993Zm.4954200000000011,8.663409999999999a.17879.17879,0,0,1,.299.14053l.1561,1.61412a.1933.1933,0,0,0,.37235.02141l1.520669999999999-3.709059999999999l-3.97245-.53766a.1933.1933,0,0,0-.16764.33317l1.31982.94225a.17879.17879,0,0,1-.02781.32923l.00361-.00254a4.57684,4.57684,0,0,1-4.502,0l-.501.86523a5.50442,5.50442,0,0,0,5.50391,0Z"/>
- </group>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_left.xml
deleted file mode 100644
index 038da24..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_left.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <group android:pivotX="10" android:scaleX="-1">
- <path android:fillColor="#FF000000"
- android:pathData="M7,6.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.1999999999999993a3.20363,3.20363,0,0,0,3.2,3.1999999999999993m0-7.199999999999999a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm7.83777-5.45184a.1933.1933,0,0,0-.31177.20471l.67188,1.47589a.17881.17881,0,0,1-.18872.2712399999999988h-5.00916v.5a2.99994,2.99994,0,0,1-3,3h-.5v4h1v-3.030760000000001a4.0032,4.0032,0,0,0,3.469239999999999-3.469239999999999h4.03992a.17881.17881,0,0,1,.18872.27124l-.6718799999999998,1.4758899999999997a.1933.1933,0,0,0,.31177.20471l3.1713900000000024-2.4518400000000007Z"/>
- </group>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_right.xml
deleted file mode 100644
index a96201d..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_right.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <group android:pivotX="10" android:scaleX="-1">
- <path android:fillColor="#FF000000"
- android:pathData="M13,6.2a3.8,3.8,0,1,1-3.8000000000000007,3.8a3.80428,3.80428,0,0,1,3.8000000000000007-3.8m0,7a3.2,3.2,0,1,0-3.1999999999999993-3.1999999999999993a3.20363,3.20363,0,0,0,3.1999999999999993,3.1999999999999993m0-7.199999999999999a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm2.82861-5.82813a4.0315,4.0315,0,0,0-.542-.45459a4.078,4.078,0,0,0-5.11475.4541a3.96842,3.96842,0,0,0-1.141099999999998,2.328619999999999h-4.030760000000001a.17879.17879,0,0,1-.18866-.27124l.6718799999999998-1.4758899999999997a.1933.1933,0,0,0-.31177-.20471l-3.17145,2.4518400000000007l3.17145,2.45184a.1933.1933,0,0,0,.31177-.20471l-.6718799999999998-1.4758899999999997a.17879.17879,0,0,1,.1886599999999996-.2712400000000006h5v-.5a2.98063,2.98063,0,0,1,.87891-2.12158a3.06088,3.06088,0,0,1,3.83545-.34082a3.02248,3.02248,0,0,1,.40723.34131a2.99976,2.99976,0,0,1-2.1215899999999994,5.12109h-.5v4h1v-3.030760000000001a4.00038,4.00038,0,0,0,2.3286099999999994-6.797369999999999Z"/>
- </group>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_sharp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_sharp_left.xml
deleted file mode 100644
index da060af..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_sharp_left.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <group android:pivotX="10" android:scaleX="-1">
- <path android:fillColor="#FF000000"
- android:pathData="M8.97217,5.2a3.8,3.8,0,1,1-3.8,3.8a3.8043,3.8043,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.2a3.20362,3.20362,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm7.491,1.02374a.19328.19328,0,0,0-.36517-.07568l-.5685199999999995,1.5187399999999993a.17883.17883,0,0,1-.32526.05835l-.00018.00018l-3.75726-3.75726l-.35352.35352a2.98022,2.98022,0,0,1-2.121089999999999.8784100000000006h-.5v4h1v-3.030760000000001a3.95621,3.95621,0,0,0,1.95264-.80859l3.07312,3.07275a.17841.17841,0,0,1-.05914.324l-1.5186900000000012.5686000000000018a.1933.1933,0,0,0,.07568.36523l3.9762200000000014.5087699999999984Z"/>
- </group>
-</vector>
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_sharp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_sharp_right.xml
deleted file mode 100644
index 91165f8..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_sharp_right.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <group android:pivotX="10" android:scaleX="-1">
- <path android:fillColor="#FF000000"
- android:pathData="M10.994,5.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.1999999999999993a3.20363,3.20363,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm2.8291-5.82813a4.03583,4.03583,0,0,0-.54248-.45459a4.07906,4.07906,0,0,0-5.11475.4541a4.00058,4.00058,0,0,0-.33252,5.28076l-3.0657700000000023,3.06578a.17873.17873,0,0,1-.325-.05847l-.5685799999999994-1.518740000000001a.19332.19332,0,0,0-.36523.07568l-.5087700000000002,3.9762600000000017l3.97626-.50879a.19332.19332,0,0,0,.07568-.36523l-1.5187400000000002-.5685500000000001a.17879.17879,0,0,1-.05835-.3252l-.00037-.00037l3.40378-3.40567l.33838-.353l-.34521-.34619a2.9995,2.9995,0,0,1,.0014699999999994162-4.241229999999998a3.06063,3.06063,0,0,1,3.83545-.34082a3.02673,3.02673,0,0,1,.40771.34131a3,3,0,0,1-2.1220599999999994,5.12109h-.5v4h1v-3.030760000000001a4.00076,4.00076,0,0,0,2.3290900000000008-6.797369999999999Z"/>
- </group>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_slight_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_slight_left.xml
deleted file mode 100644
index 6bdd564..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_slight_left.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <group android:pivotX="10" android:scaleX="-1">
- <path android:fillColor="#FF000000"
- android:pathData="M8.97128,7.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.2a3.20363,3.20363,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm4.081189999999999-10.548729999999999a.19328.19328,0,0,0-.07568.36517l1.51874.5686a.17878.17878,0,0,1,.05835.3252l.00006.00006l-3.8150899999999996,3.8150899999999988l.35352.35352a2.99976,2.99976,0,0,1-2.1210999999999984,5.121090000000001h-.5v3.97917h1v-3.0099300000000007a4.00123,4.00123,0,0,0,2.66016-6.42236l3.1295699999999993-3.1295399999999978a.17878.17878,0,0,1,.3252.05835l.5684999999999985,1.5187400000000002a.19332.19332,0,0,0,.36523-.07574l.50879-3.9762Z"/>
- </group>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_slight_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_slight_right.xml
deleted file mode 100644
index 00c0fa5..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_slight_right.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <group android:pivotX="10" android:scaleX="-1">
- <path android:fillColor="#FF000000"
- android:pathData="M10.97473,7.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.2a3.20363,3.20363,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm-5.499-9.20184a.17879.17879,0,0,1,.05835000000000079-.32515999999999945l1.51872-.5685899999999999a.1933.1933,0,0,0-.0757-.36521l-3.97624-.50881l.50881,3.97625a.1933.1933,0,0,0,.36521.0757l.56854-1.51872a.17879.17879,0,0,1,.32521-.05835m6.7061,9.464a4.00038,4.00038,0,0,0,2.32861-6.79736a4.0315,4.0315,0,0,0-.542-.45459a4.07671,4.07671,0,0,0-4.73975.12256l-3.75294-3.749l-.707.708l4.439,4.43311l.353-.35352a3.05971,3.05971,0,0,1,3.83545-.34082a3.02248,3.02248,0,0,1,.40723.34131a2.99976,2.99976,0,0,1-2.1216100000000004,5.121040000000001h-.5v4h1v-3.030760000000001Z"/>
- </group>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_straight.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_straight.xml
deleted file mode 100644
index 0961145..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_cw_straight.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <group android:pivotX="10" android:scaleX="-1">
- <path android:fillColor="#FF000000"
- android:pathData="M10,8.2a3.8,3.8,0,1,1-3.8,3.8000000000000007a3.80427,3.80427,0,0,1,3.8-3.8000000000000007m0,7a3.2,3.2,0,1,0-3.2-3.1999999999999993a3.20363,3.20363,0,0,0,3.2,3.1999999999999993m0-7.199999999999999a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm2.83057-5.82666a3.97135,3.97135,0,0,0-2.33057-1.1425799999999988v-3.0266100000000007a.17881.17881,0,0,1,.27124-.18872l1.4758899999999997.6718700000000002a.19329.19329,0,0,0,.20471-.31177l-2.4518400000000007-3.17138l-2.45184,3.1713899999999997a.1933.1933,0,0,0,.20471.31177l1.476-.67187a.17879.17879,0,0,1,.2711299999999994.18871000000000038v3.99585h.5a3,3,0,1,1,0,6h-.5v3h1v-2.030760000000001a4.00076,4.00076,0,0,0,2.33057-6.7959Z"/>
- </group>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_left.xml
deleted file mode 100644
index faa7027..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M10,5.97986l.011.00183a6.06019,6.06019,0,0,1,5.989000000000001,6.07324v3.9450699999999994h-.003109999999999502l.002,1.50317a.49614.49614,0,0,1-.49620000000000175.4968299999999992h-1.0064700000000002a.49622.49622,0,0,1-.4962199999999992-.496220000000001v-5.448849999999998a4.05782,4.05782,0,0,0-3.98877-4.07324h-1.99878a.3576.3576,0,0,0-.37738.54248l1.3437500000000009,2.951830000000001a.38659.38659,0,0,1-.62354.40942l-6.34698-4.885420000000002l6.347-4.922a.38659.38659,0,0,1,.62354.40942l-1.3437700000000001,2.9518499999999994a.35757.35757,0,0,0,.37738.54242h1.9875500000000006"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_right.xml
deleted file mode 100644
index 6ef4749..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M9.98877,7.98169a4.05782,4.05782,0,0,0-3.9887700000000006,4.07324v5.44885a.49622.49622,0,0,1-.4962200000000001.496220000000001h-1.0064700000000002a.49614.49614,0,0,1-.49615-.49683l.0019500000000007844-1.5031700000000008h-.0031100000000003902v-3.9450699999999994a6.06019,6.06019,0,0,1,5.989000000000001-6.07324l.010999999999999233-.0018299999999999983v.0018299999999999983h1.98755a.35757.35757,0,0,0,.37738-.54242l-1.3437500000000018-2.9518400000000007a.38659.38659,0,0,1,.6235300000000006-.40942999999999996l6.346990000000002,4.922000000000001l-6.347,4.88544a.38659.38659,0,0,1-.62354-.40942l1.34375-2.95184a.3576.3576,0,0,0-.37738-.54248h-1.998759999999999Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_left.xml
deleted file mode 100644
index 9024be2..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M15.49771,17.99542a.49779.49779,0,0,1-.49779-.49779v-12.4983l-.2797799999999988-.006330000000000169a2.56758,2.56758,0,0,0-2.0957.79l-5.39527,4.61283a.34918.34918,0,0,0,.08252.63177l2.92877,1.39331a.38658.38658,0,0,1-.21344.71472l-8.0105.33209l1.69568-7.836a.38661.38661,0,0,1,.74072-.0882l.8725,3.12372a.35757.35757,0,0,0,.638.17206l.0037800000000007827.00446999999999953l5.392099999999999-4.609089999999999a4.46634,4.46634,0,0,1,3.38477-1.24121l.26416.002a1.92935,1.92935,0,0,1,1.43408.56885a2.10247,2.10247,0,0,1,.55713,1.46045l.000460000000000349,12.472840000000001a.49779.49779,0,0,1-.49779.49781h-1.0044Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_right.xml
deleted file mode 100644
index 3394364..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M3.49789,17.99542a.49779.49779,0,0,1-.49779-.49781l.00047000000000041453-12.472889999999998a2.10247,2.10247,0,0,1,.5571299999999999-1.4604500000000002a1.92935,1.92935,0,0,1,1.43408-.56885l.26416-.002a4.46634,4.46634,0,0,1,3.38476,1.2412599999999996l5.392099999999999,4.609089999999999l.00378-.00446a.35757.35757,0,0,0,.638-.17206l.8725-3.12372a.38661.38661,0,0,1,.74072.0882l1.69568,7.836l-8.01048-.3320899999999991a.38658.38658,0,0,1-.21344-.71472l2.92877-1.39331a.34918.34918,0,0,0,.08252-.63177l-5.395280000000001-4.612840000000001a2.56758,2.56758,0,0,0-2.0957-.79l-.27979.00635v12.4983a.49779.49779,0,0,1-.49779.49779h-1.0043999999999995Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_left.xml
deleted file mode 100644
index 431736f..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M14.9859,14.043v3.46082a.49621.49621,0,0,1-.4961600000000015.4961800000000025h-1.0065299999999997a.49614.49614,0,0,1-.49615-.49683l.0047-3.60767a5.21819,5.21819,0,0,0-1.665-4.144l-2.448220000000001-2.0656499999999998a.35758.35758,0,0,0-.6405.16266l-.91821,3.1106a.38663.38663,0,0,1-.7393899999999993-.09910999999999959l-1.5804400000000003-7.859999999999999l8.00476.44965a.38658.38658,0,0,1,.20294.71777l-2.9489199999999993,1.3501599999999998a.3576.3576,0,0,0-.07019.6571l2.45746,2.07385a7.25158,7.25158,0,0,1,2.339850000000002,5.7944700000000005Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_right.xml
deleted file mode 100644
index 0ab8aef..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_right.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M7.35395,8.24854l2.45746-2.07386a.3576.3576,0,0,0-.07019-.6571l-2.94892-1.3501600000000007a.38658.38658,0,0,1,.20294-.71777l8.004760000000001-.4496500000000001l-1.58044,7.86a.38663.38663,0,0,1-.73938.09912l-.9181799999999996-3.1106099999999985a.35758.35758,0,0,0-.6405-.16266l-2.448220000000001,2.0656099999999995a5.21819,5.21819,0,0,0-1.665,4.144l.0047,3.60767a.49614.49614,0,0,1-.49618999999999946.49687000000000126h-1.0065300000000006a.49621.49621,0,0,1-.49615-.49622v-3.4607799999999997a7.25157,7.25157,0,0,1,2.3398400000000006-5.794459999999999Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_left.xml
deleted file mode 100644
index bfb9e0c..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_left.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
- <path android:fillColor="#FF000000"
- android:pathData="M17,8v9.49652a.50346.50346,0,0,1-.5034799999999997.5034799999999997h-.993a.50346.50346,0,0,1-.50352-.5034799999999997v-9.49652a3.5,3.5,0,0,0-7,0v4h-.009089999999999598a.35757.35757,0,0,0,.54242.37738l2.95184-1.34375a.3866.3866,0,0,1,.40942.62354l-4.9036800000000005,6.342829999999999l-4.9037500000000005-6.342829999999999a.3866.3866,0,0,1,.40942-.62354l2.95184,1.34375a.3576.3576,0,0,0,.5424900000000008-.3773800000000005h.009089999999999598v-4a5.5,5.5,0,0,1,11,0Z"/>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_right.xml
deleted file mode 100644
index 8fc9223..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_right.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
- android:height="20dp" android:viewportWidth="20" android:viewportHeight="20"
- android:pivotX="10" android:scaleX="-1">
- <group android:pivotX="10" android:scaleX="-1">
- <path android:fillColor="#FF000000"
- android:pathData="M17,8v9.49652a.50346.50346,0,0,1-.5034799999999997.5034799999999997h-.993a.50346.50346,0,0,1-.50352-.5034799999999997v-9.49652a3.5,3.5,0,0,0-7,0v4h-.009089999999999598a.35757.35757,0,0,0,.54242.37738l2.95184-1.34375a.3866.3866,0,0,1,.40942.62354l-4.9036800000000005,6.342829999999999l-4.9037500000000005-6.342829999999999a.3866.3866,0,0,1,.40942-.62354l2.95184,1.34375a.3576.3576,0,0,0,.5424900000000008-.3773800000000005h.009089999999999598v-4a5.5,5.5,0,0,1,11,0Z"/>
- </group>
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/focused_button_shape.xml b/tests/DirectRenderingClusterSample/res/drawable/focused_button_shape.xml
deleted file mode 100644
index 9ded30c..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/focused_button_shape.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <stroke
- android:width="2dp"
- android:color="#333333"/>
- <corners
- android:radius="7dp"/>
- <padding
- android:left="5dp"
- android:top="5dp"
- android:right="5dp"
- android:bottom="5dp"/>
-</shape>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/gradient_bottom.xml b/tests/DirectRenderingClusterSample/res/drawable/gradient_bottom.xml
deleted file mode 100644
index 8006864..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/gradient_bottom.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <gradient
- android:startColor="#00000000"
- android:endColor="#FF000000"
- android:angle="270"
- android:dither="true"
- />
-</shape>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/gradient_top.xml b/tests/DirectRenderingClusterSample/res/drawable/gradient_top.xml
deleted file mode 100644
index 74932ad..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/gradient_top.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <gradient
- android:startColor="#00000000"
- android:endColor="#FF000000"
- android:angle="90"
- android:dither="true"
- />
-</shape>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/seekbar_background.xml b/tests/DirectRenderingClusterSample/res/drawable/seekbar_background.xml
deleted file mode 100644
index ec08455..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/seekbar_background.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2016, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
-
- <item android:id="@android:id/background">
- <shape android:shape="line">
- <stroke android:width="@dimen/playback_seekbar_track_height"/>
- </shape>
- </item>
-
- <item android:id="@android:id/progress">
- <clip>
- <shape android:shape="line">
- <stroke android:width="@dimen/playback_seekbar_track_height"/>
- </shape>
- </clip>
- </item>
-
-</layer-list>
diff --git a/tests/DirectRenderingClusterSample/res/drawable/seekbar_thumb.xml b/tests/DirectRenderingClusterSample/res/drawable/seekbar_thumb.xml
deleted file mode 100644
index 1d0b4a1..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/seekbar_thumb.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2018, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="oval">
- <solid android:color="@color/progress_bar_thumb_color"/>
- <size
- android:width="@dimen/playback_seekbar_thumb_width"
- android:height="@dimen/playback_seekbar_thumb_height"/>
-</shape>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/speedometer.xml b/tests/DirectRenderingClusterSample/res/drawable/speedometer.xml
deleted file mode 100644
index d97c54e..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/speedometer.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:aapt="http://schemas.android.com/aapt"
- android:width="200dp"
- android:height="200dp"
- android:viewportHeight="64"
- android:viewportWidth="64">
-
- <path
- android:pathData="M0,32
- A32,32 0 1,1 64,32
- A32,32 0 1,1 0,32 Z">
- <aapt:attr name="android:fillColor">
- <gradient
- android:centerX="32"
- android:centerY="32"
- android:gradientRadius="32"
- android:type="radial">
- <item
- android:color="#FF000000"
- android:offset="0.0"/>
- <item
- android:color="#FF000000"
- android:offset="0.94"/>
- <item
- android:color="#00000000"
- android:offset="1.0"/>
- </gradient>
- </aapt:attr>
- </path>
-
- <path
- android:fillColor="#000"
- android:strokeWidth="0.25"
- android:pathData="M2,32
- A30,30 0 1,1 62,32
- A30,30 0 1,1 2,32 Z">
- <aapt:attr name="android:strokeColor">
- <gradient
- android:startX="0"
- android:startY="10"
- android:startColor="#000"
- android:endX="0"
- android:endY="150"
- android:endColor="#000"
- android:centerColor="#DDD"
- android:type="linear"/>
- </aapt:attr>
- </path>
-
-</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/layout/activity_main.xml b/tests/DirectRenderingClusterSample/res/layout/activity_main.xml
deleted file mode 100644
index fa8db14..0000000
--- a/tests/DirectRenderingClusterSample/res/layout/activity_main.xml
+++ /dev/null
@@ -1,237 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/activity_main"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@android:color/background_dark"
- android:windowIsFloating="true"
- tools:context=".MainClusterActivity">
-
- <androidx.constraintlayout.widget.Guideline
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/left_unobscured"
- android:orientation="vertical"
- app:layout_constraintGuide_begin="@dimen/speedometer_overlap_width"/>
-
- <androidx.constraintlayout.widget.Guideline
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/right_unobscured"
- android:orientation="vertical"
- app:layout_constraintGuide_end="@dimen/speedometer_overlap_width"/>
-
- <androidx.constraintlayout.widget.Guideline
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/gauges_top"
- android:orientation="horizontal"
- app:layout_constraintGuide_begin="@dimen/speedometer_top"/>
-
- <androidx.viewpager.widget.ViewPager
- android:id="@+id/pager"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- app:layout_constraintTop_toTopOf="parent"
- app:layout_constraintBottom_toTopOf="@+id/info"/>
-
- <LinearLayout
- android:id="@+id/info"
- android:layout_width="0dp"
- android:layout_height="@dimen/info_height"
- app:layout_constraintLeft_toRightOf="@+id/left_unobscured"
- app:layout_constraintRight_toLeftOf="@+id/right_unobscured"
- app:layout_constraintBottom_toBottomOf="parent"
- android:gravity="center">
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:gravity="start">
-
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:includeFontPadding="false"
- android:text="@string/info_fuel_label"
- android:textSize="@dimen/info_label_text_size"/>
-
- <TextView
- android:id="@+id/info_fuel"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:includeFontPadding="false"
- android:text="@string/info_value_empty"
- android:textSize="@dimen/info_value_text_size"/>
-
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:includeFontPadding="false"
- android:text="@string/info_range_label"
- android:textSize="@dimen/info_label_text_size"/>
-
- <TextView
- android:id="@+id/info_range"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:includeFontPadding="false"
- android:text="@string/info_value_empty"
- android:textSize="@dimen/info_value_text_size"/>
- </LinearLayout>
-
- <include
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:id="@+id/navigation_state"
- layout="@layout/include_navigation_state"/>
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:gravity="end">
-
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:includeFontPadding="false"
- android:text="@string/info_speed_label"
- android:textSize="@dimen/info_label_text_size"/>
-
- <TextView
- android:id="@+id/info_speed"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:includeFontPadding="false"
- android:text="@string/info_value_empty"
- android:textSize="@dimen/info_value_text_size"/>
-
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:includeFontPadding="false"
- android:text="@string/info_rpm_label"
- android:textSize="@dimen/info_label_text_size"/>
-
- <TextView
- android:id="@+id/info_rpm"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:includeFontPadding="false"
- android:text="@string/info_value_empty"
- android:textSize="@dimen/info_value_text_size"/>
- </LinearLayout>
- </LinearLayout>
-
- <ImageView
- android:id="@+id/left_gauge"
- android:layout_width="@dimen/speedometer_width"
- android:layout_height="@dimen/speedometer_height"
- android:src="@drawable/speedometer"
- android:elevation="2dp"
- app:layout_constraintTop_toBottomOf="@+id/gauges_top"
- app:layout_constraintRight_toLeftOf="@+id/left_unobscured"/>
-
- <ImageView
- android:id="@+id/right_gauge"
- android:layout_width="@dimen/speedometer_width"
- android:layout_height="@dimen/speedometer_height"
- android:src="@drawable/speedometer"
- android:elevation="2dp"
- app:layout_constraintTop_toBottomOf="@+id/gauges_top"
- app:layout_constraintLeft_toRightOf="@+id/right_unobscured"/>
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:translationZ="4dp"
- app:layout_constraintLeft_toLeftOf="parent"
- app:layout_constraintBottom_toBottomOf="parent">
-
- <Button
- android:id="@+id/btn_nav"
- android:layout_width="@dimen/facet_icon_size"
- android:layout_height="@dimen/facet_icon_size"
- android:layout_margin="@dimen/facet_icon_margin"
- android:background="@drawable/ic_nav"
- android:backgroundTint="@color/icon_color"
- android:focusableInTouchMode="true" />
- <Button
- android:id="@+id/btn_phone"
- android:layout_width="@dimen/facet_icon_size"
- android:layout_height="@dimen/facet_icon_size"
- android:layout_margin="@dimen/facet_icon_margin"
- android:background="@drawable/ic_phone"
- android:backgroundTint="@color/icon_color"
- android:focusableInTouchMode="true" />
- <Button
- android:id="@+id/btn_music"
- android:layout_width="@dimen/facet_icon_size"
- android:layout_height="@dimen/facet_icon_size"
- android:layout_margin="@dimen/facet_icon_margin"
- android:background="@drawable/ic_music"
- android:backgroundTint="@color/icon_color"
- android:focusableInTouchMode="true" />
- <Button
- android:id="@+id/btn_car_info"
- android:layout_width="@dimen/facet_icon_size"
- android:layout_height="@dimen/facet_icon_size"
- android:layout_margin="@dimen/facet_icon_margin"
- android:background="@drawable/ic_car_info"
- android:backgroundTint="@color/icon_color"
- android:focusableInTouchMode="true" />
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:translationZ="4dp"
- app:layout_constraintRight_toRightOf="parent"
- app:layout_constraintBottom_toBottomOf="parent">
-
- <TextView
- android:id="@+id/gear_parked"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginHorizontal="@dimen/gear_icon_margin"
- android:text="@string/gear_parked"
- android:textColor="@color/icon_color"
- android:textSize="@dimen/gear_text_size"/>
-
- <TextView
- android:id="@+id/gear_reverse"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginHorizontal="@dimen/gear_icon_margin"
- android:text="@string/gear_reverse"
- android:textColor="@color/icon_color"
- android:textSize="@dimen/gear_text_size"/>
-
- <TextView
- android:id="@+id/gear_neutral"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginHorizontal="@dimen/gear_icon_margin"
- android:text="@string/gear_neutral"
- android:textColor="@color/icon_color"
- android:textSize="@dimen/gear_text_size"/>
-
- <TextView
- android:id="@+id/gear_drive"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginHorizontal="@dimen/gear_icon_margin"
- android:text="@string/gear_drive"
- android:textColor="@color/icon_color"
- android:textSize="@dimen/gear_text_size"/>
-
- </LinearLayout>
-</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/tests/DirectRenderingClusterSample/res/layout/fragment_car_info.xml b/tests/DirectRenderingClusterSample/res/layout/fragment_car_info.xml
deleted file mode 100644
index 3a1f5ab..0000000
--- a/tests/DirectRenderingClusterSample/res/layout/fragment_car_info.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="com.google.experiments.client.pavelm.fakeclusterux.CarInfoFragment">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="32 psi"
- android:layout_gravity="center_horizontal"
- android:layout_marginLeft="-80dp"
- />
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="33 psi"
- android:layout_gravity="center_horizontal"
- android:layout_marginLeft="80dp"
- />
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="33 psi"
- android:layout_gravity="center_horizontal|bottom"
- android:layout_marginLeft="80dp"
- />
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="31 psi"
- android:layout_gravity="center_horizontal|bottom"
- android:layout_marginLeft="-80dp"
- />
-
- <ImageView
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:src="@drawable/car_top_view"
- android:padding="30dp"
- android:scaleType="fitCenter" />
-
-</FrameLayout>
diff --git a/tests/DirectRenderingClusterSample/res/layout/fragment_music.xml b/tests/DirectRenderingClusterSample/res/layout/fragment_music.xml
deleted file mode 100644
index f9c72f7..0000000
--- a/tests/DirectRenderingClusterSample/res/layout/fragment_music.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2018, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<androidx.cardview.widget.CardView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- app:cardElevation="0dp"
- app:cardCornerRadius="6dp">
-
- <com.android.car.apps.common.CrossfadeImageView
- android:id="@+id/album_background"
- android:foreground="?android:attr/selectableItemBackground"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:scaleType="fitStart" />
-
- <View
- android:id="@+id/playback_scrim"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/album_art_scrim"
- android:alpha="@dimen/album_art_scrim_alpha"/>
-
- <androidx.constraintlayout.widget.ConstraintLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:id="@+id/playback_container"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <TextView
- android:id="@+id/app_name"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/playback_fragment_text_margin_top"
- android:layout_marginLeft="@dimen/playback_fragment_text_margin_x"
- android:layout_marginRight="@dimen/playback_fragment_text_margin_x"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:ellipsize="end"
- android:maxLines="1"
- android:includeFontPadding="false"
- app:layout_constraintLeft_toLeftOf="parent"
- app:layout_constraintRight_toRightOf="parent"
- app:layout_constraintTop_toTopOf="parent"/>
-
- <androidx.constraintlayout.widget.Guideline
- android:id="@+id/margin_start"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:orientation="vertical"
- app:layout_constraintGuide_begin="@dimen/fragment_playback_guide_margin_x"/>
-
- <androidx.constraintlayout.widget.Guideline
- android:id="@+id/margin_end"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- app:layout_constraintGuide_end="@dimen/fragment_playback_guide_margin_x"/>
-
- <androidx.constraintlayout.widget.Guideline
- android:id="@+id/margin_top"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- app:layout_constraintGuide_begin="@dimen/fragment_playback_guide_margin_top"/>
-
- <ImageView
- android:id="@+id/album_art"
- android:layout_width="@dimen/playback_album_art_size_normal"
- android:layout_height="@dimen/playback_album_art_size_normal"
- android:layout_marginStart="@dimen/fragment_metadata_art_margin_start"
- android:layout_marginEnd="@dimen/fragment_metadata_art_margin_end"
- android:contentDescription="@string/album_art"
- android:background="@color/album_art_background"
- android:scaleType="centerCrop"
- android:transitionName="@string/album_art"
- app:layout_constraintTop_toTopOf="@+id/app_name"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintStart_toStartOf="@+id/margin_start"
- tools:src="@drawable/ic_person"/>
-
- <include
- android:id="@+id/metadata_subcontainer"
- layout="@layout/metadata_normal"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/fragment_metadata_metadata_margin_start"
- android:layout_marginEnd="@dimen/fragment_metadata_metadata_margin_end"
- app:layout_constraintBottom_toBottomOf="@+id/album_art"
- app:layout_constraintEnd_toEndOf="@+id/margin_end"
- app:layout_constraintStart_toEndOf="@+id/album_art"
- app:layout_constraintTop_toTopOf="@+id/album_art"/>
-
- </androidx.constraintlayout.widget.ConstraintLayout>
-
-</androidx.cardview.widget.CardView>
diff --git a/tests/DirectRenderingClusterSample/res/layout/fragment_navigation.xml b/tests/DirectRenderingClusterSample/res/layout/fragment_navigation.xml
deleted file mode 100644
index 54894c2..0000000
--- a/tests/DirectRenderingClusterSample/res/layout/fragment_navigation.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".NavigationFragment">
-
- <SurfaceView
- android:id="@+id/nav_surface"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
-
- <ProgressBar
- android:id="@+id/progress_bar"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- app:layout_constraintVertical_chainStyle="packed"
- app:layout_constraintLeft_toLeftOf="parent"
- app:layout_constraintRight_toRightOf="parent"
- app:layout_constraintTop_toTopOf="parent"
- app:layout_constraintBottom_toTopOf="@+id/message"/>
-
- <TextView
- android:id="@+id/message"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/select_nav_app"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintLeft_toLeftOf="parent"
- app:layout_constraintRight_toRightOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/progress_bar"/>
-
- <ImageView
- android:layout_width="match_parent"
- android:layout_height="@dimen/navigation_gradient_height"
- android:src="@drawable/gradient_top"
- app:layout_constraintTop_toTopOf="parent"/>
-
- <ImageView
- android:layout_width="match_parent"
- android:layout_height="@dimen/navigation_gradient_height"
- android:src="@drawable/gradient_bottom"
- app:layout_constraintBottom_toBottomOf="parent"/>
-
-</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/layout/fragment_phone.xml b/tests/DirectRenderingClusterSample/res/layout/fragment_phone.xml
deleted file mode 100644
index b7f903b..0000000
--- a/tests/DirectRenderingClusterSample/res/layout/fragment_phone.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2019 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <FrameLayout
- android:id="@+id/user_profile_container"
- android:layout_width="match_parent"
- android:gravity="center"
- android:layout_height="0dp"
- android:layout_weight="1">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center"
- android:orientation="vertical">
- <ImageView
- android:id="@+id/avatar"
- android:layout_width="@dimen/large_avatar_icon_size"
- android:layout_height="@dimen/large_avatar_icon_size"
- android:layout_gravity="center"
- android:scaleType="fitCenter" />
- <TextView
- android:id="@+id/title"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="@dimen/user_profile_title_padding_top"
- android:focusable="true"
- android:maxLines="1"
- android:gravity="center"/>
- <TextView
- android:id="@+id/body"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="@dimen/user_profile_body_padding_top"
- android:gravity="center"
- android:maxLines="1"/>
- </LinearLayout>
-
- </FrameLayout>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/layout/include_navigation_state.xml b/tests/DirectRenderingClusterSample/res/layout/include_navigation_state.xml
deleted file mode 100644
index 8f1196a..0000000
--- a/tests/DirectRenderingClusterSample/res/layout/include_navigation_state.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal">
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical">
-
- <ImageView
- android:id="@+id/maneuver"
- android:layout_width="@dimen/maneuver_width"
- android:layout_height="@dimen/maneuver_height"
- android:layout_marginLeft="@dimen/maneuver_margin"
- android:layout_marginRight="@dimen/maneuver_margin"
- android:tint="@android:color/white"/>
- <ImageView
- android:id="@+id/provided_maneuver"
- android:layout_width="@dimen/provided_maneuver_width"
- android:layout_height="@dimen/provided_maneuver_height"
- android:layout_gravity="center"/>
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_weight="1.0">
-
- <TextView
- android:id="@+id/distance"
- android:layout_width="@dimen/distance_width"
- android:layout_height="wrap_content"
- android:maxLines="1"
- android:textSize="@dimen/distance_text_size"/>
-
- <android.car.cluster.sample.LaneView
- android:id="@+id/lane"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/laneview_height"
- android:layout_alignParentRight="true"/>
- </LinearLayout>
-
- <android.car.cluster.sample.CueView
- android:id="@+id/cue"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:maxLines="1"
- android:textSize="@dimen/cue_text_size"/>
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- <TextView
- android:id="@+id/eta"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginRight="@dimen/eta_margin_right"
- android:maxLines="1"
- android:textSize="@dimen/eta_text_size"/>
-
- <TextView
- android:id="@+id/segment"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:maxLines="1"
- android:ellipsize="end"
- android:textSize="@dimen/segment_text_size"/>
- </LinearLayout>
-
- <android.car.cluster.sample.LaneView
- android:id="@+id/provided_lane"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/provided_laneview_height"
- android:layout_marginLeft="@dimen/distance_width"/>
- </LinearLayout>
-</LinearLayout>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/layout/metadata_normal.xml b/tests/DirectRenderingClusterSample/res/layout/metadata_normal.xml
deleted file mode 100644
index 5cb75a6..0000000
--- a/tests/DirectRenderingClusterSample/res/layout/metadata_normal.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2018, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<androidx.constraintlayout.widget.ConstraintLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/metadata_subcontainer"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:focusable="false">
-
- <TextView
- android:id="@+id/title"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:ellipsize="end"
- android:includeFontPadding="false"
- android:maxLines="@integer/playback_title_text_max_lines"
- android:textAppearance="?android:attr/textAppearanceLarge"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent"
- tools:text="Body 1 Header"/>
- <TextView
- android:id="@+id/subtitle"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/metadata_normal_subtitle_margin_top"
- android:layout_marginEnd="@dimen/metadata_normal_subtitle_margin_end"
- android:ellipsize="end"
- android:maxLines="@integer/playback_subtitle_text_max_lines"
- android:textAppearance="?android:attr/textAppearanceMedium"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintEnd_toStartOf="@+id/time"
- app:layout_constraintTop_toBottomOf="@+id/title"
- tools:text="Body 2"/>
- <TextView
- android:id="@+id/time"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/metadata_normal_time_margin_top"
- android:ellipsize="end"
- android:maxLines="@integer/playback_subtitle_text_max_lines"
- android:gravity="end"
- android:textAppearance="?android:attr/textAppearanceMedium"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/title"
- tools:text="3:27 / 4:03"/>
- <SeekBar
- android:id="@+id/seek_bar"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/metadata_normal_seek_margin_top"
- android:clickable="false"
- android:focusable="false"
- android:paddingEnd="@dimen/playback_seekbar_padding_end"
- android:paddingStart="@dimen/playback_seekbar_padding_start"
- android:progressDrawable="@drawable/seekbar_background"
- android:thumb="@drawable/seekbar_thumb"
- android:splitTrack="false"
- android:progressTint="@color/progress_bar_highlight"
- android:progressBackgroundTint="@color/progress_bar_background"
- android:background="@null"
- android:visibility="invisible"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/subtitle"
- tools:progress="70"
- tools:visibility="visible"/>
-
-</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/tests/DirectRenderingClusterSample/res/mipmap-hdpi/ic_launcher.png b/tests/DirectRenderingClusterSample/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cde69bc..0000000
--- a/tests/DirectRenderingClusterSample/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/mipmap-mdpi/ic_launcher.png b/tests/DirectRenderingClusterSample/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c133a0c..0000000
--- a/tests/DirectRenderingClusterSample/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/mipmap-xhdpi/ic_launcher.png b/tests/DirectRenderingClusterSample/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index bfa42f0..0000000
--- a/tests/DirectRenderingClusterSample/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/mipmap-xxhdpi/ic_launcher.png b/tests/DirectRenderingClusterSample/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 324e72c..0000000
--- a/tests/DirectRenderingClusterSample/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/mipmap-xxxhdpi/ic_launcher.png b/tests/DirectRenderingClusterSample/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index aee44e1..0000000
--- a/tests/DirectRenderingClusterSample/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/DirectRenderingClusterSample/res/values-en-rUS/dimens.xml b/tests/DirectRenderingClusterSample/res/values-en-rUS/dimens.xml
deleted file mode 100644
index 05eef22..0000000
--- a/tests/DirectRenderingClusterSample/res/values-en-rUS/dimens.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <!-- -->
- <!-- Sensor value conversion constants -->
- <!-- -->
- <!-- Speed: meters per second to miles per hour -->
- <item name="speed_factor" format="float" type="dimen">2.236936</item>
- <!-- Distance: miles to meters -->
- <item name="distance_factor" format="float" type="dimen">1609.344</item>
-</resources>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/values-w820dp/dimens.xml b/tests/DirectRenderingClusterSample/res/values-w820dp/dimens.xml
deleted file mode 100644
index 63fc816..0000000
--- a/tests/DirectRenderingClusterSample/res/values-w820dp/dimens.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<resources>
- <!-- Example customization of dimensions originally defined in res/values/dimens.xml
- (such as screen margins) for screens with more than 820dp of available width. This
- would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
- <dimen name="activity_horizontal_margin">64dp</dimen>
-</resources>
diff --git a/tests/DirectRenderingClusterSample/res/values/colors.xml b/tests/DirectRenderingClusterSample/res/values/colors.xml
deleted file mode 100644
index c40f199..0000000
--- a/tests/DirectRenderingClusterSample/res/values/colors.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <color name="colorPrimary">#3F51B5</color>
- <color name="colorPrimaryDark">#303F9F</color>
- <color name="colorAccent">#FF4081</color>
- <color name="darkBlue">#2b2b77</color>
-
- <!-- Gear and facet icon colors -->
- <color name="icon_selected">#6EDDFF</color>
- <color name="icon_unselected">#1B378A</color>
-
- <!-- LaneView highlight colors -->
- <color name="laneDirection">#888888</color>
- <color name="laneDirectionHighlighted">#FFFFFF</color>
-
- <!-- Traffic colors -->
- <color name="low_traffic">#0F9D58</color>
- <color name="medium_traffic">#F2B300</color>
- <color name="high_traffic">#E06055</color>
- <color name="unknown_traffic">#4285F4</color>
-
- <color name="album_art_background">@*android:color/car_grey_100</color>
- <!-- Color used on the placeholder album art -->
- <color name="album_art_placeholder_color">@*android:color/car_grey_800</color>
- <!-- Color used on the progress bar background -->
- <color name="progress_bar_background">@*android:color/car_seekbar_track_background</color>
- <!-- Color used on the progress bar -->
- <color name="progress_bar_highlight">@*android:color/car_accent</color>
- <!-- Color used on the thumb of the progress bar -->
- <color name="progress_bar_thumb_color">@*android:color/car_accent</color>
-</resources>
diff --git a/tests/DirectRenderingClusterSample/res/values/dimens.xml b/tests/DirectRenderingClusterSample/res/values/dimens.xml
deleted file mode 100644
index 21aec67..0000000
--- a/tests/DirectRenderingClusterSample/res/values/dimens.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<resources>
- <!-- Default screen margins, per the Android Design guidelines. -->
- <dimen name="activity_horizontal_margin">16dp</dimen>
- <dimen name="activity_vertical_margin">16dp</dimen>
- <!-- Size and position of speedometers -->
- <dimen name="speedometer_height">600dp</dimen>
- <dimen name="speedometer_width">600dp</dimen>
- <dimen name="speedometer_overlap_width">90dp</dimen>
- <dimen name="speedometer_top">20dp</dimen>
- <!-- Navigation fragment gradients -->
- <dimen name="navigation_gradient_height">15dp</dimen>
- <!-- Facet buttons -->
- <dimen name="facet_icon_size">30dp</dimen>
- <dimen name="facet_icon_margin">5dp</dimen>
- <!-- Gears -->
- <dimen name="gear_text_size">28sp</dimen>
- <dimen name="gear_icon_margin">5dp</dimen>
- <!-- Information space -->
- <dimen name="info_height">100dp</dimen>
- <dimen name="info_label_text_size">10sp</dimen>
- <dimen name="info_value_text_size">20sp</dimen>
-
- <!-- -->
- <!-- Navigation state componenets -->
- <!-- -->
- <dimen name="nav_state_width">170dp</dimen>
- <!-- Maneuver -->
- <dimen name="maneuver_width">60dp</dimen>
- <dimen name="maneuver_height">60dp</dimen>
- <dimen name="maneuver_margin">8dp</dimen>
- <dimen name="provided_maneuver_width">30dp</dimen>
- <dimen name="provided_maneuver_height">30dp</dimen>
- <!-- Distance -->
- <dimen name="distance_width">125dp</dimen>
- <dimen name="distance_text_size">20sp</dimen>
- <!-- Segment -->
- <dimen name="segment_text_size">15sp</dimen>
- <!-- ETA -->
- <dimen name="eta_margin_right">15dp</dimen>
- <dimen name="eta_text_size">15sp</dimen>
- <!-- Cue -->
- <dimen name="cue_text_size">15sp</dimen>
- <!-- Lane -->
- <dimen name="laneview_height">25dp</dimen>
- <dimen name="provided_laneview_height">25dp</dimen>
- <dimen name="lane_width">50dp</dimen>
- <dimen name="lane_height">50dp</dimen>
-
- <dimen name="lane_icon_offset">12.5dp</dimen>
-
- <!-- -->
- <!-- Sensor value conversion constants -->
- <!-- -->
- <!-- Speed: meters per second to kilometers per hour -->
- <item name="speed_factor" format="float" type="dimen">3.6</item>
- <!-- Distance: kilometers to meters -->
- <item name="distance_factor" format="float" type="dimen">1000</item>
-
- <!-- fragment_metadata.xml -->
- <dimen name="fragment_metadata_queue_divider_margin">@*android:dimen/car_keyline_1</dimen>
- <dimen name="fragment_metadata_queue_margin_top">@*android:dimen/car_padding_4</dimen>
- <dimen name="fragment_metadata_metadata_margin_start">@*android:dimen/car_padding_4</dimen>
- <dimen name="fragment_metadata_metadata_margin_end">@*android:dimen/car_keyline_1</dimen>
- <dimen name="fragment_metadata_art_margin_start">@*android:dimen/car_keyline_1</dimen>
- <dimen name="fragment_metadata_art_margin_end">@*android:dimen/car_padding_4</dimen>
-
- <!-- metadata_normal.xml -->
- <dimen name="metadata_normal_subtitle_margin_top">@*android:dimen/car_padding_1</dimen>
- <dimen name="metadata_normal_time_margin_top">@*android:dimen/car_padding_1</dimen>
- <dimen name="metadata_normal_seek_margin_top">@*android:dimen/car_padding_4</dimen>
- <dimen name="metadata_normal_subtitle_margin_end">@*android:dimen/car_padding_3</dimen>
-
- <!-- Size of the album art thumbnail -->
- <dimen name="playback_album_art_size_normal">156dp</dimen>
-
- <!-- Playback seekbar track height -->
- <dimen name="playback_seekbar_track_height">8dp</dimen>
-
- <!-- Paddings of playback seekbar -->
- <dimen name="playback_seekbar_padding_start">10dp</dimen>
- <dimen name="playback_seekbar_padding_end">10dp</dimen>
-
- <!-- Size of the thumb in the playback seekbar -->
- <dimen name="playback_seekbar_thumb_height">20dp</dimen>
- <dimen name="playback_seekbar_thumb_width">20dp</dimen>
-
- <!-- fragment_playback.xml and fragment_playback_with_queue.xml -->
- <dimen name="fragment_playback_guide_margin_x">@*android:dimen/car_margin</dimen>
- <dimen name="fragment_playback_guide_margin_top">@*android:dimen/car_padding_4</dimen>
-
- <!-- -->
- <!-- Communication Facet -->
- <!-- -->
- <dimen name="user_profile_title_padding_top">@*android:dimen/car_padding_3</dimen>
- <dimen name="user_profile_body_padding_top">@*android:dimen/car_padding_3</dimen>
-
- <dimen name="large_avatar_icon_size">@dimen/car_large_avatar_size</dimen>
-</resources>
diff --git a/tests/DirectRenderingClusterSample/res/values/strings.xml b/tests/DirectRenderingClusterSample/res/values/strings.xml
deleted file mode 100644
index 5ec6198..0000000
--- a/tests/DirectRenderingClusterSample/res/values/strings.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<resources>
- <string name="app_name" translatable="false">Fake Cluster Implementation</string>
-
- <!-- TODO: Remove or change this placeholder text -->
- <string name="hello_blank_fragment" translatable="false">Hello blank fragment</string>
-
- <!-- Message to show when a navigation app hasn't been selected yet. [CHAR LIMIT=100] -->
- <string name="select_nav_app" translatable="false">Select a navigation app on the main unit.</string>
-
- <!-- Gears texts [CHAR LIMIT=1] -->
- <string name="gear_parked" translatable="false">P</string>
- <string name="gear_reverse" translatable="false">R</string>
- <string name="gear_neutral" translatable="false">N</string>
- <string name="gear_drive" translatable="false">D</string>
-
- <!-- Information labels (shown next to driving directions) [CHAR LIMIT=30] -->
- <string name="info_fuel_label" translatable="false">Fuel</string>
- <string name="info_speed_label" translatable="false">Speed</string>
- <string name="info_range_label" translatable="false">Range</string>
- <string name="info_rpm_label" translatable="false">RPM</string>
- <string name="info_value_empty" translatable="false">-</string>
-
- <!-- Marker used to insert images inside rich-text strings. This string is never shown or spoken
- to the user. Instead a image would be rendered in its place -->
- <string name="span_image" translatable="false">[Image]</string>
-</resources>
diff --git a/tests/DirectRenderingClusterSample/res/values/styles.xml b/tests/DirectRenderingClusterSample/res/values/styles.xml
deleted file mode 100644
index cd5f552..0000000
--- a/tests/DirectRenderingClusterSample/res/values/styles.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<resources>
- <style name="noAnimTheme" parent="android:Theme">
- <item name="android:windowAnimationStyle">@null</item>
- </style>
-</resources>
diff --git a/tests/DirectRenderingClusterSample/res/values/themes.xml b/tests/DirectRenderingClusterSample/res/values/themes.xml
deleted file mode 100644
index 972a036..0000000
--- a/tests/DirectRenderingClusterSample/res/values/themes.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<resources>
- <style name="Theme.ClusterTheme" parent="@android:style/Theme.Black.NoTitleBar.Fullscreen">
- <item name="android:windowAnimationStyle">@null</item>
- </style>
-</resources>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ActivityMonitor.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ActivityMonitor.java
deleted file mode 100644
index 6cabd69..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ActivityMonitor.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import android.annotation.Nullable;
-import android.app.ActivityManager;
-import android.app.ActivityManager.StackInfo;
-import android.app.IActivityManager;
-import android.app.IProcessObserver;
-import android.app.TaskStackListener;
-import android.content.ComponentName;
-import android.os.Handler;
-import android.os.RemoteException;
-import android.util.Log;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Top activity monitor, allows listeners to be notified when a new activity comes to the foreground
- * on a particular device.
- */
-public class ActivityMonitor {
- private static final String TAG = "Cluster.ActivityMonitor";
-
- /**
- * Listener of activity changes
- */
- public interface ActivityListener {
- /**
- * Invoked when a new activity becomes the top activity on a particular display.
- */
- void onTopActivityChanged(int displayId, @Nullable ComponentName activity);
- }
-
- private IActivityManager mActivityManager;
- // Listeners of top activity changes, indexed by the displayId they are interested on.
- private final Map<Integer, Set<ActivityListener>> mListeners = new HashMap<>();
- private final Handler mHandler = new Handler();
- private final IProcessObserver.Stub mProcessObserver = new IProcessObserver.Stub() {
- @Override
- public void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities) {
- notifyTopActivities();
- }
-
- @Override
- public void onForegroundServicesChanged(int pid, int uid, int fgServicetypes) {
- }
-
- @Override
- public void onProcessDied(int pid, int uid) {
- notifyTopActivities();
- }
- };
- private final TaskStackListener mTaskStackListener = new TaskStackListener() {
- @Override
- public void onTaskStackChanged() {
- Log.i(TAG, "onTaskStackChanged");
- notifyTopActivities();
- }
- };
-
- /**
- * Registers a new listener to receive activity updates on a particular display
- *
- * @param displayId identifier of the display to monitor
- * @param listener listener to be notified
- */
- public void addListener(int displayId, ActivityListener listener) {
- mListeners.computeIfAbsent(displayId, k -> new HashSet<>()).add(listener);
- }
-
- /**
- * Unregisters a listener previously registered with {@link #addListener(int, ActivityListener)}
- */
- public void removeListener(int displayId, ActivityListener listener) {
- mListeners.computeIfAbsent(displayId, k -> new HashSet<>()).remove(listener);
- }
-
- /**
- * Starts monitoring activity changes. {@link #stop()} should be invoked to release resources.
- */
- public void start() {
- mActivityManager = ActivityManager.getService();
- // Monitoring both listeners are necessary as there are cases where one listener cannot
- // monitor activity change.
- try {
- mActivityManager.registerProcessObserver(mProcessObserver);
- mActivityManager.registerTaskStackListener(mTaskStackListener);
- } catch (RemoteException e) {
- Log.e(TAG, "Cannot register activity monitoring", e);
- throw new RuntimeException(e);
- }
- notifyTopActivities();
- }
-
- /**
- * Stops monitoring activity changes. Should be invoked when this monitor is not longer used.
- */
- public void stop() {
- if (mActivityManager == null) {
- return;
- }
- try {
- mActivityManager.unregisterProcessObserver(mProcessObserver);
- mActivityManager.unregisterTaskStackListener(mTaskStackListener);
- } catch (RemoteException e) {
- Log.e(TAG, "Cannot unregister activity monitoring. Ignoring", e);
- }
- mActivityManager = null;
- }
-
- /**
- * Notifies listeners on changes of top activities. {@link ActivityManager} might trigger
- * updates on threads different than UI.
- */
- private void notifyTopActivities() {
- mHandler.post(() -> {
- try {
- List<StackInfo> infos = mActivityManager.getAllStackInfos();
- for (StackInfo info : infos) {
- Set<ActivityListener> listeners = mListeners.get(info.displayId);
- if (listeners != null && !listeners.isEmpty()) {
- for (ActivityListener listener : listeners) {
- listener.onTopActivityChanged(info.displayId, info.topActivity);
- }
- }
- }
- } catch (RemoteException e) {
- Log.e(TAG, "Cannot getTasks", e);
- }
- });
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/CarInfoFragment.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/CarInfoFragment.java
deleted file mode 100644
index 87d57e5..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/CarInfoFragment.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.fragment.app.Fragment;
-
-/**
- * A simple {@link Fragment} subclass.
- */
-public class CarInfoFragment extends Fragment {
-
-
- public CarInfoFragment() {
- // Required empty public constructor
- }
-
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // Inflate the layout for this fragment
- return inflater.inflate(R.layout.fragment_car_info, container, false);
- }
-
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterDisplayProvider.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterDisplayProvider.java
deleted file mode 100644
index 007533c..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterDisplayProvider.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.car.cluster.sample;
-
-import android.annotation.Nullable;
-import android.content.Context;
-import android.hardware.display.DisplayManager;
-import android.hardware.display.DisplayManager.DisplayListener;
-import android.os.SystemProperties;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.Display;
-import android.view.DisplayAddress;
-
-/**
- * This class provides a display for instrument cluster renderer.
- * <p>
- * By default it will try to provide physical secondary display if it is connected, if secondary
- * display is not connected during creation of this class then it will start networked virtual
- * display and listens for incoming connections.
- *
- * @see {@link NetworkedVirtualDisplay}
- */
-public class ClusterDisplayProvider {
- private static final String TAG = "Cluster.DisplayProvider";
-
- private static final String RO_CLUSTER_DISPLAY_PORT = "ro.car.cluster.displayport";
- private static final String PERSIST_CLUSTER_DISPLAY_PORT =
- "persist.car.cluster.displayport";
- private static final int NETWORKED_DISPLAY_WIDTH = 1280;
- private static final int NETWORKED_DISPLAY_HEIGHT = 720;
- private static final int NETWORKED_DISPLAY_DPI = 320;
-
- private final DisplayListener mListener;
- private final DisplayManager mDisplayManager;
-
- private NetworkedVirtualDisplay mNetworkedVirtualDisplay;
- private int mClusterDisplayId = -1;
-
- ClusterDisplayProvider(Context context, DisplayListener clusterDisplayListener) {
- mListener = clusterDisplayListener;
- mDisplayManager = context.getSystemService(DisplayManager.class);
-
- Display clusterDisplay = getInstrumentClusterDisplay(mDisplayManager);
- if (clusterDisplay != null) {
- Log.i(TAG, String.format("Found display: %s (id: %d, owner: %s)",
- clusterDisplay.getName(), clusterDisplay.getDisplayId(),
- clusterDisplay.getOwnerPackageName()));
- mClusterDisplayId = clusterDisplay.getDisplayId();
- clusterDisplayListener.onDisplayAdded(clusterDisplay.getDisplayId());
- trackClusterDisplay(null /* no need to track display by name */);
- } else {
- Log.i(TAG, "No physical cluster display found, starting network display");
- setupNetworkDisplay(context);
- }
- }
-
- private void setupNetworkDisplay(Context context) {
- mNetworkedVirtualDisplay = new NetworkedVirtualDisplay(context,
- NETWORKED_DISPLAY_WIDTH, NETWORKED_DISPLAY_HEIGHT, NETWORKED_DISPLAY_DPI);
- String displayName = mNetworkedVirtualDisplay.start();
- trackClusterDisplay(displayName);
- }
-
- private void trackClusterDisplay(@Nullable String displayName) {
- mDisplayManager.registerDisplayListener(new DisplayListener() {
- @Override
- public void onDisplayAdded(int displayId) {
- boolean clusterDisplayAdded = false;
-
- if (displayName == null && mClusterDisplayId == -1) {
- mClusterDisplayId = displayId;
- clusterDisplayAdded = true;
- } else {
- Display display = mDisplayManager.getDisplay(displayId);
- if (display != null && TextUtils.equals(display.getName(), displayName)) {
- mClusterDisplayId = displayId;
- clusterDisplayAdded = true;
- }
- }
-
- if (clusterDisplayAdded) {
- mListener.onDisplayAdded(displayId);
- }
- }
-
- @Override
- public void onDisplayRemoved(int displayId) {
- if (displayId == mClusterDisplayId) {
- mClusterDisplayId = -1;
- mListener.onDisplayRemoved(displayId);
- }
- }
-
- @Override
- public void onDisplayChanged(int displayId) {
- if (displayId == mClusterDisplayId) {
- mListener.onDisplayChanged(displayId);
- }
- }
-
- }, null);
- }
-
- private static Display getInstrumentClusterDisplay(DisplayManager displayManager) {
- Display[] displays = displayManager.getDisplays();
- Log.d(TAG, "There are currently " + displays.length + " displays connected.");
-
- final int displayPortPrimary = 0; // primary port should not be instrument cluster.
- int displayPort = SystemProperties.getInt(PERSIST_CLUSTER_DISPLAY_PORT,
- displayPortPrimary);
- if (displayPort == displayPortPrimary) {
- displayPort = SystemProperties.getInt(RO_CLUSTER_DISPLAY_PORT,
- displayPortPrimary);
- if (displayPort == displayPortPrimary) {
- return null;
- }
- }
- // match port for system display ( = null getOwnerPackageName())
- // with separate check for main display as main display should be never picked up.
- for (Display display : displays) {
- if (display.getDisplayId() != Display.DEFAULT_DISPLAY
- && display.getOwnerPackageName() == null
- && display.getAddress() != null
- && display.getAddress() instanceof DisplayAddress.Physical) {
- final byte port = ((DisplayAddress.Physical) display.getAddress()).getPort();
- if (displayPort == port) {
- return display;
- }
- }
- }
- return null;
- }
-
- @Override
- public String toString() {
- return getClass().getSimpleName() + "{"
- + " clusterDisplayId = " + mClusterDisplayId
- + "}";
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterRenderingServiceImpl.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterRenderingServiceImpl.java
deleted file mode 100644
index 80a94e1..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterRenderingServiceImpl.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
-
-import static java.lang.Integer.parseInt;
-
-import android.annotation.Nullable;
-import android.app.ActivityOptions;
-import android.car.cluster.ClusterActivityState;
-import android.car.cluster.renderer.InstrumentClusterRenderingService;
-import android.car.cluster.renderer.NavigationRenderer;
-import android.car.navigation.CarNavigationInstrumentCluster;
-import android.content.Intent;
-import android.graphics.Rect;
-import android.hardware.display.DisplayManager.DisplayListener;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.provider.Settings.Global;
-import android.util.Log;
-import android.view.Display;
-import android.view.InputDevice;
-import android.view.KeyEvent;
-
-import androidx.car.cluster.navigation.NavigationState;
-import androidx.versionedparcelable.ParcelUtils;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.function.Consumer;
-
-/**
- * Implementation of {@link InstrumentClusterRenderingService} which renders an activity on a
- * virtual display that is transmitted to an external screen.
- */
-public class ClusterRenderingServiceImpl extends InstrumentClusterRenderingService implements
- ImageResolver.BitmapFetcher {
- private static final String TAG = "Cluster.SampleService";
-
- private static final int NO_DISPLAY = -1;
-
- static final String LOCAL_BINDING_ACTION = "local";
- static final String NAV_STATE_BUNDLE_KEY = "navstate";
-
- private List<ServiceClient> mClients = new ArrayList<>();
- private ClusterDisplayProvider mDisplayProvider;
- private int mDisplayId = NO_DISPLAY;
- private final IBinder mLocalBinder = new LocalBinder();
- private final ImageResolver mImageResolver = new ImageResolver(this);
-
- public interface ServiceClient {
- void onKeyEvent(KeyEvent keyEvent);
- void onNavigationStateChange(NavigationState navState);
- }
-
- public class LocalBinder extends Binder {
- ClusterRenderingServiceImpl getService() {
- return ClusterRenderingServiceImpl.this;
- }
- }
-
- private final DisplayListener mDisplayListener = new DisplayListener() {
- @Override
- public void onDisplayAdded(int displayId) {
- Log.i(TAG, "Cluster display found, displayId: " + displayId);
- mDisplayId = displayId;
- launchMainActivity();
- }
-
- @Override
- public void onDisplayRemoved(int displayId) {
- Log.w(TAG, "Cluster display has been removed");
- }
-
- @Override
- public void onDisplayChanged(int displayId) {
-
- }
- };
-
- public void setActivityLaunchOptions(int displayId, ClusterActivityState state) {
- ActivityOptions options = displayId != Display.INVALID_DISPLAY
- ? ActivityOptions.makeBasic().setLaunchDisplayId(displayId)
- : null;
- setClusterActivityLaunchOptions(options);
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, String.format("activity options set: %s (displayeId: %d)",
- options, options.getLaunchDisplayId()));
- }
- setClusterActivityState(state);
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, String.format("activity state set: %s", state));
- }
- }
-
- public void registerClient(ServiceClient client) {
- mClients.add(client);
- }
-
- public void unregisterClient(ServiceClient client) {
- mClients.remove(client);
- }
-
- public ImageResolver getImageResolver() {
- return mImageResolver;
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- Log.d(TAG, "onBind, intent: " + intent);
- return LOCAL_BINDING_ACTION.equals(intent.getAction())
- ? mLocalBinder
- : super.onBind(intent);
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- Log.d(TAG, "onCreate");
- mDisplayProvider = new ClusterDisplayProvider(this, mDisplayListener);
- }
-
- private void launchMainActivity() {
- ActivityOptions options = ActivityOptions.makeBasic();
- options.setLaunchDisplayId(mDisplayId);
- Intent intent = new Intent(this, MainClusterActivity.class);
- intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
- startActivityAsUser(intent, options.toBundle(), UserHandle.SYSTEM);
- Log.i(TAG, String.format("launching main activity: %s (display: %d)", intent, mDisplayId));
- }
-
- @Override
- public void onKeyEvent(KeyEvent keyEvent) {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "onKeyEvent, keyEvent: " + keyEvent);
- }
- broadcastClientEvent(client -> client.onKeyEvent(keyEvent));
- }
-
- /**
- * Broadcasts an event to all the registered service clients
- *
- * @param event event to broadcast
- */
- private void broadcastClientEvent(Consumer<ServiceClient> event) {
- for (ServiceClient client : mClients) {
- event.accept(client);
- }
- }
-
- @Override
- public NavigationRenderer getNavigationRenderer() {
- NavigationRenderer navigationRenderer = new NavigationRenderer() {
- @Override
- public CarNavigationInstrumentCluster getNavigationProperties() {
- CarNavigationInstrumentCluster config =
- CarNavigationInstrumentCluster.createCluster(1000);
- Log.d(TAG, "getNavigationProperties, returns: " + config);
- return config;
- }
-
- @Override
- public void onNavigationStateChanged(@Nullable Bundle bundle) {
- try {
- if (bundle == null) {
- return;
- }
- StringBuilder bundleSummary = new StringBuilder();
- bundle.setClassLoader(ParcelUtils.class.getClassLoader());
- NavigationState navState = NavigationState
- .fromParcelable(bundle.getParcelable(NAV_STATE_BUNDLE_KEY));
- bundleSummary.append(navState.toString());
-
- // Update clients
- broadcastClientEvent(client -> client.onNavigationStateChange(navState));
- Log.d(TAG, "onNavigationStateChanged(" + bundleSummary + ")");
- } catch (Exception e) {
- Log.e(TAG, "Error parsing event data (" + bundle + ")", e);
- NavigationState navState = new NavigationState.Builder().build();
- broadcastClientEvent(client -> client.onNavigationStateChange(navState));
- }
- }
- };
-
- Log.i(TAG, "createNavigationRenderer, returns: " + navigationRenderer);
- return navigationRenderer;
- }
-
- @Override
- protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
- if (args != null && args.length > 0) {
- execShellCommand(args);
- } else {
- super.dump(fd, writer, args);
- writer.println("DisplayProvider: " + mDisplayProvider);
- }
- }
-
- private void emulateKeyEvent(int keyCode) {
- Log.i(TAG, "emulateKeyEvent, keyCode: " + keyCode);
- long downTime = SystemClock.uptimeMillis();
- long eventTime = SystemClock.uptimeMillis();
- KeyEvent event = obtainKeyEvent(keyCode, downTime, eventTime, KeyEvent.ACTION_DOWN);
- onKeyEvent(event);
-
- eventTime = SystemClock.uptimeMillis();
- event = obtainKeyEvent(keyCode, downTime, eventTime, KeyEvent.ACTION_UP);
- onKeyEvent(event);
- }
-
- private KeyEvent obtainKeyEvent(int keyCode, long downTime, long eventTime, int action) {
- int scanCode = 0;
- if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
- scanCode = 108;
- } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
- scanCode = 106;
- }
- return KeyEvent.obtain(
- downTime,
- eventTime,
- action,
- keyCode,
- 0 /* repeat */,
- 0 /* meta state */,
- 0 /* deviceId*/,
- scanCode /* scancode */,
- KeyEvent.FLAG_FROM_SYSTEM /* flags */,
- InputDevice.SOURCE_KEYBOARD,
- null /* characters */);
- }
-
- private void execShellCommand(String[] args) {
- Log.i(TAG, "execShellCommand, args: " + Arrays.toString(args));
-
- String command = args[0];
-
- switch (command) {
- case "injectKey": {
- if (args.length > 1) {
- emulateKeyEvent(parseInt(args[1]));
- } else {
- Log.i(TAG, "Not enough arguments");
- }
- break;
- }
- case "destroyOverlayDisplay": {
- Settings.Global.putString(getContentResolver(),
- Global.OVERLAY_DISPLAY_DEVICES, "");
- break;
- }
-
- case "createOverlayDisplay": {
- if (args.length > 1) {
- Settings.Global.putString(getContentResolver(),
- Global.OVERLAY_DISPLAY_DEVICES, args[1]);
- } else {
- Log.i(TAG, "Not enough arguments, expected 2");
- }
- break;
- }
-
- case "setUnobscuredArea": {
- if (args.length > 5) {
- Rect unobscuredArea = new Rect(parseInt(args[2]), parseInt(args[3]),
- parseInt(args[4]), parseInt(args[5]));
- setClusterActivityState(args[1],
- ClusterActivityState.create(true, unobscuredArea).toBundle());
- } else {
- Log.i(TAG, "wrong format, expected: category left top right bottom");
- }
- }
- }
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterViewModel.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterViewModel.java
deleted file mode 100644
index 1cf1b24..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterViewModel.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import android.annotation.Nullable;
-import android.app.Application;
-import android.car.Car;
-import android.car.CarAppFocusManager;
-import android.car.VehicleAreaType;
-import android.car.cluster.sample.sensors.Sensor;
-import android.car.cluster.sample.sensors.Sensors;
-import android.car.hardware.CarPropertyValue;
-import android.car.hardware.property.CarPropertyManager;
-import android.car.hardware.property.CarPropertyManager.CarPropertyEventCallback;
-import android.content.ComponentName;
-import android.content.ServiceConnection;
-import android.os.IBinder;
-import android.util.Log;
-import android.util.TypedValue;
-
-import androidx.annotation.NonNull;
-import androidx.core.util.Preconditions;
-import androidx.lifecycle.AndroidViewModel;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MutableLiveData;
-import androidx.lifecycle.Transformations;
-
-import java.text.DecimalFormat;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * {@link AndroidViewModel} for cluster information.
- */
-public class ClusterViewModel extends AndroidViewModel {
- private static final String TAG = "Cluster.ViewModel";
-
- private static final int PROPERTIES_REFRESH_RATE_UI = 5;
-
- private float mSpeedFactor;
- private float mDistanceFactor;
-
- public enum NavigationActivityState {
- /** No activity has been selected to be displayed on the navigation fragment yet */
- NOT_SELECTED,
- /** An activity has been selected, but it is not yet visible to the user */
- LOADING,
- /** Navigation activity is visible to the user */
- VISIBLE,
- }
-
- private ComponentName mFreeNavigationActivity;
- private ComponentName mCurrentNavigationActivity;
- private final MutableLiveData<NavigationActivityState> mNavigationActivityStateLiveData =
- new MutableLiveData<>();
- private final MutableLiveData<Boolean> mNavigationFocus = new MutableLiveData<>(false);
- private Car mCar;
- private CarAppFocusManager mCarAppFocusManager;
- private CarPropertyManager mCarPropertyManager;
- private Map<Sensor<?>, MutableLiveData<?>> mSensorLiveDatas = new HashMap<>();
-
- private ServiceConnection mCarServiceConnection = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- Log.i(TAG, "onServiceConnected, name: " + name + ", service: " + service);
-
- registerAppFocusListener();
- registerCarPropertiesListener();
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- Log.i(TAG, "onServiceDisconnected, name: " + name);
- mCarAppFocusManager = null;
- mCarPropertyManager = null;
- }
- };
-
- private void registerAppFocusListener() {
- mCarAppFocusManager = (CarAppFocusManager) mCar.getCarManager(
- Car.APP_FOCUS_SERVICE);
- if (mCarAppFocusManager != null) {
- mCarAppFocusManager.addFocusListener(
- (appType, active) -> setNavigationFocus(active),
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
- } else {
- Log.e(TAG, "onServiceConnected: unable to obtain CarAppFocusManager");
- }
- }
-
- private void registerCarPropertiesListener() {
- Sensors sensors = Sensors.getInstance();
- mCarPropertyManager = (CarPropertyManager) mCar.getCarManager(Car.PROPERTY_SERVICE);
- for (Integer propertyId : sensors.getPropertyIds()) {
- try {
- mCarPropertyManager.registerCallback(mCarPropertyEventListener,
- propertyId, PROPERTIES_REFRESH_RATE_UI);
- } catch (SecurityException ex) {
- Log.e(TAG, "onServiceConnected: Unable to listen to car property: " + propertyId
- + " sensors: " + sensors.getSensorsForPropertyId(propertyId), ex);
- }
- }
- }
-
- private CarPropertyEventCallback mCarPropertyEventListener = new CarPropertyEventCallback() {
- @Override
- public void onChangeEvent(CarPropertyValue value) {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG,
- "CarProperty change: property " + value.getPropertyId() + ", area"
- + value.getAreaId() + ", value: " + value.getValue());
- }
- for (Sensor<?> sensorId : Sensors.getInstance()
- .getSensorsForPropertyId(value.getPropertyId())) {
- if (sensorId.mAreaId == Sensors.GLOBAL_AREA_ID
- || (sensorId.mAreaId & value.getAreaId()) != 0) {
- setSensorValue(sensorId, value);
- }
- }
- }
-
- @Override
- public void onErrorEvent(int propId, int zone) {
- for (Sensor<?> sensorId : Sensors.getInstance().getSensorsForPropertyId(
- propId)) {
- if (sensorId.mAreaId == VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL
- || (sensorId.mAreaId & zone) != 0) {
- setSensorValue(sensorId, null);
- }
- }
- }
-
- private <T> void setSensorValue(Sensor<T> id, CarPropertyValue<?> value) {
- T newValue = value != null ? id.mAdapter.apply(value) : null;
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "Sensor " + id.mName + " = " + newValue);
- }
- getSensorMutableLiveData(id).setValue(newValue);
- }
- };
-
- /**
- * New {@link ClusterViewModel} instance
- */
- public ClusterViewModel(@NonNull Application application) {
- super(application);
- mCar = Car.createCar(application, mCarServiceConnection);
- mCar.connect();
-
- TypedValue tv = new TypedValue();
- getApplication().getResources().getValue(R.dimen.speed_factor, tv, true);
- mSpeedFactor = tv.getFloat();
-
- getApplication().getResources().getValue(R.dimen.distance_factor, tv, true);
- mDistanceFactor = tv.getFloat();
- }
-
- @Override
- protected void onCleared() {
- super.onCleared();
- mCar.disconnect();
- mCar = null;
- mCarAppFocusManager = null;
- mCarPropertyManager = null;
- }
-
- /**
- * Returns a {@link LiveData} providing the current state of the activity displayed on the
- * navigation fragment.
- */
- public LiveData<NavigationActivityState> getNavigationActivityState() {
- return mNavigationActivityStateLiveData;
- }
-
- /**
- * Returns a {@link LiveData} indicating whether navigation focus is currently being granted
- * or not. This indicates whether a navigation application is currently providing driving
- * directions.
- */
- public LiveData<Boolean> getNavigationFocus() {
- return mNavigationFocus;
- }
-
- /**
- * Returns a {@link LiveData} that tracks the value of a given car sensor. Each sensor has its
- * own data type. The list of all supported sensors can be found at {@link Sensors}
- *
- * @param sensor sensor to observe
- * @param <T> data type of such sensor
- */
- @SuppressWarnings("unchecked")
- @NonNull
- public <T> LiveData<T> getSensor(@NonNull Sensor<T> sensor) {
- return getSensorMutableLiveData(Preconditions.checkNotNull(sensor));
- }
-
- /**
- * Returns the current value of the sensor, directly from the VHAL.
- *
- * @param sensor sensor to read
- * @param <V> VHAL data type
- * @param <T> data type of such sensor
- */
- @Nullable
- public <T> T getSensorValue(@NonNull Sensor<T> sensor) {
- CarPropertyValue<?> value = mCarPropertyManager
- .getProperty(sensor.mPropertyId, sensor.mAreaId);
- return sensor.mAdapter.apply(value);
- }
-
- /**
- * Returns a {@link LiveData} that tracks the fuel level in a range from 0 to 100.
- */
- public LiveData<Integer> getFuelLevel() {
- return Transformations.map(getSensor(Sensors.SENSOR_FUEL), (fuelValue) -> {
- Float fuelCapacityValue = getSensorValue(Sensors.SENSOR_FUEL_CAPACITY);
- if (fuelValue == null || fuelCapacityValue == null || fuelCapacityValue == 0) {
- return null;
- }
- if (fuelValue < 0.0f) {
- return 0;
- }
- if (fuelValue > fuelCapacityValue) {
- return 100;
- }
- return Math.round(fuelValue / (fuelCapacityValue * 100f));
- });
- }
-
- /**
- * Returns a {@link LiveData} that tracks the RPM x 1000
- */
- public LiveData<String> getRPM() {
- return Transformations.map(getSensor(Sensors.SENSOR_RPM), (rpmValue) -> {
- return new DecimalFormat("#0.0").format(rpmValue / 1000f);
- });
- }
-
- /**
- * Returns a {@link LiveData} that tracks the speed in either mi/h or km/h depending on locale.
- */
- public LiveData<Integer> getSpeed() {
- return Transformations.map(getSensor(Sensors.SENSOR_SPEED), (speedValue) -> {
- return Math.round(speedValue * mSpeedFactor);
- });
- }
-
- /**
- * Returns a {@link LiveData} that tracks the range the vehicle has until it runs out of gas.
- */
- public LiveData<Integer> getRange() {
- return Transformations.map(getSensor(Sensors.SENSOR_FUEL_RANGE), (rangeValue) -> {
- return Math.round(rangeValue / mDistanceFactor);
- });
- }
-
- /**
- * Sets the activity selected to be displayed on the cluster when no driving directions are
- * being provided.
- */
- public void setFreeNavigationActivity(ComponentName activity) {
- if (!Objects.equals(activity, mFreeNavigationActivity)) {
- mFreeNavigationActivity = activity;
- updateNavigationActivityLiveData();
- }
- }
-
- /**
- * Sets the activity currently being displayed on the cluster.
- */
- public void setCurrentNavigationActivity(ComponentName activity) {
- if (!Objects.equals(activity, mCurrentNavigationActivity)) {
- mCurrentNavigationActivity = activity;
- updateNavigationActivityLiveData();
- }
- }
-
- /**
- * Sets whether navigation focus is currently being granted or not.
- */
- public void setNavigationFocus(boolean navigationFocus) {
- if (mNavigationFocus.getValue() == null || mNavigationFocus.getValue() != navigationFocus) {
- mNavigationFocus.setValue(navigationFocus);
- updateNavigationActivityLiveData();
- }
- }
-
- private void updateNavigationActivityLiveData() {
- NavigationActivityState newState = calculateNavigationActivityState();
- if (newState != mNavigationActivityStateLiveData.getValue()) {
- mNavigationActivityStateLiveData.setValue(newState);
- }
- }
-
- private NavigationActivityState calculateNavigationActivityState() {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, String.format("Current state: current activity = '%s', free nav activity = "
- + "'%s', focus = %s", mCurrentNavigationActivity,
- mFreeNavigationActivity,
- mNavigationFocus.getValue()));
- }
- if (mNavigationFocus.getValue() != null && mNavigationFocus.getValue()) {
- // Car service controls which activity is displayed while driving, so we assume this
- // has already been taken care of.
- return NavigationActivityState.VISIBLE;
- } else if (mFreeNavigationActivity == null) {
- return NavigationActivityState.NOT_SELECTED;
- } else if (Objects.equals(mFreeNavigationActivity, mCurrentNavigationActivity)) {
- return NavigationActivityState.VISIBLE;
- } else {
- return NavigationActivityState.LOADING;
- }
- }
-
- @SuppressWarnings("unchecked")
- private <T> MutableLiveData<T> getSensorMutableLiveData(Sensor<T> sensor) {
- return (MutableLiveData<T>) mSensorLiveDatas
- .computeIfAbsent(sensor, x -> new MutableLiveData<>());
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/CueView.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/CueView.java
deleted file mode 100644
index d7bbf5f..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/CueView.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
-import android.os.Handler;
-import android.text.SpannableStringBuilder;
-import android.text.style.ImageSpan;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.widget.TextView;
-
-import androidx.car.cluster.navigation.ImageReference;
-import androidx.car.cluster.navigation.RichText;
-import androidx.car.cluster.navigation.RichTextElement;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
-
-/**
- * View component that displays the Cue information on the instrument cluster display
- */
-public class CueView extends TextView {
- private static final String TAG = "Cluster.CueView";
-
- private String mImageSpanText;
- private CompletableFuture<?> mFuture;
- private Handler mHandler = new Handler();
- private RichText mContent;
-
- public CueView(Context context) {
- super(context);
- }
-
- public CueView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public CueView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- mImageSpanText = context.getString(R.string.span_image);
- }
-
- public void setRichText(RichText richText, ImageResolver imageResolver) {
- if (richText == null) {
- setText(null);
- return;
- }
-
- if (mFuture != null && !Objects.equals(richText, mContent)) {
- mFuture.cancel(true);
- }
-
- List<ImageReference> imageReferences = richText.getElements().stream()
- .filter(element -> element.getImage() != null)
- .map(element -> element.getImage())
- .collect(Collectors.toList());
- mFuture = imageResolver
- .getBitmaps(imageReferences, 0, getLineHeight())
- .thenAccept(bitmaps -> {
- mHandler.post(() -> update(richText, bitmaps));
- mFuture = null;
- })
- .exceptionally(ex -> {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "Unable to fetch images for cue: " + richText);
- }
- mHandler.post(() -> update(richText, Collections.emptyMap()));
- return null;
- });
- mContent = richText;
- }
-
- private void update(RichText richText, Map<ImageReference, Bitmap> bitmaps) {
- SpannableStringBuilder builder = new SpannableStringBuilder();
-
- for (RichTextElement element : richText.getElements()) {
- if (element.getImage() != null) {
- Bitmap bitmap = bitmaps.get(element.getImage());
- if (bitmap != null) {
- String imageText = element.getText().isEmpty() ? mImageSpanText :
- element.getText();
- int start = builder.length();
- int end = start + imageText.length();
- builder.append(imageText);
- BitmapDrawable drawable = new BitmapDrawable(getResources(), bitmap);
- drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
- builder.setSpan(new ImageSpan(drawable), start, end, 0);
- }
- } else if (!element.getText().isEmpty()) {
- builder.append(element.getText());
- }
- }
-
- setText(builder);
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/HeartBeatLiveData.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/HeartBeatLiveData.java
deleted file mode 100644
index 42116b8..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/HeartBeatLiveData.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import android.os.Handler;
-import android.os.Looper;
-
-import androidx.lifecycle.LiveData;
-
-/**
- * Emits a true value in a fixed periodical pace. The first beat begins when this live data becomes
- * active.
- *
- * <p> Note that if this heart beat is shared, the time can be less than the given interval between
- * observation and first beat for the second observer.
- */
-public class HeartBeatLiveData extends LiveData<Boolean> {
- private long mPulseRate;
- private Handler mMainThreadHandler = new Handler(Looper.getMainLooper());
-
- public HeartBeatLiveData(long rateInMillis) {
- mPulseRate = rateInMillis;
- }
-
- @Override
- protected void onActive() {
- super.onActive();
- mMainThreadHandler.post(mUpdateDurationRunnable);
- }
-
- @Override
- protected void onInactive() {
- super.onInactive();
- mMainThreadHandler.removeCallbacks(mUpdateDurationRunnable);
- }
-
- private final Runnable mUpdateDurationRunnable = new Runnable() {
- @Override
- public void run() {
- setValue(true);
- mMainThreadHandler.postDelayed(this, mPulseRate);
- }
- };
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ImageResolver.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ImageResolver.java
deleted file mode 100644
index 5e03b9b..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ImageResolver.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import android.graphics.Bitmap;
-import android.graphics.Point;
-import android.net.Uri;
-import android.util.Log;
-import android.util.LruCache;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.car.cluster.navigation.ImageReference;
-
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
-
-/**
- * Class for retrieving bitmap images from a ContentProvider
- */
-public class ImageResolver {
- private static final String TAG = "Cluster.ImageResolver";
- private static final int IMAGE_CACHE_SIZE_BYTES = 4 * 1024 * 1024; /* 4 mb */
-
- private final BitmapFetcher mFetcher;
- private final LruCache<String, Bitmap> mCache = new LruCache<String, Bitmap>(
- IMAGE_CACHE_SIZE_BYTES) {
- @Override
- protected int sizeOf(String key, Bitmap value) {
- return value.getByteCount();
- }
- };
-
- public interface BitmapFetcher {
- Bitmap getBitmap(Uri uri);
- }
-
- /**
- * Creates a resolver that delegate the image retrieval to the given fetcher.
- */
- public ImageResolver(BitmapFetcher fetcher) {
- mFetcher = fetcher;
- }
-
- /**
- * Returns a {@link CompletableFuture} that provides a bitmap from a {@link ImageReference}.
- * This image would fit inside the provided size. Either width, height or both should be greater
- * than 0.
- *
- * @param width required width, or 0 if width is flexible based on height.
- * @param height required height, or 0 if height is flexible based on width.
- */
- @NonNull
- public CompletableFuture<Bitmap> getBitmap(@NonNull ImageReference img, int width, int height) {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, String.format("Requesting image %s (width: %d, height: %d)",
- img.getRawContentUri(), width, height));
- }
-
- return CompletableFuture.supplyAsync(() -> {
- // Adjust the size to fit in the requested box.
- Point adjusted = getAdjustedSize(img.getOriginalWidth(), img.getOriginalHeight(), width,
- height);
- if (adjusted == null) {
- Log.e(TAG, "The provided image has no original size: " + img.getRawContentUri());
- return null;
- }
- Uri uri = img.getContentUri(adjusted.x, adjusted.y);
- Bitmap bitmap = mCache.get(uri.toString());
- if (bitmap == null) {
- bitmap = mFetcher.getBitmap(uri);
- if (bitmap == null) {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "Unable to fetch image: " + uri);
- }
- return null;
- }
- if (bitmap.getWidth() != adjusted.x || bitmap.getHeight() != adjusted.y) {
- bitmap = Bitmap.createScaledBitmap(bitmap, adjusted.x, adjusted.y, true);
- }
- mCache.put(uri.toString(), bitmap);
- }
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, String.format("Returning image %s (width: %d, height: %d)",
- img.getRawContentUri(), width, height));
- }
- return bitmap != null ? Bitmap.createScaledBitmap(bitmap, adjusted.x, adjusted.y, true)
- : null;
- });
- }
-
- /**
- * Same as {@link #getBitmap(ImageReference, int, int)} but it works on a list of images. The
- * returning {@link CompletableFuture} will contain a map from each {@link ImageReference} to
- * its bitmap. If any image fails to be fetched, the whole future completes exceptionally.
- *
- * @param width required width, or 0 if width is flexible based on height.
- * @param height required height, or 0 if height is flexible based on width.
- */
- @NonNull
- public CompletableFuture<Map<ImageReference, Bitmap>> getBitmaps(
- @NonNull List<ImageReference> imgs, int width, int height) {
- CompletableFuture<Map<ImageReference, Bitmap>> future = new CompletableFuture<>();
-
- Map<ImageReference, CompletableFuture<Bitmap>> bitmapFutures = imgs.stream().collect(
- Collectors.toMap(
- img -> img,
- img -> getBitmap(img, width, height)));
-
- CompletableFuture.allOf(bitmapFutures.values().toArray(new CompletableFuture[0]))
- .thenAccept(v -> {
- Map<ImageReference, Bitmap> bitmaps = bitmapFutures.entrySet().stream()
- .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry
- .getValue().join()));
- future.complete(bitmaps);
- })
- .exceptionally(ex -> {
- future.completeExceptionally(ex);
- return null;
- });
-
- return future;
- }
-
- /**
- * Returns an image size that exactly fits inside a requested box, maintaining an original size
- * aspect ratio.
- *
- * @param originalWidth original width (must be != 0)
- * @param originalHeight original height (must be != 0)
- * @param requestedWidth required width, or 0 if width is flexible based on height.
- * @param requestedHeight required height, or 0 if height is flexible based on width.
- */
- @Nullable
- public Point getAdjustedSize(int originalWidth, int originalHeight, int requestedWidth,
- int requestedHeight) {
- if (originalWidth <= 0 || originalHeight <= 0) {
- return null;
- } else if (requestedWidth == 0 && requestedHeight == 0) {
- throw new IllegalArgumentException("At least one of width or height must be != 0");
- }
- // If width is flexible or if both width and height are set and the original image is wider
- // than the space provided, then scale the width.
- float requiredRatio = requestedHeight > 0 ? ((float) requestedWidth) / requestedHeight : 0;
- float imageRatio = ((float) originalWidth) / originalHeight;
- Point res = new Point(requestedWidth, requestedHeight);
- if (requestedWidth == 0 || (requestedHeight != 0 && imageRatio < requiredRatio)) {
- res.x = (int) (((float) requestedHeight / originalHeight) * originalWidth);
- } else {
- res.y = (int) (((float) requestedWidth / originalWidth) * originalHeight);
- }
- return res;
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/LaneView.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/LaneView.java
deleted file mode 100644
index 1181fa2..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/LaneView.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import android.annotation.Nullable;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.VectorDrawable;
-import android.os.Handler;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-
-import androidx.car.cluster.navigation.ImageReference;
-import androidx.car.cluster.navigation.Lane;
-import androidx.car.cluster.navigation.LaneDirection;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * View component that displays the Lane preview information on the instrument cluster display
- */
-public class LaneView extends LinearLayout {
- private static final String TAG = "Cluster.LaneView";
-
- private Handler mHandler = new Handler();
-
- private ArrayList<Lane> mLanes;
-
- private final int mWidth = (int) getResources().getDimension(R.dimen.lane_width);
- private final int mHeight = (int) getResources().getDimension(R.dimen.lane_height);
- private final int mOffset = (int) getResources().getDimension(R.dimen.lane_icon_offset);
-
- private enum Shift {
- LEFT,
- RIGHT,
- BOTH
- }
-
- public LaneView(Context context) {
- super(context);
- }
-
- public LaneView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public LaneView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- public void setLanes(ImageReference imageReference, ImageResolver imageResolver) {
- imageResolver
- .getBitmap(imageReference, 0, getHeight())
- .thenAccept(bitmap -> {
- mHandler.post(() -> {
- removeAllViews();
- ImageView imgView = new ImageView(getContext());
- imgView.setImageBitmap(bitmap);
- imgView.setAdjustViewBounds(true);
- addView(imgView);
- });
- })
- .exceptionally(ex -> {
- removeAllViews();
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "Unable to fetch image for lane: " + imageReference);
- }
- return null;
- });
- }
-
- public void setLanes(List<Lane> lanes) {
- mLanes = new ArrayList<>(lanes);
- removeAllViews();
-
- // Use drawables for lane directional guidance
- for (Lane lane : mLanes) {
- Bitmap bitmap = combineBitmapFromLane(lane);
- ImageView imgView = new ImageView(getContext());
- imgView.setImageBitmap(bitmap);
- imgView.setAdjustViewBounds(true);
- addView(imgView);
- }
- }
-
- private Bitmap combineBitmapFromLane(Lane lane) {
- if (lane.getDirections().isEmpty()) {
- return null;
- }
-
- Bitmap bitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
-
- Shift shift = getShift(lane);
-
- for (LaneDirection laneDir : lane.getDirections()) {
- if (!laneDir.isHighlighted()) {
- drawToCanvas(laneDir, canvas, false, shift);
- }
- }
-
- for (LaneDirection laneDir : lane.getDirections()) {
- if (laneDir.isHighlighted()) {
- drawToCanvas(laneDir, canvas, true, shift);
- }
- }
-
- return bitmap;
- }
-
- private void drawToCanvas(LaneDirection laneDir, Canvas canvas, boolean isHighlighted,
- Shift shift) {
- int offset = getOffset(laneDir, shift);
- VectorDrawable icon = (VectorDrawable) getLaneIcon(laneDir);
- icon.setBounds(offset, 0, mWidth + offset, mHeight);
- icon.setColorFilter(new PorterDuffColorFilter(isHighlighted
- ? getContext().getColor(R.color.laneDirectionHighlighted)
- : getContext().getColor(R.color.laneDirection),
- PorterDuff.Mode.SRC_ATOP));
- icon.draw(canvas);
- }
-
- /**
- * Determines the offset direction to line up overlapping lane directions.
- */
- private Shift getShift(Lane lane) {
- boolean containsRight = false;
- boolean containsLeft = false;
- boolean containsStraight = false;
-
- for (LaneDirection laneDir : lane.getDirections()) {
- if (laneDir.getShape().equals(LaneDirection.Shape.NORMAL_RIGHT)
- || laneDir.getShape().equals(LaneDirection.Shape.SLIGHT_RIGHT)
- || laneDir.getShape().equals(LaneDirection.Shape.SHARP_RIGHT)
- || laneDir.getShape().equals(LaneDirection.Shape.U_TURN_RIGHT)) {
- containsRight = true;
- }
- if (laneDir.getShape().equals(LaneDirection.Shape.NORMAL_LEFT)
- || laneDir.getShape().equals(LaneDirection.Shape.SLIGHT_LEFT)
- || laneDir.getShape().equals(LaneDirection.Shape.SHARP_LEFT)
- || laneDir.getShape().equals(LaneDirection.Shape.U_TURN_LEFT)) {
- containsLeft = true;
- }
- if (laneDir.getShape().equals(LaneDirection.Shape.STRAIGHT)) {
- containsStraight = true;
- }
- }
-
- if (containsLeft && containsRight) {
- //shift turns outwards
- return Shift.BOTH;
- } else if (containsStraight && containsRight) {
- //shift straight lane dir to the left
- return Shift.LEFT;
- } else if (containsStraight && containsLeft) {
- //shift straight lane dir to the right
- return Shift.RIGHT;
- }
-
- return null;
- }
-
- /**
- * Returns the offset value of the lane direction based on the given shift direction.
- */
- private int getOffset(LaneDirection laneDir, Shift shift) {
- if (shift == Shift.BOTH) {
- if (laneDir.getShape().equals(LaneDirection.Shape.NORMAL_LEFT)
- || laneDir.getShape().equals(LaneDirection.Shape.SLIGHT_LEFT)
- || laneDir.getShape().equals(LaneDirection.Shape.SHARP_LEFT)
- || laneDir.getShape().equals(LaneDirection.Shape.U_TURN_LEFT)) {
- return -mOffset;
- }
- if (laneDir.getShape().equals(LaneDirection.Shape.NORMAL_RIGHT)
- || laneDir.getShape().equals(LaneDirection.Shape.SLIGHT_RIGHT)
- || laneDir.getShape().equals(LaneDirection.Shape.SHARP_RIGHT)
- || laneDir.getShape().equals(LaneDirection.Shape.U_TURN_RIGHT)) {
- return mOffset;
- }
- } else if (shift == Shift.LEFT) {
- if (laneDir.getShape().equals(LaneDirection.Shape.STRAIGHT)) {
- return -mOffset;
- }
- } else if (shift == Shift.RIGHT) {
- if (laneDir.getShape().equals(LaneDirection.Shape.STRAIGHT)) {
- return mOffset;
- }
- }
-
- return 0;
- }
-
- private Drawable getLaneIcon(@Nullable LaneDirection laneDir) {
- if (laneDir == null) {
- return null;
- }
- switch (laneDir.getShape()) {
- case UNKNOWN:
- return null;
- case STRAIGHT:
- return mContext.getDrawable(R.drawable.direction_continue);
- case SLIGHT_LEFT:
- return mContext.getDrawable(R.drawable.direction_turn_slight_left);
- case SLIGHT_RIGHT:
- return mContext.getDrawable(R.drawable.direction_turn_slight_right);
- case NORMAL_LEFT:
- return mContext.getDrawable(R.drawable.direction_turn_left);
- case NORMAL_RIGHT:
- return mContext.getDrawable(R.drawable.direction_turn_right);
- case SHARP_LEFT:
- return mContext.getDrawable(R.drawable.direction_turn_sharp_left);
- case SHARP_RIGHT:
- return mContext.getDrawable(R.drawable.direction_turn_sharp_right);
- case U_TURN_LEFT:
- return mContext.getDrawable(R.drawable.direction_uturn_left);
- case U_TURN_RIGHT:
- return mContext.getDrawable(R.drawable.direction_uturn_right);
- }
- return null;
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MainClusterActivity.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MainClusterActivity.java
deleted file mode 100644
index 0bd298c..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MainClusterActivity.java
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import static android.car.cluster.sample.ClusterRenderingServiceImpl.LOCAL_BINDING_ACTION;
-import static android.content.Intent.ACTION_USER_SWITCHED;
-import static android.content.Intent.ACTION_USER_UNLOCKED;
-
-import android.app.ActivityManager;
-import android.app.ActivityOptions;
-import android.car.Car;
-import android.car.cluster.ClusterActivityState;
-import android.car.cluster.sample.sensors.Sensors;
-import android.content.ActivityNotFoundException;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.ServiceConnection;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.UserHandle;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.Display;
-import android.view.InputDevice;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.Button;
-import android.widget.TextView;
-
-import androidx.car.cluster.navigation.NavigationState;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentPagerAdapter;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.ViewModelProviders;
-import androidx.viewpager.widget.ViewPager;
-
-import com.android.car.telephony.common.InMemoryPhoneBook;
-
-import java.lang.ref.WeakReference;
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Main activity displayed on the instrument cluster. This activity contains fragments for each of
- * the cluster "facets" (e.g.: navigation, communication, media and car state). Users can navigate
- * to each facet by using the steering wheel buttons.
- * <p>
- * This activity runs on "system user" (see {@link UserHandle#USER_SYSTEM}) but it is visible on
- * all users (the same activity remains active even during user switch).
- * <p>
- * This activity also launches a default navigation app inside a virtual display (which is located
- * inside {@link NavigationFragment}). This navigation app is launched when:
- * <ul>
- * <li>Virtual display for navigation apps is ready.
- * <li>After every user switch.
- * </ul>
- * This is necessary because the navigation app runs under a normal user, and different users will
- * see different instances of the same application, with their own personalized data.
- */
-public class MainClusterActivity extends FragmentActivity implements
- ClusterRenderingServiceImpl.ServiceClient {
- private static final String TAG = "Cluster.MainActivity";
-
- private static final NavigationState NULL_NAV_STATE = new NavigationState.Builder().build();
- private static final int NO_DISPLAY = -1;
-
- private ViewPager mPager;
- private NavStateController mNavStateController;
- private ClusterViewModel mClusterViewModel;
-
- private Map<View, Facet<?>> mButtonToFacet = new HashMap<>();
- private SparseArray<Facet<?>> mOrderToFacet = new SparseArray<>();
-
- private Map<Sensors.Gear, View> mGearsToIcon = new HashMap<>();
- private InputMethodManager mInputMethodManager;
- private ClusterRenderingServiceImpl mService;
- private VirtualDisplay mPendingVirtualDisplay = null;
-
- private static final int NAVIGATION_ACTIVITY_RETRY_INTERVAL_MS = 1000;
-
- private UserReceiver mUserReceiver;
- private ActivityMonitor mActivityMonitor = new ActivityMonitor();
- private final Handler mHandler = new Handler();
- private final Runnable mRetryLaunchNavigationActivity = this::tryLaunchNavigationActivity;
- private int mNavigationDisplayId = NO_DISPLAY;
-
- private int mPreviousFacet;
-
- /**
- * Description of a virtual display
- */
- public static class VirtualDisplay {
- /** Identifier of the display */
- public final int mDisplayId;
- /** Rectangular area inside this display that can be viewed without obstructions */
- public final Rect mUnobscuredBounds;
-
- public VirtualDisplay(int displayId, Rect unobscuredBounds) {
- mDisplayId = displayId;
- mUnobscuredBounds = unobscuredBounds;
- }
- }
-
- private final View.OnFocusChangeListener mFacetButtonFocusListener =
- new View.OnFocusChangeListener() {
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- if (hasFocus) {
- mPager.setCurrentItem(mButtonToFacet.get(v).mOrder);
- }
- }
- };
-
- private ServiceConnection mClusterRenderingServiceConnection = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- Log.i(TAG, "onServiceConnected, name: " + name + ", service: " + service);
- mService = ((ClusterRenderingServiceImpl.LocalBinder) service).getService();
- mService.registerClient(MainClusterActivity.this);
- mNavStateController.setImageResolver(mService.getImageResolver());
- if (mPendingVirtualDisplay != null) {
- // If haven't reported the virtual display yet, do so on service connect.
- reportNavDisplay(mPendingVirtualDisplay);
- mPendingVirtualDisplay = null;
- }
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- Log.i(TAG, "onServiceDisconnected, name: " + name);
- mService = null;
- mNavStateController.setImageResolver(null);
- onNavigationStateChange(NULL_NAV_STATE);
- }
- };
-
- private ActivityMonitor.ActivityListener mNavigationActivityMonitor = (displayId, activity) -> {
- if (displayId != mNavigationDisplayId) {
- return;
- }
- mClusterViewModel.setCurrentNavigationActivity(activity);
- };
-
- private static class UserReceiver extends BroadcastReceiver {
- private WeakReference<MainClusterActivity> mActivity;
-
- UserReceiver(MainClusterActivity activity) {
- mActivity = new WeakReference<>(activity);
- }
-
- public void register(Context context) {
- IntentFilter intentFilter = new IntentFilter(ACTION_USER_UNLOCKED);
- intentFilter.addAction(ACTION_USER_SWITCHED);
- context.registerReceiver(this, intentFilter);
- }
-
- public void unregister(Context context) {
- context.unregisterReceiver(this);
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- MainClusterActivity activity = mActivity.get();
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "Broadcast received: " + intent);
- }
- activity.tryLaunchNavigationActivity();
- }
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Log.d(TAG, "onCreate");
- setContentView(R.layout.activity_main);
-
- mInputMethodManager = getSystemService(InputMethodManager.class);
-
- Intent intent = new Intent(this, ClusterRenderingServiceImpl.class);
- intent.setAction(LOCAL_BINDING_ACTION);
- bindServiceAsUser(intent, mClusterRenderingServiceConnection, 0, UserHandle.SYSTEM);
-
- registerFacet(new Facet<>(findViewById(R.id.btn_nav), 0, NavigationFragment.class));
- registerFacet(new Facet<>(findViewById(R.id.btn_phone), 1, PhoneFragment.class));
- registerFacet(new Facet<>(findViewById(R.id.btn_music), 2, MusicFragment.class));
- registerFacet(new Facet<>(findViewById(R.id.btn_car_info), 3, CarInfoFragment.class));
- registerGear(findViewById(R.id.gear_parked), Sensors.Gear.PARK);
- registerGear(findViewById(R.id.gear_reverse), Sensors.Gear.REVERSE);
- registerGear(findViewById(R.id.gear_neutral), Sensors.Gear.NEUTRAL);
- registerGear(findViewById(R.id.gear_drive), Sensors.Gear.DRIVE);
-
- mPager = findViewById(R.id.pager);
- mPager.setAdapter(new ClusterPageAdapter(getSupportFragmentManager()));
- mOrderToFacet.get(0).mButton.requestFocus();
- mNavStateController = new NavStateController(findViewById(R.id.navigation_state));
-
- mClusterViewModel = ViewModelProviders.of(this).get(ClusterViewModel.class);
- mClusterViewModel.getNavigationFocus().observe(this, focus -> {
- // If focus is lost, we launch the default navigation activity again.
- if (!focus) {
- mNavStateController.update(null);
- tryLaunchNavigationActivity();
- }
- });
-
- mClusterViewModel.getSensor(Sensors.SENSOR_GEAR).observe(this, this::updateSelectedGear);
-
- registerSensor(findViewById(R.id.info_fuel), mClusterViewModel.getFuelLevel());
- registerSensor(findViewById(R.id.info_speed), mClusterViewModel.getSpeed());
- registerSensor(findViewById(R.id.info_range), mClusterViewModel.getRange());
- registerSensor(findViewById(R.id.info_rpm), mClusterViewModel.getRPM());
-
- mActivityMonitor.start();
-
- mUserReceiver = new UserReceiver(this);
- mUserReceiver.register(this);
-
- try {
- InMemoryPhoneBook.get();
- } catch (IllegalStateException ex) {
- // Initialize if not yet initialized
- InMemoryPhoneBook.init(this);
- }
-
- PhoneFragmentViewModel phoneViewModel = ViewModelProviders.of(this).get(
- PhoneFragmentViewModel.class);
-
- phoneViewModel.setPhoneStateCallback(new PhoneFragmentViewModel.PhoneStateCallback() {
- @Override
- public void onCall() {
- mPreviousFacet = mPager.getCurrentItem();
- mOrderToFacet.get(1).mButton.requestFocus();
- }
-
- @Override
- public void onDisconnect() {
- mOrderToFacet.get(mPreviousFacet).mButton.requestFocus();
- }
- });
- }
-
- private <V> void registerSensor(TextView textView, LiveData<V> source) {
- String emptyValue = getString(R.string.info_value_empty);
- source.observe(this, value -> textView.setText(value != null
- ? value.toString() : emptyValue));
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- Log.d(TAG, "onDestroy");
- mUserReceiver.unregister(this);
- mActivityMonitor.stop();
- if (mService != null) {
- mService.unregisterClient(this);
- mService = null;
- }
- unbindService(mClusterRenderingServiceConnection);
- }
-
- @Override
- public void onKeyEvent(KeyEvent event) {
- Log.i(TAG, "onKeyEvent, event: " + event);
-
- // This is a hack. We use SOURCE_CLASS_POINTER here because this type of input is associated
- // with the display. otherwise this event will be ignored in ViewRootImpl because injecting
- // KeyEvent w/o activity being focused is useless.
- event.setSource(event.getSource() | InputDevice.SOURCE_CLASS_POINTER);
- mInputMethodManager.dispatchKeyEventFromInputMethod(getCurrentFocus(), event);
- }
-
- @Override
- public void onNavigationStateChange(NavigationState state) {
- Log.d(TAG, "onNavigationStateChange: " + state);
- if (mNavStateController != null) {
- mNavStateController.update(state);
- }
- }
-
- public void updateNavDisplay(VirtualDisplay virtualDisplay) {
- // Starting the default navigation activity. This activity will be shown when navigation
- // focus is not taken.
- startNavigationActivity(virtualDisplay.mDisplayId);
- // Notify the service (so it updates display properties on car service)
- if (mService == null) {
- // Service is not bound yet. Hold the information and notify when the service is bound.
- mPendingVirtualDisplay = virtualDisplay;
- return;
- } else {
- reportNavDisplay(virtualDisplay);
- }
- }
-
- private void reportNavDisplay(VirtualDisplay virtualDisplay) {
- mService.setActivityLaunchOptions(virtualDisplay.mDisplayId, ClusterActivityState
- .create(virtualDisplay.mDisplayId != Display.INVALID_DISPLAY,
- virtualDisplay.mUnobscuredBounds));
- }
-
- public class ClusterPageAdapter extends FragmentPagerAdapter {
- public ClusterPageAdapter(FragmentManager fm) {
- super(fm);
- }
-
- @Override
- public int getCount() {
- return mButtonToFacet.size();
- }
-
- @Override
- public Fragment getItem(int position) {
- return mOrderToFacet.get(position).getOrCreateFragment();
- }
- }
-
- private <T> void registerFacet(Facet<T> facet) {
- mOrderToFacet.append(facet.mOrder, facet);
- mButtonToFacet.put(facet.mButton, facet);
-
- facet.mButton.setOnFocusChangeListener(mFacetButtonFocusListener);
- }
-
- private static class Facet<T> {
- Button mButton;
- Class<T> mClazz;
- int mOrder;
-
- Facet(Button button, int order, Class<T> clazz) {
- this.mButton = button;
- this.mOrder = order;
- this.mClazz = clazz;
- }
-
- private Fragment mFragment;
-
- Fragment getOrCreateFragment() {
- if (mFragment == null) {
- try {
- mFragment = (Fragment) mClazz.getConstructors()[0].newInstance();
- } catch (InstantiationException | IllegalAccessException
- | InvocationTargetException e) {
- throw new RuntimeException(e);
- }
- }
- return mFragment;
- }
- }
-
- private void startNavigationActivity(int displayId) {
- mActivityMonitor.removeListener(mNavigationDisplayId, mNavigationActivityMonitor);
- mActivityMonitor.addListener(displayId, mNavigationActivityMonitor);
- mNavigationDisplayId = displayId;
- tryLaunchNavigationActivity();
- }
-
- /**
- * Tries to start a default navigation activity in the cluster. During system initialization
- * launching user activities might fail due the system not being ready or {@link PackageManager}
- * not being able to resolve the implicit intent. It is also possible that the system doesn't
- * have a default navigation activity selected yet.
- */
- private void tryLaunchNavigationActivity() {
- if (mNavigationDisplayId == NO_DISPLAY) {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, String.format("Launch activity ignored (no display yet)"));
- }
- // Not ready to launch yet.
- return;
- }
- mHandler.removeCallbacks(mRetryLaunchNavigationActivity);
-
- ComponentName navigationActivity = getNavigationActivity();
- mClusterViewModel.setFreeNavigationActivity(navigationActivity);
-
- try {
- if (navigationActivity == null) {
- throw new ActivityNotFoundException();
- }
- Intent intent = new Intent(Intent.ACTION_MAIN).addCategory(Car.CAR_CATEGORY_NAVIGATION)
- .setPackage(navigationActivity.getPackageName())
- .setComponent(navigationActivity)
- .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- Log.d(TAG, "Launching: " + intent + " on display: " + mNavigationDisplayId);
- Bundle activityOptions = ActivityOptions.makeBasic()
- .setLaunchDisplayId(mNavigationDisplayId)
- .toBundle();
-
- startActivityAsUser(intent, activityOptions, UserHandle.CURRENT);
- } catch (ActivityNotFoundException ex) {
- // Some activities might not be available right on startup. We will retry.
- mHandler.postDelayed(mRetryLaunchNavigationActivity,
- NAVIGATION_ACTIVITY_RETRY_INTERVAL_MS);
- } catch (Exception ex) {
- Log.e(TAG, "Unable to start navigation activity: " + navigationActivity, ex);
- }
- }
-
- /**
- * Returns a default navigation activity to show in the cluster.
- * In the current implementation we search for an activity with the
- * {@link Car#CAR_CATEGORY_NAVIGATION} category from the same navigation app
- * selected from CarLauncher (see CarLauncher#getMapsIntent()).
- * Alternatively, other implementations could:
- * <ul>
- * <li>Read this package from a resource (having a OEM default activity to show)
- * <li>Let the user select one from settings.
- * </ul>
- */
- private ComponentName getNavigationActivity() {
- PackageManager pm = getPackageManager();
- int userId = ActivityManager.getCurrentUser();
-
- // Get currently selected navigation app.
- Intent intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN,
- Intent.CATEGORY_APP_MAPS);
- ResolveInfo navigationApp = pm.resolveActivityAsUser(intent,
- PackageManager.MATCH_DEFAULT_ONLY, userId);
-
- // Get all possible cluster activities
- intent = new Intent(Intent.ACTION_MAIN).addCategory(Car.CAR_CATEGORY_NAVIGATION);
- List<ResolveInfo> candidates = pm.queryIntentActivitiesAsUser(intent, 0, userId);
-
- // If there is a select navigation app, try finding a matching auxiliary navigation activity
- if (navigationApp != null) {
- for (ResolveInfo candidate : candidates) {
- if (candidate.activityInfo.packageName.equals(navigationApp.activityInfo
- .packageName)) {
- Log.d(TAG, "Found activity: " + candidate);
- return new ComponentName(candidate.activityInfo.packageName,
- candidate.activityInfo.name);
- }
- }
- }
-
- // During initialization implicit intents might not provided a result. We will just
- // retry until we find one, or we exhaust the retries.
- Log.d(TAG, "No default activity found (it might not be available yet).");
- return null;
- }
-
- private void registerGear(View view, Sensors.Gear gear) {
- mGearsToIcon.put(gear, view);
- }
-
- private void updateSelectedGear(Sensors.Gear gear) {
- for (Map.Entry<Sensors.Gear, View> entry : mGearsToIcon.entrySet()) {
- entry.getValue().setSelected(entry.getKey() == gear);
- }
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MusicFragment.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MusicFragment.java
deleted file mode 100644
index 25739e2..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MusicFragment.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-import androidx.lifecycle.ViewModelProviders;
-
-import com.android.car.apps.common.BackgroundImageView;
-import com.android.car.media.common.playback.PlaybackViewModel;
-import com.android.car.media.common.source.MediaSourceViewModel;
-
-/**
- * Displays information on the current media item selected.
- */
-public class MusicFragment extends Fragment {
- private static final String TAG = "MusicFragment";
-
- public MusicFragment() {
- // Required empty public constructor
- }
-
- @Nullable
- @Override
- public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
- Bundle savedInstanceState) {
- FragmentActivity activity = requireActivity();
- PlaybackViewModel playbackViewModel = PlaybackViewModel.get(activity.getApplication());
- MediaSourceViewModel mMediaSourceViewModel = MediaSourceViewModel.get(
- activity.getApplication());
-
- MusicFragmentViewModel innerViewModel = ViewModelProviders.of(activity).get(
- MusicFragmentViewModel.class);
- innerViewModel.init(mMediaSourceViewModel, playbackViewModel);
-
- View view = inflater.inflate(R.layout.fragment_music, container, false);
-
- TextView appName = view.findViewById(R.id.app_name);
- innerViewModel.getAppName().observe(getViewLifecycleOwner(), appName::setText);
-
- TextView title = view.findViewById(R.id.title);
- innerViewModel.getTitle().observe(getViewLifecycleOwner(), title::setText);
-
- TextView subtitle = view.findViewById(R.id.subtitle);
- innerViewModel.getSubtitle().observe(getViewLifecycleOwner(), subtitle::setText);
-
- SeekBar seekBar = view.findViewById(R.id.seek_bar);
- innerViewModel.getMaxProgress().observe(getViewLifecycleOwner(),
- maxProgress -> seekBar.setMax(maxProgress != null ? maxProgress.intValue() : 0));
- innerViewModel.getProgress().observe(getViewLifecycleOwner(),
- progress -> seekBar.setProgress((int) progress.getProgress()));
- innerViewModel.hasTime().observe(getViewLifecycleOwner(),
- hasTime -> seekBar.setVisibility(hasTime ? View.VISIBLE : View.INVISIBLE));
-
- TextView time = view.findViewById(R.id.time);
-
- innerViewModel.getTimeText().observe(getViewLifecycleOwner(),
- timeText -> time.setText(timeText));
-
- BackgroundImageView albumBackground = view.findViewById(R.id.album_background);
- ImageView albumIcon = view.findViewById(R.id.album_art);
- innerViewModel.getAlbumArt().observe(getViewLifecycleOwner(), albumArt -> {
- albumBackground.setBackgroundImage(albumArt, true);
- if (albumArt == null) {
- albumIcon.setImageDrawable(getContext().getDrawable(R.drawable.ic_person));
- } else {
- albumIcon.setImageBitmap(albumArt);
- }
- });
-
- return view;
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MusicFragmentViewModel.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MusicFragmentViewModel.java
deleted file mode 100644
index 81a87df..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MusicFragmentViewModel.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import static androidx.lifecycle.Transformations.map;
-
-import static com.android.car.arch.common.LiveDataFunctions.combine;
-import static com.android.car.arch.common.LiveDataFunctions.mapNonNull;
-
-import android.annotation.SuppressLint;
-import android.app.Application;
-import android.graphics.Bitmap;
-import android.media.session.PlaybackState;
-
-import androidx.lifecycle.AndroidViewModel;
-import androidx.lifecycle.LiveData;
-
-import com.android.car.media.common.MediaItemMetadata;
-import com.android.car.media.common.playback.AlbumArtLiveData;
-import com.android.car.media.common.playback.PlaybackProgress;
-import com.android.car.media.common.playback.PlaybackViewModel;
-import com.android.car.media.common.source.MediaSource;
-import com.android.car.media.common.source.MediaSourceViewModel;
-
-import com.bumptech.glide.request.target.Target;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * View model for {@link MusicFragment}
- */
-public final class MusicFragmentViewModel extends AndroidViewModel {
-
- private LiveData<MediaSource> mMediaSource;
- private LiveData<CharSequence> mAppName;
- private LiveData<Bitmap> mAppIcon;
- private LiveData<CharSequence> mTitle;
- private LiveData<CharSequence> mSubtitle;
- private LiveData<Bitmap> mAlbumArt;
- private LiveData<PlaybackProgress> mProgress;
- private LiveData<Long> mMaxProgress;
- private LiveData<CharSequence> mTimeText;
- private LiveData<Boolean> mHasTime;
-
- private PlaybackViewModel mPlaybackViewModel;
- private MediaSourceViewModel mMediaSourceViewModel;
-
- public MusicFragmentViewModel(Application application) {
- super(application);
- }
-
- void init(MediaSourceViewModel mediaSourceViewModel, PlaybackViewModel playbackViewModel) {
- if (mMediaSourceViewModel == mediaSourceViewModel
- && mPlaybackViewModel == playbackViewModel) {
- return;
- }
- mPlaybackViewModel = playbackViewModel;
- mMediaSourceViewModel = mediaSourceViewModel;
- mMediaSource = mMediaSourceViewModel.getPrimaryMediaSource();
- mAppName = mapNonNull(mMediaSource, MediaSource::getName);
- mAppIcon = mapNonNull(mMediaSource, MediaSource::getRoundPackageIcon);
- mTitle = mapNonNull(playbackViewModel.getMetadata(), MediaItemMetadata::getTitle);
- mSubtitle = mapNonNull(playbackViewModel.getMetadata(), MediaItemMetadata::getSubtitle);
- mAlbumArt = AlbumArtLiveData.getAlbumArt(getApplication(),
- Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL, false,
- playbackViewModel.getMetadata());
- mProgress = playbackViewModel.getProgress();
- mMaxProgress = map(playbackViewModel.getPlaybackStateWrapper(),
- state -> state != null ? state.getMaxProgress() : 0L);
- mTimeText = combine(mProgress, mMaxProgress, (progress, maxProgress) -> {
- boolean showHours = TimeUnit.MILLISECONDS.toHours(maxProgress) > 0;
- return String.format("%s / %s",
- formatTime(progress.getProgress(), showHours),
- formatTime(maxProgress, showHours));
- });
- mHasTime = combine(mProgress, mMaxProgress, (progress, maxProgress) ->
- maxProgress > 0
- && progress.getProgress() != PlaybackState.PLAYBACK_POSITION_UNKNOWN);
- }
-
- LiveData<CharSequence> getAppName() {
- return mAppName;
- }
-
- LiveData<Bitmap> getAppIcon() {
- return mAppIcon;
- }
-
- LiveData<CharSequence> getTitle() {
- return mTitle;
- }
-
- LiveData<CharSequence> getSubtitle() {
- return mSubtitle;
- }
-
- LiveData<Bitmap> getAlbumArt() {
- return mAlbumArt;
- }
-
- LiveData<PlaybackProgress> getProgress() {
- return mProgress;
- }
-
- LiveData<Long> getMaxProgress() {
- return mMaxProgress;
- }
-
- LiveData<CharSequence> getTimeText() {
- return mTimeText;
- }
-
- LiveData<Boolean> hasTime() {
- return mHasTime;
- }
-
- @SuppressLint("DefaultLocale")
- private static String formatTime(long millis, boolean showHours) {
- long hours = TimeUnit.MILLISECONDS.toHours(millis);
- long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % TimeUnit.HOURS.toMinutes(1);
- long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % TimeUnit.MINUTES.toSeconds(1);
- if (showHours) {
- return String.format("%d:%02d:%02d", hours, minutes, seconds);
- } else {
- return String.format("%d:%02d", minutes, seconds);
- }
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavStateController.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavStateController.java
deleted file mode 100644
index bb39e63..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavStateController.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import android.annotation.Nullable;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.util.Log;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.car.cluster.navigation.Destination;
-import androidx.car.cluster.navigation.Destination.Traffic;
-import androidx.car.cluster.navigation.Distance;
-import androidx.car.cluster.navigation.ImageReference;
-import androidx.car.cluster.navigation.Maneuver;
-import androidx.car.cluster.navigation.NavigationState;
-import androidx.car.cluster.navigation.Segment;
-import androidx.car.cluster.navigation.Step;
-
-import java.time.Duration;
-import java.time.ZonedDateTime;
-
-/**
- * View controller for navigation state rendering.
- */
-public class NavStateController {
- private static final String TAG = "Cluster.NavController";
-
- private Handler mHandler = new Handler();
-
- private ImageView mManeuver;
- private ImageView mProvidedManeuver;
- private LaneView mLane;
- private LaneView mProvidedLane;
- private TextView mDistance;
- private TextView mSegment;
- private TextView mEta;
- private CueView mCue;
- private Context mContext;
- private ImageResolver mImageResolver;
-
- /**
- * Creates a controller to coordinate updates to the views displaying navigation state
- * data.
- *
- * @param container {@link View} containing the navigation state views
- */
- public NavStateController(View container) {
- mManeuver = container.findViewById(R.id.maneuver);
- mProvidedManeuver = container.findViewById(R.id.provided_maneuver);
- mLane = container.findViewById(R.id.lane);
- mProvidedLane = container.findViewById(R.id.provided_lane);
- mDistance = container.findViewById(R.id.distance);
- mSegment = container.findViewById(R.id.segment);
- mEta = container.findViewById(R.id.eta);
- mCue = container.findViewById(R.id.cue);
-
- mContext = container.getContext();
- }
-
- public void setImageResolver(@Nullable ImageResolver imageResolver) {
- mImageResolver = imageResolver;
- }
-
- /**
- * Updates views to reflect the provided navigation state
- */
- public void update(@Nullable NavigationState state) {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "Updating nav state: " + state);
- }
- Step step = state != null && state.getSteps().size() > 0 ? state.getSteps().get(0) : null;
- Destination destination = state != null && !state.getDestinations().isEmpty()
- ? state.getDestinations().get(0) : null;
- ZonedDateTime eta = destination != null ? destination.getEta() : null;
- Traffic traffic = destination != null ? destination.getTraffic() : null;
-
- mEta.setText(eta != null ? formatEta(eta) : null);
- mEta.setTextColor(getTrafficColor(traffic));
- mManeuver.setImageDrawable(getManeuverIcon(step != null ? step.getManeuver() : null));
- setProvidedManeuverIcon(mProvidedManeuver,
- step != null ? step.getManeuver().getIcon() : null);
- mDistance.setText(formatDistance(step != null ? step.getDistance() : null));
- mSegment.setText(state != null ? getSegmentString(state.getCurrentSegment()) : null);
- mCue.setRichText(step != null ? step.getCue() : null, mImageResolver);
-
- if (step != null && step.getLanes().size() > 0) {
- mProvidedLane.setLanes(step.getLanesImage(), mImageResolver);
- mProvidedLane.setVisibility(View.VISIBLE);
-
- mLane.setLanes(step.getLanes());
- mLane.setVisibility(View.VISIBLE);
- } else {
- mLane.setVisibility(View.GONE);
- mProvidedLane.setVisibility(View.GONE);
- }
- }
-
-
- private int getTrafficColor(@Nullable Traffic traffic) {
- if (traffic == Traffic.LOW) {
- return mContext.getColor(R.color.low_traffic);
- } else if (traffic == Traffic.MEDIUM) {
- return mContext.getColor(R.color.medium_traffic);
- } else if (traffic == Traffic.HIGH) {
- return mContext.getColor(R.color.high_traffic);
- }
-
- return mContext.getColor(R.color.unknown_traffic);
- }
-
- private String formatEta(@Nullable ZonedDateTime eta) {
- ZonedDateTime now = ZonedDateTime.now();
- Duration duration = Duration.between(now, eta);
- long seconds = duration.getSeconds();
-
- // TODO: move formatting into common lib somewhere
- long minutes = (seconds / 60) % 60;
- long hours = (seconds / 3600) % 24;
- long days = seconds / (3600 * 24);
-
- if (days > 0) {
- return String.format("%d d %d hr", days, hours);
- } else if (hours > 0) {
- return String.format("%d hr %d min", hours, minutes);
- } else {
- return String.format("%d min", minutes);
- }
- }
-
- private String getSegmentString(Segment segment) {
- if (segment != null) {
- return segment.getName();
- }
-
- return null;
- }
-
- private void setProvidedManeuverIcon(ImageView view, ImageReference imageReference) {
- if (mImageResolver == null || imageReference == null) {
- view.setImageBitmap(null);
- return;
- }
-
- mImageResolver
- .getBitmap(imageReference, 0, view.getHeight())
- .thenAccept(bitmap -> {
- mHandler.post(() -> {
- view.setImageBitmap(bitmap);
- });
- })
- .exceptionally(ex -> {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "Unable to fetch image for maneuver: " + imageReference);
- }
- return null;
- });
- }
-
- private Drawable getManeuverIcon(@Nullable Maneuver maneuver) {
- if (maneuver == null) {
- return null;
- }
- switch (maneuver.getType()) {
- case UNKNOWN:
- return null;
- case DEPART:
- return mContext.getDrawable(R.drawable.direction_depart);
- case NAME_CHANGE:
- return mContext.getDrawable(R.drawable.direction_new_name_straight);
- case KEEP_LEFT:
- return mContext.getDrawable(R.drawable.direction_continue_left);
- case KEEP_RIGHT:
- return mContext.getDrawable(R.drawable.direction_continue_right);
- case TURN_SLIGHT_LEFT:
- return mContext.getDrawable(R.drawable.direction_turn_slight_left);
- case TURN_SLIGHT_RIGHT:
- return mContext.getDrawable(R.drawable.direction_turn_slight_right);
- case TURN_NORMAL_LEFT:
- return mContext.getDrawable(R.drawable.direction_turn_left);
- case TURN_NORMAL_RIGHT:
- return mContext.getDrawable(R.drawable.direction_turn_right);
- case TURN_SHARP_LEFT:
- return mContext.getDrawable(R.drawable.direction_turn_sharp_left);
- case TURN_SHARP_RIGHT:
- return mContext.getDrawable(R.drawable.direction_turn_sharp_right);
- case U_TURN_LEFT:
- return mContext.getDrawable(R.drawable.direction_uturn_left);
- case U_TURN_RIGHT:
- return mContext.getDrawable(R.drawable.direction_uturn_right);
- case ON_RAMP_SLIGHT_LEFT:
- return mContext.getDrawable(R.drawable.direction_on_ramp_slight_left);
- case ON_RAMP_SLIGHT_RIGHT:
- return mContext.getDrawable(R.drawable.direction_on_ramp_slight_right);
- case ON_RAMP_NORMAL_LEFT:
- return mContext.getDrawable(R.drawable.direction_on_ramp_left);
- case ON_RAMP_NORMAL_RIGHT:
- return mContext.getDrawable(R.drawable.direction_on_ramp_right);
- case ON_RAMP_SHARP_LEFT:
- return mContext.getDrawable(R.drawable.direction_on_ramp_sharp_left);
- case ON_RAMP_SHARP_RIGHT:
- return mContext.getDrawable(R.drawable.direction_on_ramp_sharp_right);
- case ON_RAMP_U_TURN_LEFT:
- return mContext.getDrawable(R.drawable.direction_uturn_left);
- case ON_RAMP_U_TURN_RIGHT:
- return mContext.getDrawable(R.drawable.direction_uturn_right);
- case OFF_RAMP_SLIGHT_LEFT:
- return mContext.getDrawable(R.drawable.direction_off_ramp_slight_left);
- case OFF_RAMP_SLIGHT_RIGHT:
- return mContext.getDrawable(R.drawable.direction_off_ramp_slight_right);
- case OFF_RAMP_NORMAL_LEFT:
- return mContext.getDrawable(R.drawable.direction_off_ramp_left);
- case OFF_RAMP_NORMAL_RIGHT:
- return mContext.getDrawable(R.drawable.direction_off_ramp_right);
- case FORK_LEFT:
- return mContext.getDrawable(R.drawable.direction_fork_left);
- case FORK_RIGHT:
- return mContext.getDrawable(R.drawable.direction_fork_right);
- case MERGE_LEFT:
- return mContext.getDrawable(R.drawable.direction_merge_left);
- case MERGE_RIGHT:
- return mContext.getDrawable(R.drawable.direction_merge_right);
- case ROUNDABOUT_ENTER:
- return mContext.getDrawable(R.drawable.direction_roundabout);
- case ROUNDABOUT_EXIT:
- return mContext.getDrawable(R.drawable.direction_roundabout);
- case ROUNDABOUT_ENTER_AND_EXIT_CW_SHARP_RIGHT:
- return mContext.getDrawable(R.drawable.direction_roundabout_cw_sharp_right);
- case ROUNDABOUT_ENTER_AND_EXIT_CW_NORMAL_RIGHT:
- return mContext.getDrawable(R.drawable.direction_roundabout_cw_right);
- case ROUNDABOUT_ENTER_AND_EXIT_CW_SLIGHT_RIGHT:
- return mContext.getDrawable(R.drawable.direction_roundabout_cw_slight_right);
- case ROUNDABOUT_ENTER_AND_EXIT_CW_STRAIGHT:
- return mContext.getDrawable(R.drawable.direction_roundabout_cw_straight);
- case ROUNDABOUT_ENTER_AND_EXIT_CW_SHARP_LEFT:
- return mContext.getDrawable(R.drawable.direction_roundabout_cw_sharp_left);
- case ROUNDABOUT_ENTER_AND_EXIT_CW_NORMAL_LEFT:
- return mContext.getDrawable(R.drawable.direction_roundabout_cw_left);
- case ROUNDABOUT_ENTER_AND_EXIT_CW_SLIGHT_LEFT:
- return mContext.getDrawable(R.drawable.direction_roundabout_cw_slight_left);
- case ROUNDABOUT_ENTER_AND_EXIT_CW_U_TURN:
- return mContext.getDrawable(R.drawable.direction_uturn_right);
- case ROUNDABOUT_ENTER_AND_EXIT_CCW_SHARP_RIGHT:
- return mContext.getDrawable(R.drawable.direction_roundabout_ccw_sharp_right);
- case ROUNDABOUT_ENTER_AND_EXIT_CCW_NORMAL_RIGHT:
- return mContext.getDrawable(R.drawable.direction_roundabout_ccw_right);
- case ROUNDABOUT_ENTER_AND_EXIT_CCW_SLIGHT_RIGHT:
- return mContext.getDrawable(R.drawable.direction_roundabout_ccw_slight_right);
- case ROUNDABOUT_ENTER_AND_EXIT_CCW_STRAIGHT:
- return mContext.getDrawable(R.drawable.direction_roundabout_ccw_straight);
- case ROUNDABOUT_ENTER_AND_EXIT_CCW_SHARP_LEFT:
- return mContext.getDrawable(R.drawable.direction_roundabout_ccw_sharp_left);
- case ROUNDABOUT_ENTER_AND_EXIT_CCW_NORMAL_LEFT:
- return mContext.getDrawable(R.drawable.direction_roundabout_ccw_left);
- case ROUNDABOUT_ENTER_AND_EXIT_CCW_SLIGHT_LEFT:
- return mContext.getDrawable(R.drawable.direction_roundabout_ccw_slight_left);
- case ROUNDABOUT_ENTER_AND_EXIT_CCW_U_TURN:
- return mContext.getDrawable(R.drawable.direction_uturn_left);
- case STRAIGHT:
- return mContext.getDrawable(R.drawable.direction_continue);
- case FERRY_BOAT:
- return mContext.getDrawable(R.drawable.direction_close);
- case FERRY_TRAIN:
- return mContext.getDrawable(R.drawable.direction_close);
- case DESTINATION:
- return mContext.getDrawable(R.drawable.direction_arrive);
- case DESTINATION_STRAIGHT:
- return mContext.getDrawable(R.drawable.direction_arrive_straight);
- case DESTINATION_LEFT:
- return mContext.getDrawable(R.drawable.direction_arrive_left);
- case DESTINATION_RIGHT:
- return mContext.getDrawable(R.drawable.direction_arrive_right);
- }
- return null;
- }
-
- private String formatDistance(@Nullable Distance distance) {
- if (distance == null || distance.getDisplayUnit() == Distance.Unit.UNKNOWN) {
- return null;
- }
-
- String unit = "";
-
- switch (distance.getDisplayUnit()) {
- case METERS:
- unit = "m";
- break;
- case KILOMETERS:
- unit = "km";
- break;
- case MILES:
- unit = "mi";
- break;
- case YARDS:
- unit = "yd";
- break;
- case FEET:
- unit = "ft";
- break;
- }
- return String.format("In %s %s", distance.getDisplayValue(), unit);
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavigationFragment.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavigationFragment.java
deleted file mode 100644
index d35ba02..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavigationFragment.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.hardware.display.DisplayManager;
-import android.hardware.display.DisplayManager.DisplayListener;
-import android.hardware.display.VirtualDisplay;
-import android.os.Bundle;
-import android.os.Handler;
-import android.util.Log;
-import android.view.Display;
-import android.view.LayoutInflater;
-import android.view.Surface;
-import android.view.SurfaceHolder;
-import android.view.SurfaceHolder.Callback;
-import android.view.SurfaceView;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import androidx.fragment.app.Fragment;
-import androidx.lifecycle.ViewModelProvider;
-import androidx.lifecycle.ViewModelProviders;
-
-public class NavigationFragment extends Fragment {
- private static final String TAG = "Cluster.NavFragment";
-
- private SurfaceView mSurfaceView;
- private DisplayManager mDisplayManager;
- private Rect mUnobscuredBounds;
- private MainClusterActivity mMainClusterActivity;
- private ClusterViewModel mViewModel;
- private ProgressBar mProgressBar;
- private TextView mMessage;
-
-
- // Static because we want to keep alive this virtual display when navigating through
- // ViewPager (this fragment gets dynamically destroyed and created)
- private static VirtualDisplay mVirtualDisplay;
- private static int mRegisteredNavDisplayId = Display.INVALID_DISPLAY;
- private boolean mNavigationDisplayUpdatePending = false;
-
- public NavigationFragment() {
- // Required empty public constructor
- }
-
-
- private final DisplayListener mDisplayListener = new DisplayListener() {
- @Override
- public void onDisplayAdded(int displayId) {
- int navDisplayId = getVirtualDisplayId();
- Log.i(TAG, "onDisplayAdded, displayId: " + displayId
- + ", navigation display id: " + navDisplayId);
-
- if (navDisplayId == displayId) {
- mRegisteredNavDisplayId = displayId;
- updateNavigationDisplay();
- }
- }
-
- @Override
- public void onDisplayRemoved(int displayId) {
- if (mRegisteredNavDisplayId == displayId) {
- mRegisteredNavDisplayId = Display.INVALID_DISPLAY;
- updateNavigationDisplay();
- }
- }
-
- @Override
- public void onDisplayChanged(int displayId) {}
- };
-
- private void updateNavigationDisplay() {
- if (mMainClusterActivity == null) {
- // Not attached to the activity yet. Let's wait.
- mNavigationDisplayUpdatePending = true;
- return;
- }
-
- mNavigationDisplayUpdatePending = false;
- mMainClusterActivity.updateNavDisplay(new MainClusterActivity.VirtualDisplay(
- mRegisteredNavDisplayId, mUnobscuredBounds));
- }
-
- @Override
- public void onAttach(Context context) {
- super.onAttach(context);
- mMainClusterActivity = (MainClusterActivity) context;
- if (mNavigationDisplayUpdatePending) {
- updateNavigationDisplay();
- }
- }
-
- @Override
- public void onDetach() {
- mMainClusterActivity = null;
- super.onDetach();
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- Log.i(TAG, "onCreateView");
- ViewModelProvider provider = ViewModelProviders.of(requireActivity());
- mViewModel = provider.get(ClusterViewModel.class);
-
- mDisplayManager = getActivity().getSystemService(DisplayManager.class);
- mDisplayManager.registerDisplayListener(mDisplayListener, new Handler());
-
- // Inflate the layout for this fragment
- View root = inflater.inflate(R.layout.fragment_navigation, container, false);
-
- mSurfaceView = root.findViewById(R.id.nav_surface);
- mSurfaceView.getHolder().addCallback(new Callback() {
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- Log.i(TAG, "surfaceCreated, holder: " + holder);
- }
-
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- Log.i(TAG, "surfaceChanged, holder: " + holder + ", size:" + width + "x" + height
- + ", format:" + format);
-
- // Create dummy unobscured area to report to navigation activity.
- int obscuredWidth = (int) getResources()
- .getDimension(R.dimen.speedometer_overlap_width);
- int obscuredHeight = (int) getResources()
- .getDimension(R.dimen.navigation_gradient_height);
- mUnobscuredBounds = new Rect(
- obscuredWidth, /* left: size of gauge */
- obscuredHeight, /* top: gradient */
- width - obscuredWidth, /* right: size of the display - size of gauge */
- height - obscuredHeight /* bottom: size of display - gradient */
- );
-
- if (mVirtualDisplay == null) {
- mVirtualDisplay = createVirtualDisplay(holder.getSurface(), width, height);
- } else {
- mVirtualDisplay.setSurface(holder.getSurface());
- }
- }
-
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- Log.i(TAG, "surfaceDestroyed, holder: " + holder + ", detaching surface from"
- + " display, surface: " + holder.getSurface());
- // detaching surface is similar to turning off the display
- mVirtualDisplay.setSurface(null);
- }
- });
- mProgressBar = root.findViewById(R.id.progress_bar);
- mMessage = root.findViewById(R.id.message);
-
- mViewModel.getNavigationActivityState().observe(this, state -> {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "State: " + state);
- }
- mProgressBar.setVisibility(state == ClusterViewModel.NavigationActivityState.LOADING
- ? View.VISIBLE : View.INVISIBLE);
- mMessage.setVisibility(state == ClusterViewModel.NavigationActivityState.NOT_SELECTED
- ? View.VISIBLE : View.INVISIBLE);
- });
-
- return root;
- }
-
- private VirtualDisplay createVirtualDisplay(Surface surface, int width, int height) {
- Log.i(TAG, "createVirtualDisplay, surface: " + surface + ", width: " + width
- + "x" + height);
- return mDisplayManager.createVirtualDisplay("Cluster-App-VD", width, height, 160, surface,
- DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY);
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- Log.i(TAG, "onDestroy");
- }
-
- private int getVirtualDisplayId() {
- return (mVirtualDisplay != null && mVirtualDisplay.getDisplay() != null)
- ? mVirtualDisplay.getDisplay().getDisplayId() : Display.INVALID_DISPLAY;
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java
deleted file mode 100644
index ba64ce5..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.car.cluster.sample;
-
-import android.annotation.NonNull;
-import android.content.Context;
-import android.hardware.display.DisplayManager;
-import android.hardware.display.DisplayManager.DisplayListener;
-import android.hardware.display.VirtualDisplay;
-import android.media.MediaCodec;
-import android.media.MediaCodec.BufferInfo;
-import android.media.MediaCodec.CodecException;
-import android.media.MediaCodecInfo;
-import android.media.MediaCodecInfo.CodecProfileLevel;
-import android.media.MediaFormat;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.Message;
-import android.util.Log;
-import android.view.Display;
-import android.view.Surface;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.RandomAccessFile;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.nio.ByteBuffer;
-import java.util.UUID;
-
-/**
- * This class encapsulates all work related to managing networked virtual display.
- * <p>
- * It opens a socket and listens on port {@code PORT} for connections, or the emulator pipe. Once
- * connection is established it creates virtual display and media encoder and starts streaming video
- * to that socket. If the receiving part is disconnected, it will keep port open and virtual
- * display won't be destroyed.
- */
-public class NetworkedVirtualDisplay {
- private static final String TAG = "Cluster." + NetworkedVirtualDisplay.class.getSimpleName();
-
- private final String mUniqueId = UUID.randomUUID().toString();
-
- private final DisplayManager mDisplayManager;
- private final int mWidth;
- private final int mHeight;
- private final int mDpi;
-
- private static final int FPS = 25;
- private static final int BITRATE = 6144000;
- private static final String MEDIA_FORMAT_MIMETYPE = MediaFormat.MIMETYPE_VIDEO_AVC;
-
- public static final int MSG_START = 0;
- public static final int MSG_STOP = 1;
- public static final int MSG_SEND_FRAME = 2;
-
- private static final String PIPE_NAME = "pipe:qemud:carCluster";
- private static final String PIPE_DEVICE = "/dev/qemu_pipe";
-
- // Constants shared with emulator in car-cluster-widget.cpp
- public static final int PIPE_START = 1;
- public static final int PIPE_STOP = 2;
-
- private static final int PORT = 5151;
-
- private SenderThread mActiveThread;
- private HandlerThread mBroadcastThread = new HandlerThread("BroadcastThread");
-
- private VirtualDisplay mVirtualDisplay;
- private MediaCodec mVideoEncoder;
- private Handler mHandler;
- private byte[] mBuffer = null;
- private int mLastFrameLength = 0;
-
- private final DebugCounter mCounter = new DebugCounter();
-
- NetworkedVirtualDisplay(Context context, int width, int height, int dpi) {
- mDisplayManager = context.getSystemService(DisplayManager.class);
- mWidth = width;
- mHeight = height;
- mDpi = dpi;
-
- DisplayListener displayListener = new DisplayListener() {
- @Override
- public void onDisplayAdded(int i) {
- final Display display = mDisplayManager.getDisplay(i);
- if (display != null && getDisplayName().equals(display.getName())) {
- onVirtualDisplayReady(display);
- }
- }
-
- @Override
- public void onDisplayRemoved(int i) {}
-
- @Override
- public void onDisplayChanged(int i) {}
- };
-
- mDisplayManager.registerDisplayListener(displayListener, new Handler());
- }
-
- /**
- * Opens socket and creates virtual display asynchronously once connection established. Clients
- * of this class may subscribe to
- * {@link android.hardware.display.DisplayManager#registerDisplayListener(
- * DisplayListener, Handler)} to be notified when virtual display is created.
- * Note, that this method should be called only once.
- *
- * @return Unique display name associated with the instance of this class.
- *
- * @see {@link Display#getName()}
- *
- * @throws IllegalStateException thrown if networked display already started
- */
- public String start() {
- if (mBroadcastThread.isAlive()) {
- throw new IllegalStateException("Already started");
- }
-
- mBroadcastThread.start();
- mHandler = new BroadcastThreadHandler(mBroadcastThread.getLooper());
- mHandler.sendMessage(Message.obtain(mHandler, MSG_START));
- return getDisplayName();
- }
-
- public void release() {
- mHandler.sendMessage(Message.obtain(mHandler, MSG_STOP));
- mBroadcastThread.quitSafely();
-
- if (mVirtualDisplay != null) {
- mVirtualDisplay.setSurface(null);
- mVirtualDisplay.release();
- mVirtualDisplay = null;
- }
- }
-
- private String getDisplayName() {
- return "Cluster-" + mUniqueId;
- }
-
- private VirtualDisplay createVirtualDisplay() {
- Log.i(TAG, "createVirtualDisplay " + mWidth + "x" + mHeight +"@" + mDpi);
- return mDisplayManager.createVirtualDisplay(getDisplayName(), mWidth, mHeight, mDpi,
- null, 0 /* flags */, null, null );
- }
-
- private void onVirtualDisplayReady(Display display) {
- Log.i(TAG, "onVirtualDisplayReady, display: " + display);
- }
-
- private void startCasting(Handler handler) {
- Log.i(TAG, "Start casting...");
- if (mVideoEncoder != null) {
- Log.i(TAG, "Already started casting");
- return;
- }
- mVideoEncoder = createVideoStream(handler);
-
- if (mVirtualDisplay == null) {
- mVirtualDisplay = createVirtualDisplay();
- }
-
- mVirtualDisplay.setSurface(mVideoEncoder.createInputSurface());
- mVideoEncoder.start();
- Log.i(TAG, "Video encoder started");
- }
-
- private MediaCodec createVideoStream(Handler handler) {
- MediaCodec encoder;
- try {
- encoder = MediaCodec.createEncoderByType(MEDIA_FORMAT_MIMETYPE);
- } catch (IOException e) {
- Log.e(TAG, "Failed to create video encoder for " + MEDIA_FORMAT_MIMETYPE, e);
- return null;
- }
-
- encoder.setCallback(new MediaCodec.Callback() {
- @Override
- public void onInputBufferAvailable(@NonNull MediaCodec codec, int index) {
- // Nothing to do
- }
-
- @Override
- public void onOutputBufferAvailable(@NonNull MediaCodec codec, int index,
- @NonNull BufferInfo info) {
- mCounter.outputBuffers++;
- doOutputBufferAvailable(index, info);
- }
-
- @Override
- public void onError(@NonNull MediaCodec codec, @NonNull CodecException e) {
- Log.e(TAG, "onError, codec: " + codec, e);
- mCounter.bufferErrors++;
- stopCasting();
- startCasting(handler);
- }
-
- @Override
- public void onOutputFormatChanged(@NonNull MediaCodec codec,
- @NonNull MediaFormat format) {
- Log.i(TAG, "onOutputFormatChanged, codec: " + codec + ", format: " + format);
-
- }
- }, handler);
-
- configureVideoEncoder(encoder, mWidth, mHeight);
- return encoder;
- }
-
- private void doOutputBufferAvailable(int index, @NonNull BufferInfo info) {
- mHandler.removeMessages(MSG_SEND_FRAME);
-
- ByteBuffer encodedData = mVideoEncoder.getOutputBuffer(index);
- if (encodedData == null) {
- throw new RuntimeException("couldn't fetch buffer at index " + index);
- }
-
- if (info.size != 0) {
- encodedData.position(info.offset);
- encodedData.limit(info.offset + info.size);
- mLastFrameLength = encodedData.remaining();
- if (mBuffer == null || mBuffer.length < mLastFrameLength) {
- Log.i(TAG, "Allocating new buffer: " + mLastFrameLength);
- mBuffer = new byte[mLastFrameLength];
- }
- encodedData.get(mBuffer, 0, mLastFrameLength);
- mVideoEncoder.releaseOutputBuffer(index, false);
-
- // Send this frame asynchronously (avoiding blocking on the socket). We might miss
- // frames if the consumer is not fast enough, but this is acceptable.
- sendFrameAsync(0);
- } else {
- Log.e(TAG, "Skipping empty buffer");
- mVideoEncoder.releaseOutputBuffer(index, false);
- }
- }
-
- private void sendFrameAsync(long delayMs) {
- Message msg = mHandler.obtainMessage(MSG_SEND_FRAME);
- mHandler.sendMessageDelayed(msg, delayMs);
- }
-
- private void sendFrame(byte[] buf, int len) {
- if (mActiveThread != null) {
- mActiveThread.send(buf, len);
- }
- }
-
- private void stopCasting() {
- Log.i(TAG, "Stopping casting...");
-
- if (mVirtualDisplay != null) {
- Surface surface = mVirtualDisplay.getSurface();
- if (surface != null) surface.release();
- }
-
- if (mVideoEncoder != null) {
- // Releasing encoder as stop/start didn't work well (couldn't create or reuse input
- // surface).
- try {
- mVideoEncoder.stop();
- mVideoEncoder.release();
- } catch (IllegalStateException e) {
- // do nothing, already released
- }
- mVideoEncoder = null;
- }
- Log.i(TAG, "Casting stopped");
- }
-
- private class BroadcastThreadHandler extends Handler {
- private static final int MAX_FAIL_COUNT = 10;
- private int mFailConnectCounter;
-
- BroadcastThreadHandler(Looper looper) {
- super(looper);
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_START:
- Log.i(TAG, "Received start message");
-
- // Make sure mActiveThread cannot start multiple times
- if (mActiveThread != null) {
- Log.w(TAG, "Trying to start a running thread. Race condition may exist");
- break;
- }
-
- // Failure to connect to either pipe or network returns null
- if (mActiveThread == null) {
- mActiveThread = tryPipeConnect();
- }
- if (mActiveThread == null) {
- mActiveThread = tryNetworkConnect();
- }
- if (mActiveThread == null) {
- // When failed attempt limit is reached, clean up and quit this thread.
- mFailConnectCounter++;
- if (mFailConnectCounter >= MAX_FAIL_COUNT) {
- Log.e(TAG, "Too many failed connection attempts; aborting");
- release();
- throw new RuntimeException("Abort after failed connection attempts");
- }
- mHandler.sendMessage(Message.obtain(mHandler, MSG_START));
- break;
- }
-
- try {
- mFailConnectCounter = 0;
- mCounter.clientsConnected++;
- mActiveThread.start();
- startCasting(this);
- } catch (Exception e) {
- Log.e(TAG, "Failed to start thread", e);
- Log.e(TAG, "DebugCounter: " + mCounter);
- }
- break;
-
- case MSG_STOP:
- Log.i(TAG, "Received stop message");
- stopCasting();
- mCounter.clientsDisconnected++;
- if (mActiveThread != null) {
- mActiveThread.close();
- try {
- mActiveThread.join();
- } catch (InterruptedException e) {
- Log.e(TAG, "Waiting for active thread to close failed", e);
- }
- mActiveThread = null;
- }
- break;
-
- case MSG_SEND_FRAME:
- if (mActiveThread == null) {
- // Stop the chaining signal if there's no client to send to
- break;
- }
- sendFrame(mBuffer, mLastFrameLength);
- // We will keep sending last frame every second as a heartbeat.
- sendFrameAsync(1000L);
- break;
- }
- }
-
- // Returns null if can't establish pipe connection
- // Otherwise returns the corresponding client thread
- private PipeThread tryPipeConnect() {
- try {
- RandomAccessFile pipe = new RandomAccessFile(PIPE_DEVICE, "rw");
- byte[] temp = new byte[PIPE_NAME.length() + 1];
- temp[PIPE_NAME.length()] = 0;
- System.arraycopy(PIPE_NAME.getBytes(), 0, temp, 0, PIPE_NAME.length());
- pipe.write(temp);
-
- // At this point, the pipe exists, so we will just wait for a start signal
- // This is in case pipe still sends leftover stops from last instantiation
- int signal = pipe.read();
- while (signal != PIPE_START) {
- Log.i(TAG, "Received non-start signal: " + signal);
- signal = pipe.read();
- }
- return new PipeThread(mHandler, pipe);
- } catch (IOException e) {
- Log.e(TAG, "Failed to establish pipe connection", e);
- return null;
- }
- }
-
- // Returns null if can't establish network connection
- // Otherwise returns the corresponding client thread
- private SocketThread tryNetworkConnect() {
- try {
- ServerSocket serverSocket = new ServerSocket(PORT);
- Log.i(TAG, "Server socket opened");
- Socket socket = serverSocket.accept();
- socket.setTcpNoDelay(true);
- socket.setKeepAlive(true);
- socket.setSoLinger(true, 0);
-
- InputStream inputStream = socket.getInputStream();
- OutputStream outputStream = socket.getOutputStream();
-
- return new SocketThread(mHandler, serverSocket, inputStream, outputStream);
- } catch (IOException e) {
- Log.e(TAG, "Failed to establish network connection", e);
- return null;
- }
- }
- }
-
- private static void configureVideoEncoder(MediaCodec codec, int width, int height) {
- MediaFormat format = MediaFormat.createVideoFormat(MEDIA_FORMAT_MIMETYPE, width, height);
-
- format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
- MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
- format.setInteger(MediaFormat.KEY_BIT_RATE, BITRATE);
- format.setInteger(MediaFormat.KEY_FRAME_RATE, FPS);
- format.setInteger(MediaFormat.KEY_CAPTURE_RATE, FPS);
- format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
- format.setFloat(MediaFormat.KEY_I_FRAME_INTERVAL, 1); // 1 second between I-frames
- format.setInteger(MediaFormat.KEY_LEVEL, CodecProfileLevel.AVCLevel31);
- format.setInteger(MediaFormat.KEY_PROFILE,
- MediaCodecInfo.CodecProfileLevel.AVCProfileBaseline);
-
- codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
- }
-
- @Override
- public String toString() {
- return getClass() + "{"
- + ", receiver connected: " + (mActiveThread != null)
- + ", encoder: " + mVideoEncoder
- + ", virtualDisplay" + mVirtualDisplay
- + "}";
- }
-
- private static class DebugCounter {
- long outputBuffers;
- long bufferErrors;
- long clientsConnected;
- long clientsDisconnected;
-
- @Override
- public String toString() {
- return getClass().getSimpleName() + "{"
- + "outputBuffers=" + outputBuffers
- + ", bufferErrors=" + bufferErrors
- + ", clientsConnected=" + clientsConnected
- + ", clientsDisconnected= " + clientsDisconnected
- + "}";
- }
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PhoneFragment.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PhoneFragment.java
deleted file mode 100644
index c546f9d..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PhoneFragment.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import android.os.Bundle;
-import android.telephony.TelephonyManager;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-import androidx.lifecycle.ViewModelProviders;
-
-import com.android.car.telephony.common.TelecomUtils;
-
-/**
- * Displays ongoing call information.
- */
-public class PhoneFragment extends Fragment {
- private View mUserProfileContainerView;
-
- private PhoneFragmentViewModel mViewModel;
-
- public PhoneFragment() {
- // Required empty public constructor
- }
-
- @Nullable
- @Override
- public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
- Bundle savedInstanceState) {
- FragmentActivity activity = requireActivity();
- mViewModel = ViewModelProviders.of(activity).get(
- PhoneFragmentViewModel.class);
-
- View fragmentView = inflater.inflate(R.layout.fragment_phone, container, false);
- mUserProfileContainerView = fragmentView.findViewById(R.id.user_profile_container);
-
- TextView body = mUserProfileContainerView.findViewById(R.id.body);
- ImageView avatar = mUserProfileContainerView.findViewById(R.id.avatar);
- TextView nameView = mUserProfileContainerView.findViewById(R.id.title);
-
- mViewModel.getContactInfo().observe(getViewLifecycleOwner(), (contactInfo) -> {
- nameView.setText(contactInfo.getDisplayName());
- TelecomUtils.setContactBitmapAsync(getContext(),
- avatar, contactInfo.getContact(), contactInfo.getNumber());
- });
- mViewModel.getBody().observe(getViewLifecycleOwner(), body::setText);
- mViewModel.getState().observe(getViewLifecycleOwner(), (state) -> {
- if (state == TelephonyManager.CALL_STATE_IDLE) {
- mUserProfileContainerView.setVisibility(View.GONE);
- } else {
- mUserProfileContainerView.setVisibility(View.VISIBLE);
- }
- });
-
- return fragmentView;
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PhoneFragmentViewModel.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PhoneFragmentViewModel.java
deleted file mode 100644
index dd955e1..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PhoneFragmentViewModel.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import static androidx.lifecycle.Transformations.map;
-
-import android.app.Application;
-import android.content.Context;
-import android.telephony.PhoneStateListener;
-import android.telephony.TelephonyManager;
-
-import androidx.lifecycle.AndroidViewModel;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MutableLiveData;
-
-import com.android.car.telephony.common.Contact;
-import com.android.car.telephony.common.InMemoryPhoneBook;
-import com.android.car.telephony.common.TelecomUtils;
-
-/**
- * View model for {@link PhoneFragment}
- */
-public final class PhoneFragmentViewModel extends AndroidViewModel {
- private MutableLiveData<Long> mConnectTime = new MutableLiveData<>();
- private MutableLiveData<Integer> mState = new MutableLiveData<>();
- private MutableLiveData<String> mNumber = new MutableLiveData<>();
- private LiveData<String> mBody;
- private LiveData<ContactInfo> mContactInfo;
-
- private PhoneStateCallback mCallback;
-
- public PhoneFragmentViewModel(Application application) {
- super(application);
-
- TelephonyManager telephonyManager = (TelephonyManager) application.getSystemService(
- Context.TELEPHONY_SERVICE);
- telephonyManager.listen(new ClusterPhoneStateListener(),
- PhoneStateListener.LISTEN_CALL_STATE);
-
- mBody = new SelfRefreshDescriptionLiveData(getApplication(), mState, mNumber, mConnectTime);
-
- mContactInfo = map(mNumber, (number) -> {
- return new ContactInfo(number);
- });
- }
-
- public interface PhoneStateCallback {
- void onCall();
-
- void onDisconnect();
- }
-
- public LiveData<Integer> getState() {
- return mState;
- }
-
- public LiveData<String> getBody() {
- return mBody;
- }
-
- public LiveData<ContactInfo> getContactInfo() {
- return mContactInfo;
- }
-
- public void setPhoneStateCallback(PhoneStateCallback callback) {
- mCallback = callback;
- }
-
- /**
- * Listens to phone state changes
- */
- private class ClusterPhoneStateListener extends PhoneStateListener {
- ClusterPhoneStateListener() {
- }
-
- @Override
- public void onCallStateChanged(int state, String incomingNumber) {
- super.onCallStateChanged(state, incomingNumber);
-
- mState.setValue(state);
- mNumber.setValue(incomingNumber);
-
- if (state == TelephonyManager.CALL_STATE_IDLE) {
- if (mCallback != null) {
- mCallback.onDisconnect();
- }
- } else if (state == TelephonyManager.CALL_STATE_RINGING) {
- if (mCallback != null) {
- mCallback.onCall();
- }
- } else if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
- mConnectTime.setValue(System.currentTimeMillis());
- if (mCallback != null) {
- mCallback.onCall();
- }
- }
- }
- }
-
- public class ContactInfo {
- private String mNumber;
- private String mDisplayName;
- private Contact mContact;
-
- public ContactInfo(String number) {
- mNumber = number;
- mDisplayName = TelecomUtils.getDisplayNameAndAvatarUri(getApplication(), number).first;
- mContact = InMemoryPhoneBook.get().lookupContactEntry(number);
- }
-
- public String getNumber() {
- return mNumber;
- }
-
- public String getDisplayName() {
- return mDisplayName;
- }
-
- public Contact getContact() {
- return mContact;
- }
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PipeThread.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PipeThread.java
deleted file mode 100644
index c96f482..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PipeThread.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-import android.os.Handler;
-import android.util.Log;
-
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Thread that can send data to the emulator using a qemud service.
- */
-public class PipeThread extends SenderThread {
- private static final String TAG = "Cluster." + PipeThread.class.getSimpleName();
-
- private RandomAccessFile mPipe;
-
- /**
- * Creates instance of pipe thread that can write to given pipe file.
- *
- * @param handler {@link Handler} used to message broadcaster.
- * @param pipe {@link RandomAccessFile} file already connected to pipe.
- */
- PipeThread(Handler handler, RandomAccessFile pipe) {
- super(handler);
- mPipe = pipe;
- }
-
- public void run() {
- try {
- int signal = mPipe.read();
- while (signal != NetworkedVirtualDisplay.PIPE_STOP) {
- Log.i(TAG, "Received non-stop signal: " + signal);
- signal = mPipe.read();
- }
- restart();
- } catch (IOException e) {
- Log.e(TAG, "Failed to read from pipe");
- restart();
- }
- }
-
- @Override
- public void send(byte[] buf, int len) {
- try {
- // First sends the size prior to sending the data, since receiving side only sees
- // the size of the buffer, which could be significant larger than the actual data.
- mPipe.write(ByteBuffer.allocate(4)
- .order(ByteOrder.LITTLE_ENDIAN).putInt(len).array());
- mPipe.write(buf);
- } catch (IOException e) {
- Log.e(TAG, "Write to pipe failed");
- restart();
- }
- }
-
- @Override
- public void close() {
- try {
- mPipe.close();
- } catch (IOException e) {
- Log.e(TAG, "Failed to close pipe", e);
- }
- }
-}
-
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SelfRefreshDescriptionLiveData.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SelfRefreshDescriptionLiveData.java
deleted file mode 100644
index 79122c4..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SelfRefreshDescriptionLiveData.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import android.content.Context;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.text.format.DateUtils;
-
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MediatorLiveData;
-
-import com.android.car.telephony.common.TelecomUtils;
-
-/**
- * Emits the description for the body in {@link PhoneFragmentViewModel}.
- *
- * This description may be the current duration of the call, call state, call type,
- * or a combination of them.
- *
- * Possible strings:
- * "Ringing"
- * "1:05"
- * "Mobile · Dialing"
- * "Mobile · 1:05"
- */
-public class SelfRefreshDescriptionLiveData extends MediatorLiveData<String> {
- private final LiveData<Long> mConnectTimeLiveData;
- private final LiveData<String> mNumberLiveData;
- private final LiveData<Integer> mStateLiveData;
- private final Context mContext;
-
- /**
- * @param stateLiveData LiveData holding the {@link TelephonyManager} call state
- * @param numberLiveData LiveData holding the call number
- * @param connectTimeLiveData LiveData holding the starting timestamp of the call
- */
- public SelfRefreshDescriptionLiveData(Context context,
- LiveData<Integer> stateLiveData,
- LiveData<String> numberLiveData,
- LiveData<Long> connectTimeLiveData) {
- mContext = context;
- mNumberLiveData = numberLiveData;
- mStateLiveData = stateLiveData;
- mConnectTimeLiveData = connectTimeLiveData;
-
- HeartBeatLiveData heartBeatLiveData = new HeartBeatLiveData(DateUtils.SECOND_IN_MILLIS);
-
- addSource(stateLiveData, (trigger) -> updateDescription());
- addSource(heartBeatLiveData, (trigger) -> updateDescription());
- addSource(mNumberLiveData, (trigger) -> updateDescription());
- addSource(mConnectTimeLiveData, (trigger) -> updateDescription());
- }
-
- private void updateDescription() {
- String number = mNumberLiveData.getValue();
- Integer callState = mStateLiveData.getValue();
- Long connectTime = mConnectTimeLiveData.getValue();
- if (callState != null) {
- String newDescription = getCallInfoText(mContext, callState, number,
- connectTime != null ? connectTime : 0);
-
- String oldDescription = getValue();
- if (!newDescription.equals(oldDescription)) {
- setValue(newDescription);
- }
- } else {
- setValue("");
- }
- }
-
- /**
- * @return A formatted string that has information about the phone call
- * Possible strings:
- * "Mobile · Dialing"
- * "Mobile · 1:05"
- */
- private String getCallInfoText(Context context, Integer callState, String number,
- Long connectTime) {
- CharSequence label = TelecomUtils.getTypeFromNumber(context, number);
- String text = "";
- if (callState == TelephonyManager.CALL_STATE_OFFHOOK) {
- long duration = connectTime > 0 ? System.currentTimeMillis()
- - connectTime : 0;
- String durationString = DateUtils.formatElapsedTime(duration / 1000);
- if (!TextUtils.isEmpty(durationString) && !TextUtils.isEmpty(label)) {
- text = context.getString(R.string.phone_label_with_info, label,
- durationString);
- } else if (!TextUtils.isEmpty(durationString)) {
- text = durationString;
- } else if (!TextUtils.isEmpty(label)) {
- text = (String) label;
- }
- } else {
- String state = callStateToUiString(context, callState);
- if (!TextUtils.isEmpty(label)) {
- text = context.getString(R.string.phone_label_with_info, label, state);
- } else {
- text = state;
- }
- }
-
- return text;
- }
-
- /**
- * @return A string representation of the call state that can be presented to a user.
- */
- private String callStateToUiString(Context context, int state) {
- switch (state) {
- case TelephonyManager.CALL_STATE_IDLE:
- return context.getString(R.string.call_state_call_ended);
- case TelephonyManager.CALL_STATE_RINGING:
- return context.getString(R.string.call_state_call_ringing);
- case TelephonyManager.CALL_STATE_OFFHOOK:
- return context.getString(R.string.call_state_call_active);
- default:
- return "";
- }
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java
deleted file mode 100644
index 9def7ee..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-import android.os.Handler;
-import android.os.Message;
-import android.util.Log;
-
-/**
- * This class serves as a template for sending to specific clients of the broadcaster.
- */
-public abstract class SenderThread extends Thread {
- private static final String TAG = "Cluster.SenderThread";
-
- private Handler mHandler;
-
- SenderThread(Handler handler) {
- mHandler = handler;
- }
-
- abstract void send(byte[] buf, int len);
- abstract void close();
-
- /**
- * Tells the broadcasting thread to stop and close everything in progress, and start over again.
- * It will kill the current instance of this thread, and produce a new one.
- */
- synchronized void restart() {
- if (mHandler.hasMessages(NetworkedVirtualDisplay.MSG_START)) return;
- Log.i(TAG, "Sending STOP and START msgs to NetworkedVirtualDisplay");
-
- mHandler.sendMessage(Message.obtain(mHandler, NetworkedVirtualDisplay.MSG_STOP));
- mHandler.sendMessage(Message.obtain(mHandler, NetworkedVirtualDisplay.MSG_START));
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SocketThread.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SocketThread.java
deleted file mode 100644
index a5215b0..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SocketThread.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-import android.os.Handler;
-import android.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.ServerSocket;
-
-/**
- * The thread that will send data on an opened socket.
- */
-public class SocketThread extends SenderThread {
- private static final String TAG = "Cluster." + SocketThread.class.getSimpleName();
- private ServerSocket mServerSocket;
- private OutputStream mOutputStream;
- private InputStream mInputStream;
-
- /**
- * Create instance of thread that can write to given open socket.
- *
- * @param handler {@link Handler} used to message the broadcaster.
- * @param serverSocket {@link ServerSocket} should be already opened.
- * @param inputStream {@link InputStream} corresponding to opened socket.
- * @param outputStream {@link OutputStream} corresponding to opened socket.
- */
- SocketThread(Handler handler, ServerSocket serverSocket, InputStream inputStream,
- OutputStream outputStream) {
- super(handler);
- mServerSocket = serverSocket;
- mInputStream = inputStream;
- mOutputStream = outputStream;
- }
-
- public void run() {
- try {
- // This read should block until something disconnects (or something
- // similar) which should cause an exception, in which case we should
- // try to setup again and reconnect
- mInputStream.read();
- } catch (IOException e) {
- Log.e(TAG, "Socket thread disconnected.");
- }
- restart();
- }
-
- @Override
- public void send(byte[] buf, int len) {
- try {
- mOutputStream.write(buf, 0, len);
- } catch (IOException e) {
- Log.e(TAG, "Failed to write data to socket, retrying connection");
- restart();
- }
- }
-
- @Override
- public void close() {
- if (mServerSocket != null) {
- try {
- mServerSocket.close();
- } catch (IOException e) {
- Log.w(TAG, "Failed to close server socket, ignoring");
- }
- mServerSocket = null;
- }
- mInputStream = null;
- mOutputStream = null;
- }
-}
-
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensor.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensor.java
deleted file mode 100644
index 8f01cd7..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensor.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample.sensors;
-
-import android.car.VehiclePropertyType;
-import android.car.hardware.CarPropertyValue;
-
-import java.util.function.Function;
-
-/**
- * Description of a car sensor. It can be used as identifier at
- * {@link android.car.cluster.sample.ClusterViewModel#getSensor(Sensor)} to obtain a
- * {@link androidx.lifecycle.LiveData} to track values of this sensor. The sensor description is
- * used to process and decode the information reported by the car.
- * <p>
- * All instances of this class must be obtained from {@link Sensors}.
- *
- * @param <T> data type used by this sensor.
- */
-public class Sensor<T> {
- /** Name of the sensor (for debugging) */
- public final String mName;
- /** VHAL identifier of this sensor */
- public final int mPropertyId;
- /** VHAL area associated with this sensor (each area is reported as an independent sensor) */
- public final int mAreaId;
- /**
- * Data type expected to be reported by the VHAL. If the values received don't match with the
- * expected ones, we warn about it and ignore the value.
- */
- @VehiclePropertyType.Enum
- public final int mExpectedPropertyType;
- /** VHAL Area associated with this sensor. */
- public final Function<CarPropertyValue<?>, T> mAdapter;
-
- /**
- * Creates a new sensor. Only {@link Sensors} should use this constructor.
- */
- Sensor(String name, int propertyId, int areaId, int expectedPropertyType,
- Function<CarPropertyValue<?>, T> adapter) {
- mName = name;
- mPropertyId = propertyId;
- mAreaId = areaId;
- mExpectedPropertyType = expectedPropertyType;
- mAdapter = adapter;
- }
-
- @Override
- public String toString() {
- return mName;
- }
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensors.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensors.java
deleted file mode 100644
index 90d6350..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensors.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample.sensors;
-
-import android.car.VehiclePropertyIds;
-import android.car.VehiclePropertyType;
-import android.car.hardware.CarPropertyValue;
-import android.car.hardware.CarSensorEvent;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Function;
-
-/**
- * The collection of all sensors supported by this application.
- */
-public class Sensors {
- /** Area identifier used for sensors corresponding to global VHAL properties */
- public static final int GLOBAL_AREA_ID = -1;
-
- private static Sensors sInstance;
- private static List<Sensor<?>> sSensors = new ArrayList<>();
- private Map<Integer, List<Sensor<?>>> mSensorsByPropertyId = new HashMap<>();
-
- /** Possible values of the {@link #SENSOR_GEAR} sensor */
- public enum Gear {
- NEUTRAL,
- REVERSE,
- DRIVE,
- PARK,
- }
-
- /** Fuel of the car, measured in millimeters */
- public static final Sensor<Float> SENSOR_FUEL = registerSensor(
- "Fuel", VehiclePropertyIds.FUEL_LEVEL, GLOBAL_AREA_ID, VehiclePropertyType.FLOAT,
- value -> (Float) value.getValue());
- /** Fuel capacity of the car, measured in millimeters */
- public static final Sensor<Float> SENSOR_FUEL_CAPACITY = registerSensor(
- "Fuel Capacity", VehiclePropertyIds.INFO_FUEL_CAPACITY, GLOBAL_AREA_ID,
- VehiclePropertyType.FLOAT,
- value -> (Float) value.getValue());
- /** RPMs */
- public static final Sensor<Float> SENSOR_RPM = registerSensor(
- "RPM", VehiclePropertyIds.ENGINE_RPM, GLOBAL_AREA_ID,
- VehiclePropertyType.FLOAT,
- value -> (Float) value.getValue());
- /** Fuel range in meters */
- public static final Sensor<Float> SENSOR_FUEL_RANGE = registerSensor(
- "Fuel Range", VehiclePropertyIds.RANGE_REMAINING, GLOBAL_AREA_ID,
- VehiclePropertyType.FLOAT,
- value -> (Float) value.getValue());
- /** Speed in meters per second */
- public static final Sensor<Float> SENSOR_SPEED = registerSensor(
- "Speed", VehiclePropertyIds.PERF_VEHICLE_SPEED, GLOBAL_AREA_ID,
- VehiclePropertyType.FLOAT,
- value -> (Float) value.getValue());
- /** Current gear of the car */
- public static final Sensor<Gear> SENSOR_GEAR = registerSensor(
- "Gear", VehiclePropertyIds.GEAR_SELECTION, GLOBAL_AREA_ID, VehiclePropertyType.INT32,
- value -> {
- if (value == null) {
- return null;
- }
- Integer gear = (Integer) value.getValue();
- if ((gear & CarSensorEvent.GEAR_REVERSE) != 0) {
- return Gear.REVERSE;
- } else if ((gear & CarSensorEvent.GEAR_NEUTRAL) != 0) {
- return Gear.NEUTRAL;
- } else if ((gear & CarSensorEvent.GEAR_DRIVE) != 0) {
- return Gear.DRIVE;
- } else if ((gear & CarSensorEvent.GEAR_PARK) != 0) {
- return Gear.PARK;
- } else {
- return null;
- }
- });
-
- private static <T> Sensor<T> registerSensor(String propertyName, int propertyId, int areaId,
- int expectedPropertyType, Function<CarPropertyValue<?>, T> adapter) {
- Sensor<T> sensor = new Sensor<>(propertyName, propertyId, areaId, expectedPropertyType,
- adapter);
- sSensors.add(sensor);
- return sensor;
- }
-
- /**
- * Obtains the singleton instance of this class
- */
- public static Sensors getInstance() {
- if (sInstance == null) {
- sInstance = new Sensors();
- }
- return sInstance;
- }
-
- private Sensors() {
- initializeSensorsMap();
- }
-
- private void initializeSensorsMap() {
- for (Sensor<?> sensorId : getSensors()) {
- mSensorsByPropertyId
- .computeIfAbsent(sensorId.mPropertyId, (id) -> new ArrayList<>())
- .add(sensorId);
- }
- }
-
- /**
- * Returns all sensors.
- */
- public List<Sensor<?>> getSensors() {
- return sSensors;
- }
-
- /**
- * Returns all sensors associated to the given VHAL property id.
- */
- public List<Sensor<?>> getSensorsForPropertyId(int propertyId) {
- return mSensorsByPropertyId.get(propertyId);
- }
-
- /**
- * Returns all property ids we care about.
- */
- public Set<Integer> getPropertyIds() {
- return mSensorsByPropertyId.keySet();
- }
-}
diff --git a/tests/DirectRenderingClusterSample/tests/Android.mk b/tests/DirectRenderingClusterSample/tests/Android.mk
deleted file mode 100644
index 9f0a4e8..0000000
--- a/tests/DirectRenderingClusterSample/tests/Android.mk
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (C) 2019 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-# Include all makefiles in subdirectories
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/DirectRenderingClusterSample/tests/robotests/Android.mk b/tests/DirectRenderingClusterSample/tests/robotests/Android.mk
deleted file mode 100644
index 4dd6b7a..0000000
--- a/tests/DirectRenderingClusterSample/tests/robotests/Android.mk
+++ /dev/null
@@ -1,46 +0,0 @@
-#############################################
-# Messenger Robolectric test target. #
-#############################################
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := DirectRenderingClusterSampleTests
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_RESOURCE_DIR := \
- $(LOCAL_PATH)/res
-
-LOCAL_JAVA_LIBRARIES := \
- robolectric_android-all-stub \
- Robolectric_all-target \
- mockito-robolectric-prebuilt \
- truth-prebuilt
-
-LOCAL_INSTRUMENTATION_FOR := DirectRenderingClusterSample
-
-LOCAL_MODULE_TAGS := optional
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-#############################################################
-# Messenger runner target to run the previous target. #
-#############################################################
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := RunDirectRenderingClusterSampleTests
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
- DirectRenderingClusterSampleTests
-
-LOCAL_TEST_PACKAGE := DirectRenderingClusterSample
-
-LOCAL_INSTRUMENT_SOURCE_DIRS := $(dir $(LOCAL_PATH))../src
-
-include prebuilts/misc/common/robolectric/3.6.1/run_robotests.mk
-
-
-
-
diff --git a/tests/DirectRenderingClusterSample/tests/robotests/AndroidManifest.xml b/tests/DirectRenderingClusterSample/tests/robotests/AndroidManifest.xml
deleted file mode 100644
index ad22fc2..0000000
--- a/tests/DirectRenderingClusterSample/tests/robotests/AndroidManifest.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2019 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="android.car.cluster.sample.robotests">
- <application/>
-
-</manifest>
diff --git a/tests/DirectRenderingClusterSample/tests/robotests/readme.md b/tests/DirectRenderingClusterSample/tests/robotests/readme.md
deleted file mode 100644
index 97cff08..0000000
--- a/tests/DirectRenderingClusterSample/tests/robotests/readme.md
+++ /dev/null
@@ -1,6 +0,0 @@
-Unit test suite for RenderingClusterSample using Robolectric.
-
-```
-$ croot
-$ make RunDirectRenderingClusterSampleTests -j96
-```
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/tests/robotests/src/android/car/cluster/sample/ImageResolverTest.java b/tests/DirectRenderingClusterSample/tests/robotests/src/android/car/cluster/sample/ImageResolverTest.java
deleted file mode 100644
index 0d1cece..0000000
--- a/tests/DirectRenderingClusterSample/tests/robotests/src/android/car/cluster/sample/ImageResolverTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.cluster.sample;
-
-import static org.junit.Assert.assertEquals;
-
-import android.graphics.Point;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.internal.DoNotInstrument;
-
-@RunWith(RobolectricTestRunner.class)
-@DoNotInstrument
-public class ImageResolverTest {
- private ImageResolver mImageResolver;
-
- @Before
- public void setup() {
- mImageResolver = new ImageResolver((uri) -> null);
- }
-
- @Test
- public void adjustedSize_widerImageInSquareBox() {
- assertEquals(new Point(20, 10), mImageResolver.getAdjustedSize(40, 20, 20, 20));
- }
-
- @Test
- public void adjustedSize_tallerImageInSquareBox() {
- assertEquals(new Point(10, 20), mImageResolver.getAdjustedSize(20, 40, 20, 20));
- }
-
- @Test
- public void adjustedSize_narrowerImageInSquareBox() {
- assertEquals(new Point(10, 20), mImageResolver.getAdjustedSize(5, 10, 20, 20));
- }
-
- @Test
- public void adjustedSize_shorterImageInSquareBox() {
- assertEquals(new Point(20, 8), mImageResolver.getAdjustedSize(5, 2, 20, 20));
- }
-
- @Test
- public void adjustedSize_widerImageInTallRectangle() {
- assertEquals(new Point(20, 10), mImageResolver.getAdjustedSize(40, 20, 20, 40));
- }
-
- @Test
- public void adjustedSize_tallerImageInTallRectangle() {
- assertEquals(new Point(20, 40), mImageResolver.getAdjustedSize(5, 10, 20, 40));
- }
-
- @Test
- public void adjustedSize_widerImageInWideRectangle() {
- assertEquals(new Point(40, 20), mImageResolver.getAdjustedSize(10, 5, 40, 20));
- }
-
- @Test
- public void adjustedSize_tallerImageInWideRectangle() {
- assertEquals(new Point(10, 20), mImageResolver.getAdjustedSize(5, 10, 40, 20));
- }
-
- @Test
- public void adjustedSize_nullIfNoOriginalWidth() {
- assertEquals(null, mImageResolver.getAdjustedSize(0, 10, 40, 20));
- }
-
- @Test
- public void adjustedSize_nullIfNoOriginalHeight() {
- assertEquals(null, mImageResolver.getAdjustedSize(5, 0, 40, 20));
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void adjustedSize_exceptionIfRequestedWidthAndHeightNoProvided() {
- assertEquals(null, mImageResolver.getAdjustedSize(5, 10, 0, 0));
- }
-
- @Test
- public void adjustedSize_flexibleWidth() {
- assertEquals(new Point(20, 30), mImageResolver.getAdjustedSize(40, 60, 0, 30));
- }
-
- @Test
- public void adjustedSize_flexibleHeight() {
- assertEquals(new Point(20, 20), mImageResolver.getAdjustedSize(40, 40, 20, 0));
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/Android.mk b/tests/InstrumentClusterRendererSample/Android.mk
deleted file mode 100644
index fc00dfa..0000000
--- a/tests/InstrumentClusterRendererSample/Android.mk
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright (C) 2016 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-#
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := InstrumentClusterRendererSampleImpl
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-# Each update should be signed by OEMs
-LOCAL_CERTIFICATE := platform
-LOCAL_PRIVILEGED_MODULE := true
-
-LOCAL_PROGUARD_FLAG_FILES := proguard.flags
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_JAVA_LIBRARIES += android.car
-
-LOCAL_USE_AAPT2 := true
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_STATIC_ANDROID_LIBRARIES += androidx.legacy_legacy-support-v4
-
-include $(BUILD_PACKAGE)
diff --git a/tests/InstrumentClusterRendererSample/AndroidManifest.xml b/tests/InstrumentClusterRendererSample/AndroidManifest.xml
deleted file mode 100644
index 6231220..0000000
--- a/tests/InstrumentClusterRendererSample/AndroidManifest.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.car.cluster.sample"
- android:sharedUserId="android.uid.system">
-
- <uses-sdk android:targetSdkVersion="23" android:minSdkVersion="23"/>
-
- <!-- We set TYPE_SYSTEM_ALERT window flag to presentation in order
- to show it outside of activity context -->
- <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
-
- <uses-permission android:name="android.permission.CONTROL_INCALL_EXPERIENCE"/>
-
- <application android:label="@string/app_name"
- android:icon="@drawable/ic_launcher"
- android:process="android.car.service"
- android:directBootAware="true">
- <service android:name="com.android.car.cluster.sample.ClusterInCallService"
- android:permission="android.permission.BIND_INCALL_SERVICE"
- android:exported="false">
- <meta-data android:name="android.telecom.METADATA_IN_CALL_UI"
- android:value="false" />
- <intent-filter>
- <action android:name="android.telecom.InCallService"/>
- </intent-filter>
- </service>
-
- <service android:name="com.android.car.cluster.sample.StatusBarNotificationListener"
- android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
- android:exported="false">
- <intent-filter>
- <action android:name="android.service.notification.NotificationListenerService" />
- </intent-filter>
- </service>
-
- <service android:name="com.android.car.cluster.sample.InstrumentClusterRenderingServiceImpl"
- android:exported="false"
- android:permission="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"
- />
- </application>
-</manifest>
diff --git a/tests/InstrumentClusterRendererSample/res/anim/icon_switcher_in.xml b/tests/InstrumentClusterRendererSample/res/anim/icon_switcher_in.xml
deleted file mode 100644
index 1c27b63..0000000
--- a/tests/InstrumentClusterRendererSample/res/anim/icon_switcher_in.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:interpolator/linear"
- android:fromAlpha="0.0" android:toAlpha="1.0"
- android:duration="@android:integer/config_longAnimTime" />
diff --git a/tests/InstrumentClusterRendererSample/res/anim/icon_switcher_out.xml b/tests/InstrumentClusterRendererSample/res/anim/icon_switcher_out.xml
deleted file mode 100644
index 6039c48..0000000
--- a/tests/InstrumentClusterRendererSample/res/anim/icon_switcher_out.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<set>
- <!-- We hide this image only when a new one if fully visible, otherwise we may
- be in the state when we have 2 images semi-transparent, and even combined together they
- will look like semi-transparent it looks ugly when we have something underneath, e.g.
- when phone is answered.
- -->
- <alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:interpolator/linear"
- android:fromAlpha="1.0"
- android:toAlpha="0"
- android:startOffset="@android:integer/config_longAnimTime"
- android:duration="@android:integer/config_longAnimTime"/>
-</set>
diff --git a/tests/InstrumentClusterRendererSample/res/anim/slide_in_bottom.xml b/tests/InstrumentClusterRendererSample/res/anim/slide_in_bottom.xml
deleted file mode 100644
index 5739277..0000000
--- a/tests/InstrumentClusterRendererSample/res/anim/slide_in_bottom.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
- <translate android:fromYDelta="50%p" android:toYDelta="0"
- android:duration="@android:integer/config_mediumAnimTime"/>
- <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
- android:duration="@android:integer/config_mediumAnimTime" />
-</set>
diff --git a/tests/InstrumentClusterRendererSample/res/anim/slide_out_top.xml b/tests/InstrumentClusterRendererSample/res/anim/slide_out_top.xml
deleted file mode 100644
index 2a92e26..0000000
--- a/tests/InstrumentClusterRendererSample/res/anim/slide_out_top.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
- <translate android:fromYDelta="0" android:toYDelta="-50%p"
- android:duration="@android:integer/config_mediumAnimTime"/>
- <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
- android:duration="@android:integer/config_mediumAnimTime" />
-</set>
diff --git a/tests/InstrumentClusterRendererSample/res/drawable-ldpi/ic_launcher.png b/tests/InstrumentClusterRendererSample/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 9923872..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/cloud_154_shadow.png b/tests/InstrumentClusterRendererSample/res/drawable/cloud_154_shadow.png
deleted file mode 100644
index 7275874..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/cloud_154_shadow.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/cloud_192.png b/tests/InstrumentClusterRendererSample/res/drawable/cloud_192.png
deleted file mode 100644
index 4fb90d3..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/cloud_192.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/cloud_384.png b/tests/InstrumentClusterRendererSample/res/drawable/cloud_384.png
deleted file mode 100644
index e74a3c6..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/cloud_384.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/cloud_96_shadow.png b/tests/InstrumentClusterRendererSample/res/drawable/cloud_96_shadow.png
deleted file mode 100644
index e73899c..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/cloud_96_shadow.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/gas_station_36.png b/tests/InstrumentClusterRendererSample/res/drawable/gas_station_36.png
deleted file mode 100644
index a766a2b..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/gas_station_36.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/hangouts_icon.png b/tests/InstrumentClusterRendererSample/res/drawable/hangouts_icon.png
deleted file mode 100644
index f7683f5..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/hangouts_icon.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/line_empty_divider.xml b/tests/InstrumentClusterRendererSample/res/drawable/line_empty_divider.xml
deleted file mode 100644
index cbaf65d..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/line_empty_divider.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <size android:height="5px" android:width="0dp"/>
-</shape>
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/phone.png b/tests/InstrumentClusterRendererSample/res/drawable/phone.png
deleted file mode 100644
index d4fb6fc..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/phone.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/phone_active.png b/tests/InstrumentClusterRendererSample/res/drawable/phone_active.png
deleted file mode 100644
index 8c941bb..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/phone_active.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/sun_154.png b/tests/InstrumentClusterRendererSample/res/drawable/sun_154.png
deleted file mode 100644
index 0103438..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/sun_154.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/drawable/unknown_contact_480.png b/tests/InstrumentClusterRendererSample/res/drawable/unknown_contact_480.png
deleted file mode 100644
index 9f864ca..0000000
--- a/tests/InstrumentClusterRendererSample/res/drawable/unknown_contact_480.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/layout/call_card.xml b/tests/InstrumentClusterRendererSample/res/layout/call_card.xml
deleted file mode 100644
index 8c024f3..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/call_card.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <LinearLayout android:id="@+id/phone_text_panel"
- android:layout_width="@dimen/card_message_panel_width"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_centerVertical="true">
- <TextView android:id="@+id/call_status"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/incoming_call"
- android:textColor="@color/cluster_font_secondary"
- android:fontFamily="@string/font_family_secondary"
- android:textSize="@dimen/font_size_large"/>
- <TextView android:id="@+id/contact_name"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="@color/cluster_font_primary"
- android:textSize="@dimen/font_size_large"
- android:fontFamily="@string/font_family_primary"/>
- <LinearLayout android:id="@+id/call_duration_panel"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
- <Chronometer android:id="@+id/call_duration"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="@color/cluster_font_secondary"
- android:fontFamily="@string/font_family_secondary"
- android:textSize="@dimen/font_size_large"/>
- <TextView android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/dummy_call_type"
- android:textColor="@color/cluster_font_secondary"
- android:fontFamily="@string/font_family_secondary"
- android:textSize="@dimen/font_size_large"
- android:layout_marginLeft="@dimen/word_spacing"/>
- </LinearLayout>
- </LinearLayout>
-</merge>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/card_view.xml b/tests/InstrumentClusterRendererSample/res/layout/card_view.xml
deleted file mode 100644
index 14fbd9d..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/card_view.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="@dimen/card_width"
- android:layout_height="@dimen/card_height">
-
- <ImageView android:id="@+id/image_background"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:scaleType="centerCrop"
- android:visibility="gone"/>
-
- <include layout="@layout/icon_switcher" android:id="@+id/left_icon_switcher"/>
- <include layout="@layout/icon_switcher" android:id="@+id/right_icon_switcher"/>
-</RelativeLayout>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/cluster_view.xml b/tests/InstrumentClusterRendererSample/res/layout/cluster_view.xml
deleted file mode 100644
index b6d192c..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/cluster_view.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout android:id="@+id/root"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:keepScreenOn="true"
- android:orientation="horizontal"
- android:background="@color/cluster_background"
- xmlns:android="http://schemas.android.com/apk/res/android">
- <View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1"/>
- <com.android.car.cluster.sample.CardPanel
- android:id="@+id/card_panel"
- android:layout_width="@dimen/card_width"
- android:layout_height="@dimen/card_height">
-
- </com.android.car.cluster.sample.CardPanel>
-</LinearLayout>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/hangout_layout.xml b/tests/InstrumentClusterRendererSample/res/layout/hangout_layout.xml
deleted file mode 100644
index fbd4f0d..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/hangout_layout.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <LinearLayout android:id="@+id/msg_text_panel"
- android:layout_width="@dimen/card_message_panel_width"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_centerVertical="true"
- android:showDividers="middle"
- android:divider="@drawable/line_empty_divider">
- <TextView android:id="@+id/msg_card_status"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/incoming_message"
- android:fontFamily="@string/font_family_secondary"
- android:textColor="@color/cluster_font_secondary"
- android:textSize="@dimen/font_size_large"/>
- <TextView android:id="@+id/msg_card_contact_name"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="@color/cluster_font_primary"
- android:fontFamily="@string/font_family_primary"
- android:text="@string/unknown"
- android:textSize="@dimen/font_size_large"/>
- </LinearLayout>
-</merge>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/icon_switcher.xml b/tests/InstrumentClusterRendererSample/res/layout/icon_switcher.xml
deleted file mode 100644
index 9bc4c5d..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/icon_switcher.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/left_icon_switcher"
- android:layout_width="@dimen/card_icon_size"
- android:layout_height="@dimen/card_icon_size"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:inAnimation="@anim/icon_switcher_in"
- android:outAnimation="@anim/icon_switcher_out">
- <ImageView android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@android:color/transparent"
- android:scaleType="centerCrop"/>
- <ImageView android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@android:color/transparent"
- android:scaleType="centerCrop"/>
-</ViewSwitcher>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/media_card.xml b/tests/InstrumentClusterRendererSample/res/layout/media_card.xml
deleted file mode 100644
index 62a574c..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/media_card.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- Panel will be shown for media -->
- <LinearLayout android:id="@+id/message_panel"
- android:layout_width="@dimen/card_message_panel_width"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_centerVertical="true"
- android:showDividers="middle"
- android:divider="@drawable/line_empty_divider">
- <TextView android:id="@+id/media_title"
- android:layout_width="@dimen/card_message_panel_width"
- android:layout_height="wrap_content"
- android:textColor="@color/cluster_font_primary"
- android:textSize="@dimen/font_size_medium"
- android:fontFamily="sans-serif-medium"
- android:singleLine="false"/>
- <TextView android:id="@+id/media_subtitle"
- android:layout_width="@dimen/card_message_panel_width"
- android:layout_height="wrap_content"
- android:textColor="@color/cluster_font_secondary"
- android:textSize="@dimen/font_size_small"
- android:fontFamily="sans-serif-regular"
- android:singleLine="false"/>
- <ProgressBar
- android:id="@+id/progress_bar"
- android:progress="80"
- style="?android:attr/progressBarStyleHorizontal"
- android:layout_width="@dimen/media_card_progress_width"
- android:layout_height="@dimen/media_card_progress_height"
- android:layout_marginTop="@dimen/media_card_progress_margin_top"
- android:background="#3cf5f5f5"
- android:max="100"/>
- </LinearLayout>
-</merge>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/nav_card.xml b/tests/InstrumentClusterRendererSample/res/layout/nav_card.xml
deleted file mode 100644
index adee49c..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/nav_card.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <ViewSwitcher android:id="@+id/nav_directions_switcher"
- android:layout_width="@dimen/card_message_panel_width"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:inAnimation="@anim/slide_in_bottom"
- android:outAnimation="@anim/slide_out_top">
- </ViewSwitcher>
-</merge>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/nav_card_maneuver_description.xml b/tests/InstrumentClusterRendererSample/res/layout/nav_card_maneuver_description.xml
deleted file mode 100644
index ca5ec3e..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/nav_card_maneuver_description.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/nav_directions"
- android:layout_width="@dimen/card_message_panel_width"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:orientation="vertical">
- <!-- First line contains distance and units, e.g. 200 ft -->
- <LinearLayout android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
- <TextView android:id="@+id/nav_distance"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="@dimen/font_size_nav_distance"
- android:textColor="@color/cluster_font_primary"
- android:fontFamily="@string/font_family_primary"/>
- <TextView android:id="@+id/nav_distance_units"
- android:layout_marginLeft="@dimen/word_spacing"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="@dimen/font_size_medium"
- android:textColor="@color/cluster_font_dark_gray"
- android:fontFamily="@string/font_family_secondary"
- android:text="@string/nav_distance_units_ft"/>
- </LinearLayout>
-
- <!-- Second line for street name -->
- <TextView android:id="@+id/nav_street"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="@dimen/font_size_medium"
- android:textColor="@color/cluster_font_secondary"
- android:fontFamily="@string/font_family_secondary"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/layout/weather_card.xml b/tests/InstrumentClusterRendererSample/res/layout/weather_card.xml
deleted file mode 100644
index da01ffc..0000000
--- a/tests/InstrumentClusterRendererSample/res/layout/weather_card.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-
- <ImageView android:id="@+id/weather_near_cloud"
- android:layout_width="@dimen/weather_card_near_cloud"
- android:layout_height="@dimen/weather_card_near_cloud"
- android:layout_alignParentBottom="true"
- android:layout_alignParentRight="true"
- android:src="@drawable/cloud_384"
- android:scaleType="fitXY"
- android:translationY="@dimen/weather_card_cloud_vertical_margin"
- android:layout_marginRight="@dimen/weather_card_near_margin_right"/>
- <ImageView android:id="@+id/weather_far_cloud"
- android:layout_width="@dimen/weather_card_far_cloud"
- android:layout_height="@dimen/weather_card_far_cloud"
- android:layout_centerHorizontal="true"
- android:layout_alignParentTop="true"
- android:src="@drawable/cloud_192"
- android:scaleType="fitXY"
- android:translationY="@dimen/weather_card_cloud_vertical_margin"/>
-
- <!-- Panel shown for the weather -->
- <LinearLayout android:id="@+id/weather_panel"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:orientation="horizontal">
- <TextView android:id="@+id/weather_temperature"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:fontFamily="sans-serif-light"
- android:textColor="@color/cluster_font_primary"
- android:text="@string/dummy_weather_temperature"
- android:textSize="@dimen/speedo_speed_min_font_size"/>
- <LinearLayout android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_gravity="center"
- android:paddingLeft="@dimen/weather_card_text_left_padding">
- <TextView android:id="@+id/weather_forecast"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="@dimen/font_size_large"
- android:textColor="@color/cluster_font_primary"
- android:text="@string/dummy_weather_forecast"
- android:translationY="6px"/>
- <TextView android:id="@+id/weather_location"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="@dimen/font_size_large"
- android:textColor="@color/cluster_font_secondary"
- android:fontFamily="@string/font_family_secondary"
- android:text="@string/dummy_weather_location"/>
- </LinearLayout>
- </LinearLayout>
-</merge>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/mipmap-hdpi/ic_launcher.png b/tests/InstrumentClusterRendererSample/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cde69bc..0000000
--- a/tests/InstrumentClusterRendererSample/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/mipmap-mdpi/ic_launcher.png b/tests/InstrumentClusterRendererSample/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c133a0c..0000000
--- a/tests/InstrumentClusterRendererSample/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/mipmap-xhdpi/ic_launcher.png b/tests/InstrumentClusterRendererSample/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index bfa42f0..0000000
--- a/tests/InstrumentClusterRendererSample/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/mipmap-xxhdpi/ic_launcher.png b/tests/InstrumentClusterRendererSample/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 324e72c..0000000
--- a/tests/InstrumentClusterRendererSample/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/mipmap-xxxhdpi/ic_launcher.png b/tests/InstrumentClusterRendererSample/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index aee44e1..0000000
--- a/tests/InstrumentClusterRendererSample/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/InstrumentClusterRendererSample/res/values/attrs.xml b/tests/InstrumentClusterRendererSample/res/values/attrs.xml
deleted file mode 100644
index 9386437..0000000
--- a/tests/InstrumentClusterRendererSample/res/values/attrs.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
-</resources>
diff --git a/tests/InstrumentClusterRendererSample/res/values/colors.xml b/tests/InstrumentClusterRendererSample/res/values/colors.xml
deleted file mode 100644
index 2b7698b..0000000
--- a/tests/InstrumentClusterRendererSample/res/values/colors.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <color name="colorPrimary">#3F51B5</color>
- <color name="colorPrimaryDark">#303F9F</color>
- <color name="colorAccent">#FF4081</color>
-
- <color name="black_overlay">#66000000</color>
-
- <color name="cluster_background">#172026</color>
- <color name="speedo_inner_circle_shade">#770c1013</color>
- <color name="cluster_active_area_background">#ff141c21</color>
- <color name="cluster_black">#ff0c1013</color>
- <color name="cluster_font_primary">#fff5f5f5</color>
- <color name="cluster_font_secondary">#8af5f5f5</color>
- <!-- Speed unit -->
- <color name="cluster_font_light_gray">#ffd8d9da</color>
- <!-- Phone call duration / album -->
- <color name="cluster_font_dark_gray">#ffa6a9ab</color>
-
- <color name="media_icon_foreground">#ff202020</color>
-
- <color name="media_background">#ff444444</color>
- <color name="media_background_dark">#ff303030</color>
-
- <color name="phone_background">#ff01579b</color>
- <color name="phone_background_dark">#ff014174</color>
- <color name="phone_icon_background">#ff0277bd</color>
- <color name="phone_font_incoming_call">#ffa3c1d9</color>
-
- <color name="maps_background">#ff0d904f</color>
-
- <color name="speedo_minute_arm_color_begin">#ffffcbbb</color>
- <color name="speedo_minute_arm_color_mid">#ffffcbbb</color>
- <color name="speedo_minute_arm_color_end">#ffffcbbb</color>
- <color name="speedo_minute_arm_color_border">#77ffcbbb</color>
- <color name="speedo_clock_nail">#ffffcbbb</color>
-
- <color name="speedo_clock_nail_shadow_start">#33000000</color>
- <color name="speedo_clock_nail_shadow_mid">#22000000</color>
- <color name="speedo_clock_nail_shadow_end">#00000000</color>
- <color name="speedo_clock_nail_shadow">#33000000</color>
-
- <color name="speedo_hour_arm_color_mid">@color/cluster_font_primary</color>
- <color name="speedo_hour_arm_color_start">@color/cluster_font_primary</color>
- <color name="speedo_hour_arm_color_end">@color/cluster_font_primary</color>
- <color name="speedo_hour_arm_color_border">#77f5f5f5</color>
-
- <color name="weather_blue_sky">#ff4385f4</color>
- <color name="weather_sun">#fffdbf2d</color>
- <color name="weather_cloud">#fffffeff</color>
- <color name="weather_location_text">#ffb2d1ff</color>
-
- <color name="hangout_background">#ff086934</color>
- <color name="hangout_icon_background">#ff086934</color>
- <color name="hangout_incoming_message_font_color">#ffa5c7b5</color>
- <color name="hangout_background_dark">#ff054422</color>
-
-</resources>
diff --git a/tests/InstrumentClusterRendererSample/res/values/dimens.xml b/tests/InstrumentClusterRendererSample/res/values/dimens.xml
deleted file mode 100644
index 66d54de..0000000
--- a/tests/InstrumentClusterRendererSample/res/values/dimens.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <dimen name="cluster_width">1920px</dimen>
- <dimen name="cluster_height">720px</dimen>
-
- <dimen name="fuel_panel_width">360px</dimen>
-
- <dimen name="speedo_margin_top">43px</dimen>
- <dimen name="speed_units_margin_from_center">165px</dimen>
- <dimen name="speedo_outer_circle_diameter">651px</dimen>
- <dimen name="speedo_inner_circle_min_diameter">232px</dimen>
- <dimen name="speedo_speed_min_font_size">@dimen/font_size_xlarge</dimen>
- <dimen name="speedo_speed_max_font_size">@dimen/font_size_xxlarge</dimen>
-
- <dimen name="speedo_inner_circle_max_diameter">540px</dimen>
- <dimen name="speedo_minute_arm_width">232px</dimen>
- <dimen name="speedo_minute_arm_width_half">116px</dimen>
- <dimen name="speedo_hour_arm_width">160px</dimen>
- <dimen name="speedo_hour_arm_width_half">80px</dimen>
- <dimen name="speedo_clock_nail">52px</dimen>
- <dimen name="speedo_border_width">1px</dimen>
-
- <dimen name="speedo_arm_height">8px</dimen>
- <dimen name="speedo_arm_center">4px</dimen>
-
-
- <dimen name="card_width">909px</dimen>
- <dimen name="card_height">@dimen/cluster_height</dimen>
- <dimen name="card_icon_size">154px</dimen>
- <dimen name="card_background_image_width">780px</dimen>
- <dimen name="card_message_panel_width">500px</dimen>
- <dimen name="card_content_left_padding">40px</dimen>
-
- <dimen name="word_spacing">10px</dimen>
-
- <dimen name="font_size_nav_distance">56px</dimen>
-
- <dimen name="font_size_xxlarge">152px</dimen>
- <dimen name="font_size_xlarge">120px</dimen>
- <dimen name="font_size_large">45px</dimen>
- <dimen name="font_size_medium">36px</dimen>
- <dimen name="font_size_small">26px</dimen>
- <dimen name="font_size_xsmall">22px</dimen>
-
- <dimen name="font_size_drive_state">@dimen/font_size_large</dimen>
-
- <dimen name="weather_card_near_cloud">384px</dimen>
- <dimen name="weather_card_near_margin_right">60px</dimen>
- <dimen name="weather_card_far_cloud">192px</dimen>
- <dimen name="weather_card_cloud_vertical_margin">40px</dimen>
- <dimen name="weather_card_text_left_padding">20px</dimen>
-
- <dimen name="media_card_progress_width">210px</dimen>
- <dimen name="media_card_progress_height">2px</dimen>
- <dimen name="media_card_progress_margin_top">12px</dimen>
-
- <dimen name="drive_state_size">144px</dimen>
- <dimen name="drive_state_inner_diameter">84px</dimen>
-
- <dimen name="fuel_indicator_width">@dimen/drive_state_size</dimen>
- <dimen name="fuel_indicator_radius">72px</dimen> <!-- fuel_indicator_width / 2 -->
- <dimen name="fuel_indicator_height">224px</dimen>
- <dimen name="fuel_indicator_inner_padding">30px</dimen> <!-- (width - inner_diameter) / 2 -->
- <dimen name="fuel_indicator_inner_padding_half">15px</dimen> <!-- padding / 2 -->
- <dimen name="fuel_indicator_inner_height">168px</dimen> <!-- height - padding * 2 -->
- <dimen name="fuel_indicator_inner_width">@dimen/drive_state_inner_diameter</dimen>
- <dimen name="fuel_indicator_inner_radius">42px</dimen> <!-- fuel_indicator_inner_diameter / 2 -->
- <dimen name="fuel_indicator_border_width">1px</dimen>
- <dimen name="fuel_panel_margin_right">40px</dimen>
-</resources>
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/res/values/strings.xml b/tests/InstrumentClusterRendererSample/res/values/strings.xml
deleted file mode 100644
index 2666619..0000000
--- a/tests/InstrumentClusterRendererSample/res/values/strings.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources xmlns:xliff="http://schemas.android.com/tools">
- <string name="app_name" translatable="false">InstrumentClusterRendererImpl</string>
-
- <string name="incoming_call" translatable="false">Incoming call</string>
- <string name="dialing" translatable="false">Dialing</string>
- <string name="dummy_call_type" translatable="false">• Mobile</string>
-
- <string name="font_family_primary" translatable="false">sans-serif-medium</string>
- <string name="font_family_secondary" translatable="false">sans-serif-regular</string>
-
- <string name="dummy_weather_forecast" translatable="false">Partly cloudy</string>
- <string name="dummy_weather_location" translatable="false">Mountain View, CA</string>
- <string name="dummy_weather_temperature" translatable="false">82°</string>
-
- <string name="nav_distance_units_ft" translatable="false">ft</string>
- <string name="nav_distance_units_meters" translatable="false">m</string>
- <string name="nav_distance_units_kilometers" translatable="false">km</string>
- <string name="nav_distance_units_miles" translatable="false">mi</string>
- <string name="nav_distance_units_yards" translatable="false">yd</string>
-
- <string name="incoming_message" translatable="false">Incoming message</string>
-
- <string name="unknown" translatable="false">Unknown</string>
- <string name="voicemail" translatable="false">Voicemail</string>
- <string name="phone_label_with_info" translatable="false">
- <xliff:g id="label" example="Mobile">%1$s</xliff:g>
- " \u00B7 "
- <xliff:g id="duration" example="1:20">%2$s</xliff:g>
- </string>
- <!-- Status label for phone state [CHAR LIMIT=20] -->
- <string name="call_state_connecting" translatable="false">Connecting</string>
- <!-- Status label for phone state [CHAR LIMIT=20] -->
- <string name="call_state_dialing" translatable="false">Dialing</string>
- <!-- Status label for phone state [CHAR LIMIT=20] -->
- <string name="call_state_hold" translatable="false">On Hold</string>
- <!-- Status label for phone state [CHAR LIMIT=20] -->
- <string name="call_state_call_ended" translatable="false">Call Ended</string>
- <!-- Status label for phone state [CHAR LIMIT=20] -->
- <string name="call_state_call_active" translatable="false">Connected</string>
- <!-- Status label for phone state [CHAR LIMIT=20] -->
- <string name="call_state_call_ringing" translatable="false">Ringing</string>
- <!-- Status label for phone state [CHAR LIMIT=20] -->
- <string name="call_state_call_ending" translatable="false">Disconnecting</string>
-
-</resources>
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/BitmapUtils.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/BitmapUtils.java
deleted file mode 100644
index 430bf35..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/BitmapUtils.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample;
-
-import static android.graphics.Color.blue;
-import static android.graphics.Color.green;
-import static android.graphics.Color.red;
-
-import android.graphics.Bitmap;
-import android.graphics.Bitmap.Config;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.Rect;
-import android.graphics.RectF;
-
-/**
- * Utility functions to work with bitmaps.
- */
-public class BitmapUtils {
-
- // Non-transparent color to crop images using Xfermode.
- private static final int OPAQUE_COLOR = 0xff424242;
-
- /**
- * Scales a bitmap while preserving the proportions such that both dimensions are the smallest
- * values possible that are equal to or larger than the given dimensions.
- *
- * This function can be a few times as expensive as Bitmap.createScaledBitmap with
- * filtering when downscaling, but it produces much nicer results.
- *
- * @param bm The bitmap to scale.
- * @param width The desired width.
- * @param height The desired height.
- * @return The scaled bitmap, or the original bitmap if scaling was not necessary.
- */
- public static Bitmap scaleBitmap(Bitmap bm, int width, int height) {
- if (bm == null || (bm.getHeight() == height && bm.getWidth() == width)) {
- return bm;
- }
-
- float heightScale = (float) height / bm.getHeight();
- float widthScale = (float) width / bm.getWidth();
-
- float scale = heightScale > widthScale ? heightScale : widthScale;
- int scaleWidth = (int) Math.ceil(bm.getWidth() * scale);
- int scaleHeight = (int) Math.ceil(bm.getHeight() * scale);
-
- Bitmap scaledBm = bm;
- // If you try to scale an image down too much in one go, you can end up with discontinuous
- // interpolation. Therefore, if necessary, we scale the image to twice the desired size
- // and do a second scaling to the desired size, which smooths jaggedness from the first go.
- if (scale < .5f) {
- scaledBm = Bitmap.createScaledBitmap(scaledBm, scaleWidth * 2, scaleHeight * 2, true);
- }
-
- if (scale != 1f) {
- Bitmap newScaledBitmap = Bitmap
- .createScaledBitmap(scaledBm, scaleWidth, scaleHeight, true);
- if (scaledBm != bm) {
- scaledBm.recycle();
- }
- scaledBm = newScaledBitmap;
- }
- return scaledBm;
- }
-
- public static Bitmap squareCropBitmap(Bitmap bitmap) {
- if (bitmap.getWidth() == bitmap.getHeight()) {
- return bitmap;
- }
-
- int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
-
- Bitmap output = Bitmap.createBitmap(size,
- size, Config.ARGB_8888);
- Canvas canvas = new Canvas(output);
-
- int x = size < bitmap.getWidth() ? (bitmap.getWidth() - size ) / 2 : 0;
- int y = size < bitmap.getHeight() ? (bitmap.getHeight() - size ) / 2 : 0;
- Rect srcRect = new Rect(x, y, x + size, y + size);
- Rect dstRect = new Rect(0, 0, output.getWidth(), output.getHeight());
-
- canvas.drawBitmap(bitmap, srcRect, dstRect, null);
- return output;
- }
-
- public static Bitmap circleCropBitmap(Bitmap bitmap) {
- bitmap = squareCropBitmap(bitmap);
- Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
- bitmap.getHeight(), Config.ARGB_8888);
- Canvas canvas = new Canvas(output);
-
- Paint paint = new Paint();
- Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
-
- paint.setAntiAlias(true);
- canvas.drawARGB(0, 0, 0, 0);
- paint.setColor(OPAQUE_COLOR);
- canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2,
- bitmap.getWidth() / 2, paint);
- paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
- canvas.drawBitmap(bitmap, rect, rect, paint);
- return output;
- }
-
- public static Bitmap generateNavManeuverIcon(int size, int bgColor, Bitmap maneuver) {
- Bitmap bm = Bitmap.createBitmap(size, size, Config.ARGB_8888);
- Canvas canvas = new Canvas(bm);
- drawCircle(canvas, bgColor);
-
- canvas.drawBitmap(maneuver,
- (bm.getWidth() - maneuver.getWidth()) / 2,
- (bm.getHeight() - maneuver.getHeight()) / 2,
- new Paint(Paint.ANTI_ALIAS_FLAG));
- return bm;
- }
-
- public static Bitmap generateMediaIcon(int size, int bgColor, int fgColor) {
- final float goldenRatio = 1.618f;
-
- Bitmap bm = Bitmap.createBitmap(size, size, Config.ARGB_8888);
- Canvas canvas = new Canvas(bm);
- drawCircle(canvas, bgColor);
-
- // Calculate column parameters relative to the size.
- int bottom = (int) (size / goldenRatio);
- int columnWidth = size / 17;
- int columnSpace = columnWidth / 2;
- int allColumnsWidth = columnWidth * 3 + columnSpace * 2;
- int left = size / 2 - (allColumnsWidth) / 2;
-
- Paint columnPaint = new Paint();
- columnPaint.setColor(fgColor);
- columnPaint.setAntiAlias(true);
- canvas.drawRect(new RectF(left, bottom - columnWidth * 2, left + columnWidth, bottom),
- columnPaint);
-
- left += columnWidth + columnSpace;
- canvas.drawRect(new RectF(left, bottom - columnWidth * 4, left + columnWidth, bottom),
- columnPaint);
-
- left += columnWidth + columnSpace;
- canvas.drawRect(new RectF(left, bottom - columnWidth * 3, left + columnWidth, bottom),
- columnPaint);
-
- return bm;
- }
-
- private static Canvas drawCircle(Canvas canvas, int bgColor) {
- int size = canvas.getWidth();
- Paint p = new Paint();
- p.setAntiAlias(true);
- p.setColor(bgColor);
- canvas.drawCircle(size / 2, size / 2, (size / 2) - 1, p);
- return canvas;
- }
-
- public static int[] getBaseColors(int color) {
- return new int[] {red(color), green(color), blue(color)};
- }
-
- /**
- * Scales colors for given bitmap. This could be used as color filter for example.
- */
- public static Bitmap scaleBitmapColors(Bitmap original, int minColor, int maxColor) {
- int[] pixels = new int[original.getWidth() * original.getHeight()];
- original.getPixels(pixels, 0, original.getWidth(), 0, 0,
- original.getWidth(), original.getHeight());
-
- int[] min = getBaseColors(minColor);
- int[] max = getBaseColors(maxColor);
-
- for (int i = 0; i < pixels.length; i++) {
- int pixel = pixels[i];
- int[] colors = new int[] {red(pixel), green(pixel), blue(pixel)};
-
- for (int j = 0; j < 3; j++) {
- colors[j] = (int)((colors[j] / 255.0) * (max[j] - min[j]) + min[j]);
- }
-
- pixels[i] = Color.rgb(colors[0], colors[1], colors[2]);
- }
-
- Bitmap bmp = Bitmap.createBitmap(original.getWidth(), original.getHeight(), Config.ARGB_8888);
- bmp.setPixels(pixels, 0, original.getWidth(), 0, 0, original.getWidth(),
- original.getHeight());
- return bmp;
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/CardPanel.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/CardPanel.java
deleted file mode 100644
index 88c2aba..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/CardPanel.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.View;
-import android.widget.FrameLayout;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Panel that responsible of holding cards.
- */
-public class CardPanel extends FrameLayout {
- private final static String TAG = DebugUtil.getTag(CardPanel.class);
-
- private final List<View> mOrderedChildren = new ArrayList<>(10);
- private final Set<View> mViewsToBeRemoved = new HashSet<>();
-
- public CardPanel(Context context) {
- this(context, null);
- }
-
- public CardPanel(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public CardPanel(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
-
- setChildrenDrawingOrderEnabled(true);
- }
-
- @Override
- public void addView(View child, int index) {
- super.addView(child, index);
- if (index < 0) {
- mOrderedChildren.add(child);
- } else {
- mOrderedChildren.add(index, child);
- }
- }
-
- @Override
- public void removeView(View view) {
- super.removeView(view);
-
- mOrderedChildren.remove(view);
- mViewsToBeRemoved.remove(view);
- }
-
- /**
- * If we are removing view with animation, we do not want to treat this view as visible.
- */
- public void markViewToBeRemoved(View view) {
- mViewsToBeRemoved.add(view);
- }
-
-
- public boolean childViewExists(View child) {
- return indexOfChild(child) >= 0 && !mViewsToBeRemoved.contains(child);
- }
-
- /** Moves given child behind the top card */
- public void moveChildBehindTheTop(View child) {
- if (mOrderedChildren.size() <= 1) {
- return;
- }
-
- int newIndex = mOrderedChildren.size() - 2;
- int oldIndex = mOrderedChildren.indexOf(child);
- if (oldIndex == -1) {
- Log.e(TAG, "Child: " + child + " not found in "
- + Arrays.toString(mOrderedChildren.toArray()));
- return;
- }
- if (newIndex == oldIndex) {
- return;
- }
-
- // Swap children.
- View tmpChild = mOrderedChildren.get(newIndex);
- mOrderedChildren.set(newIndex, child);
- mOrderedChildren.set(oldIndex, tmpChild);
- }
-
- public View getTopVisibleChild() {
- for (int i = mOrderedChildren.size() - 1; i >= 0; i--) {
- View child = mOrderedChildren.get(i);
- if (child.getVisibility() == VISIBLE && !mViewsToBeRemoved.contains(child)) {
- return child;
- }
- }
- return null;
- }
-
- @SuppressWarnings("unchecked")
- public <E> E getChildOrNull(Class<E> clazz) {
- for (int i = 0; i < getChildCount(); i++) {
- View child = getChildAt(i);
- if (clazz.isInstance(child) && !mViewsToBeRemoved.contains(child)) {
- return (E) child;
- }
- }
- return null;
- }
-
- @SuppressWarnings("unchecked")
- public <E> E getVisibleChildOrNull(Class<E> clazz) {
- for (int i = 0; i < getChildCount(); i++) {
- View child = getChildAt(i);
- if (clazz.isInstance(child) && !mViewsToBeRemoved.contains(child)
- && child.getVisibility() == VISIBLE) {
- return (E) child;
- }
- }
- return null;
- }
-
- @Override
- protected int getChildDrawingOrder(int childCount, int i) {
- return indexOfChild(mOrderedChildren.get(i));
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ClusterInCallService.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ClusterInCallService.java
deleted file mode 100644
index 8348a2b..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ClusterInCallService.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample;
-
-import static com.android.car.cluster.sample.DebugUtil.DEBUG;
-
-import android.content.Intent;
-import android.os.Binder;
-import android.os.IBinder;
-import android.telecom.Call;
-import android.telecom.Call.Callback;
-import android.telecom.InCallService;
-import android.util.Log;
-
-import java.lang.ref.WeakReference;
-
-/**
- * Monitors call state and reports it to the listeners that was registered using
- * {@link #registerListener} method.
- */
-public class ClusterInCallService extends InCallService {
-
- private static final String TAG = DebugUtil.getTag(ClusterInCallService.class);
-
- static final String ACTION_LOCAL_BINDING = "local_binding";
-
- private final PhoneCallback mPhoneCallback = new PhoneCallback(this);
- private volatile Callback mListener;
-
- @Override
- public void onCallAdded(Call call) {
- if (DEBUG) {
- Log.d(TAG, "onCallAdded");
- }
- call.registerCallback(mPhoneCallback);
- mPhoneCallback.onStateChanged(call, call.getState());
- }
-
- @Override
- public void onCallRemoved(Call call) {
- if (DEBUG) {
- Log.d(TAG, "onCallRemoved");
- }
- call.unregisterCallback(mPhoneCallback);
- }
-
- private void doStateChanged(Call call, int state) {
- if (DEBUG) {
- Log.d(TAG, "doStateChanged, call: " + call + ", state: " + state);
- }
- if (mListener != null) {
- mListener.onStateChanged(call, state);
- }
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- Log.d(TAG, "onBind, intent:" + intent);
- return ACTION_LOCAL_BINDING.equals(intent.getAction())
- ? new LocalBinder() : super.onBind(intent);
- }
-
- public class LocalBinder extends Binder {
- ClusterInCallService getService() {
- return ClusterInCallService.this;
- }
- }
-
- public void registerListener(Callback listener) {
- Log.d(TAG, "registerListener, listener: " + listener);
- mListener = listener;
- }
-
- private static class PhoneCallback extends Callback {
- private final WeakReference<ClusterInCallService> mServiceRef;
-
- private PhoneCallback(ClusterInCallService service) {
- mServiceRef = new WeakReference<>(service);
- }
-
- @Override
- public void onStateChanged(Call call, int state) {
- Log.d(TAG, "PhoneCallback#onStateChanged, call: " + call + ", state: " + state);
- ClusterInCallService service = mServiceRef.get();
- if (service != null) {
- service.doStateChanged(call, state);
- }
- }
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ClusterView.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ClusterView.java
deleted file mode 100644
index 7b4255c..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ClusterView.java
+++ /dev/null
@@ -1,644 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample;
-
-import static com.android.car.cluster.sample.BitmapUtils.generateMediaIcon;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.os.Handler;
-import android.os.Looper;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewAnimationUtils;
-import android.view.ViewGroup;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.AlphaAnimation;
-import android.view.animation.Animation;
-import android.view.animation.Animation.AnimationListener;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.Interpolator;
-import android.view.animation.Transformation;
-import android.view.animation.TranslateAnimation;
-import android.widget.FrameLayout;
-import android.widget.RelativeLayout;
-
-import com.android.car.cluster.sample.cards.CallCard;
-import com.android.car.cluster.sample.cards.CallCard.CallStatus;
-import com.android.car.cluster.sample.cards.CardView;
-import com.android.car.cluster.sample.cards.CardView.CardType;
-import com.android.car.cluster.sample.cards.MessageCard;
-import com.android.car.cluster.sample.cards.MediaCard;
-import com.android.car.cluster.sample.cards.NavCard;
-import com.android.car.cluster.sample.cards.WeatherCard;
-
-import java.util.PriorityQueue;
-
-/**
- * Class that represents cluster view. It is responsible of ranking cards and play animations
- * during card transitions.
- */
-public class ClusterView extends FrameLayout implements CardView.PriorityChangedListener{
- private static final String TAG = DebugUtil.getTag(ClusterView.class);
-
- private CardPanel mCardPanel;
-
- private final Handler mHandler = new Handler(Looper.getMainLooper());
- private final PriorityQueue<CardView> mQueue = new PriorityQueue<>(8);
-
- public ClusterView(Context context) {
- this(context, null);
- }
-
- public ClusterView(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- inflate(getContext(), R.layout.cluster_view, this);
- mCardPanel = (CardPanel) findViewById(R.id.card_panel);
- }
-
- private <E extends CardView> E createCard(@CardType int cardType) {
- CardView card;
- switch (cardType)
- {
- case CardType.WEATHER:
- card = new WeatherCard(getContext(), this /* priority listener */);
- break;
- case CardType.MEDIA:
- card = new MediaCard(getContext(), this /* priority listener */);
- break;
- case CardType.PHONE_CALL:
- card = new CallCard(getContext(), this /* priority listener */);
- break;
- case CardType.NAV:
- card = new NavCard(getContext(), this /* priority listener */);
- break;
- case CardType.HANGOUT:
- card = new MessageCard(getContext(), this /* priority listener */);
- break;
- default:
- card = new CardView(getContext(), cardType, this /* priority listener */);
- }
- RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
- card.setLayoutParams(params);
- return (E) card;
- }
-
- public void handleIncomingCall(Bitmap contactImage, String contactName) {
- if (contactImage == null) {
- contactImage = BitmapFactory.decodeResource(getResources(),
- R.drawable.unknown_contact_480);
- }
- CardView card = createIncomingCallCard(contactImage, contactName);
- enqueueCard(card);
- }
-
- public void handleDialingCall(Bitmap contactImage, String contactName) {
- if (contactImage == null) {
- contactImage = BitmapFactory.decodeResource(getResources(),
- R.drawable.unknown_contact_480);
- }
- CardView card = createDialingCallCard(contactImage, contactName);
- enqueueCard(card);
- }
-
- public void handleUpdateContactName(String contactName) {
- CallCard card = getCallCard();
- if (card != null) {
- card.setContactName(contactName);
- }
- }
-
- public void handleUpdateContactImage(Bitmap image) {
- CallCard card = getCallCard();
- if (card != null) {
- updateContactImage(card, image);
- }
- }
-
- public void handleHangoutMessage(Bitmap contactImage, String contactName) {
- if (getCardOrNull(MessageCard.class) != null) {
- return; // Deduplicate.
- }
-
- if (contactImage == null) {
- contactImage = BitmapFactory.decodeResource(getResources(),
- R.drawable.unknown_contact_480);
- }
- MessageCard card = createCard(CardType.HANGOUT);
- card.setContactName(contactName);
-
- int c = getResources().getColor(R.color.hangout_background, null);
- card.setBackgroundColor(c);
- card.setLeftIcon(BitmapUtils.circleCropBitmap(contactImage));
-
- enqueueCard(card);
- }
-
- public void handleCallConnected(long connectedTimestamp) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "handleCallConnected, connectedTimestamp: " + connectedTimestamp);
- }
- CallCard card = getCallCard();
- if (card != null) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "handleCallConnected, call status: " + card.getCallStatus());
- }
-
- if (card.getCallStatus() == CallStatus.INCOMING_OR_DIALING) {
- card.animateCallConnected(connectedTimestamp);
- }
- }
- }
-
- public void handleCallDisconnected() {
- final CallCard callCard = getCallCard();
- if (callCard != null) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "handleCallDisconnected, callCard status: " + callCard.getCallStatus());
- }
-
- if (callCard == getCurrentCard()
- && callCard.getCallStatus() == CallStatus.ACTIVE) {
- callCard.animateCallDisconnected();
- } else {
- removeCard(callCard);
- }
- }
- }
-
- public void runDelayed(long delay, final Runnable task) {
- mHandler.postDelayed(task, delay);
- }
-
- public MediaCard createMediaCard(Bitmap albumCover, String title, String subtitle,
- int appColor) {
- MediaCard card = createCard(CardType.MEDIA);
- int iconSize = card.getIconSize();
-
- if (albumCover != null) {
- Bitmap albumIcon = BitmapUtils.scaleBitmap(albumCover, iconSize, iconSize);
- albumIcon = BitmapUtils.circleCropBitmap(albumIcon);
- card.setLeftIcon(albumIcon);
-
- Bitmap backgroundImage = BitmapUtils.scaleBitmapColors(albumCover,
- getResources().getColor(R.color.media_background_dark, null),
- getResources().getColor(R.color.media_background, null));
-
- backgroundImage = BitmapUtils.scaleBitmap(backgroundImage,
- (int) (getResources().getDimension(R.dimen.card_width)),
- (int) getResources().getDimension(R.dimen.card_height));
-
- int c = getResources().getColor(R.color.phone_background, null);
- card.setBackground(backgroundImage, c);
- }
-
- Bitmap mediaApp = generateMediaIcon(iconSize,
- appColor,
- getResources().getColor(R.color.media_icon_foreground, null));
- card.setRightIcon(mediaApp);
- card.setProgressColor(appColor);
- card.setTitle(title);
- card.setSubtitle(subtitle);
- return card;
- }
-
- public CardView getCurrentCard() {
- return (CardView) mCardPanel.getTopVisibleChild();
- }
-
- public CardView createWeatherCard() {
- CardView card;
- card = createCard(CardType.WEATHER);
- card.setBackgroundColor(getResources().getColor(R.color.weather_blue_sky, null));
- return card;
- }
-
- public CallCard createIncomingCallCard(Bitmap contactImage, String contactName) {
- CallCard card = createCard(CardType.PHONE_CALL);
- updateContactImage(card, contactImage);
- card.setContactName(contactName);
- card.setStatusLabel(getContext().getString(R.string.incoming_call));
- return card;
- }
-
- public CallCard createDialingCallCard(Bitmap contactImage, String contactName) {
- CallCard card = createCard(CardType.PHONE_CALL);
-
- updateContactImage(card, contactImage);
- card.setContactName(contactName);
- card.setStatusLabel(getContext().getString(R.string.dialing));
- return card;
- }
-
- public NavCard createNavCard() {
- return createCard(CardType.NAV);
- }
-
- private void updateContactImage(CardView card, Bitmap contactImage) {
- int iconSize = (int)getResources().getDimension(R.dimen.card_icon_size);
- Bitmap contactImageCircle = BitmapUtils.circleCropBitmap(
- BitmapUtils.scaleBitmap(contactImage, iconSize, iconSize));
- card.setLeftIcon(contactImageCircle);
-
- contactImage = BitmapUtils.scaleBitmapColors(contactImage,
- getResources().getColor(R.color.phone_background_dark, null),
- getResources().getColor(R.color.phone_background, null));
-
- contactImage = BitmapUtils.scaleBitmap(contactImage,
- (int) getResources().getDimension(R.dimen.card_width),
- (int) getResources().getDimension(R.dimen.card_height));
-
- int c = getResources().getColor(R.color.phone_background, null);
- card.setBackground(contactImage, c);
- }
-
- public boolean cardExists(CardView card) {
- return mCardPanel.childViewExists(card);
- }
-
- public void removeCard(final CardView card) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "removeCard, card: " + card);
- }
- final CardView currentlyShownCard = getCurrentCard();
- if (currentlyShownCard == card) {
- // Card is on the screen, play nice animation and then remove it.
- mQueue.remove(card);
- mCardPanel.markViewToBeRemoved(card);
- CardView cardToShow = mQueue.peek();
- if (cardToShow != null) {
- Animation animation = cardToShow.getAnimation();
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "card to show: " + cardToShow + ", animation: " + animation);
- }
- if (animation != null) {
- cardToShow.getAnimation().cancel();
- }
-
- cardToShow.setVisibility(VISIBLE);
- mCardPanel.moveChildBehindTheTop(cardToShow);
- }
- playUnrevealAnimation(card, new Runnable() {
- @Override
- public void run() {
- removeCardInternal(card);
- }
- });
- } else {
- // Card is not on the screen, just remove it.
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "removeCard, card is not on the screen, remove it immediately");
- removeCardInternal(card);
- }
- }
- }
-
- public void enqueueCard(final CardView card) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "enqueueCard, card: " + card);
- }
- final CardView currentCard = getCurrentCard();
- boolean cardIsOnTheScreen = card == currentCard;
-
- boolean cardExisted = mQueue.remove(card);
- mQueue.offer(card);
-
- CardView activeCard = mQueue.peek();
- boolean shouldDisplayCard = activeCard == card;
-
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "enqueueCard, card: " + card + ", onScreen: "
- + cardIsOnTheScreen + ", cardExisted: " + cardExisted + ", shouldDisplayCard: "
- + shouldDisplayCard + ", activeCard: " + activeCard
- + ", currentCard: " + currentCard);
- }
-
- if (cardIsOnTheScreen) {
- if (!shouldDisplayCard) {
- // Card priority was decreased, but it still active. Need to reverse reveal
- // animation and show underlying card.
- showCardWithFadeoutAnimation(activeCard);
- }
- } else {
- // Card is not on the screen right now.
- if (cardExisted) {
- if (shouldDisplayCard) {
- // Card was created in the past and is in the queue, need to show
- // this card using unreveal animation.
- showCardWithUnrevealAnimation(card);
- }
- } else {
- if (shouldDisplayCard) {
- // Card doesn't exist, but we want to show it.
- showCardWithRevealAnimation(card);
- } else {
- // We want to add the card to the panel, but do not want to show it.
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "Adding hidden card");
- }
- card.setVisibility(GONE);
- mCardPanel.addView(card, 0);
- }
- }
- }
-
- removeInvisibleDuplicatedCard(card); // Remove invisible cards with the same card type.
-
- dumpCardsToLog();
- }
-
- private void showCardWithRevealAnimation(final CardView cardToShow) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "showCardWithRevealAnimation, card: " + cardToShow);
- }
-
- removeInvisibleDuplicatedCard(cardToShow);
-
- CardView currentCard = getCurrentCard();
- mCardPanel.addView(cardToShow);
- playRevealAnimation(cardToShow, currentCard, new RemoveOrHideCard(this, currentCard));
- }
-
- private void removeInvisibleDuplicatedCard(CardView card) {
- Log.d(TAG, "removeInvisibleDuplicatedCard, card: " + card);
- // Remove cards that has the same card type and not visible on the screen.
- for (int i = mCardPanel.getChildCount() - 1; i >= 0; i--) {
- CardView child = (CardView) mCardPanel.getChildAt(i);
- if (child.getCardType() == card.getCardType()
- && child != card
- && child.getVisibility() != VISIBLE) {
- Log.d(TAG, "removeInvisibleDuplicatedCard, found dup: " + child);
- removeCardInternal(child);
- }
- }
- }
-
- private void showCardWithFadeoutAnimation(final CardView cardToShow) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "showCardWithFadeoutAnimation, card: " + cardToShow);
- }
- // Place card behind the top card, it will become visible once fade out animation for the
- // top card starts to play.
- mCardPanel.moveChildBehindTheTop(cardToShow);
- cardToShow.setVisibility(VISIBLE);
-
- // Hide top card with animation.
- playFadeOutAndSlideOutAnimation((CardView) mCardPanel.getTopVisibleChild());
- }
-
- private void showCardWithUnrevealAnimation(CardView cardToShow) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "showCardWithUnrevealAnimation, card: " + cardToShow);
- }
- final CardView currentCard = (CardView) mCardPanel.getTopVisibleChild();
- // Card was created in the past and is in the queue, need to show reverse reveal
- // animation to unreveal this card.
- mCardPanel.moveChildBehindTheTop(cardToShow);
- cardToShow.setVisibility(VISIBLE);
- playUnrevealAnimation(currentCard, new RemoveOrHideCard(this, currentCard));
- }
-
- private static class RemoveOrHideCard implements Runnable {
- private final CardView mCard;
-
- private final ClusterView mClusterView;
-
- RemoveOrHideCard(ClusterView clusterView, CardView card) {
- mCard = card;
- mClusterView = clusterView;
- }
-
- @Override
- public void run() {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "RemoveOrHideCard: " + mCard);
- }
-
- mClusterView.removeInvisibleDuplicatedCard(mCard);
-
- if (mCard.isGarbage()) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "RemoveOrHideCard, card has garbage priority");
- }
- mClusterView.removeCardInternal(mCard);
- } else {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "RemoveOrHideCard, hiding card: " + mCard);
- }
- mCard.setVisibility(GONE);
- mCard.setAlpha(1); // Restore alpha after fade-out animation, it's gone anyway.
- mClusterView.dumpCardsToLog();
- }
- }
- }
-
- private void removeCardInternal(CardView card) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "removeCardInternal, card: " + card);
- }
- mCardPanel.removeView(card);
- mQueue.remove(card);
-
- dumpCardsToLog();
- }
-
- @Override
- public void onPriorityChanged(CardView card, int priority) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "onPriorityChanged, card: " + card + ", priority: " + priority);
- }
- if (cardExists(card)) {
- enqueueCard(card);
- }
- }
-
- private void playRevealAnimation(final CardView cardToShow, final CardView currentCard,
- final Runnable oldCardDissapearedAction) {
-
- if (currentCard == cardToShow) {
- return;
- }
-
- if (currentCard != null) {
- playAlphaAnimation(currentCard,
- 0, // Target alpha
- 400, // Duration
- new DecelerateInterpolator(0.5f),
- oldCardDissapearedAction);
- }
-
- cardToShow.addOnLayoutChangeListener(new OnLayoutChangeListener() {
- @Override
- public void onLayoutChange(View v, int left, int top, int right, int bottom,
- int oldLeft, int oldTop, int oldRight, int oldBottom) {
- cardToShow.removeOnLayoutChangeListener(this); // Just need it once.
-
- createRevealAnimator(cardToShow, new DecelerateInterpolator(1f), true)
- .start();
- }
- });
- cardToShow.onPlayRevealAnimation();
- }
-
- private void playAlphaAnimation(final CardView card, float targetAlpha, long duration,
- Interpolator interpolator, final Runnable endAction) {
- Animation animation = new AlphaAnimation(card.getAlpha(), targetAlpha);
- animation.setDuration(duration * DebugUtil.ANIMATION_FACTOR);
- animation.setInterpolator(interpolator);
-
- animation.setAnimationListener(new AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) { }
-
- @Override
- public void onAnimationEnd(Animation animation) {
- // For some reason, cancelled animation hasEnded() == true here.
- // Check for start time instead.
- if (endAction != null && animation.getStartTime() != Long.MIN_VALUE) {
- endAction.run();
- }
- }
-
- @Override
- public void onAnimationRepeat(Animation animation) { }
- });
- card.setAnimation(animation);
- animation.start();
- }
-
- private static boolean isAnimationCancelled(Animation animation) {
- return (animation.getStartTime() == Long.MIN_VALUE) || (!animation.hasEnded());
- }
-
- private void playFadeOutAndSlideOutAnimation(final CardView card) {
- Animation animation = new TranslateAnimation(0, card.getWidth(), 0, 0) {
- private final float mFromAlpha = card.getAlpha();
- private final float mToAlpha = 0;
-
- @Override
- protected void applyTransformation(float interpolatedTime, Transformation t) {
- super.applyTransformation(interpolatedTime, t);
-
- final float alpha = mFromAlpha;
- t.setAlpha(alpha + ((mToAlpha - alpha) * interpolatedTime));
- }
- };
- animation.setDuration(600 * DebugUtil.ANIMATION_FACTOR);
- animation.setAnimationListener(new AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) { }
-
- @Override
- public void onAnimationEnd(Animation animation) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "playFadeOutAndSlideOutAnimation, onAnimationEnd " + animation
- + ", startTime: " + animation.getStartTime());
- }
- if (!isAnimationCancelled(animation)) {
- new RemoveOrHideCard(ClusterView.this, card)
- .run();
- }
- // Reset X position.
- card.setTranslationX(0);
- }
-
- @Override
- public void onAnimationRepeat(Animation animation) { }
- });
- card.setAnimation(animation);
- animation.start();
- }
-
- /** Hides given card and reveals underlying card */
- private void playUnrevealAnimation(final CardView card, final Runnable unrevealCompleteAction) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "playUnrevealAnimation, card: " + card);
- }
-
- final Animator anim = createRevealAnimator(card,
- new AccelerateInterpolator(2f), false /* hide */);
-
- anim.addListener(new AnimatorListenerAdapter() {
- private boolean cancelled = false;
-
- @Override
- public void onAnimationCancel(Animator animation) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "onAnimationCancel, animation: " + animation);
- }
- cancelled = true;
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- if (cancelled) {
- return;
- }
-
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "onAnimationEnd, animation: " + animation);
- }
- unrevealCompleteAction.run();
- }
- });
-
- anim.start();
- card.onPlayUnrevealAnimation();
- }
-
- private Animator createRevealAnimator(CardView card, Interpolator interpolator, boolean show) {
- int cardWidth = (int) getResources().getDimension(R.dimen.card_width);
- int radius = (int) (cardWidth * 1.2f);
- int centerY = (int) (getResources().getDimension(R.dimen.card_height) / 2);
-
- Animator anim = ViewAnimationUtils.createCircularReveal(card, radius, centerY,
- show ? 0 : radius /* start radius */,
- show ? radius : 0 /* end radius */);
-
- anim.setInterpolator(interpolator);
- anim.setDuration(600 * DebugUtil.ANIMATION_FACTOR);
- return anim;
- }
-
- public <E> E getCardOrNull(Class<E> clazz) {
- return mCardPanel.getChildOrNull(clazz);
- }
-
- public <E> E getVisibleCardOrNull(Class<E> clazz) {
- return mCardPanel.getVisibleChildOrNull(clazz);
- }
-
- private CallCard getCallCard() {
- return getCardOrNull(CallCard.class);
- }
-
- private void dumpCardsToLog() {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "Cards in layout: " + mCardPanel.getChildCount() + ", cards in queue: "
- + mQueue.size());
- for (int i = 0; i < mCardPanel.getChildCount(); i++) {
- Log.d(TAG, "child: " + mCardPanel.getChildAt(i));
- }
- }
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/DebugUtil.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/DebugUtil.java
deleted file mode 100644
index c42fe14..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/DebugUtil.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample;
-
-/**
- * Utility functions / constants that make sense for debugging.
- */
-public final class DebugUtil {
- /** The default factor is 1, increasing this number results in slowing down animation */
- public static final long ANIMATION_FACTOR = 1;
-
- public static final String TAG = "CLUSTER";
-
- public static final boolean DEBUG = true;
-
- public static String getTag(Class clazz) {
- return TAG + "." + clazz.getSimpleName();
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterController.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterController.java
deleted file mode 100644
index fbfa8de..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterController.java
+++ /dev/null
@@ -1,594 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.cluster.sample;
-
-import static com.android.car.cluster.sample.DebugUtil.DEBUG;
-
-import android.annotation.Nullable;
-import android.app.Presentation;
-import android.car.cluster.renderer.NavigationRenderer;
-import android.car.navigation.CarNavigationInstrumentCluster;
-import android.car.navigation.CarNavigationStatusManager;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Color;
-import android.hardware.display.DisplayManager;
-import android.media.MediaDescription;
-import android.media.MediaMetadata;
-import android.media.session.PlaybackState;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.telecom.Call;
-import android.telecom.GatewayInfo;
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.Display;
-
-import com.android.car.cluster.sample.MediaStateMonitor.MediaStateListener;
-import com.android.car.cluster.sample.cards.MediaCard;
-import com.android.car.cluster.sample.cards.NavCard;
-
-import java.text.DecimalFormatSymbols;
-import java.text.NumberFormat;
-import java.util.Locale;
-import java.util.Objects;
-import java.util.Timer;
-import java.util.TimerTask;
-
-/**
- * This class is responsible for subscribing to system events (such as call status, media status,
- * etc.) and updating accordingly UI component {@link ClusterView}.
- */
-/*package*/ class InstrumentClusterController {
-
- private final static String TAG = DebugUtil.getTag(InstrumentClusterController.class);
-
- private final Context mContext;
- private final NavigationRenderer mNavigationRenderer;
-
- private ClusterView mClusterView;
- private MediaStateMonitor mMediaStateMonitor;
- private MediaStateListenerImpl mMediaStateListener;
- private ClusterInCallService mInCallService;
- private MessagingNotificationHandler mNotificationHandler;
- private StatusBarNotificationListener mNotificationListener;
- private RetriableServiceBinder mInCallServiceRetriableBinder;
- private RetriableServiceBinder mNotificationServiceRetriableBinder;
-
- InstrumentClusterController(Context context) {
- mContext = context;
- mNavigationRenderer = new NavigationRendererImpl(this);
-
- init();
- }
-
- private void init() {
- grantNotificationListenerPermissionsIfNecessary(mContext);
-
- final Display display = getInstrumentClusterDisplay(mContext);
- if (DEBUG) {
- Log.d(TAG, "Instrument cluster display: " + display);
- }
- if (display == null) {
- return;
- }
-
- mClusterView = new ClusterView(mContext);
- Presentation presentation = new InstrumentClusterPresentation(mContext, display);
- presentation.setContentView(mClusterView);
-
- // To handle incoming messages
- mNotificationHandler = new MessagingNotificationHandler(mClusterView);
-
- mMediaStateListener = new MediaStateListenerImpl(this);
- mMediaStateMonitor = new MediaStateMonitor(mContext, mMediaStateListener);
-
- mInCallServiceRetriableBinder = new RetriableServiceBinder(
- new Handler(Looper.getMainLooper()),
- mContext,
- ClusterInCallService.class,
- ClusterInCallService.ACTION_LOCAL_BINDING,
- mInCallServiceConnection);
- mInCallServiceRetriableBinder.attemptToBind();
-
- mNotificationServiceRetriableBinder = new RetriableServiceBinder(
- new Handler(Looper.getMainLooper()),
- mContext,
- StatusBarNotificationListener.class,
- StatusBarNotificationListener.ACTION_LOCAL_BINDING,
- mNotificationListenerConnection);
- mNotificationServiceRetriableBinder.attemptToBind();
-
- // Show default card - weather
- mClusterView.enqueueCard(mClusterView.createWeatherCard());
-
- presentation.show();
- }
-
- NavigationRenderer getNavigationRenderer() {
- return mNavigationRenderer;
- }
-
- private final ServiceConnection mInCallServiceConnection = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder binder) {
- if (DEBUG) {
- Log.d(TAG, "onServiceConnected, name: " + name + ", binder: " + binder);
- }
-
- mInCallService = ((ClusterInCallService.LocalBinder) binder).getService();
- mInCallService.registerListener(mCallServiceListener);
-
- // The InCallServiceImpl could be bound when we already have some active calls, let's
- // notify UI about these calls.
- for (Call call : mInCallService.getCalls()) {
- mCallServiceListener.onStateChanged(call, call.getState());
- }
- mInCallServiceRetriableBinder = null;
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- if (DEBUG) {
- Log.d(TAG, "onServiceDisconnected, name: " + name);
- }
- }
- };
-
- private final ServiceConnection mNotificationListenerConnection = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder binder) {
- if (DEBUG) {
- Log.d(TAG, "onServiceConnected, name: " + name + ", binder: " + binder);
- }
-
- mNotificationListener = ((StatusBarNotificationListener.LocalBinder) binder)
- .getService();
- mNotificationListener.setHandler(mNotificationHandler);
-
- mNotificationServiceRetriableBinder = null;
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- if (DEBUG) {
- Log.d(TAG, "onServiceDisconnected, name: "+ name);
- }
- }
- };
-
- private final Call.Callback mCallServiceListener = new Call.Callback() {
- @Override
- public void onStateChanged(Call call, int state) {
- if (DEBUG) {
- Log.d(TAG, "onCallStateChanged, call: " + call + ", state: " + state);
- }
-
- runOnMain(() -> InstrumentClusterController.this.onCallStateChanged(call, state));
- }
- };
-
- private String extractPhoneNumber(Call call) {
- String number = "";
- Call.Details details = call.getDetails();
- if (details != null) {
- GatewayInfo gatewayInfo = details.getGatewayInfo();
-
- if (gatewayInfo != null) {
- number = gatewayInfo.getOriginalAddress().getSchemeSpecificPart();
- } else if (details.getHandle() != null) {
- number = details.getHandle().getSchemeSpecificPart();
- }
- } else {
- number = mContext.getResources().getString(R.string.unknown);
- }
-
- return number;
- }
-
- private void onCallStateChanged(Call call, int state) {
- if (DEBUG) {
- Log.d(TAG, "onCallStateChanged, call: " + call + ", state: " + state);
- }
-
- switch (state) {
- case Call.STATE_ACTIVE: {
- Call.Details details = call.getDetails();
- if (details != null) {
- long duration = System.currentTimeMillis() - details.getConnectTimeMillis();
- mClusterView.handleCallConnected(SystemClock.elapsedRealtime() - duration);
- }
- } break;
- case Call.STATE_CONNECTING: {
-
- } break;
- case Call.STATE_DISCONNECTING: {
- mClusterView.handleCallDisconnected();
- } break;
- case Call.STATE_DIALING: {
- String phoneNumber = extractPhoneNumber(call);
- String displayName = TelecomUtils.getDisplayName(mContext, phoneNumber);
- Bitmap image = TelecomUtils
- .getContactPhotoFromNumber(mContext.getContentResolver(), phoneNumber);
- mClusterView.handleDialingCall(image, displayName);
- } break;
- case Call.STATE_DISCONNECTED: {
- mClusterView.handleCallDisconnected();
- } break;
- case Call.STATE_HOLDING:
- break;
- case Call.STATE_NEW:
- break;
- case Call.STATE_RINGING: {
- String phoneNumber = extractPhoneNumber(call);
- String displayName = TelecomUtils.getDisplayName(mContext, phoneNumber);
- Bitmap image = TelecomUtils
- .getContactPhotoFromNumber(mContext.getContentResolver(), phoneNumber);
- if (image != null) {
- if (DEBUG) {
- Log.d(TAG, "Incoming call, contact image size: " + image.getWidth()
- + "x" + image.getHeight());
- }
- }
- mClusterView.handleIncomingCall(image, displayName);
- } break;
- default:
- Log.w(TAG, "Unexpected call state: " + state + ", call : " + call);
- }
- }
-
- private static void grantNotificationListenerPermissionsIfNecessary(Context context) {
- ComponentName componentName = new ComponentName(context,
- StatusBarNotificationListener.class);
- String componentFlatten = componentName.flattenToString();
-
- ContentResolver resolver = context.getContentResolver();
- String grantedComponents = Settings.Secure.getString(resolver,
- Settings.Secure.ENABLED_NOTIFICATION_LISTENERS);
-
- if (grantedComponents != null) {
- String[] allowed = grantedComponents.split(":");
- for (String s : allowed) {
- if (s.equals(componentFlatten)) {
- if (DEBUG) {
- Log.d(TAG, "Notification listener permission granted.");
- }
- return; // Permission already granted.
- }
- }
- }
-
- if (DEBUG) {
- Log.d(TAG, "Granting notification listener permission.");
- }
- Settings.Secure.putString(resolver,
- Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
- grantedComponents + ":" + componentFlatten);
-
- }
-
- /* package */ void onDestroy() {
- if (mMediaStateMonitor != null) {
- mMediaStateMonitor.release();
- mMediaStateMonitor = null;
- }
- if (mMediaStateListener != null) {
- mMediaStateListener.release();
- mMediaStateListener = null;
- }
- if (mInCallService != null) {
- mContext.unbindService(mInCallServiceConnection);
- mInCallService = null;
- }
- if (mNotificationListener != null) {
- mContext.unbindService(mNotificationListenerConnection);
- mNotificationListener = null;
- }
- if (mInCallServiceRetriableBinder != null) {
- mInCallServiceRetriableBinder.release();
- mInCallServiceRetriableBinder = null;
- }
- if (mNotificationServiceRetriableBinder != null) {
- mNotificationServiceRetriableBinder.release();
- mNotificationServiceRetriableBinder = null;
- }
- }
-
- private static Display getInstrumentClusterDisplay(Context context) {
- DisplayManager displayManager = context.getSystemService(DisplayManager.class);
- Display[] displays = displayManager.getDisplays();
-
- if (DEBUG) {
- Log.d(TAG, "There are currently " + displays.length + " displays connected.");
- for (Display display : displays) {
- Log.d(TAG, " " + display);
- }
- }
-
- if (displays.length > 1) {
- // TODO: Put this into settings?
- return displays[displays.length - 1];
- }
- return null;
- }
-
- private static void runOnMain(Runnable runnable) {
- new Handler(Looper.getMainLooper()).post(runnable);
- }
-
- private static class MediaStateListenerImpl implements MediaStateListener {
- private final Timer mTimer = new Timer("ClusterMediaProgress");
- private final ClusterView mClusterView;
-
- private MediaData mCurrentMedia;
- private MediaAppInfo mMediaAppInfo;
- private MediaCard mCard;
- private PlaybackState mPlaybackState;
- private TimerTask mTimerTask;
-
- MediaStateListenerImpl(InstrumentClusterController renderer) {
- mClusterView = renderer.mClusterView;
- }
-
- void release() {
- if (mTimerTask != null) {
- mTimerTask.cancel();
- mTimerTask = null;
- }
- }
-
- @Override
- public void onPlaybackStateChanged(final PlaybackState playbackState) {
- if (DEBUG) {
- Log.d(TAG, "onPlaybackStateChanged, playbackState: " + playbackState);
- }
-
- if (mTimerTask != null) {
- mTimerTask.cancel();
- mTimerTask = null;
- }
-
- if (playbackState != null) {
- if ((playbackState.getState() == PlaybackState.STATE_PLAYING
- || playbackState.getState() == PlaybackState.STATE_BUFFERING)) {
- mPlaybackState = playbackState;
-
- if (mCurrentMedia != null) {
- showMediaCardIfNecessary(mCurrentMedia);
-
- if (mCurrentMedia.duration > 0) {
- startTrackProgressTimer();
- }
- }
- } else if (playbackState.getState() == PlaybackState.STATE_STOPPED
- || playbackState.getState() == PlaybackState.STATE_ERROR
- || playbackState.getState() == PlaybackState.STATE_NONE) {
- hideMediaCard();
- }
- } else {
- hideMediaCard();
- }
-
- }
-
- private void startTrackProgressTimer() {
- mTimerTask = new TimerTask() {
- @Override
- public void run() {
- runOnMain(() -> {
- if (mPlaybackState == null || mCard == null) {
- return;
- }
- long trackStarted = mPlaybackState.getLastPositionUpdateTime()
- - mPlaybackState.getPosition();
- long trackDuration = mCurrentMedia == null ? 0 : mCurrentMedia.duration;
-
- long currentTime = SystemClock.elapsedRealtime();
- long progressMs = (currentTime - trackStarted);
- if (trackDuration > 0) {
- mCard.setProgress((int)((progressMs * 100) / trackDuration));
- }
- });
- }
- };
-
- mTimer.scheduleAtFixedRate(mTimerTask, 0, 1000);
- }
-
-
- @Override
- public void onMetadataChanged(MediaMetadata metadata) {
- if (DEBUG) {
- Log.d(TAG, "onMetadataChanged: " + metadata);
- }
- MediaData data = MediaData.createFromMetadata(metadata);
- if (data == null) {
- hideMediaCard();
- }
- mCurrentMedia = data;
- }
-
- private void hideMediaCard() {
- if (DEBUG) {
- Log.d(TAG, "hideMediaCard");
- }
-
- if (mCard != null) {
- mClusterView.removeCard(mCard);
- mCard = null;
- }
-
- // Remove all existing media cards if any.
- MediaCard mediaCard;
- do {
- mediaCard = mClusterView.getCardOrNull(MediaCard.class);
- if (mediaCard != null) {
- mClusterView.removeCard(mediaCard);
- }
- } while (mediaCard != null);
- }
-
- private void showMediaCardIfNecessary(MediaData data) {
- if (!needToCreateMediaCard(data)) {
- return;
- }
-
- int accentColor = mMediaAppInfo == null
- ? Color.GRAY : mMediaAppInfo.getMediaClientAccentColor();
-
- mCard = mClusterView.createMediaCard(
- data.albumCover, data.title, data.subtitle, accentColor);
- if (data.duration <= 0) {
- mCard.setProgress(100); // unknown position
- } else {
- mCard.setProgress(0);
- }
- mClusterView.enqueueCard(mCard);
- }
-
- private boolean needToCreateMediaCard(MediaData data) {
- return (mCard == null)
- || !Objects.equals(mCard.getTitle(), data.title)
- || !Objects.equals(mCard.getSubtitle(), data.subtitle);
- }
-
- @Override
- public void onMediaAppChanged(MediaAppInfo mediaAppInfo) {
- mMediaAppInfo = mediaAppInfo;
- }
-
- private static class MediaData {
- final Bitmap albumCover;
- final String subtitle;
- final String title;
- final long duration;
-
- private MediaData(MediaMetadata metadata) {
- MediaDescription mediaDescription = metadata.getDescription();
- title = charSequenceToString(mediaDescription.getTitle());
- subtitle = charSequenceToString(mediaDescription.getSubtitle());
- albumCover = mediaDescription.getIconBitmap();
- duration = metadata.getLong(MediaMetadata.METADATA_KEY_DURATION);
- }
-
- static MediaData createFromMetadata(MediaMetadata metadata) {
- return metadata == null ? null : new MediaData(metadata);
- }
-
- private static String charSequenceToString(@Nullable CharSequence cs) {
- return cs == null ? null : String.valueOf(cs);
- }
-
- @Override
- public String toString() {
- return "MediaData{" +
- "albumCover=" + albumCover +
- ", subtitle='" + subtitle + '\'' +
- ", title='" + title + '\'' +
- ", duration=" + duration +
- '}';
- }
- }
- }
-
- private static class NavigationRendererImpl extends NavigationRenderer {
-
- private final InstrumentClusterController mController;
-
- private ClusterView mClusterView;
- private Resources mResources;
-
- private NavCard mNavCard;
-
- NavigationRendererImpl(InstrumentClusterController controller) {
- mController = controller;
- }
-
- @Override
- public CarNavigationInstrumentCluster getNavigationProperties() {
- if (DEBUG) {
- Log.d(TAG, "getNavigationProperties");
- }
- return CarNavigationInstrumentCluster.createCustomImageCluster(
- 1000, /* 1 Hz*/
- 64, /* image width */
- 64, /* image height */
- 32); /* color depth */
- }
-
- @Override
- public void onEvent(int eventType, Bundle bundle) {
- if (DEBUG) {
- Log.d(TAG, "onEvent");
- }
- // Implement this.
- }
- }
-
- /**
- * Services might not be ready for binding. This class will retry binding after short interval
- * if previous binding failed.
- */
- private static class RetriableServiceBinder {
- private static final long RETRY_INTERVAL_MS = 500;
- private static final long MAX_RETRY = 30;
-
- private Handler mHandler;
- private final Context mContext;
- private final Intent mIntent;
- private final ServiceConnection mConnection;
-
- private long mAttemptsLeft = MAX_RETRY;
-
- private final Runnable mBindRunnable = () -> attemptToBind();
-
- RetriableServiceBinder(Handler handler, Context context, Class<?> cls, String action,
- ServiceConnection connection) {
- mHandler = handler;
- mContext = context;
- mIntent = new Intent(mContext, cls);
- mIntent.setAction(action);
- mConnection = connection;
- }
-
- void release() {
- mHandler.removeCallbacks(mBindRunnable);
- }
-
- void attemptToBind() {
- boolean bound = mContext.bindServiceAsUser(mIntent,
- mConnection, Context.BIND_AUTO_CREATE, UserHandle.CURRENT_OR_SELF);
-
- if (!bound && --mAttemptsLeft > 0) {
- mHandler.postDelayed(mBindRunnable, RETRY_INTERVAL_MS);
- } else if (!bound) {
- Log.e(TAG, "Gave up to bind to a service: " + mIntent.getComponent() + " after "
- + MAX_RETRY + " retries.");
- }
- }
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterPresentation.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterPresentation.java
deleted file mode 100644
index 3a3068e..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterPresentation.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.cluster.sample;
-
-import android.app.Presentation;
-import android.content.Context;
-import android.view.Display;
-import android.view.WindowManager;
-
-/**
- * Presentation class.
- */
-public class InstrumentClusterPresentation extends Presentation {
- public InstrumentClusterPresentation(Context outerContext, Display display) {
- super(outerContext, display);
- // To allow presentation from the service.
- getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterRenderingServiceImpl.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterRenderingServiceImpl.java
deleted file mode 100644
index 066072e..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterRenderingServiceImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample;
-
-import android.car.cluster.renderer.InstrumentClusterRenderingService;
-import android.car.cluster.renderer.NavigationRenderer;
-import android.view.KeyEvent;
-
-/**
- * Service for {@link InstrumentClusterController}. This is entry-point of the instrument cluster
- * renderer. This service will be bound from Car Service.
- */
-public class InstrumentClusterRenderingServiceImpl extends InstrumentClusterRenderingService {
-
- private InstrumentClusterController mController;
-
- @Override
- public void onCreate() {
- super.onCreate();
-
- mController = new InstrumentClusterController(this /* context */);
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
-
- if (mController != null) {
- mController.onDestroy();
- mController = null;
- }
- }
-
- @Override
- public NavigationRenderer getNavigationRenderer() {
- return mController.getNavigationRenderer();
- }
-
- @Override
- public void onKeyEvent(KeyEvent keyEvent) {
- // No need to handle key events in this implementation.
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ManeuverPanel.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ManeuverPanel.java
deleted file mode 100644
index 835b9ed..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/ManeuverPanel.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.FrameLayout;
-import android.widget.TextView;
-
-import com.android.car.cluster.sample.cards.NavCard;
-
-/**
- * Contains text information about next maneuver. This panel is used in {@link NavCard}.
- */
-public class ManeuverPanel extends FrameLayout {
-
- private TextView mDistance;
- private TextView mDistanceUnits;
- private TextView mStreet;
-
- public ManeuverPanel(Context context) {
- this(context, null);
- }
-
- public ManeuverPanel(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- inflate(context, R.layout.nav_card_maneuver_description, this);
-
- mDistance = (TextView) findViewById(R.id.nav_distance);
- mDistanceUnits = (TextView) findViewById(R.id.nav_distance_units);
- mStreet = (TextView) findViewById(R.id.nav_street);
- }
-
- public void setDistanceToNextManeuver(String distance, String units) {
- mDistance.setText(distance);
- mDistanceUnits.setText(units);
- }
-
- public void setStreet(CharSequence street) {
- mStreet.setText(street);
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MediaAppInfo.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MediaAppInfo.java
deleted file mode 100644
index 3f1e004..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MediaAppInfo.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2016, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.cluster.sample;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.util.Log;
-
-/**
- * An immutable class which hold the the information about the currently connected media app.
- */
-public class MediaAppInfo {
- private static final String TAG = DebugUtil.getTag(MediaAppInfo.class);
-
- private int mAccentColor;
-
- public MediaAppInfo(Context context, String packageName) {
- try {
- PackageManager packageManager = context.getPackageManager();
- ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName,
- PackageManager.GET_META_DATA);
-
- fetchAppColors(packageName, appInfo.theme, context);
- } catch (PackageManager.NameNotFoundException e) {
- Log.e(TAG, "Got a component that doesn't exist (" + packageName + ")");
- }
- }
-
- public int getMediaClientAccentColor() {
- return mAccentColor;
- }
-
- private void fetchAppColors(String packageName, int appTheme, Context context) {
- TypedArray ta = null;
- try {
- Context packageContext = context.createPackageContext(packageName, 0);
- packageContext.setTheme(appTheme);
- Resources.Theme theme = packageContext.getTheme();
- ta = theme.obtainStyledAttributes(new int[]{ android.R.attr.colorAccent });
- mAccentColor = ta.getColor(1,
- context.getResources().getColor(android.R.color.holo_green_light));
- } catch (PackageManager.NameNotFoundException e) {
- Log.e(TAG, "Unable to update media client package attributes.", e);
- } finally {
- if (ta != null) {
- ta.recycle();
- }
- }
- }
-}
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MediaStateMonitor.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MediaStateMonitor.java
deleted file mode 100644
index 2b68d07..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MediaStateMonitor.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.cluster.sample;
-
-import static com.android.car.cluster.sample.DebugUtil.DEBUG;
-
-import android.content.Context;
-import android.media.MediaMetadata;
-import android.media.session.MediaController;
-import android.media.session.MediaSessionManager;
-import android.media.session.MediaSessionManager.OnActiveSessionsChangedListener;
-import android.media.session.PlaybackState;
-import android.util.Log;
-
-import java.lang.ref.WeakReference;
-import java.util.List;
-
-/**
- * Reports current media status to instrument cluster renderer through {@link MediaStateListener}
- */
-public class MediaStateMonitor {
-
- private final static String TAG = DebugUtil.getTag(MediaStateMonitor.class);
-
- private final Context mContext;
- private final MediaListener mMediaListener;
- private MediaController mPrimaryMediaController;
- private OnActiveSessionsChangedListener mActiveSessionsChangedListener;
- private MediaSessionManager mMediaSessionManager;
- private MediaStateListener mListener;
-
- public MediaStateMonitor(Context context, MediaStateListener listener) {
- mListener = listener;
- mContext = context;
- mMediaListener = new MediaListener(this);
- mActiveSessionsChangedListener = controllers -> onActiveSessionsChanged(controllers);
- mMediaSessionManager = mContext.getSystemService(MediaSessionManager.class);
- mMediaSessionManager.addOnActiveSessionsChangedListener(
- mActiveSessionsChangedListener, null);
-
- onActiveSessionsChanged(mMediaSessionManager.getActiveSessions(null));
- }
-
- private void onActiveSessionsChanged(List<MediaController> controllers) {
- if (DEBUG) {
- Log.d(TAG, "onActiveSessionsChanged, controllers found: " + controllers.size());
- }
- MediaController newPrimaryController = null;
- if (!controllers.isEmpty()) {
- newPrimaryController = controllers.get(0);
- if (mPrimaryMediaController == newPrimaryController) {
- // Primary media controller has not been changed.
- return;
- }
- }
-
- releasePrimaryMediaController();
-
- if (newPrimaryController != null) {
- mPrimaryMediaController = newPrimaryController;
- mPrimaryMediaController.registerCallback(mMediaListener);
- mListener.onMediaAppChanged(
- new MediaAppInfo(mContext, mPrimaryMediaController.getPackageName()));
- }
- updateRendererMediaStatusIfAvailable();
- }
-
- public void release() {
- releasePrimaryMediaController();
- if (mActiveSessionsChangedListener != null) {
- mMediaSessionManager.removeOnActiveSessionsChangedListener(
- mActiveSessionsChangedListener);
- mActiveSessionsChangedListener = null;
- }
- mMediaSessionManager = null;
- }
-
- private void releasePrimaryMediaController() {
- if (mPrimaryMediaController != null) {
- mPrimaryMediaController.unregisterCallback(mMediaListener);
- mPrimaryMediaController = null;
- }
- }
-
- private void updateRendererMediaStatusIfAvailable() {
- mListener.onMetadataChanged(
- mPrimaryMediaController == null ? null : mPrimaryMediaController.getMetadata());
- mListener.onPlaybackStateChanged(
- mPrimaryMediaController == null
- ? null : mPrimaryMediaController.getPlaybackState());
- }
-
- private void onPlaybackStateChanged(PlaybackState state) {
- mListener.onPlaybackStateChanged(state);
- }
-
- private void onMetadataChanged(MediaMetadata metadata) {
- mListener.onMetadataChanged(metadata);
- }
-
- public interface MediaStateListener {
- void onPlaybackStateChanged(PlaybackState playbackState);
- void onMetadataChanged(MediaMetadata metadata);
- void onMediaAppChanged(MediaAppInfo mediaAppPackage);
- }
-
- private static class MediaListener extends MediaController.Callback {
- private final WeakReference<MediaStateMonitor> mServiceRef;
-
- MediaListener(MediaStateMonitor service) {
- mServiceRef = new WeakReference<>(service);
- }
-
- @Override
- public void onPlaybackStateChanged(PlaybackState state) {
- MediaStateMonitor service = mServiceRef.get();
- if (service != null) {
- service.onPlaybackStateChanged(state);
- }
- }
-
- @Override
- public void onMetadataChanged(MediaMetadata metadata) {
- MediaStateMonitor service = mServiceRef.get();
- if (service != null) {
- service.onMetadataChanged(metadata);
- }
- }
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MessagingConverter.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MessagingConverter.java
deleted file mode 100644
index eddeec7..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MessagingConverter.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample;
-
-import android.app.Notification;
-import android.graphics.Bitmap;
-import android.service.notification.StatusBarNotification;
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.core.app.NotificationCompat.CarExtender;
-import androidx.core.app.NotificationCompat.CarExtender.UnreadConversation;
-
-/**
- * Convert a {@link CarExtender} notification into a {@link MessageContactDetails}
- */
-public class MessagingConverter {
- private static final String TAG = DebugUtil.getTag(MessagingConverter.class);
-
- public static boolean canConvert(StatusBarNotification sbn) {
- Notification notification = sbn.getNotification();
- if (notification == null) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "Notification is empty.");
- }
- return false;
- }
- CarExtender ce = new CarExtender(sbn.getNotification());
- if (ce.getUnreadConversation() == null) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "Notification with no messaging component.");
- }
- return false;
- }
-
- CarExtender.UnreadConversation uc = ce.getUnreadConversation();
- String[] messages = uc.getMessages();
- if (messages == null || messages.length == 0) {
- Log.w(TAG, "Car message notification with no messages.");
- return false;
- }
-
- if (TextUtils.isEmpty(uc.getParticipant())) {
- Log.w(TAG, "Car message notification with no participant.");
- return false;
- }
-
- if (uc.getReplyPendingIntent() == null) {
- Log.w(TAG, "Car message notification with no reply intent.");
- return false;
- }
-
- for (String m : messages) {
- if (m == null) {
- Log.w(TAG, "Car message with null text.");
- return false;
- }
- }
- return true;
- }
-
- public static MessageContactDetails convert(StatusBarNotification sbn) {
- CarExtender ce = new CarExtender(sbn.getNotification());
- UnreadConversation uc = ce.getUnreadConversation();
-
- Bitmap largeIcon = ce.getLargeIcon();
- if (largeIcon == null) {
- largeIcon = sbn.getNotification().largeIcon;
- }
- String name = uc.getParticipant();
-
- return new MessageContactDetails(largeIcon, name);
- }
-
- public static class MessageContactDetails {
- private final Bitmap mContactImage;
- private final String mContactName;
-
- private MessageContactDetails(Bitmap contactImage, String contactName) {
- mContactImage = contactImage;
- mContactName = contactName;
- }
-
- public Bitmap getContactImage() {
- return mContactImage;
- }
-
- public String getContactName() {
- return mContactName;
- }
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MessagingNotificationHandler.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MessagingNotificationHandler.java
deleted file mode 100644
index e88ee46..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/MessagingNotificationHandler.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample;
-
-import static com.android.car.cluster.sample.DebugUtil.DEBUG;
-
-import android.app.Notification;
-import android.os.Handler;
-import android.os.Message;
-import android.service.notification.StatusBarNotification;
-import android.util.Log;
-
-import com.android.car.cluster.sample.MessagingConverter.MessageContactDetails;
-
-/**
- * Handles messaging {@link StatusBarNotification}.
- */
-class MessagingNotificationHandler extends Handler {
- private static final String TAG = DebugUtil.getTag(MessagingNotificationHandler.class);
-
- private final ClusterView mClusterView;
-
- MessagingNotificationHandler(ClusterView cluster) {
- mClusterView = cluster;
- }
-
- @Override
- public void handleMessage(Message msg) {
- if (DEBUG) {
- Log.d(TAG, "NotificationHandler, handleMessage: " + msg);
- }
- if (msg.obj instanceof StatusBarNotification) {
- StatusBarNotification sbn = (StatusBarNotification) msg.obj;
- Notification notification = sbn.getNotification();
- if (notification != null) {
- if (DEBUG) {
- Log.d(TAG, "NotificationHandler, notification extras: "
- + notification.extras.toString());
- }
- if (MessagingConverter.canConvert(sbn)) {
- MessageContactDetails data = MessagingConverter.convert(sbn);
- mClusterView.handleHangoutMessage(
- data.getContactImage(), data.getContactName());
- } else {
- Log.w(TAG, "Can't convert message: " + sbn);
- }
- }
- } else {
- Log.w(TAG, "Unexpected message with object: " + msg.obj);
- }
- }
-}
\ No newline at end of file
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/StatusBarNotificationListener.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/StatusBarNotificationListener.java
deleted file mode 100644
index 8758766..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/StatusBarNotificationListener.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample;
-
-import android.content.Intent;
-import android.os.Binder;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.service.notification.NotificationListenerService;
-import android.service.notification.StatusBarNotification;
-import android.util.Log;
-
-/**
- * Listens to status bar notifications and passes it to the listener.
- */
-public class StatusBarNotificationListener extends NotificationListenerService {
-
- private static final String TAG = DebugUtil.getTag(StatusBarNotificationListener.class);
-
- static final String ACTION_LOCAL_BINDING = "local_binding";
-
- private Handler mHandler;
-
- @Override
- public void onNotificationPosted(StatusBarNotification sbn) {
- if (MessagingConverter.canConvert(sbn) && mHandler != null) {
- Message msg = Message.obtain(mHandler);
- msg.obj = sbn;
- mHandler.sendMessage(msg);
- }
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- Log.d(TAG, "onBind, intent:" + intent);
-
- return ACTION_LOCAL_BINDING.equals(intent.getAction())
- ? new LocalBinder() : super.onBind(intent);
- }
-
- public void setHandler(Handler handler) {
- mHandler = handler;
- }
-
- public class LocalBinder extends Binder {
- public StatusBarNotificationListener getService() {
- return StatusBarNotificationListener.this;
- }
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/TelecomUtils.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/TelecomUtils.java
deleted file mode 100644
index dfe7cb7..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/TelecomUtils.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample;
-
-/**
- * Utility class to retrieve contact information.
- */
-import android.annotation.Nullable;
-import android.annotation.WorkerThread;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.Context;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.BitmapFactory.Options;
-import android.graphics.Rect;
-import android.net.Uri;
-import android.provider.ContactsContract;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.LruCache;
-
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Locale;
-
-public class TelecomUtils {
-
- private final static String TAG = DebugUtil.getTag(TelecomUtils.class);
-
- private static final String[] CONTACT_ID_PROJECTION = new String[] {
- ContactsContract.PhoneLookup.DISPLAY_NAME,
- ContactsContract.PhoneLookup.TYPE,
- ContactsContract.PhoneLookup.LABEL,
- ContactsContract.PhoneLookup._ID
- };
-
- private static LruCache<String, Bitmap> sContactPhotoNumberCache;
- private static LruCache<Long, Bitmap> sContactPhotoIdCache;
- private static HashMap<String, Integer> sContactIdCache;
- private static HashMap<String, String> sFormattedNumberCache;
- private static HashMap<String, String> sDisplayNameCache;
- private static HashMap<String, String> sContactNameCache;
- private static String sVoicemailNumber;
- private static TelephonyManager sTelephonyManager;
-
- /**
- * Fetch contact photo by number from local cache.
- *
- * @param number
- * @return Contact photo if it's in the cache, otherwise null.
- */
- @Nullable
- public static Bitmap getCachedContactPhotoFromNumber(String number) {
- if (number == null) {
- return null;
- }
-
- if (sContactPhotoNumberCache == null) {
- sContactPhotoNumberCache = new LruCache<String, Bitmap>(4194304 /** 4 mb **/) {
- @Override
- protected int sizeOf(String key, Bitmap value) {
- return value.getByteCount();
- }
- };
- } else if (sContactPhotoNumberCache.get(number) != null) {
- return sContactPhotoNumberCache.get(number);
- }
-
- return null;
- }
-
- @WorkerThread
- public static Bitmap getContactPhotoFromNumber(ContentResolver contentResolver, String number) {
- if (number == null) {
- return null;
- }
-
- Bitmap photo = getCachedContactPhotoFromNumber(number);
- if (photo != null) {
- return photo;
- }
-
- int id = getContactIdFromNumber(contentResolver, number);
- if (id == 0) {
- return null;
- }
- photo = getContactPhotoFromId(contentResolver, id);
- if (photo != null) {
- sContactPhotoNumberCache.put(number, photo);
- }
- return photo;
- }
-
- /**
- * Return the contact id for the given contact id
- * @param id the contact id to get the photo for
- * @return the contact photo if it is found, null otherwise.
- */
- public static Bitmap getContactPhotoFromId(ContentResolver contentResolver, long id) {
- if (sContactPhotoIdCache == null) {
- sContactPhotoIdCache = new LruCache<Long, Bitmap>(4194304 /** 4 mb **/) {
- @Override
- protected int sizeOf(Long key, Bitmap value) {
- return value.getByteCount();
- }
- };
- } else if (sContactPhotoIdCache.get(id) != null) {
- return sContactPhotoIdCache.get(id);
- }
-
- Uri photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
- InputStream photoDataStream = ContactsContract.Contacts.openContactPhotoInputStream(
- contentResolver, photoUri, true);
-
- Options options = new Options();
- options.inPreferQualityOverSpeed = true;
- // Scaling will be handled by later. We shouldn't scale multiple times to avoid
- // quality lost due to multiple potential scaling up and down.
- options.inScaled = false;
-
- Rect nullPadding = null;
- Bitmap photo = BitmapFactory.decodeStream(photoDataStream, nullPadding, options);
- if (photo != null) {
- photo.setDensity(Bitmap.DENSITY_NONE);
- sContactPhotoIdCache.put(id, photo);
- }
- return photo;
- }
-
- /**
- * Return the contact id for the given phone number.
- * @param number Caller phone number
- * @return the contact id if it is found, 0 otherwise.
- */
- public static int getContactIdFromNumber(ContentResolver cr, String number) {
- if (number == null || number.isEmpty()) {
- return 0;
- }
- if (sContactIdCache == null) {
- sContactIdCache = new HashMap<>();
- } else if (sContactIdCache.containsKey(number)) {
- return sContactIdCache.get(number);
- }
-
-
- Uri uri = Uri.withAppendedPath(
- ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
- Uri.encode(number));
- Cursor cursor = cr.query(uri, CONTACT_ID_PROJECTION, null, null, null);
-
- try {
- if (cursor != null && cursor.moveToFirst()) {
- int id = cursor.getInt(cursor.getColumnIndex(ContactsContract.PhoneLookup._ID));
- sContactIdCache.put(number, id);
- return id;
- }
- }
- finally {
- if (cursor != null) {
- cursor.close();
- }
- }
- return 0;
- }
-
- public static String getVoicemailNumber(Context context) {
- if (sVoicemailNumber == null) {
- sVoicemailNumber = getTelephonyManager(context).getVoiceMailNumber();
- }
- return sVoicemailNumber;
- }
-
- public static TelephonyManager getTelephonyManager(Context context) {
- if (sTelephonyManager == null) {
- sTelephonyManager =
- (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
- }
- return sTelephonyManager;
- }
-
- public static String getFormattedNumber(Context context, String number) {
- Log.d(TAG, "getFormattedNumber: " + number);
- if (number == null) {
- return "";
- }
-
- if (sFormattedNumberCache == null) {
- sFormattedNumberCache = new HashMap<>();
- } else {
- if (sFormattedNumberCache.containsKey(number)) {
- return sFormattedNumberCache.get(number);
- }
- }
-
- String countryIso = getTelephonyManager(context).getSimCountryIso().toUpperCase(Locale.US);
- if (countryIso.length() != 2) {
- countryIso = Locale.getDefault().getCountry();
- if (countryIso == null || countryIso.length() != 2) {
- countryIso = "US";
- }
- }
- Log.d(TAG, "PhoneNumberUtils.formatNumberToE16, number: "
- + number + ", country: " + countryIso);
- String e164 = PhoneNumberUtils.formatNumberToE164(number, countryIso);
- String formattedNumber = PhoneNumberUtils.formatNumber(number, e164, countryIso);
- formattedNumber = TextUtils.isEmpty(formattedNumber) ? number : formattedNumber;
- sFormattedNumberCache.put(number, formattedNumber);
- Log.d(TAG, "getFormattedNumber, result: " + formattedNumber);
- return formattedNumber;
- }
-
- public static String getDisplayName(Context context, String number) {
- return getDisplayName(context, number, null);
- }
-
- private static String getDisplayName(Context context, String number, Uri gatewayOriginalAddress) {
- Log.d(TAG, "getDisplayName: " + number
- + ", gatewayOriginalAddress: " + gatewayOriginalAddress);
- if (sDisplayNameCache == null) {
- sDisplayNameCache = new HashMap<>();
- } else {
- if (sDisplayNameCache.containsKey(number)) {
- return sDisplayNameCache.get(number);
- }
- }
-
- if (TextUtils.isEmpty(number)) {
- return context.getString(R.string.unknown);
- }
- ContentResolver cr = context.getContentResolver();
- String name;
- if (number.equals(getVoicemailNumber(context))) {
- name = context.getResources().getString(R.string.voicemail);
- } else {
- name = getContactNameFromNumber(cr, number);
- }
-
- if (name == null) {
- name = getFormattedNumber(context, number);
- }
- if (name == null && gatewayOriginalAddress != null) {
- name = gatewayOriginalAddress.getSchemeSpecificPart();
- }
- if (name == null) {
- name = context.getString(R.string.unknown);
- }
- sDisplayNameCache.put(number, name);
- return name;
- }
-
- private static String getContactNameFromNumber(ContentResolver cr, String number) {
- if (sContactNameCache == null) {
- sContactNameCache = new HashMap<>();
- } else if (sContactNameCache.containsKey(number)) {
- return sContactNameCache.get(number);
- }
-
- Uri uri = Uri.withAppendedPath(
- ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
-
- Cursor cursor = null;
- String name = null;
- try {
- cursor = cr.query(uri,
- new String[] {ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
- if (cursor != null && cursor.moveToFirst()) {
- name = cursor.getString(0);
- sContactNameCache.put(number, name);
- }
- } finally {
- if (cursor != null) {
- cursor.close();
- }
- }
- return name;
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/CallCard.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/CallCard.java
deleted file mode 100644
index 4ca58e6..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/CallCard.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample.cards;
-
-import android.animation.TimeInterpolator;
-import android.content.Context;
-import android.graphics.BitmapFactory;
-import android.util.Log;
-import android.view.ViewTreeObserver;
-import android.view.ViewTreeObserver.OnGlobalLayoutListener;
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.widget.Chronometer;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.android.car.cluster.sample.DebugUtil;
-import com.android.car.cluster.sample.R;
-
-/**
- * Card responsible to display current call status.
- */
-public class CallCard extends CardView {
-
- private final static String TAG = DebugUtil.getTag(CallCard.class);
-
- private LinearLayout mPhonePanel;
- private Chronometer mCallDuration;
- private TextView mContactName;
- private TextView mCallStatusTextView;
- private LinearLayout mCallDurationPanel;
-
- private int mIncomingCallTextHeight;
- private int mCallDurationTextHeight;
-
- public int getCallStatus() {
- return mCallStatus;
- }
-
- public @interface CallStatus {
- int INCOMING_OR_DIALING = 1;
- int ACTIVE = 2;
- int DISCONNECTED = 4;
- }
-
- @CallStatus
- private int mCallStatus;
-
- public CallCard(Context context, PriorityChangedListener listener) {
- super(context, CardType.PHONE_CALL, listener);
- }
-
- @Override
- protected void init() {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "init");
- }
- mCallStatus = CallStatus.INCOMING_OR_DIALING;
- mPriority = PRIORITY_CALL_INCOMING;
-
- inflate(R.layout.call_card);
-
- mPhonePanel = viewById(R.id.phone_text_panel);
- mCallStatusTextView = viewById(R.id.call_status);
- mCallDuration = viewById(R.id.call_duration);
- mContactName = viewById(R.id.contact_name);
- mCallDurationPanel = viewById(R.id.call_duration_panel);
- mDetailsPanel = mPhonePanel;
-
- mLeftIconSwitcher.setVisibility(GONE);
- mCallDurationPanel.setVisibility(INVISIBLE);
-
- setRightIcon(
- BitmapFactory.decodeResource(getResources(), R.drawable.phone), true);
-
- final ViewTreeObserver observer = mPhonePanel.getViewTreeObserver();
- // Make sure to get dimensions after layout has been created.
- observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- mPhonePanel.getViewTreeObserver().removeOnGlobalLayoutListener(this);
- mIncomingCallTextHeight = mCallStatusTextView.getHeight();
- mCallDurationTextHeight = mCallDuration.getHeight();
-
- // Call duration is hidden when call is not answered, adjust panel Y pos.
- mPhonePanel.setTranslationY(mCallDurationTextHeight / 2);
- }
- });
- }
-
- public void setContactName(String contactName) {
- mContactName.setText(contactName);
- }
-
- public void setStatusLabel(String status) {
- mCallStatusTextView.setText(status);
- }
-
- public void animateCallConnected(long connectedTimestamp) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "animateCallConnected, current status: " + mCallStatus);
- }
- if (mCallStatus == CallStatus.INCOMING_OR_DIALING) {
- mCallStatus = CallStatus.ACTIVE;
-
- // Decrease priority after call is answered.
- runDelayed(3000, new Runnable() {
- @Override
- public void run() {
- setPriority(PRIORITY_CALL_ACTIVE);
- }
- });
-
- final long duration = 500 * DebugUtil.ANIMATION_FACTOR;
-
- TimeInterpolator interpolator =
- new AccelerateDecelerateInterpolator(getContext(), null);
-
- mCallDuration.setBase(connectedTimestamp);
- mCallDuration.start();
-
- mBackgroundImage.animate()
- .alpha(0f)
- .setDuration(duration);
-
- mLeftIconSwitcher.setTranslationX(mLeftPadding);
- mLeftIconSwitcher.setVisibility(VISIBLE);
- mRightIconSwitcher.animate()
- .translationX(mLeftPadding + mIconsOverlap)
- .setInterpolator(interpolator)
- .setDuration(duration);
- setRightIcon(
- BitmapFactory.decodeResource(getResources(), R.drawable.phone_active), true);
- mDetailsPanel.animate()
- .translationX(
- mLeftPadding + mIconsOverlap + mIconSize + mLeftPadding)
- .setInterpolator(interpolator)
- .setDuration(duration);
-
- mCallStatusTextView.animate()
- .alpha(0f)
- .setDuration(duration);
-
- mCallDurationPanel.setAlpha(0);
- mCallDurationPanel.setVisibility(VISIBLE);
- mCallDurationPanel.animate()
- .setDuration(duration)
- .alpha(1);
-
- mPhonePanel.animate()
- .translationYBy(-(mIncomingCallTextHeight + mCallDurationTextHeight) / 2)
- .setDuration(duration);
- }
- }
-
- public void animateCallDisconnected() {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "animateCallConnected, current status: " + mCallStatus);
- }
- if (mCallStatus == CallStatus.ACTIVE) {
- mCallStatus = CallStatus.DISCONNECTED;
-
- runDelayed(2000, new Runnable() {
- @Override
- public void run() {
- setPriority(PRIORITY_GARBAGE);
- }
- });
-
- mCallDuration.stop();
- final int duration = 500;
-
- TimeInterpolator interpolator =
- new AccelerateDecelerateInterpolator(getContext(), null);
-
- setRightIcon(
- BitmapFactory.decodeResource(getResources(), R.drawable.phone), true);
- mRightIconSwitcher.animate()
- .translationX(mLeftPadding)
- .setInterpolator(interpolator)
- .setDuration(duration * DebugUtil.ANIMATION_FACTOR)
- .withEndAction(new Runnable() {
- @Override
- public void run() {
- mLeftIconSwitcher.setVisibility(GONE);
- }
- });
- mDetailsPanel.animate()
- .translationX(mLeftPadding + mIconSize + mLeftPadding)
- .setInterpolator(interpolator)
- .setDuration(duration * DebugUtil.ANIMATION_FACTOR);
- }
- }
-
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/CardView.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/CardView.java
deleted file mode 100644
index 06c9fcc..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/CardView.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample.cards;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Bitmap.Config;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Paint.Style;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.PorterDuffXfermode;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.SystemClock;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.ViewGroup;
-import android.view.animation.DecelerateInterpolator;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
-import android.widget.ViewSwitcher;
-
-import com.android.car.cluster.sample.DebugUtil;
-import com.android.car.cluster.sample.R;
-
-/**
- * View that responsible for displaying cards in instrument cluster (including media, phone and
- * maps).
- */
-public class CardView extends FrameLayout implements Comparable<CardView> {
-
- private final static String TAG = DebugUtil.getTag(CardView.class);
-
- protected final static long SHOW_ANIMATION_DURATION = 1000 * DebugUtil.ANIMATION_FACTOR;
-
- protected ImageView mBackgroundImage;
- protected ViewGroup mDetailsPanel;
- protected ViewSwitcher mLeftIconSwitcher;
- protected ViewSwitcher mRightIconSwitcher;
-
- private Bitmap mBitmap = Bitmap.createBitmap(1, 1, Config.ARGB_8888);
-
- protected long mLastUpdated = SystemClock.elapsedRealtime();
-
- private Canvas mCanvas = new Canvas();
- private final Paint mBackgroundCirclePaint;
-
- private final static Handler mHandler = new Handler(Looper.getMainLooper());
-
- protected final int mCardWidth;
- protected final int mCardHeight;
- protected final int mCurveRadius;
- protected final int mTextPanelWidth;
- protected final float mLeftPadding;
- protected final float mIconSize;
- protected final float mIconsOverlap;
-
- protected int mPriority = 9;
-
- protected final static int PRIORITY_GARBAGE = 10;
-
- protected final static int PRIORITY_CALL_INCOMING = 3;
- protected final static int PRIORITY_CALL_ACTIVE = 5;
- protected final static int PRIORITY_MEDIA_NOTIFICATION = 3;
- protected final static int PRIORITY_MEDIA_ACTIVE = 6;
- protected final static int PRIORITY_WEATHER_CARD = 9;
- protected final static int PRIORITY_NAVIGATION_ACTIVE = 3;
- protected final static int PRIORITY_HANGOUT_NOTIFICATION = 3;
-
- @CardType
- private int mCardType;
- private final PriorityChangedListener mPriorityChangedListener;
-
- public @interface CardType {
- int WEATHER = 1;
- int MEDIA = 2;
- int PHONE_CALL = 3;
- int NAV = 4;
- int HANGOUT = 5;
- }
-
- public CardView(Context context, @CardType int cardType, PriorityChangedListener listener) {
- this(context, null, cardType, listener);
- }
-
- public CardView(Context context, AttributeSet attrs, @CardType int cardType,
- PriorityChangedListener listener) {
- super(context, attrs);
- mPriorityChangedListener = listener;
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "ctor");
- }
- mCardType = cardType;
-
- setWillNotDraw(false); // This will trigger onDraw method.
-
- mBackgroundCirclePaint = createBackgroundCirclePaint();
- mCardWidth = (int)getResources().getDimension(R.dimen.card_width);
- mCardHeight = (int) getResources().getDimension(R.dimen.card_height);
- mTextPanelWidth = (int)getResources().getDimension(R.dimen.card_message_panel_width);
- mLeftPadding = getResources().getDimension(R.dimen.card_content_left_padding);
- mIconSize = getResources().getDimension(R.dimen.card_icon_size);
- mIconsOverlap = mIconSize - mLeftPadding;
- mCurveRadius = (int)(mCardWidth * 0.643f);
-
- inflate(getContext(), R.layout.card_view, this);
-
- if (this.isInEditMode()) {
- return;
- }
-
- mLeftIconSwitcher = viewById(R.id.left_icon_switcher);
- mRightIconSwitcher = viewById(R.id.right_icon_switcher);
- mBackgroundImage = viewById(R.id.image_background);
-
- init();
- }
-
- protected void inflate(int layoutId) {
- inflate(getContext(), layoutId, (ViewGroup) getChildAt(0));
- }
-
- protected void init() {
- }
-
- @CardType
- public int getCardType() {
- return mCardType;
- }
-
- public void setLeftIcon(Bitmap bitmap) {
- setLeftIcon(bitmap, false /* animated */);
- }
-
- public void setLeftIcon(Bitmap bitmap, boolean animated) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "setLeftIcon, bitmap: " + bitmap);
- }
- switchImageViewBitmpa(bitmap, mLeftIconSwitcher, animated);
- }
-
-
- public void setRightIcon(Bitmap bitmap) {
- setRightIcon(bitmap, false /* animated */);
- }
-
- /**
- * @param bitmap if null, the image won't be displayed and message panel will be placed
- * accordingly.
- */
- public void setRightIcon(Bitmap bitmap, boolean animated) {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "setRightIcon, bitmap: " + bitmap);
- }
- if (bitmap == null && mRightIconSwitcher.getVisibility() == VISIBLE) {
- mRightIconSwitcher.setVisibility(GONE);
- } else if (bitmap != null && mRightIconSwitcher.getVisibility() == GONE) {
- mRightIconSwitcher.setVisibility(VISIBLE);
- }
-
- switchImageViewBitmpa(bitmap, mRightIconSwitcher, animated);
- }
-
- private void switchImageViewBitmpa(Bitmap bitmap, ViewSwitcher switcher, boolean animated) {
- ImageView icon = (ImageView) (animated
- ? switcher.getNextView() : switcher.getCurrentView());
-
- icon.setBackground(null);
- icon.setImageBitmap(bitmap);
-
- if (animated) {
- switcher.showNext();
- }
- }
-
- /** Called by {@code ClusterView} when card should go away using unreveal animation */
- public void onPlayUnrevealAnimation() {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "onPlayUnrevealAnimation");
- }
- }
-
- public void onPlayRevealAnimation() {
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "onPlayRevealAnimation");
- }
-
- if (mLeftIconSwitcher.getVisibility() == VISIBLE) {
- mLeftIconSwitcher.setTranslationX(mCardWidth / 2);
- mLeftIconSwitcher.animate()
- .translationX(getLeftIconTargetX())
- .setDuration(SHOW_ANIMATION_DURATION)
- .setInterpolator(getDecelerateInterpolator());
- }
-
- if (mRightIconSwitcher.getVisibility() == VISIBLE) {
- mRightIconSwitcher.setTranslationX( mCardWidth - mTextPanelWidth / 2 - mIconSize);
- mRightIconSwitcher.animate()
- .translationX(getRightIconTargetX())
- .setDuration(SHOW_ANIMATION_DURATION)
- .setInterpolator(getDecelerateInterpolator());
- }
-
- showDetailsPanelAnimation(getDetailsPanelTargetX());
- }
-
- protected float getLeftIconTargetX() {
- return mLeftIconSwitcher.getVisibility() == VISIBLE ? mLeftPadding : 0;
- }
-
- protected float getRightIconTargetX() {
- if (mRightIconSwitcher.getVisibility() != VISIBLE) {
- return 0;
- }
- float x = mLeftPadding;
- if (mLeftIconSwitcher.getVisibility() == VISIBLE) {
- x += mIconsOverlap;
- }
- return x;
- }
-
- protected float getDetailsPanelTargetX() {
- return Math.max(getLeftIconTargetX(), getRightIconTargetX()) + mIconSize + mLeftPadding;
- }
-
- protected void showDetailsPanelAnimation(float textX) {
- if (mDetailsPanel != null) {
- mDetailsPanel.setTranslationX(mCardWidth - mTextPanelWidth / 2);
- mDetailsPanel.animate()
- .translationX(textX)
- .setDuration(SHOW_ANIMATION_DURATION)
- .setInterpolator(getDecelerateInterpolator());
- }
- }
-
- protected DecelerateInterpolator getDecelerateInterpolator() {
- return new DecelerateInterpolator(2f);
- }
-
- public void setBackground(Bitmap bmpPicture, int backgroundColor) {
- Bitmap bmpBackground = Bitmap.createBitmap(
- mCardWidth,
- (int)getResources().getDimension(R.dimen.card_height),
- Config.ARGB_8888);
- Canvas canvas = new Canvas(bmpBackground);
- //clear previous drawings
- canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
-
- Paint p = new Paint();
- p.setColor(backgroundColor);
- p.setAntiAlias(true);
- p.setStyle(Style.FILL);
- // Draw curved background.
- canvas.drawCircle(mCurveRadius, (int)getResources().getDimension(
- R.dimen.card_height) / 2,
- mCurveRadius, p);
-
- // Draw image respecting curved background.
- p.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
- float x = canvas.getWidth() - bmpPicture.getWidth();
- float y = canvas.getHeight() - bmpPicture.getHeight();
- if (y < 0) {
- y = y / 2; // Center image if it is not fitting.
- }
- canvas.drawBitmap(bmpPicture, x, y, p);
-
- mBackgroundImage.setScaleType(ScaleType.CENTER_CROP);
- mBackgroundImage.setImageBitmap(bmpBackground);
- if (mBackgroundImage.getVisibility() != VISIBLE) {
- mBackgroundImage.setVisibility(VISIBLE);
- }
- }
-
- public void setBackgroundColor(int color) {
- mBackgroundCirclePaint.setColor(color);
- }
-
- private Paint createBackgroundCirclePaint() {
- Paint p = new Paint();
- p.setAntiAlias(true);
- p.setXfermode(new PorterDuffXfermode(Mode.ADD));
- p.setStyle(Style.FILL);
- p.setColor(getResources().getColor(R.color.cluster_active_area_background, null));
- return p;
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
-
- if(mBitmap.isRecycled() || mBitmap.getWidth() != canvas.getWidth()
- || mBitmap.getHeight() != canvas.getHeight()) {
- Log.d(TAG, "creating bitmap...");
- mBitmap.recycle();
- mBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Config.ARGB_8888);
- mCanvas.setBitmap(mBitmap);
- }
-
- //clear previous drawings
- mCanvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
-
- mCanvas.drawCircle(mCurveRadius, getHeight() / 2, mCurveRadius, mBackgroundCirclePaint);
-
- canvas.drawBitmap(mBitmap, 0, 0, null);
- }
-
- public int getIconSize() {
- return (int)mIconSize;
- }
-
- public static void runDelayed(long delay, final Runnable task) {
- mHandler.postDelayed(task, delay);
- }
-
- public void setPriority(int priority) {
- mPriority = priority;
- mPriorityChangedListener.onPriorityChanged(this, priority);
- }
-
- /**
- * Should return number from 0 to 9. 0 - is most important, 9 is less important.
- */
- public int getPriority() {
- return mPriority;
- }
-
- public boolean isGarbage() {
- return getPriority() == PRIORITY_GARBAGE;
- }
-
- public void removeGracefully() {
- setPriority(PRIORITY_GARBAGE);
- }
-
- @Override
- public int compareTo(CardView another) {
- int res = this.getPriority() - another.getPriority();
- if (res == 0) {
- // If objects have the same priorities, check the last time they were updated.
- res = this.mLastUpdated > another.mLastUpdated ? -1 : 1;
- if (DebugUtil.DEBUG) {
- Log.d(TAG, "Found card with the same priority: " + this + " and " + another + ","
- + "this.mLastUpdated: " + mLastUpdated
- + ", another.mLastUpdated:" + another.mLastUpdated + ", res: " + res);
-
- }
- }
- return res;
- }
-
- @SuppressWarnings("unchecked")
- protected <E> E viewById(int id) {
- return (E) findViewById(id);
- }
-
- public interface PriorityChangedListener {
- void onPriorityChanged(CardView cardView, int newPriority);
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/MediaCard.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/MediaCard.java
deleted file mode 100644
index a20dffe..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/MediaCard.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample.cards;
-
-import android.animation.TimeInterpolator;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.PorterDuff;
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.widget.LinearLayout;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import com.android.car.cluster.sample.DebugUtil;
-import com.android.car.cluster.sample.R;
-
-/**
- * Card responsible to display media content.
- */
-public class MediaCard extends CardView {
-
- private LinearLayout mMediaPanel;
- private ProgressBar mProgressBar;
- private TextView mTitle;
- private TextView mSubtitle;
-
- public MediaCard(Context context, PriorityChangedListener listener) {
- super(context, CardType.MEDIA, listener);
- }
-
- @Override
- protected void init() {
- inflate(R.layout.media_card);
-
- mPriority = PRIORITY_MEDIA_NOTIFICATION;
-
- mMediaPanel = viewById(R.id.message_panel);
- mProgressBar = viewById(R.id.progress_bar);
- mTitle = viewById(R.id.media_title);
- mSubtitle = viewById(R.id.media_subtitle);
-
- mDetailsPanel = mMediaPanel;
- mLeftIconSwitcher.setVisibility(GONE);
- }
-
- @Override
- public void onPlayRevealAnimation() {
- super.onPlayRevealAnimation();
-
- // Decrease priority once notification animation is complete.
- runDelayed(3000, new Runnable() {
- @Override
- public void run() {
- setPriority(PRIORITY_MEDIA_ACTIVE);
- }
- });
-
- if (mBackgroundImage.getVisibility() != GONE) {
- runDelayed(SHOW_ANIMATION_DURATION + 3000, new Runnable() {
- @Override
- public void run() {
- animateBackgroundFadeOut();
- }
- });
- }
- }
-
- private void animateBackgroundFadeOut() {
- TimeInterpolator interpolator =
- new AccelerateDecelerateInterpolator(getContext(), null);
-
- long duration = 500 * DebugUtil.ANIMATION_FACTOR;
-
- mBackgroundImage.animate()
- .alpha(0f)
- .setDuration(duration);
-
- mLeftIconSwitcher.setTranslationX(mLeftPadding);
- mLeftIconSwitcher.setVisibility(VISIBLE);
- mRightIconSwitcher.animate()
- .translationX(mLeftPadding + mIconsOverlap)
- .setInterpolator(interpolator)
- .setDuration(duration);
-
- mDetailsPanel.animate()
- .translationX(
- mLeftPadding + mIconsOverlap + mIconSize + mLeftPadding)
- .setInterpolator(interpolator)
- .setDuration(duration);
-
- }
-
- public void setProgressColor(int color) {
- mProgressBar.getIndeterminateDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
- mProgressBar.setProgressTintList(ColorStateList.valueOf(color));
- }
-
- public void setProgress(int progress) {
- if (progress == -1) {
- mProgressBar.setIndeterminate(true);
- return;
- } else {
- mProgressBar.setIndeterminate(false);
- }
-
- if (progress > 100) {
- progress = 100;
- }
- if (progress < 0) {
- progress = 0;
- }
- mProgressBar.setProgress(progress);
- }
-
- public void setTitle(String album) {
- mTitle.setText(album);
- }
-
- public void setSubtitle(String track) {
- mSubtitle.setText(track);
- }
-
- public String getTitle() {
- return mTitle.getText() == null ? null : String.valueOf(mTitle.getText());
- }
-
- public String getSubtitle() {
- return mSubtitle.getText() == null ? null : String.valueOf(mSubtitle.getText());
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/MessageCard.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/MessageCard.java
deleted file mode 100644
index 7a878da..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/MessageCard.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample.cards;
-
-import android.content.Context;
-import android.graphics.BitmapFactory;
-import android.util.AttributeSet;
-import android.widget.TextView;
-
-import com.android.car.cluster.sample.R;
-
-/**
- * Card that represents hangout notification.
- */
-public class MessageCard extends CardView {
-
- private TextView mContactName;
-
- public MessageCard(Context context, PriorityChangedListener listener) {
- this(context, null, CardType.HANGOUT, listener);
- }
-
- public MessageCard(Context context, AttributeSet attrs, @CardType int cardType,
- PriorityChangedListener listener) {
- super(context, attrs, cardType, listener);
- }
-
- @Override
- protected void init() {
- super.init();
-
- inflate(R.layout.hangout_layout);
-
- mDetailsPanel = viewById(R.id.msg_text_panel);
- mContactName = viewById(R.id.msg_card_contact_name);
- setRightIcon(BitmapFactory.decodeResource(getResources(), R.drawable.hangouts_icon));
-
- mPriority = PRIORITY_HANGOUT_NOTIFICATION;
-
- // Remove this notification in 5 seconds.
- runDelayed(5000, new Runnable() {
- @Override
- public void run() {
- removeGracefully();
- }
- });
- }
-
- public void setContactName(String contactName) {
- mContactName.setText(contactName);
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/NavCard.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/NavCard.java
deleted file mode 100644
index 0253184..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/NavCard.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample.cards;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.ViewSwitcher;
-import android.widget.ViewSwitcher.ViewFactory;
-
-import com.android.car.cluster.sample.ManeuverPanel;
-import com.android.car.cluster.sample.R;
-
-/**
- * Card responsible for showing navigation.
- */
-public class NavCard extends CardView {
-
- private ViewSwitcher mDirectionsSwitcher;
-
- public NavCard(Context context, PriorityChangedListener listener) {
- this(context, null, CardType.NAV, listener);
- }
-
- public NavCard(Context context, AttributeSet attrs, @CardType int cardType,
- PriorityChangedListener listener) {
- super(context, attrs, cardType, listener);
-
- }
-
- @Override
- protected void init() {
- inflate(R.layout.nav_card);
-
- mPriority = PRIORITY_NAVIGATION_ACTIVE;
-
- mDirectionsSwitcher = viewById(R.id.nav_directions_switcher);
- mDetailsPanel = mDirectionsSwitcher;
-
- mDirectionsSwitcher.setFactory(new ViewFactory() {
- @Override
- public View makeView() {
- return new ManeuverPanel(getContext());
- }
- });
-
- setRightIcon(null); // To hide it.
- }
-
- public void setDistanceToNextManeuver(String distance, String units) {
- ManeuverPanel maneuver = (ManeuverPanel) mDirectionsSwitcher.getCurrentView();
- maneuver.setDistanceToNextManeuver(distance, units);
- }
-
- public void setStreet(CharSequence street) {
- ManeuverPanel maneuver = (ManeuverPanel) mDirectionsSwitcher.getNextView();
- maneuver.setStreet(street);
- mDirectionsSwitcher.showNext();
- }
-
- public void setManeuverImage(Bitmap maneuverImage) {
- setLeftIcon(maneuverImage, true /* animated */);
- }
-
- @Override
- public void onPlayRevealAnimation() {
- super.onPlayRevealAnimation();
- }
-}
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/WeatherCard.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/WeatherCard.java
deleted file mode 100644
index 8ab6b24..0000000
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/cards/WeatherCard.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.cluster.sample.cards;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.view.animation.DecelerateInterpolator;
-import android.widget.ImageView;
-
-import com.android.car.cluster.sample.DebugUtil;
-import com.android.car.cluster.sample.R;
-
-/**
- * Sample card responsible for displaying weather content.
- */
-public class WeatherCard extends CardView {
-
- private ImageView mFarCloudImage;
- private ImageView mNearCloudImage;
-
- public WeatherCard(Context context, PriorityChangedListener listener) {
- super(context, CardType.WEATHER, listener);
- }
-
- @Override
- protected void init() {
- inflate(R.layout.weather_card);
-
- mPriority = PRIORITY_WEATHER_CARD;
- mFarCloudImage = viewById(R.id.weather_far_cloud);
- mNearCloudImage = viewById(R.id.weather_near_cloud);
-
- mDetailsPanel = viewById(R.id.weather_panel);;
- Bitmap theSun = BitmapFactory.decodeResource(getResources(), R.drawable.sun_154);
- setLeftIcon(theSun);
- mLeftIconSwitcher.setVisibility(VISIBLE);
- ((ImageView)mRightIconSwitcher.getCurrentView()).setImageDrawable(
- getResources().getDrawable(R.drawable.cloud_154_shadow, null));
- mRightIconSwitcher.setVisibility(VISIBLE);
- }
-
- @Override
- public void onPlayRevealAnimation() {
- super.onPlayRevealAnimation();
- long duration = SHOW_ANIMATION_DURATION * DebugUtil.ANIMATION_FACTOR;
-
- mNearCloudImage.setTranslationX(400);
- mNearCloudImage.animate()
- .translationX(0)
- .setDuration(duration)
- .setInterpolator(new DecelerateInterpolator(2f));
-
- // Far cloud needs to travel less in screen coordinates so it will make it slower.
- mFarCloudImage.setTranslationX(100);
- mFarCloudImage.animate()
- .translationX(0)
- .setDuration(duration)
- .setInterpolator(new DecelerateInterpolator(2f));
- }
-
- @Override
- protected float getRightIconTargetX() {
- return super.getRightIconTargetX() - 22;
- }
-
- @Override
- protected float getDetailsPanelTargetX() {
- return super.getDetailsPanelTargetX() - 70;
- }
-}
diff --git a/tests/carservice_test/src/com/android/car/MockedVmsTestBase.java b/tests/carservice_test/src/com/android/car/MockedVmsTestBase.java
index 2028958..7214f8b 100644
--- a/tests/carservice_test/src/com/android/car/MockedVmsTestBase.java
+++ b/tests/carservice_test/src/com/android/car/MockedVmsTestBase.java
@@ -41,6 +41,8 @@
import com.android.car.vehiclehal.VehiclePropValueBuilder;
import com.android.car.vehiclehal.test.MockedVehicleHal;
+import org.junit.Before;
+
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CountDownLatch;
@@ -76,10 +78,8 @@
.addAreaConfig(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL, 0, 0);
}
- @Override
- public void setUp() throws Exception {
- super.setUp();
-
+ @Before
+ public void setUpVms() throws Exception {
// Trigger VmsClientManager to bind to the MockPublisherClient
getContext().sendBroadcastAsUser(new Intent(Intent.ACTION_USER_UNLOCKED), UserHandle.ALL);
@@ -125,16 +125,12 @@
return mVmsSubscriberManager;
}
- Pair<VmsLayer, byte[]> receiveDataMessage() throws InterruptedException {
- return receiveWithTimeout(mSubscriberClient.mMessages);
- }
-
- VmsAvailableLayers receiveLayerAvailability() throws InterruptedException {
- return receiveWithTimeout(mSubscriberClient.mAvailableLayers);
- }
-
- MockPublisherClient getMockPublisherClient() throws InterruptedException {
- sPublisherIsReady.await(2L, TimeUnit.SECONDS);
+ MockPublisherClient getMockPublisherClient() {
+ try {
+ sPublisherIsReady.await(2L, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
return sPublisherClient;
}
@@ -163,7 +159,7 @@
mSubscriptionState.add(subscriptionState);
}
- VmsSubscriptionState receiveSubscriptionState() throws InterruptedException {
+ VmsSubscriptionState receiveSubscriptionState() {
return receiveWithTimeout(mSubscriptionState);
}
}
@@ -184,11 +180,11 @@
mAvailableLayers.add(availableLayers);
}
- Pair<VmsLayer, byte[]> receiveMessage() throws InterruptedException {
+ Pair<VmsLayer, byte[]> receiveMessage() {
return receiveWithTimeout(mMessages);
}
- VmsAvailableLayers receiveLayerAvailability() throws InterruptedException {
+ VmsAvailableLayers receiveLayerAvailability() {
return receiveWithTimeout(mAvailableLayers);
}
}
@@ -219,12 +215,16 @@
.build());
}
- VehiclePropValue receiveMessage() throws InterruptedException {
+ VehiclePropValue receiveMessage() {
return receiveWithTimeout(mMessages);
}
}
- private static <T> T receiveWithTimeout(BlockingQueue<T> queue) throws InterruptedException {
- return queue.poll(2L, TimeUnit.SECONDS);
+ private static <T> T receiveWithTimeout(BlockingQueue<T> queue) {
+ try {
+ return queue.poll(2L, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
}
}
diff --git a/tests/carservice_test/src/com/android/car/VmsPublisherSubscriberTest.java b/tests/carservice_test/src/com/android/car/VmsPublisherSubscriberTest.java
index 82b89ec..87cf1b8 100644
--- a/tests/carservice_test/src/com/android/car/VmsPublisherSubscriberTest.java
+++ b/tests/carservice_test/src/com/android/car/VmsPublisherSubscriberTest.java
@@ -18,107 +18,582 @@
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import android.car.vms.VmsAssociatedLayer;
import android.car.vms.VmsAvailableLayers;
import android.car.vms.VmsLayer;
import android.car.vms.VmsLayerDependency;
import android.car.vms.VmsLayersOffering;
+import android.car.vms.VmsSubscriberManager;
+import android.car.vms.VmsSubscriptionState;
import android.util.Pair;
import androidx.test.filters.MediumTest;
+import org.junit.Before;
import org.junit.Test;
-import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashSet;
-import java.util.List;
import java.util.Set;
+import java.util.function.Supplier;
+import java.util.function.ToIntFunction;
@MediumTest
public class VmsPublisherSubscriberTest extends MockedVmsTestBase {
- private static final int LAYER_ID = 88;
- private static final int LAYER_VERSION = 19;
- private static final int LAYER_SUBTYPE = 55;
- private static final String TAG = "VmsPubSubTest";
+ private static final VmsLayer SUBSCRIPTION_LAYER = new VmsLayer(1, 1, 1);
+ private static final VmsLayer SUBSCRIPTION_LAYER_OTHER = new VmsLayer(2, 1, 1);
- // The expected publisher ID is 0 since it the expected assigned ID from the VMS core.
- public static final int EXPECTED_PUBLISHER_ID = 0;
- public static final VmsLayer LAYER = new VmsLayer(LAYER_ID, LAYER_SUBTYPE, LAYER_VERSION);
- public static final VmsAssociatedLayer ASSOCIATED_LAYER =
- new VmsAssociatedLayer(LAYER, new HashSet<>(Arrays.asList(EXPECTED_PUBLISHER_ID)));
- public static final byte[] PAYLOAD = new byte[]{2, 3, 5, 7, 11, 13, 17};
+ private static final byte[] PAYLOAD = {0xa, 0xb};
+ private static final byte[] PAYLOAD_OTHER = {0xb, 0xc};
- private static final List<VmsAssociatedLayer> AVAILABLE_ASSOCIATED_LAYERS =
- new ArrayList<>(Arrays.asList(ASSOCIATED_LAYER));
- private static final VmsAvailableLayers AVAILABLE_LAYERS_WITH_SEQ =
- new VmsAvailableLayers(
- new HashSet(AVAILABLE_ASSOCIATED_LAYERS), 1);
+ private static final byte[] PUBLISHER_INFO = {0x0};
+ private static final byte[] PUBLISHER_INFO_OTHER = {0x1};
+ private static final int UNKNOWN_PUBLISHER = 99999;
- private static final int SUBSCRIBED_LAYER_ID = 89;
- public static final VmsLayer SUBSCRIBED_LAYER =
- new VmsLayer(SUBSCRIBED_LAYER_ID, LAYER_SUBTYPE, LAYER_VERSION);
- public static final VmsAssociatedLayer ASSOCIATED_SUBSCRIBED_LAYER =
- new VmsAssociatedLayer(SUBSCRIBED_LAYER,
- new HashSet<>(Arrays.asList(EXPECTED_PUBLISHER_ID)));
- private static final List<VmsAssociatedLayer>
- AVAILABLE_ASSOCIATED_LAYERS_WITH_SUBSCRIBED_LAYER =
- new ArrayList<>(Arrays.asList(ASSOCIATED_LAYER, ASSOCIATED_SUBSCRIBED_LAYER));
- private static final VmsAvailableLayers AVAILABLE_LAYERS_WITH_SUBSCRIBED_LAYER_WITH_SEQ =
- new VmsAvailableLayers(
- new HashSet(AVAILABLE_ASSOCIATED_LAYERS_WITH_SUBSCRIBED_LAYER), 1);
+ private MockPublisherClient mPublisher;
+ private VmsSubscriberManager mSubscriber;
+ private MockSubscriberClient mSubscriberClient;
- /*
- * This test method subscribes to a layer and triggers
- * VmsPublisherClientMockService.onVmsSubscriptionChange. In turn, the mock service will publish
- * a message, which is validated in this test.
- */
- @Test
- public void testPublisherToSubscriber() throws Exception {
- getSubscriberManager().subscribe(LAYER);
-
- int publisherId = getMockPublisherClient().getPublisherId(PAYLOAD);
- getMockPublisherClient().publish(LAYER, publisherId, PAYLOAD);
-
- Pair<VmsLayer, byte[]> dataMessage = receiveDataMessage();
- assertEquals(LAYER, dataMessage.first);
- assertArrayEquals(PAYLOAD, dataMessage.second);
+ @Before
+ public void setUpClients() {
+ mPublisher = getMockPublisherClient();
+ mSubscriber = getSubscriberManager();
+ mSubscriberClient = getMockSubscriberClient();
}
- /**
- * The Mock service will get a publisher ID by sending its information when it will get
- * ServiceReady as well as on SubscriptionChange. Since clients are not notified when
- * publishers are assigned IDs, this test waits until the availability is changed which
- * indicates
- * that the Mock service has gotten its ServiceReady and publisherId.
- */
@Test
- public void testPublisherInfo() throws Exception {
- int publisherId = getMockPublisherClient().getPublisherId(PAYLOAD);
- byte[] info = getSubscriberManager().getPublisherInfo(publisherId);
- assertArrayEquals(PAYLOAD, info);
+ public void testPublisherInfo_Unregistered() {
+ assertEquals(0, mSubscriber.getPublisherInfo(UNKNOWN_PUBLISHER).length);
}
- /*
- * The Mock service offers all the subscribed layers as available layers.
- * In this test the client subscribes to a layer and verifies that it gets the
- * notification that it is available.
- */
@Test
- public void testAvailabilityWithSubscription() throws Exception {
- int publisherId = getMockPublisherClient().getPublisherId(PAYLOAD);
- getMockPublisherClient().setLayersOffering(new VmsLayersOffering(
- new HashSet<>(Arrays.asList(
- new VmsLayerDependency(LAYER),
- new VmsLayerDependency(SUBSCRIBED_LAYER))),
+ public void testPublisherInfo_Registered() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ assertArrayEquals(PUBLISHER_INFO, mSubscriber.getPublisherInfo(publisherId));
+ }
+
+ @Test
+ public void testPublisherId_AlreadyRegistered() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO);
+ assertEquals(publisherId, publisherId2);
+ }
+
+ @Test
+ public void testPublisherId_MultiplePublishers() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+ assertNotEquals(publisherId, publisherId2);
+ assertArrayEquals(PUBLISHER_INFO, mSubscriber.getPublisherInfo(publisherId));
+ assertArrayEquals(PUBLISHER_INFO_OTHER, mSubscriber.getPublisherInfo(publisherId2));
+ }
+
+ @Test
+ public void testLayerAvailability_Default() {
+ VmsAvailableLayers availableLayers = mSubscriber.getAvailableLayers();
+ assertEquals(Collections.emptySet(), availableLayers.getAssociatedLayers());
+ assertEquals(0, availableLayers.getSequence());
+ }
+
+ @Test
+ public void testLayerAvailability() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+ new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
+
+ assertLayerAvailability(1,
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)));
+ }
+
+ @Test
+ public void testLayerAvailability_Overwrite() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+ new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
+ mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+ new VmsLayerDependency(SUBSCRIPTION_LAYER_OTHER, Collections.emptySet())),
publisherId));
- Set<VmsAssociatedLayer> associatedLayers =
- AVAILABLE_LAYERS_WITH_SUBSCRIBED_LAYER_WITH_SEQ.getAssociatedLayers();
- assertEquals(associatedLayers, receiveLayerAvailability().getAssociatedLayers());
- assertEquals(associatedLayers,
- getSubscriberManager().getAvailableLayers().getAssociatedLayers());
+ assertLayerAvailability(2,
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
+ Collections.singleton(publisherId)));
+ }
+
+ @Test
+ public void testLayerAvailability_MultiplePublishers_SameLayer() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+ mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+ new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
+ mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+ new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId2));
+
+ assertLayerAvailability(2,
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER,
+ new HashSet<>(Arrays.asList(publisherId, publisherId2))));
+ }
+
+ @Test
+ public void testLayerAvailability_MultiplePublishers_MultipleLayers() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+ mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+ new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
+ mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+ new VmsLayerDependency(SUBSCRIPTION_LAYER_OTHER, Collections.emptySet())),
+ publisherId2));
+
+ assertLayerAvailability(2,
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)),
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
+ Collections.singleton(publisherId2)));
+ }
+
+ @Test
+ public void testLayerAvailability_MultiplePublishers_Remove() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+ mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+ new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
+ mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+ new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId2));
+
+ mPublisher.setLayersOffering(new VmsLayersOffering(Collections.emptySet(), publisherId2));
+
+ assertLayerAvailability(3,
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)));
+ }
+
+ @Test
+ public void testLayerAvailability_MultiplePublishers_Overwrite() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+ mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+ new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
+ mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+ new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId2));
+
+ mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
+ new VmsLayerDependency(SUBSCRIPTION_LAYER_OTHER, Collections.emptySet())),
+ publisherId2));
+
+ assertLayerAvailability(3,
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)),
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
+ Collections.singleton(publisherId2)));
+ }
+
+ @Test
+ public void testStartMonitoring() {
+ mSubscriber.startMonitoring();
+ assertNull(mPublisher.receiveSubscriptionState());
+
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+ }
+
+ @Test
+ public void testStartMonitoring_AfterPublish() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+
+ mSubscriber.startMonitoring();
+ assertNull(mSubscriberClient.receiveMessage());
+ }
+
+ @Test
+ public void testStartMonitoring_MultipleLayers() {
+ mSubscriber.startMonitoring();
+
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+ mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId, PAYLOAD_OTHER);
+ assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
+ }
+
+ @Test
+ public void testStartMonitoring_MultiplePublishers() {
+ mSubscriber.startMonitoring();
+
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+ int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId2, PAYLOAD_OTHER);
+ assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD_OTHER);
+ }
+
+ @Test
+ public void testStopMonitoring() {
+ mSubscriber.startMonitoring();
+ mSubscriber.stopMonitoring();
+ assertNull(mPublisher.receiveSubscriptionState());
+
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertNull(mSubscriberClient.receiveMessage());
+ }
+
+ @Test
+ public void testSubscribe() {
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+ assertSubscriptionState(1, SUBSCRIPTION_LAYER);
+
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+ }
+
+ @Test
+ public void testSubscribe_AfterPublish() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+
+ assertSubscriptionState(1, SUBSCRIPTION_LAYER);
+ assertNull(mSubscriberClient.receiveMessage());
+ }
+
+ @Test
+ public void testSubscribe_MultipleLayers() {
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER);
+ assertSubscriptionState(2, SUBSCRIPTION_LAYER, SUBSCRIPTION_LAYER_OTHER);
+
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+ mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId, PAYLOAD_OTHER);
+ assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
+ }
+
+ @Test
+ public void testSubscribe_MultiplePublishers() {
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+ assertSubscriptionState(1, SUBSCRIPTION_LAYER);
+
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+ int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId2, PAYLOAD_OTHER);
+ assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD_OTHER);
+ }
+
+ @Test
+ public void testSubscribe_MultipleLayers_MultiplePublishers() {
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER);
+ assertSubscriptionState(2, SUBSCRIPTION_LAYER, SUBSCRIPTION_LAYER_OTHER);
+
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+ int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+ mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId2, PAYLOAD_OTHER);
+ assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
+ }
+
+ @Test
+ public void testSubscribe_ClearCallback() {
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+ mSubscriber.clearVmsSubscriberClientCallback();
+
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertNull(mSubscriberClient.receiveMessage());
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void testSubscribe_NoCallback() {
+ mSubscriber.clearVmsSubscriberClientCallback();
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+ }
+
+ @Test
+ public void testUnsubscribe() {
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+ mSubscriber.unsubscribe(SUBSCRIPTION_LAYER);
+ assertSubscriptionState(2, Collections.emptySet(), Collections.emptySet());
+
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertNull(mSubscriberClient.receiveMessage());
+ }
+
+ @Test
+ public void testUnsubscribe_MultipleLayers() {
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER);
+ mSubscriber.unsubscribe(SUBSCRIPTION_LAYER);
+ assertSubscriptionState(3, SUBSCRIPTION_LAYER_OTHER);
+
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertNull(mSubscriberClient.receiveMessage());
+
+ mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId, PAYLOAD_OTHER);
+ assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
+ }
+
+ @Test
+ public void testUnsubscribe_MultiplePublishers() {
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER);
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER);
+ mSubscriber.unsubscribe(SUBSCRIPTION_LAYER);
+ assertSubscriptionState(3, SUBSCRIPTION_LAYER_OTHER);
+
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertNull(mSubscriberClient.receiveMessage());
+
+ int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId2, PAYLOAD_OTHER);
+ assertNull(mSubscriberClient.receiveMessage());
+ }
+
+ @Test
+ public void testUnsubscribe_NotSubscribed() {
+ mSubscriber.unsubscribe(SUBSCRIPTION_LAYER);
+ assertNull(mPublisher.receiveSubscriptionState());
+
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertNull(mSubscriberClient.receiveMessage());
+ }
+
+ @Test
+ public void testSubscribeToPublisher() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+ assertSubscriptionState(1,
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)));
+
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+ }
+
+ @Test
+ public void testSubscribeToPublisher_AfterPublish() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+
+ assertSubscriptionState(1,
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)));
+
+ assertNull(mSubscriberClient.receiveMessage());
+ }
+
+ @Test
+ public void testSubscribeToPublisher_MultipleLayers() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER, publisherId);
+
+ assertSubscriptionState(2,
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)),
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
+ Collections.singleton(publisherId)));
+
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+ mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId, PAYLOAD_OTHER);
+ assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
+ }
+
+ @Test
+ public void testSubscribeToPublisher_MultiplePublishers() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+ assertSubscriptionState(1,
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)));
+
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId2, PAYLOAD_OTHER);
+ assertNull(mSubscriberClient.receiveMessage());
+ }
+
+ @Test
+ public void testSubscribeToPublisher_MultipleLayers_MultiplePublishers() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER, publisherId2);
+ assertSubscriptionState(2,
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)),
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
+ Collections.singleton(publisherId2)));
+
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
+
+ mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId2, PAYLOAD_OTHER);
+ assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
+ }
+
+ @Test
+ public void testSubscribeToPublisher_UnknownPublisher() {
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER, UNKNOWN_PUBLISHER);
+
+ assertSubscriptionState(1,
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER,
+ Collections.singleton(UNKNOWN_PUBLISHER)));
+ }
+
+ @Test
+ public void testSubscribeToPublisher_ClearCallback() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+ mSubscriber.clearVmsSubscriberClientCallback();
+
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertNull(mSubscriberClient.receiveMessage());
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void testSubscribeToPublisher_NoCallback() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+ mSubscriber.clearVmsSubscriberClientCallback();
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+ }
+
+ @Test
+ public void testUnsubscribeToPublisher() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+ mSubscriber.unsubscribe(SUBSCRIPTION_LAYER, publisherId);
+ assertSubscriptionState(2, Collections.emptySet(), Collections.emptySet());
+
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertNull(mSubscriberClient.receiveMessage());
+ }
+
+ @Test
+ public void testUnsubscribeToPublisher_MultipleLayers() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER, publisherId);
+ mSubscriber.unsubscribe(SUBSCRIPTION_LAYER, publisherId);
+ assertSubscriptionState(3,
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
+ Collections.singleton(publisherId)));
+
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertNull(mSubscriberClient.receiveMessage());
+
+ mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId, PAYLOAD_OTHER);
+ assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
+ }
+
+ @Test
+ public void testUnsubscribeToPublisher_MultiplePublishers() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+ int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
+
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
+ mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId2);
+ mSubscriber.unsubscribe(SUBSCRIPTION_LAYER, publisherId);
+ assertSubscriptionState(3,
+ new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId2)));
+
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertNull(mSubscriberClient.receiveMessage());
+
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId2, PAYLOAD_OTHER);
+ assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD_OTHER);
+ }
+
+ @Test
+ public void testUnsubscribeToPublisher_NotSubscribed() {
+ int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
+
+ mSubscriber.unsubscribe(SUBSCRIPTION_LAYER, publisherId);
+ assertNull(mPublisher.receiveSubscriptionState());
+
+ mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
+ assertNull(mSubscriberClient.receiveMessage());
+ }
+
+ @Test
+ public void testUnsubscribeToPublisher_UnknownPublisher() {
+ mSubscriber.unsubscribe(SUBSCRIPTION_LAYER, UNKNOWN_PUBLISHER);
+ assertNull(mPublisher.receiveSubscriptionState());
+ }
+
+ private void assertLayerAvailability(int sequenceNumber,
+ VmsAssociatedLayer... associatedLayers) {
+ VmsAvailableLayers availableLayers = receiveWithSequence(
+ getMockSubscriberClient()::receiveLayerAvailability,
+ VmsAvailableLayers::getSequence,
+ sequenceNumber);
+ assertEquals(availableLayers, mSubscriber.getAvailableLayers());
+ assertEquals(new HashSet<>(Arrays.asList(associatedLayers)),
+ availableLayers.getAssociatedLayers());
+ }
+
+ private void assertSubscriptionState(int sequenceNumber, VmsLayer... layers) {
+ assertSubscriptionState(sequenceNumber, new HashSet<>(Arrays.asList(layers)),
+ Collections.emptySet());
+ }
+
+ private void assertSubscriptionState(int sequenceNumber,
+ VmsAssociatedLayer... associatedLayers) {
+ assertSubscriptionState(sequenceNumber, Collections.emptySet(),
+ new HashSet<>(Arrays.asList(associatedLayers)));
+ }
+
+ private void assertSubscriptionState(int sequenceNumber, Set<VmsLayer> layers,
+ Set<VmsAssociatedLayer> associatedLayers) {
+ VmsSubscriptionState subscriptionState = receiveWithSequence(
+ mPublisher::receiveSubscriptionState,
+ VmsSubscriptionState::getSequenceNumber,
+ sequenceNumber);
+ assertEquals(layers, subscriptionState.getLayers());
+ assertEquals(associatedLayers, subscriptionState.getAssociatedLayers());
+ }
+
+ private static <T> T receiveWithSequence(Supplier<T> supplierFunction,
+ ToIntFunction<T> sequenceNumberFn, int sequenceNumber) {
+ T obj = null;
+ for (int seq = 1; seq <= sequenceNumber; seq++) {
+ obj = supplierFunction.get();
+ assertNotNull(obj);
+ assertEquals(seq, sequenceNumberFn.applyAsInt(obj));
+ }
+ return obj;
+ }
+
+ private void assertDataMessage(VmsLayer layer, byte[] payload) {
+ Pair<VmsLayer, byte[]> message = mSubscriberClient.receiveMessage();
+ assertEquals(layer, message.first);
+ assertArrayEquals(payload, message.second);
}
}