Merge "Delete the location cache after SUSPEND_EXIT." into qt-dev
diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..fc4eb1b
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,13 @@
+BasedOnStyle: Google
+AllowShortBlocksOnASingleLine: false
+AllowShortFunctionsOnASingleLine: false
+
+AccessModifierOffset: -2
+ColumnLimit: 100
+CommentPragmas: NOLINT:.*
+DerivePointerAlignment: false
+IndentWidth: 4
+PointerAlignment: Left
+TabWidth: 4
+UseTab: Never
+PenaltyExcessCharacter: 32
diff --git a/FrameworkPackageStubs/AndroidManifest.xml b/FrameworkPackageStubs/AndroidManifest.xml
index 1cfd7de..89ea2b0 100644
--- a/FrameworkPackageStubs/AndroidManifest.xml
+++ b/FrameworkPackageStubs/AndroidManifest.xml
@@ -74,6 +74,11 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter android:priority="-1">
+ <action android:name="android.settings.PROCESS_WIFI_EASY_CONNECT_URI" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="DPP"/>
+ </intent-filter>
+ <intent-filter android:priority="-1">
<action android:name="android.settings.USER_DICTIONARY_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..d935103
--- /dev/null
+++ b/README.md
@@ -0,0 +1,9 @@
+Native (C++) code format is required to be compatible with .clang-format file. Run
+
+```
+git clang-format --style=file --extension='h,cpp,cc' HEAD~
+```
+
+Note that clang-format is *not* desirable for Android java files. Therefore
+the command line above is limited to specific extensions.
+
diff --git a/car-bugreportd/Android.bp b/car-bugreportd/Android.bp
new file mode 100644
index 0000000..e026d0b
--- /dev/null
+++ b/car-bugreportd/Android.bp
@@ -0,0 +1,35 @@
+//
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+cc_binary {
+ name: "car-bugreportd",
+ init_rc: ["car-bugreportd.rc"],
+ srcs: [
+ "main.cpp",
+ ],
+ cflags: [
+ "-Werror",
+ "-Wall",
+ ],
+ cppflags: [
+ "-Wno-unused-parameter",
+ ],
+ shared_libs: [
+ "libbase",
+ "liblog",
+ "libcutils",
+ ],
+}
diff --git a/car-bugreportd/car-bugreportd.rc b/car-bugreportd/car-bugreportd.rc
new file mode 100644
index 0000000..4c405e1
--- /dev/null
+++ b/car-bugreportd/car-bugreportd.rc
@@ -0,0 +1,17 @@
+service car-bugreportd /system/bin/car-bugreportd
+ socket car_br_progress_socket stream 0660 shell log
+ socket car_br_output_socket stream 0660 shell log
+ class core
+ user shell
+ group log
+ disabled
+ oneshot
+
+# car-dumpstatez generates a zipped bugreport but also uses a socket to print the file location once
+# it is finished.
+service car-dumpstatez /system/bin/dumpstate -S -d -z \
+ -o /data/user_de/0/com.android.shell/files/bugreports/bugreport
+ socket dumpstate stream 0660 shell log
+ class main
+ disabled
+ oneshot
\ No newline at end of file
diff --git a/car-bugreportd/main.cpp b/car-bugreportd/main.cpp
new file mode 100644
index 0000000..055d35a
--- /dev/null
+++ b/car-bugreportd/main.cpp
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "car-bugreportd"
+
+#include <android-base/errors.h>
+#include <android-base/file.h>
+#include <android-base/logging.h>
+#include <android-base/macros.h>
+#include <android-base/properties.h>
+#include <android-base/stringprintf.h>
+#include <android-base/strings.h>
+#include <android-base/unique_fd.h>
+#include <cutils/sockets.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <log/log_main.h>
+#include <private/android_filesystem_config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <time.h>
+#include <unistd.h>
+
+#include <chrono>
+#include <string>
+#include <vector>
+
+namespace {
+// Socket to write the progress information.
+constexpr const char* kCarBrProgressSocket = "car_br_progress_socket";
+// Socket to write the zipped bugreport file.
+constexpr const char* kCarBrOutputSocket = "car_br_output_socket";
+// The prefix used by bugreportz protocol to indicate bugreport finished successfully.
+constexpr const char* kOkPrefix = "OK:";
+// Number of connect attempts to dumpstate socket
+constexpr const int kMaxDumpstateConnectAttempts = 20;
+// Wait time between connect attempts
+constexpr const int kWaitTimeBetweenConnectAttemptsInSec = 1;
+// Wait time for dumpstate. No timeout in dumpstate is longer than 60 seconds. Choose
+// a value that is twice longer.
+constexpr const int kDumpstateTimeoutInSec = 120;
+
+// Returns a valid socket descriptor or -1 on failure.
+int openSocket(const char* service) {
+ int s = android_get_control_socket(service);
+ if (s < 0) {
+ ALOGE("android_get_control_socket(%s): %s", service, strerror(errno));
+ return -1;
+ }
+ fcntl(s, F_SETFD, FD_CLOEXEC);
+ if (listen(s, 4) < 0) {
+ ALOGE("listen(control socket): %s", strerror(errno));
+ return -1;
+ }
+
+ struct sockaddr addr;
+ socklen_t alen = sizeof(addr);
+ int fd = accept(s, &addr, &alen);
+ if (fd < 0) {
+ ALOGE("accept(control socket): %s", strerror(errno));
+ return -1;
+ }
+ return fd;
+}
+
+// Processes the given dumpstate progress protocol |line| and updates
+// |out_last_nonempty_line| when |line| is non-empty, and |out_zip_path| when
+// the bugreport is finished.
+void processLine(const std::string& line, std::string* out_zip_path,
+ std::string* out_last_nonempty_line) {
+ // The protocol is documented in frameworks/native/cmds/bugreportz/readme.md
+ if (line.empty()) {
+ return;
+ }
+ *out_last_nonempty_line = line;
+ if (line.find(kOkPrefix) != 0) {
+ return;
+ }
+ *out_zip_path = line.substr(strlen(kOkPrefix));
+ return;
+}
+
+int copyTo(int fd_in, int fd_out, void* buffer, size_t buffer_len) {
+ ssize_t bytes_read = TEMP_FAILURE_RETRY(read(fd_in, buffer, buffer_len));
+ if (bytes_read == 0) {
+ return 0;
+ }
+ if (bytes_read == -1) {
+ // EAGAIN really means time out, so make that clear.
+ if (errno == EAGAIN) {
+ ALOGE("read timed out");
+ } else {
+ ALOGE("read terminated abnormally (%s)", strerror(errno));
+ }
+ return -1;
+ }
+ // copy all bytes to the output socket
+ if (!android::base::WriteFully(fd_out, buffer, bytes_read)) {
+ ALOGE("write failed");
+ return -1;
+ }
+ return bytes_read;
+}
+
+bool copyFile(const std::string& zip_path, int output_socket) {
+ android::base::unique_fd fd(TEMP_FAILURE_RETRY(open(zip_path.c_str(), O_RDONLY)));
+ if (fd == -1) {
+ return false;
+ }
+ while (1) {
+ char buffer[65536];
+ int bytes_copied = copyTo(fd, output_socket, buffer, sizeof(buffer));
+ if (bytes_copied == 0) {
+ break;
+ }
+ if (bytes_copied == -1) {
+ return false;
+ }
+ }
+ return true;
+}
+
+// Triggers a bugreport and waits until it is all collected.
+// returns false if error, true if success
+bool doBugreport(int progress_socket, size_t* out_bytes_written, std::string* zip_path) {
+ // Socket will not be available until service starts.
+ android::base::unique_fd s;
+ for (int i = 0; i < kMaxDumpstateConnectAttempts; i++) {
+ s.reset(socket_local_client("dumpstate", ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM));
+ if (s != -1) break;
+ sleep(kWaitTimeBetweenConnectAttemptsInSec);
+ }
+
+ if (s == -1) {
+ ALOGE("failed to connect to dumpstatez service");
+ return false;
+ }
+
+ // Set a timeout so that if nothing is read by the timeout, stop reading and quit
+ struct timeval tv = {
+ .tv_sec = kDumpstateTimeoutInSec,
+ .tv_usec = 0,
+ };
+ if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) != 0) {
+ ALOGW("Cannot set socket timeout (%s)", strerror(errno));
+ }
+
+ std::string line;
+ std::string last_nonempty_line;
+ while (true) {
+ char buffer[65536];
+ ssize_t bytes_read = copyTo(s, progress_socket, buffer, sizeof(buffer));
+ if (bytes_read == 0) {
+ break;
+ }
+ if (bytes_read == -1) {
+ return false;
+ }
+ // Process the buffer line by line. this is needed for the filename.
+ for (int i = 0; i < bytes_read; i++) {
+ char c = buffer[i];
+ if (c == '\n') {
+ processLine(line, zip_path, &last_nonempty_line);
+ line.clear();
+ } else {
+ line.append(1, c);
+ }
+ }
+ }
+ s.reset();
+ // Process final line, in case it didn't finish with newline.
+ processLine(line, zip_path, &last_nonempty_line);
+ // if doBugReport finished successfully, zip path should be set.
+ if (zip_path->empty()) {
+ ALOGE("no zip file path was found in bugreportz progress data");
+ return false;
+ }
+ return true;
+}
+
+// Removes bugreport
+void cleanupBugreportFile(const std::string& zip_path) {
+ if (unlink(zip_path.c_str()) != 0) {
+ ALOGE("Could not unlink %s (%s)", zip_path.c_str(), strerror(errno));
+ }
+}
+
+} // namespace
+
+int main(void) {
+ ALOGE("Starting bugreport collecting service");
+
+ auto t0 = std::chrono::steady_clock::now();
+
+ // Start the dumpstatez service.
+ android::base::SetProperty("ctl.start", "car-dumpstatez");
+
+ size_t bytes_written = 0;
+
+ std::string zip_path;
+ int progress_socket = openSocket(kCarBrProgressSocket);
+ if (progress_socket < 0) {
+ // early out. in this case we will not print the final message, but that is ok.
+ android::base::SetProperty("ctl.stop", "car-dumpstatez");
+ return EXIT_FAILURE;
+ }
+ bool ret_val = doBugreport(progress_socket, &bytes_written, &zip_path);
+ close(progress_socket);
+
+ int output_socket = openSocket(kCarBrOutputSocket);
+ if (output_socket != -1 && ret_val) {
+ ret_val = copyFile(zip_path, output_socket);
+ }
+ if (output_socket != -1) {
+ close(output_socket);
+ }
+
+ auto delta = std::chrono::duration_cast<std::chrono::duration<double>>(
+ std::chrono::steady_clock::now() - t0)
+ .count();
+
+ std::string result = ret_val ? "success" : "failed";
+ ALOGI("bugreport %s in %.02fs, %zu bytes written", result.c_str(), delta, bytes_written);
+ cleanupBugreportFile(zip_path);
+
+ // No matter how doBugreport() finished, let's try to explicitly stop
+ // car-dumpstatez in case it stalled.
+ android::base::SetProperty("ctl.stop", "car-dumpstatez");
+
+ return ret_val ? EXIT_SUCCESS : EXIT_FAILURE;
+}
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-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-lib/src/android/car/CarBugreportManager.java b/car-lib/src/android/car/CarBugreportManager.java
index 07e9c5d..398e208 100644
--- a/car-lib/src/android/car/CarBugreportManager.java
+++ b/car-lib/src/android/car/CarBugreportManager.java
@@ -141,9 +141,11 @@
/**
* Request a bug report. An old style flat bugreport is generated in the background.
* The fd is closed when bugreport is written or if an exception happens.
+ * This API will be removed once the clients move the new API.
*
* @param fd the dump file
* @param callback the callback for reporting dump status
+ * @deprecated use requestZippedbugreport instead.
*/
@RequiresPermission(android.Manifest.permission.DUMP)
public void requestBugreport(@NonNull ParcelFileDescriptor fd,
@@ -161,6 +163,36 @@
}
}
+ /**
+ * Request a bug report. An zipped bugreport is generated in the background.
+ * The file descriptors are closed when bugreport is written or if an exception happens.
+ * The progress protocol is described
+ * <a href="https://android.googlesource.com/platform/frameworks/native/+/master/cmds/bugreportz/readme.md">
+ * here</a>
+ *
+ * @param output the zipped bugreport file
+ * @param progress the progress information that includes failure/success status.
+ * @param callback the callback for reporting dump status
+ */
+ @RequiresPermission(android.Manifest.permission.DUMP)
+ public void requestZippedBugreport(@NonNull ParcelFileDescriptor output,
+ @NonNull ParcelFileDescriptor progress,
+ @NonNull CarBugreportManagerCallback callback) {
+ Preconditions.checkNotNull(output);
+ Preconditions.checkNotNull(progress);
+ Preconditions.checkNotNull(callback);
+ try {
+ CarBugreportManagerCallbackWrapper wrapper =
+ new CarBugreportManagerCallbackWrapper(callback, mHandler);
+ mService.requestZippedBugreport(output, progress, wrapper);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ } finally {
+ IoUtils.closeQuietly(output);
+ IoUtils.closeQuietly(progress);
+ }
+ }
+
@Override
public void onCarDisconnected() {
}
diff --git a/car-lib/src/android/car/ICarBugreportService.aidl b/car-lib/src/android/car/ICarBugreportService.aidl
index 9f20081..709cc2b 100644
--- a/car-lib/src/android/car/ICarBugreportService.aidl
+++ b/car-lib/src/android/car/ICarBugreportService.aidl
@@ -26,7 +26,23 @@
interface ICarBugreportService {
/**
- * Starts bugreport service to capture a bugreport
+ * Starts bugreport service to capture a bugreport.
+ * This method will be removed once all the clients transition to the new API.
+ * @deprecated
*/
void requestBugreport(in ParcelFileDescriptor pfd, ICarBugreportCallback callback) = 1;
- }
\ No newline at end of file
+
+ /**
+ * Starts bugreport service to capture a zipped bugreport. The caller needs to provide
+ * two file descriptors. The "output" file descriptor will be used to provide the actual
+ * zip file and the "progress" descriptor will be used to provide the progress information.
+ * Both of these descriptors are written by the service and will be read by the client.
+ *
+ * The progress protocol is described
+ * <a href="https://android.googlesource.com/platform/frameworks/native/+/master/cmds/bugreportz/readme.md">
+ * here</a>
+ */
+ void requestZippedBugreport(in ParcelFileDescriptor output, in ParcelFileDescriptor progress,
+ ICarBugreportCallback callback) = 2;
+ }
+
diff --git a/car-lib/src/android/car/media/CarAudioManager.java b/car-lib/src/android/car/media/CarAudioManager.java
index 6c2e1cd..c3338a9 100644
--- a/car-lib/src/android/car/media/CarAudioManager.java
+++ b/car-lib/src/android/car/media/CarAudioManager.java
@@ -412,6 +412,71 @@
}
/**
+ * Gets the audio zones currently available
+ *
+ * @return audio zone ids
+ * @hide
+ */
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS)
+ public @NonNull int[] getAudioZoneIds() {
+ try {
+ return mService.getAudioZoneIds();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Gets the audio zone id currently mapped to uId,
+ * defaults to PRIMARY_AUDIO_ZONE if no mapping exist
+ *
+ * @param uid The uid to map
+ * @return zone id mapped to uid
+ * @hide
+ */
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS)
+ public int getZoneIdForUid(int uid) {
+ try {
+ return mService.getZoneIdForUid(uid);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Maps the audio zone id to uid
+ *
+ * @param zoneId The audio zone id
+ * @param uid The uid to map
+ * @return true if the uid is successfully mapped
+ * @hide
+ */
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS)
+ public boolean setZoneIdForUid(int zoneId, int uid) {
+ try {
+ return mService.setZoneIdForUid(zoneId, uid);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Clears the current zone mapping of the uid
+ *
+ * @param uid The uid to clear
+ * @return true if the zone was successfully cleared
+ * @hide
+ */
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS)
+ public boolean clearZoneIdForUid(int uid) {
+ try {
+ return mService.clearZoneIdForUid(uid);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Gets array of {@link AudioAttributes} usages for a volume group in a zone.
*
* @param zoneId The zone id whose volume group is queried.
diff --git a/car-lib/src/android/car/media/ICarAudio.aidl b/car-lib/src/android/car/media/ICarAudio.aidl
index 178f75a..a2f33ad 100644
--- a/car-lib/src/android/car/media/ICarAudio.aidl
+++ b/car-lib/src/android/car/media/ICarAudio.aidl
@@ -43,6 +43,11 @@
int getVolumeGroupIdForUsage(int zoneId, int usage);
int[] getUsagesForVolumeGroupId(int zoneId, int groupId);
+ int[] getAudioZoneIds();
+ int getZoneIdForUid(int uid);
+ boolean setZoneIdForUid(int zoneId, int uid);
+ boolean clearZoneIdForUid(int uid);
+
/**
* IBinder is ICarVolumeCallback but passed as IBinder due to aidl hidden.
*/
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/car_product/build/car_base.mk b/car_product/build/car_base.mk
index 385a2ea..5132890 100644
--- a/car_product/build/car_base.mk
+++ b/car_product/build/car_base.mk
@@ -53,7 +53,8 @@
libwebrtc_audio_preprocessing \
wifi-service \
A2dpSinkService \
- PackageInstaller
+ PackageInstaller \
+ car-bugreportd \
# EVS resources
PRODUCT_PACKAGES += android.automotive.evs.manager@1.0
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-night/colors_device_defaults.xml b/car_product/overlay/frameworks/base/core/res/res/values-night/colors_device_defaults.xml
new file mode 100644
index 0000000..f062f1f
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-night/colors_device_defaults.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2019, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES 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="background_floating_device_default_dark">@*android:color/car_grey_900</color>
+ <color name="background_floating_device_default_light">@*android:color/car_grey_900</color>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/colors_device_defaults.xml b/car_product/overlay/frameworks/base/core/res/res/values/colors_device_defaults.xml
index 2cd2d1f..7e2c329 100644
--- a/car_product/overlay/frameworks/base/core/res/res/values/colors_device_defaults.xml
+++ b/car_product/overlay/frameworks/base/core/res/res/values/colors_device_defaults.xml
@@ -42,8 +42,8 @@
<color name="background_device_default_dark">@*android:color/car_background</color>
<color name="background_device_default_light">@*android:color/car_background</color>
- <color name="background_floating_device_default_dark">@*android:color/car_colorSecondary</color>
- <color name="background_floating_device_default_light">@*android:color/car_colorSecondary</color>
+ <color name="background_floating_device_default_dark">@*android:color/car_grey_868</color>
+ <color name="background_floating_device_default_light">@*android:color/car_grey_868</color>
<color name="error_color_device_default_dark">@*android:color/car_red_a700</color>
<color name="error_color_device_default_light">@*android:color/car_red_a700</color>
diff --git a/car_product/sepolicy/private/carservice_app.te b/car_product/sepolicy/private/carservice_app.te
index 3c72a79..4f8315a 100644
--- a/car_product/sepolicy/private/carservice_app.te
+++ b/car_product/sepolicy/private/carservice_app.te
@@ -3,6 +3,7 @@
# Allow Car Service to be the client of Vehicle and Audio Control HALs
hal_client_domain(carservice_app, hal_audiocontrol)
+hal_client_domain(carservice_app, hal_health)
hal_client_domain(carservice_app, hal_vehicle)
# Allow to set boot.car_service_created property
@@ -11,6 +12,8 @@
# Allow Car Service to register itself with ServiceManager
allow carservice_app carservice_service:service_manager add;
+allow carservice_app wifi_service:service_manager find;
+
# Allow Car Service to access certain system services.
# Keep alphabetically sorted.
allow carservice_app {
@@ -46,6 +49,8 @@
allow carservice_app system_car_data_file:dir create_dir_perms;
allow carservice_app system_car_data_file:{ file lnk_file } create_file_perms;
+allow carservice_app cgroup:file rw_file_perms;
+
# For I/O stats tracker
allow carservice_app proc_uid_io_stats:file { read open getattr };
@@ -54,8 +59,5 @@
# To access /sys/fs/<type>/<partition>/lifetime_write_kbytes
allow carservice_app sysfs_fs_lifetime_write:file { getattr open read };
-# For allowing dumpstate to be called by CarBugreportManagerService only in userdebug or eng builds.
-userdebug_or_eng(`
set_prop(carservice_app, ctl_start_prop)
unix_socket_connect(carservice_app, dumpstate, dumpstate)
-')
\ No newline at end of file
diff --git a/car_product/sepolicy/private/dumpstate.te b/car_product/sepolicy/private/dumpstate.te
new file mode 100644
index 0000000..24a0208
--- /dev/null
+++ b/car_product/sepolicy/private/dumpstate.te
@@ -0,0 +1,3 @@
+set_prop(dumpstate, ctl_start_prop)
+set_prop(dumpstate, ctl_stop_prop)
+allow dumpstate dumpstate_socket:sock_file write;
\ No newline at end of file
diff --git a/car_product/sepolicy/private/file_contexts b/car_product/sepolicy/private/file_contexts
index b8f62fa..908c853 100644
--- a/car_product/sepolicy/private/file_contexts
+++ b/car_product/sepolicy/private/file_contexts
@@ -2,3 +2,7 @@
/data/system/car(/.*)? u:object_r:system_car_data_file:s0
+
+/system/bin/car-bugreportd u:object_r:dumpstate_exec:s0
+/dev/socket/car_br_progress_socket u:object_r:dumpstate_socket:s0
+/dev/socket/car_br_output_socket u:object_r:dumpstate_socket:s0
diff --git a/car_product/sepolicy/private/system_app.te b/car_product/sepolicy/private/system_app.te
new file mode 100644
index 0000000..232b117
--- /dev/null
+++ b/car_product/sepolicy/private/system_app.te
@@ -0,0 +1 @@
+hal_client_domain(system_app, hal_vehicle)
diff --git a/car_product/sepolicy/private/system_server.te b/car_product/sepolicy/private/system_server.te
index 44a11c5..2743021 100644
--- a/car_product/sepolicy/private/system_server.te
+++ b/car_product/sepolicy/private/system_server.te
@@ -1,3 +1,4 @@
# Car service in system server can read bootuser device id property
get_prop(system_server, car_bootuser_prop)
+allow system_server carservice_service:service_manager find;
diff --git a/evs/sepolicy/evs_app.te b/evs/sepolicy/evs_app.te
index b5e3c95..8c036b3 100644
--- a/evs/sepolicy/evs_app.te
+++ b/evs/sepolicy/evs_app.te
@@ -6,11 +6,11 @@
hal_client_domain(evs_app, hal_graphics_allocator)
# allow init to launch processes in this context
-type evs_app_exec, exec_type, file_type;
+type evs_app_exec, exec_type, file_type, system_file_type;
init_daemon_domain(evs_app)
# gets access to its own files on disk
-type evs_app_files, file_type;
+type evs_app_files, file_type, system_file_type;
allow evs_app evs_app_files:file { getattr open read };
allow evs_app evs_app_files:dir search;
diff --git a/evs/sepolicy/evs_driver.te b/evs/sepolicy/evs_driver.te
index 3d5263e..f1f31e9 100644
--- a/evs/sepolicy/evs_driver.te
+++ b/evs/sepolicy/evs_driver.te
@@ -1,9 +1,10 @@
# evs_mock mock hardware driver service
type hal_evs_driver, domain, coredomain;
hal_server_domain(hal_evs_driver, hal_evs)
+hal_client_domain(hal_evs_driver, hal_evs)
# allow init to launch processes in this context
-type hal_evs_driver_exec, exec_type, file_type;
+type hal_evs_driver_exec, exec_type, file_type, system_file_type;
init_daemon_domain(hal_evs_driver)
binder_use(hal_evs_driver)
diff --git a/evs/sepolicy/evs_manager.te b/evs/sepolicy/evs_manager.te
index 58ea6aa..51acac1 100644
--- a/evs/sepolicy/evs_manager.te
+++ b/evs/sepolicy/evs_manager.te
@@ -2,10 +2,9 @@
type evs_manager, domain, coredomain;
hal_server_domain(evs_manager, hal_evs)
hal_client_domain(evs_manager, hal_evs)
-add_hwservice(hal_evs, hal_evs_hwservice)
# allow init to launch processes in this context
-type evs_manager_exec, exec_type, file_type;
+type evs_manager_exec, exec_type, file_type, system_file_type;
init_daemon_domain(evs_manager)
# allow use of hwservices
diff --git a/service/AndroidManifest.xml b/service/AndroidManifest.xml
index 3e50805..25b2cfe 100644
--- a/service/AndroidManifest.xml
+++ b/service/AndroidManifest.xml
@@ -496,6 +496,7 @@
<uses-permission android:name="android.permission.LOCATION_HARDWARE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.PROVIDE_TRUST_AGENT" />
+ <uses-permission android:name="android.permission.READ_LOGS" />
<application android:label="@string/app_title"
android:directBootAware="true"
diff --git a/service/res/values-af/config.xml b/service/res/values-af/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-af/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-af/strings.xml b/service/res/values-af/strings.xml
index d5b6dbd..8da32cf 100644
--- a/service/res/values-af/strings.xml
+++ b/service/res/values-af/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Vir jou veiligheid is dié aktiwiteit nie beskikbaar terwyl jy bestuur nie.\nWag totdat jy geparkeer het om voort te gaan."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Kies <xliff:g id="EXIT_BUTTON">%s</xliff:g> om oor te begin met veilige programkenmerke."</string>
<string name="exit_button" msgid="5829638404777671253">"Terug"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Ontfoutin."</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"lees diagnostiese data"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Lees diagnostiese data van die motor af."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"vee diagnostiese data uit"</string>
diff --git a/service/res/values-am/config.xml b/service/res/values-am/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-am/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-am/strings.xml b/service/res/values-am/strings.xml
index 3b5594c..41b7622 100644
--- a/service/res/values-am/strings.xml
+++ b/service/res/values-am/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"ለእርስዎ ደህንነት ሲባል፣ ይህ እንቅስቃሴ እርስዎ በሚነዱበት ጊዜ አይገኝም። \nለመቀጠል እንዲችሉ፣ መኪናዎ እስከሚቆም ድረስ ይጠብቁ።"</string>
<string name="exit_button_message" msgid="8554690915924055685">"ከደህንነት አስተማማኝ የሆኑ የመተግበሪያ ባህሪያት ጋር መልሶ ለመጀመር፣ <xliff:g id="EXIT_BUTTON">%s</xliff:g>ን ይምረጡ።"</string>
<string name="exit_button" msgid="5829638404777671253">"ተመለስ"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"የአርም መረጃ"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"የምርመራ ውሂብን አንብብ"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"ከመኪናው ላይ የምርመራ ውሂብን ያንብቡ።"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"የምርመራ ውሂብን አጽዳ"</string>
diff --git a/service/res/values-ar/config.xml b/service/res/values-ar/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-ar/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-ar/strings.xml b/service/res/values-ar/strings.xml
index 288e0bb..d9b7040 100644
--- a/service/res/values-ar/strings.xml
+++ b/service/res/values-ar/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"حرصًا على سلامتك، لا يتوفّر هذا النشاط أثناء القيادة.\nللمتابعة، يمكنك الانتظار حتى تتوقّف السيارة."</string>
<string name="exit_button_message" msgid="8554690915924055685">"للبدء من جديد باستخدام ميزات تطبيق آمنة، اختَر <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"رجوع"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"التصحيح"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"قراءة البيانات التشخيصية"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"يمكنك قراءة البيانات التشخيصية من السيارة."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"محو البيانات التشخيصية"</string>
diff --git a/service/res/values-as/config.xml b/service/res/values-as/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-as/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-as/strings.xml b/service/res/values-as/strings.xml
index d40ec8f..0cac303 100644
--- a/service/res/values-as/strings.xml
+++ b/service/res/values-as/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"আপোনাৰ নিৰাপত্তাৰ বাবে এই কাৰ্যকলাপটো গাড়ী চলাই থকা সময়ত কৰিব নোৱাৰি।\nগাড়ীখন পাৰ্ক কৰি কামটো কৰক।"</string>
<string name="exit_button_message" msgid="8554690915924055685">"সুৰক্ষিত এপ্ সুবিধাসহ আকৌ আৰম্ভ কৰিবলৈ <xliff:g id="EXIT_BUTTON">%s</xliff:g> বাছনি কৰক।"</string>
<string name="exit_button" msgid="5829638404777671253">"উভতি যাওক"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"ডিবাগ তথ্য"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"ডায়গন’ষ্টিক ডেটা পঢ়িব"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"গাড়ীৰ ডায়গ’ষ্টিক তথ্য পঢ়িব।"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"ডায়গন’ষ্টিক ডেটা মচিব"</string>
diff --git a/service/res/values-az/config.xml b/service/res/values-az/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-az/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-az/strings.xml b/service/res/values-az/strings.xml
index 50f8279..5cdfa3d 100644
--- a/service/res/values-az/strings.xml
+++ b/service/res/values-az/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Təhlükəsizliyiniz üçün bu əməliyyat sürüş zamanı əlçatan deyil.\nDavam etmək üçün park edənədək gözləyin."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Təhlükəsiz tətbiq xüsusiyyətləri ilə başlamaq üçün <xliff:g id="EXIT_BUTTON">%s</xliff:g> seçin."</string>
<string name="exit_button" msgid="5829638404777671253">"Geri"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debaq məlumatı"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"diaqnoztika məlumatlarını oxumaq"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Avtomobilin diaqnoztika məlumatlarını oxumaq."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"diaqnoztika məlumatlarını silmək"</string>
diff --git a/service/res/values-b+sr+Latn/config.xml b/service/res/values-b+sr+Latn/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-b+sr+Latn/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-b+sr+Latn/strings.xml b/service/res/values-b+sr+Latn/strings.xml
index 1f23ce7..e0da81d 100644
--- a/service/res/values-b+sr+Latn/strings.xml
+++ b/service/res/values-b+sr+Latn/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Ova aktivnost nije dostupna dok vozite radi vaše bezbednosti.\nDa biste nastavili, prvo se parkirajte."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Da biste ponovo počeli sa bezbednim funkcijama aplikacije, izaberite <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Nazad"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"čitanje dijagnostičkih podataka"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Čitanje dijagnostičkih podataka iz automobila."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"brisanje dijagnostičkih podataka"</string>
diff --git a/service/res/values-be/config.xml b/service/res/values-be/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-be/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-be/strings.xml b/service/res/values-be/strings.xml
index 6174588..b5d46ae 100644
--- a/service/res/values-be/strings.xml
+++ b/service/res/values-be/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Дзеля вашай бяспекі гэта дзеянне недаступнае, калі вы за рулём.\nСпачатку прыпаркуйцеся."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Каб перазапусціць праграму ў бяспечным рэжыме, націсніце кнопку \"<xliff:g id="EXIT_BUTTON">%s</xliff:g>\"."</string>
<string name="exit_button" msgid="5829638404777671253">"Назад"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"атрымліваць даныя дыягностыкі"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Счытванне дыягнастычных даных аўтамабіля"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"ачысціць даныя дыягностыкі"</string>
diff --git a/service/res/values-bg/config.xml b/service/res/values-bg/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-bg/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-bg/strings.xml b/service/res/values-bg/strings.xml
index fd36d20..d5c1fa4 100644
--- a/service/res/values-bg/strings.xml
+++ b/service/res/values-bg/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"От съображения за безопасност тази функция не е достъпна при шофиране.\nЗа да продължите, трябва първо да паркирате."</string>
<string name="exit_button_message" msgid="8554690915924055685">"За да рестартирате приложението и безопасните му функции, изберете „<xliff:g id="EXIT_BUTTON">%s</xliff:g>“."</string>
<string name="exit_button" msgid="5829638404777671253">"Назад"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"четене на диагностични данни"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Четене на диагностични данни от автомобила."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"изчистване на диагностичните данни"</string>
diff --git a/service/res/values-bn/config.xml b/service/res/values-bn/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-bn/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-bn/strings.xml b/service/res/values-bn/strings.xml
index 0b03a73..3b5957b 100644
--- a/service/res/values-bn/strings.xml
+++ b/service/res/values-bn/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"আপনার সুরক্ষার জন্য, ড্রাইভ করার সময় এটি করা যাবে না।\nচালিয়ে যেতে, গাড়ি পার্ক করা পর্যন্ত অপেক্ষা করুন।"</string>
<string name="exit_button_message" msgid="8554690915924055685">"অ্যাপের সুরক্ষিত ফিচারগুলি নিয়ে আবার শুরু করতে, <xliff:g id="EXIT_BUTTON">%s</xliff:g> বেছে নিন।"</string>
<string name="exit_button" msgid="5829638404777671253">"আবার চালু করুন"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"ডিবাগ তথ্য"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"ডায়াগনস্টিক ডেটা দেখা"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"গাড়ির ডায়াগনস্টিক সংক্রান্ত ডেটা দেখা।"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"ডায়াগনস্টিকস ডেটা সরানো"</string>
diff --git a/service/res/values-bs/config.xml b/service/res/values-bs/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-bs/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-bs/strings.xml b/service/res/values-bs/strings.xml
index 2d69ac0..5770adf 100644
--- a/service/res/values-bs/strings.xml
+++ b/service/res/values-bs/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Radi vaše sigurnosti, ova aktivnost nije dostupna tokom vožnje.\nDa nastavite, sačekajte da se zaustavite."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Da počnete ponovo s funkcijama sigurne aplikacije, odaberite <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Nazad"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"očitati dijagnostičke podatke"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Očitati dijagnostičke podatke automobila."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"brisati dijagnostičke podatke"</string>
diff --git a/service/res/values-ca/config.xml b/service/res/values-ca/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-ca/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-ca/strings.xml b/service/res/values-ca/strings.xml
index e31da04..535b403 100644
--- a/service/res/values-ca/strings.xml
+++ b/service/res/values-ca/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Per motius de seguretat, aquesta activitat no està disponible mentre condueixes.\nPer continuar, has d\'estar aparcat."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Per tornar a començar amb unes funcions d\'aplicació segures, selecciona <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Enrere"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Depuració"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"llegeix les dades de diagnòstic"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Llegeix les dades de diagnòstic del cotxe."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"esborra les dades de diagnòstic"</string>
diff --git a/service/res/values-cs/config.xml b/service/res/values-cs/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-cs/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-cs/strings.xml b/service/res/values-cs/strings.xml
index b01f87b..369cdbc 100644
--- a/service/res/values-cs/strings.xml
+++ b/service/res/values-cs/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Tato aktivita není při řízení z bezpečnostních důvodů dostupná.\nPokračovat můžete, až zaparkujete."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Chcete-li začít znovu s bezpečnými funkcemi aplikace, vyberte <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Zpět"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"čtení diagnostických dat"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Čtení diagnostických dat z auta."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"vymazat diagnostická data"</string>
diff --git a/service/res/values-da/config.xml b/service/res/values-da/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-da/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-da/strings.xml b/service/res/values-da/strings.xml
index d3a3fb0..5513137 100644
--- a/service/res/values-da/strings.xml
+++ b/service/res/values-da/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Af hensyn til din sikkerhed kan du ikke få adgang til denne aktivitet, mens du kører.\nParkér, før du kan fortsætte."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Vælg <xliff:g id="EXIT_BUTTON">%s</xliff:g> for at starte forfra med sikre appfunktioner."</string>
<string name="exit_button" msgid="5829638404777671253">"Tilbage"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"tjekke diagnosticeringsdata"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Tjek diagnosticeringsdata fra bilen."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"rydde diagnosticeringsdata"</string>
diff --git a/service/res/values-de/config.xml b/service/res/values-de/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-de/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-de/strings.xml b/service/res/values-de/strings.xml
index 04c3af6..ff4c461 100644
--- a/service/res/values-de/strings.xml
+++ b/service/res/values-de/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Aus Sicherheitsgründen ist diese Aktivität während der Fahrt nicht verfügbar.\nWarte, bis das Fahrzeug geparkt ist."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Wähle <xliff:g id="EXIT_BUTTON">%s</xliff:g>, um die App mit sicheren Funktionen neu zu starten."</string>
<string name="exit_button" msgid="5829638404777671253">"Zurück"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"Diagnosedaten zu lesen"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Diagnosedaten des Autos lesen."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"Diagnosedaten zu löschen"</string>
diff --git a/service/res/values-el/config.xml b/service/res/values-el/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-el/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-el/strings.xml b/service/res/values-el/strings.xml
index ec05dc2..d2846d8 100644
--- a/service/res/values-el/strings.xml
+++ b/service/res/values-el/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Για λόγους ασφαλείας, η δραστηρ. δεν είναι διαθέσιμη όταν οδηγείτε.\nΓια να συνεχίσετε, περιμένετε μέχρι να σταθμεύσετε."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Για να ξεκινήσετε από την αρχή με ασφαλείς λειτουργίες εφαρμογής, επιλέξτε <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Πίσω"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Πλ. εντ. σφ."</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"παρακολούθηση δεδομένων διαγνωστικών στοιχείων"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Παρακολούθηση δεδομένων διαγνωστικών στοιχείων από το αυτοκίνητο."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"διαγραφή δεδομένων διαγνωστικών στοιχείων"</string>
diff --git a/service/res/values-en-rAU/config.xml b/service/res/values-en-rAU/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-en-rAU/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-en-rAU/strings.xml b/service/res/values-en-rAU/strings.xml
index d102771..49741f1 100644
--- a/service/res/values-en-rAU/strings.xml
+++ b/service/res/values-en-rAU/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"For your safety, this activity isn’t available while driving.\nTo continue, wait until you’ve parked."</string>
<string name="exit_button_message" msgid="8554690915924055685">"To start again with safe app features, select <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Back"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"read diagnostic data"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Read diagnostic data from the car."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"clear diagnostic data"</string>
diff --git a/service/res/values-en-rCA/config.xml b/service/res/values-en-rCA/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-en-rCA/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-en-rCA/strings.xml b/service/res/values-en-rCA/strings.xml
index d102771..49741f1 100644
--- a/service/res/values-en-rCA/strings.xml
+++ b/service/res/values-en-rCA/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"For your safety, this activity isn’t available while driving.\nTo continue, wait until you’ve parked."</string>
<string name="exit_button_message" msgid="8554690915924055685">"To start again with safe app features, select <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Back"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"read diagnostic data"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Read diagnostic data from the car."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"clear diagnostic data"</string>
diff --git a/service/res/values-en-rGB/config.xml b/service/res/values-en-rGB/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-en-rGB/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-en-rGB/strings.xml b/service/res/values-en-rGB/strings.xml
index d102771..49741f1 100644
--- a/service/res/values-en-rGB/strings.xml
+++ b/service/res/values-en-rGB/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"For your safety, this activity isn’t available while driving.\nTo continue, wait until you’ve parked."</string>
<string name="exit_button_message" msgid="8554690915924055685">"To start again with safe app features, select <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Back"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"read diagnostic data"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Read diagnostic data from the car."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"clear diagnostic data"</string>
diff --git a/service/res/values-en-rIN/config.xml b/service/res/values-en-rIN/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-en-rIN/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-en-rIN/strings.xml b/service/res/values-en-rIN/strings.xml
index d102771..49741f1 100644
--- a/service/res/values-en-rIN/strings.xml
+++ b/service/res/values-en-rIN/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"For your safety, this activity isn’t available while driving.\nTo continue, wait until you’ve parked."</string>
<string name="exit_button_message" msgid="8554690915924055685">"To start again with safe app features, select <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Back"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"read diagnostic data"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Read diagnostic data from the car."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"clear diagnostic data"</string>
diff --git a/service/res/values-en-rXC/config.xml b/service/res/values-en-rXC/config.xml
deleted file mode 100644
index a19ba0f..0000000
--- a/service/res/values-en-rXC/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-en-rXC/strings.xml b/service/res/values-en-rXC/strings.xml
index fbe2ce1..5bbe05b 100644
--- a/service/res/values-en-rXC/strings.xml
+++ b/service/res/values-en-rXC/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"For your safety, this activity isn’t available while driving.\nTo continue, wait until you’re parked."</string>
<string name="exit_button_message" msgid="8554690915924055685">"To start over with safe app features, select <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Back"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"read diagnostic data"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Read diagnostic data from the car."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"clear diagnostic data"</string>
diff --git a/service/res/values-es-rUS/config.xml b/service/res/values-es-rUS/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-es-rUS/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-es-rUS/strings.xml b/service/res/values-es-rUS/strings.xml
index 9011028..ebcc08c 100644
--- a/service/res/values-es-rUS/strings.xml
+++ b/service/res/values-es-rUS/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Por razones de seguridad, esta actividad no está disponible al conducir.\nPara continuar espera hasta que estaciones."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Para volver a comenzar con funciones de app seguras, selecciona <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Atrás"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Depuración"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"leer datos de diagnóstico"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Leer datos de diagnóstico del vehículo."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"borrar datos de diagnóstico"</string>
diff --git a/service/res/values-es/config.xml b/service/res/values-es/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-es/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-es/strings.xml b/service/res/values-es/strings.xml
index 5d54e80..e2a9e88 100644
--- a/service/res/values-es/strings.xml
+++ b/service/res/values-es/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Por tu seguridad, esta actividad no está disponible mientras conduces.\nPuedes continuar cuando hayas aparcado."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Para volver a empezar con funciones de aplicaciones seguras, selecciona <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Atrás"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Depuración"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"consultar datos de diagnóstico"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Consultar los datos de diagnóstico del coche."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"borrar los datos de diagnóstico"</string>
diff --git a/service/res/values-et/config.xml b/service/res/values-et/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-et/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-et/strings.xml b/service/res/values-et/strings.xml
index e0b6f86..cfaf748 100644
--- a/service/res/values-et/strings.xml
+++ b/service/res/values-et/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Teie turvalisuse tõttu ei ole see toiming sõitmise ajal saadaval.\nJätkamiseks oodake, kuni olete parkinud."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Uuesti alustamiseks turvaliste rakenduste funktsioonidega valige <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Tagasi"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Sil.-teave"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"diagnostikaandmete lugemine"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Auto diagnostikaandmete lugemine."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"diagnostikaandmete kustutamine"</string>
diff --git a/service/res/values-eu/config.xml b/service/res/values-eu/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-eu/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-eu/strings.xml b/service/res/values-eu/strings.xml
index 5f0249a..9e031a5 100644
--- a/service/res/values-eu/strings.xml
+++ b/service/res/values-eu/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Zure segurtasuna bermatzeko, eginbide hau ezin da erabili gidatu bitartean.\nAurrera egiteko, itxaron autoa aparkatu arte."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Berriro hasi nahi baduzu aplikazioaren eginbide seguruekin, hautatu <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Atzera"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"irakurri datu diagnostikoak"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Irakurri autoaren datu diagnostikoak."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"garbitu datu diagnostikoak"</string>
diff --git a/service/res/values-fa/config.xml b/service/res/values-fa/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-fa/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-fa/strings.xml b/service/res/values-fa/strings.xml
index 60c38d9..2e29029 100644
--- a/service/res/values-fa/strings.xml
+++ b/service/res/values-fa/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"بنا به دلایل ایمنی، این فعالیت درحین رانندگی دردسترس نیست.\n برای ادامه، تا زمان توقف خودرو صبر کنید."</string>
<string name="exit_button_message" msgid="8554690915924055685">"برای شروع مجدد با ویژگیهای برنامه امن، <xliff:g id="EXIT_BUTTON">%s</xliff:g> را انتخاب کنید."</string>
<string name="exit_button" msgid="5829638404777671253">"برگشت"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"اطلاعات اشکالزدایی"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"خواندن دادههای عیبیابی"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"دادههای عیبیابی خودرو را بخوانید."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"پاک کردن دادههای عیبیابی"</string>
diff --git a/service/res/values-fi/config.xml b/service/res/values-fi/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-fi/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-fi/strings.xml b/service/res/values-fi/strings.xml
index 88d4188..256cdfa 100644
--- a/service/res/values-fi/strings.xml
+++ b/service/res/values-fi/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Turvallisuussyistä toiminto ei ole käytettävissä ajon aikana.\nVoit jatkaa, kun olet pysäköinyt auton."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Jos haluat aloittaa alusta turvallisilla sovellusominaisuuksilla, valitse <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Takaisin"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"nähdä diagnostiikkadataa"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"lukea auton diagnostiikkadataa"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"poistaa diagnostiikkatiedot"</string>
diff --git a/service/res/values-fr-rCA/config.xml b/service/res/values-fr-rCA/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-fr-rCA/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-fr-rCA/strings.xml b/service/res/values-fr-rCA/strings.xml
index 82dc2e6..470879d 100644
--- a/service/res/values-fr-rCA/strings.xml
+++ b/service/res/values-fr-rCA/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Pour votre sécurité, cette activité est bloquée lorsque vous conduisez.\nVous devez être stationné pour continuer."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Pour recommencer avec des fonctionnalités d\'application sécurisées, sélectionnez <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Retour"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Info débog"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"lire des données de diagnostic"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Lire des données de diagnostic à partir de la voiture."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"effacer les données de diagnostic"</string>
diff --git a/service/res/values-fr/config.xml b/service/res/values-fr/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-fr/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-fr/strings.xml b/service/res/values-fr/strings.xml
index 4c742e3..6d562be 100644
--- a/service/res/values-fr/strings.xml
+++ b/service/res/values-fr/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Pour votre sécurité, cette activité n\'est pas disponible pendant la conduite.\nPour continuer, attendez d\'être garé."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Pour recommencer avec des fonctionnalités d\'application sécurisées, sélectionnez <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Retour"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"Lire les données de diagnostic"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Lire les données de diagnostic de la voiture."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"Effacer les données de diagnostic"</string>
diff --git a/service/res/values-gl/config.xml b/service/res/values-gl/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-gl/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-gl/strings.xml b/service/res/values-gl/strings.xml
index f3b1a83..efcf7b2 100644
--- a/service/res/values-gl/strings.xml
+++ b/service/res/values-gl/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Pola túa seguranza, esta actividade non está dispoñible mentres conduces.\nPodes continuar cando aparques."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Para comezar de novo coas funcións de aplicacións seguras, selecciona o botón <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Atrás"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Info. dep."</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"ler datos de diagnóstico"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Ler datos de diagnóstico do coche."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"borrar datos de diagnóstico"</string>
diff --git a/service/res/values-gu/config.xml b/service/res/values-gu/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-gu/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-gu/strings.xml b/service/res/values-gu/strings.xml
index e465258..7c00a7d 100644
--- a/service/res/values-gu/strings.xml
+++ b/service/res/values-gu/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"તમારી સલામતી માટે કાર ચલાવતી વખતે આ પ્રવૃત્તિ ઉપલબ્ધ નથી.\nચાલુ રાખવા માટે કાર પાર્ક થવા સુધી રાહ જુઓ."</string>
<string name="exit_button_message" msgid="8554690915924055685">"સુરક્ષિત ઍપ્લિકેશન સુવિધાઓ સાથે ફરી શરૂ કરવા, <xliff:g id="EXIT_BUTTON">%s</xliff:g> પસંદ કરો."</string>
<string name="exit_button" msgid="5829638404777671253">"પાછળ"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"ડિબગમાહિતી"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"નિદાનનો ડેટા વાંચો"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"કારમાંથી નિદાનનો ડેટા વાંચો."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"નિદાનનો ડેટા સાફ કરો"</string>
diff --git a/service/res/values-hi/config.xml b/service/res/values-hi/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-hi/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-hi/strings.xml b/service/res/values-hi/strings.xml
index a53a9ce..ff8429a 100644
--- a/service/res/values-hi/strings.xml
+++ b/service/res/values-hi/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"आपकी सुरक्षा के लिए, गाड़ी चलाते समय यह गतिविधि मौजूद नहीं रहती है.\nजारी रखने के लिए गाड़ी पार्क करनी होगी."</string>
<string name="exit_button_message" msgid="8554690915924055685">"सुरक्षित ऐप्लिकेशन सुविधाएं फिर से शुरू करने के लिए, <xliff:g id="EXIT_BUTTON">%s</xliff:g> चुनें."</string>
<string name="exit_button" msgid="5829638404777671253">"वापस शुरू करें"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"गड़बड़ी की पहचान का डेटा देख सकता है"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"कार की \'गड़बड़ी की पहचान का डेटा\' देख सकता है."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"गड़बड़ी की पहचान का डेटा मिटा सकता है"</string>
diff --git a/service/res/values-hr/config.xml b/service/res/values-hr/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-hr/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-hr/strings.xml b/service/res/values-hr/strings.xml
index edc2b17..2d2060b 100644
--- a/service/res/values-hr/strings.xml
+++ b/service/res/values-hr/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Radi vaše sigurnosti ta aktivnost nije dostupna tijekom vožnje.\nDa biste nastavili, pričekajte dok se ne zaustavite."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Da biste započeli ponovo sa sigurnim značajkama aplikacije, odaberite <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Natrag"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Inf. o otkl. pogrešaka"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"čitati dijagnostičke podatke"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"čitati dijagnostičke podatke automobila"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"izbrisati dijagnostičke podatke"</string>
diff --git a/service/res/values-hu/config.xml b/service/res/values-hu/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-hu/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-hu/strings.xml b/service/res/values-hu/strings.xml
index ef60a68..f427b07 100644
--- a/service/res/values-hu/strings.xml
+++ b/service/res/values-hu/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Az Ön biztonsága érdekében ez a tevékenység nem végezhető vezetés közben.\nLeparkolás után folytathatja a tevékenységet."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Ha biztonságos alkalmazásfunkciókkal szeretné újrakezdeni, válassza a következő gombot: <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Vissza"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Hibakeresési adatok"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"olvashatja a diagnosztikai adatokat"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Olvashatja az autó diagnosztikai adatait."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"törölheti a diagnosztikai adatokat"</string>
diff --git a/service/res/values-hy/config.xml b/service/res/values-hy/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-hy/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-hy/strings.xml b/service/res/values-hy/strings.xml
index 34ae170..a706dc4 100644
--- a/service/res/values-hy/strings.xml
+++ b/service/res/values-hy/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Անվտանգության նկատառումներով այս գործողությունը հասանելի չէ վարելու ռեժիմում:\nՇարունակելու համար կայանեք մեքենան:"</string>
<string name="exit_button_message" msgid="8554690915924055685">"Հավելվածն անվտանգ ռեժիմում վերագործարկելու համար սեղմեք<xliff:g id="EXIT_BUTTON">%s</xliff:g> կոճակը:"</string>
<string name="exit_button" msgid="5829638404777671253">"Հետ"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"կարդալ ախտորոշման մասին տվյալները"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Կարդալ մեքենայի ախտորոշման տվյալները։"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"մաքրել ախտորոշման տվյալները"</string>
diff --git a/service/res/values-in/config.xml b/service/res/values-in/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-in/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-in/strings.xml b/service/res/values-in/strings.xml
index 169cdcc..3651eaa 100644
--- a/service/res/values-in/strings.xml
+++ b/service/res/values-in/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Demi keamanan Anda, aktivitas ini tidak tersedia saat Anda mengemudi.\nUntuk melanjutkan, tunggu hingga mobil terparkir."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Untuk mulai dari awal dengan fitur apl yang aman, pilih <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Kembali"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Info Debug"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"membaca data diagnostik"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Membaca data diagnostik dari mobil."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"menghapus data diagnostik"</string>
diff --git a/service/res/values-is/config.xml b/service/res/values-is/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-is/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-is/strings.xml b/service/res/values-is/strings.xml
index bd81b4c..64f68f5 100644
--- a/service/res/values-is/strings.xml
+++ b/service/res/values-is/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Af öryggisástæðum er þessi aðgerð ekki í boði við akstur.\nLeggðu ökutækinu áður en þú heldur áfram."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Til að byrja aftur að setja upp örugga forritseiginleika skaltu velja <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Til baka"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Villuleit"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"lesa greiningargögn"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Lesa greiningargögn úr bílnum."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"hreinsa greiningargögn"</string>
diff --git a/service/res/values-it/config.xml b/service/res/values-it/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-it/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-it/strings.xml b/service/res/values-it/strings.xml
index f6be2f8..07aad4e 100644
--- a/service/res/values-it/strings.xml
+++ b/service/res/values-it/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Per motivi di sicurezza, questa attività non è disponibile durante la guida.\nPotrai continuare quando avrai parcheggiato."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Seleziona <xliff:g id="EXIT_BUTTON">%s</xliff:g> per ricominciare con le funzionalità sicure dell\'app."</string>
<string name="exit_button" msgid="5829638404777671253">"Indietro"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Info debug"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"Lettura dei dati diagnostici"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Consente di leggere i dati diagnostici dell\'automobile."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"Cancellazione dei dati diagnostici"</string>
diff --git a/service/res/values-iw/config.xml b/service/res/values-iw/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-iw/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-iw/strings.xml b/service/res/values-iw/strings.xml
index 7e28b02..1770cf9 100644
--- a/service/res/values-iw/strings.xml
+++ b/service/res/values-iw/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"מטעמי בטיחות, פעילות זו אינה זמינה בזמן נהיגה.\nכדי להמשיך, צריך להמתין עד לחניית הרכב."</string>
<string name="exit_button_message" msgid="8554690915924055685">"כדי להפעיל מחדש את האפליקציה במצב בטוח, יש ללחוץ על <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"הקודם"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"קריאת נתוני אבחון"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"קריאת נתוני אבחון מהרכב."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"מחיקת נתוני האבחון"</string>
diff --git a/service/res/values-ja/config.xml b/service/res/values-ja/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-ja/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-ja/strings.xml b/service/res/values-ja/strings.xml
index 22ca04f..9c8ad93 100644
--- a/service/res/values-ja/strings.xml
+++ b/service/res/values-ja/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"安全上の理由により、運転中はこのアクティビティをご利用いただけません。\n続行するには駐車してください。"</string>
<string name="exit_button_message" msgid="8554690915924055685">"アプリをセーフモードで再起動するには、<xliff:g id="EXIT_BUTTON">%s</xliff:g> を選択します。"</string>
<string name="exit_button" msgid="5829638404777671253">"戻る"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"デバッグ情報"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"診断データの読み取り"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"車から診断データを読み取ります。"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"診断データの消去"</string>
diff --git a/service/res/values-ka/config.xml b/service/res/values-ka/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-ka/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-ka/strings.xml b/service/res/values-ka/strings.xml
index bf533b3..d8343a8 100644
--- a/service/res/values-ka/strings.xml
+++ b/service/res/values-ka/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"ეს აქტივობა მიუწვდომელია მანქანის მართვისას, უსაფრთხოების მოსაზრებებიდან გამომდინარე.\nგთხოვთ, ჯერ გააჩეროთ მანქანა."</string>
<string name="exit_button_message" msgid="8554690915924055685">"აპის უსაფრთხო რეჟიმში გასაშვებად აირჩიეთ „<xliff:g id="EXIT_BUTTON">%s</xliff:g>“."</string>
<string name="exit_button" msgid="5829638404777671253">"უკან"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"გამართვის ინფორმაცია"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"დიაგნოსტიკური მონაცემების წაკითხვა"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"დიაგნოსტიკური მონაცემების წაკითხვა მანქანიდან."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"დიაგნოსტიკური მონაცემების გასუფთავება"</string>
diff --git a/service/res/values-kk/config.xml b/service/res/values-kk/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-kk/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-kk/strings.xml b/service/res/values-kk/strings.xml
index 2eeb9cf..b031e9d 100644
--- a/service/res/values-kk/strings.xml
+++ b/service/res/values-kk/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Көлік жүргізгенде, қауіпсіздік мақсатында бұл әрекетті орындау мүмкін емес.\nЖалғастыру үшін көлікті тұраққа қойыңыз."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Қолданбаны қауіпсіз күйде қайта іске қосу үшін <xliff:g id="EXIT_BUTTON">%s</xliff:g> түймесін басыңыз."</string>
<string name="exit_button" msgid="5829638404777671253">"Артқа"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Түзету"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"диагностикалық деректерді көру"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Көліктің диагностикалық деректерін көру."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"диагностикалық деректерді өшіру"</string>
diff --git a/service/res/values-km/config.xml b/service/res/values-km/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-km/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-km/strings.xml b/service/res/values-km/strings.xml
index d25d5aa..3039b03 100644
--- a/service/res/values-km/strings.xml
+++ b/service/res/values-km/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"ដើម្បីសុវត្ថិភាពរបស់អ្នក សកម្មភាពនេះមិនអាចប្រើបានទេ ពេលកំពុងបើកបរ។\nដើម្បីបន្ត សូមរង់ចាំរហូតទាល់តែអ្នកចតរថយន្តរួច។"</string>
<string name="exit_button_message" msgid="8554690915924055685">"ដើម្បីចាប់ផ្តើមឡើងវិញដោយប្រើមុខងារកម្មវិធីដែលមានសុវត្ថិភាព សូមជ្រើសរើស <xliff:g id="EXIT_BUTTON">%s</xliff:g> ។"</string>
<string name="exit_button" msgid="5829638404777671253">"ថយក្រោយ"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"ព័ត៌មានជួសជុល"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"អានទិន្នន័យវិភាគ"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"អានអំពីទិន្នន័យវិភាគពីរថយន្ត។"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"សម្អាតទិន្នន័យវិភាគ"</string>
diff --git a/service/res/values-kn/config.xml b/service/res/values-kn/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-kn/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-kn/strings.xml b/service/res/values-kn/strings.xml
index 14b7b54..0473b2d 100644
--- a/service/res/values-kn/strings.xml
+++ b/service/res/values-kn/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"ನಿಮ್ಮ ಸುರಕ್ಷೆಗಾಗಿ, ಈ ಚಟುವಟಿಕೆಯು ವಾಹನ ಚಲಾಯಿಸುತ್ತಿರುವಾಗ ಲಭ್ಯವಿಲ್ಲ. ಮುಂದುವರೆಯಲು \n ಮಾಡಿ, ನೀವು ಪಾರ್ಕ್ ಮಾಡುವ ತನಕ ಕಾಯಿರಿ."</string>
<string name="exit_button_message" msgid="8554690915924055685">"ಆಪ್ನ ಸುರಕ್ಷೆ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಒಳಗೊಂಡು ಮತ್ತೆ ಪ್ರಾರಂಭಿಸಲು, <xliff:g id="EXIT_BUTTON">%s</xliff:g> ಆಯ್ಕೆ ಮಾಡಿ."</string>
<string name="exit_button" msgid="5829638404777671253">"ಹಿಂದಕ್ಕೆ"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"ಡೀಬಗ್ ಮಾಹಿ"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"ಡಯಾಗ್ನೋಸ್ಟಿಕ್ ಡೇಟಾವನ್ನು ಓದಿ"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"ಕಾರಿನಲ್ಲಿರುವ ಅದರ ಡಯಾಗ್ನೋಸ್ಟಿಕ್ ಡೇಟಾವನ್ನು ಓದಿ."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"ಡಯಾಗ್ನೋಸ್ಟಿಕ್ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಿ"</string>
diff --git a/service/res/values-ko/config.xml b/service/res/values-ko/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-ko/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-ko/strings.xml b/service/res/values-ko/strings.xml
index cfcc030..4853d47 100644
--- a/service/res/values-ko/strings.xml
+++ b/service/res/values-ko/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"안전을 위해 운전 중에는 이용할 수 없는 활동입니다.\n계속하려면 먼저 주차하세요."</string>
<string name="exit_button_message" msgid="8554690915924055685">"안전한 앱 기능으로 다시 시작하려면 <xliff:g id="EXIT_BUTTON">%s</xliff:g>을(를) 선택하세요."</string>
<string name="exit_button" msgid="5829638404777671253">"뒤로"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"디버그 정보"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"진단 데이터 읽기"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"차량의 진단 데이터를 읽습니다."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"진단 데이터 삭제"</string>
diff --git a/service/res/values-ky/config.xml b/service/res/values-ky/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-ky/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-ky/strings.xml b/service/res/values-ky/strings.xml
index 2999b31..f2a21df 100644
--- a/service/res/values-ky/strings.xml
+++ b/service/res/values-ky/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Коопсуздугуңузду коргоо максатында, бул иш-аракетти унаа айдап баратканда аткарууга болбойт.\nТоктоп туруп, улантыңыз."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Колдонмонун коопсуз функцияларын иштетүү үчүн <xliff:g id="EXIT_BUTTON">%s</xliff:g> баскычын басыңыз."</string>
<string name="exit_button" msgid="5829638404777671253">"Артка"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Мүчүлүштүк"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"мүчүлүштүктөрдү аныктоо дайындарын окуу"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Унаадагы мүчүлүштүктөрдү аныктоо дайындарын окуу."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"мүчүлүштүктөрдү аныктоо дайындарын тазалоо"</string>
diff --git a/service/res/values-lo/config.xml b/service/res/values-lo/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-lo/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-lo/strings.xml b/service/res/values-lo/strings.xml
index 2052db6..2fe6c4f 100644
--- a/service/res/values-lo/strings.xml
+++ b/service/res/values-lo/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"ເພື່ອຄວາມປອດໄພຂອງທ່ານ, ກິດຈະກຳນີ້ບໍ່ມີໃຫ້ນໍາໃຊ້ໃນຂະນະທີ່ທ່ານກຳລັງຂັບລົດຢູ່. \nເພື່ອສືບຕໍ່, ກະລຸນາລໍຖ້າຈົນກວ່າວ່າທ່ານຈອດລົດ."</string>
<string name="exit_button_message" msgid="8554690915924055685">"ເພື່ອເລີ່ມຕົ້ນຄືນໃໝ່ດ້ວຍຄຸນສົມບັດແອັບທີ່ປອດໄພ, ກະລຸນາເລືອກ <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"ກັບຄືນ"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"ອ່ານຂໍ້ມູນການວິເຄາະ"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"ອ່ານຂໍ້ມູນການວິເຄາະຈາກລົດ."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"ລຶບລ້າງຂໍ້ມູນການວິເຄາະ"</string>
diff --git a/service/res/values-lt/config.xml b/service/res/values-lt/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-lt/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-lt/strings.xml b/service/res/values-lt/strings.xml
index d9eca78..2342259 100644
--- a/service/res/values-lt/strings.xml
+++ b/service/res/values-lt/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Siekiant užtikrinti jūsų saugą, ši veikla nepasiekiama vairuojant.\nJei norite tęsti, palaukite, kol sustosite."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Jei norite pradėti iš naujo naudodami saugias programos funkcijas, pasirinkite <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Atgal"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Der. inf."</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"nuskaityti diagnostikos duomenis"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Nuskaityti automobilio diagnostikos duomenis."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"išvalyti diagnostikos duomenis"</string>
diff --git a/service/res/values-lv/config.xml b/service/res/values-lv/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-lv/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-lv/strings.xml b/service/res/values-lv/strings.xml
index c319e52..f926f13 100644
--- a/service/res/values-lv/strings.xml
+++ b/service/res/values-lv/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Drošības apsvērumu dēļ šī darbība nav pieejama braukšanas laikā.\nTurpiniet, kad automašīna būs novietota stāvēšanai."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Lai atsāktu darbu ar drošām lietotnes funkcijām, atlasiet pogu <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Atpakaļ"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"nolasīt diagnostikas datus"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Nolasīt diagnostikas datus no automašīnas."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"notīrīt diagnostikas datus"</string>
diff --git a/service/res/values-mk/config.xml b/service/res/values-mk/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-mk/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-mk/strings.xml b/service/res/values-mk/strings.xml
index c5fa0bb..b419e52 100644
--- a/service/res/values-mk/strings.xml
+++ b/service/res/values-mk/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"За ваша безбедност, оваа активност не е достапна додека возите.\nЗа да продолжите, почекајте да се паркирате."</string>
<string name="exit_button_message" msgid="8554690915924055685">"За да започнете одново со безбедносните фунции на апликацијата, изберете <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Назад"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"ги чита дијагностичките податоци"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Чита дијагностички податоци од автомобилот."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"чисти дијагностички податоци"</string>
diff --git a/service/res/values-ml/config.xml b/service/res/values-ml/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-ml/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-ml/strings.xml b/service/res/values-ml/strings.xml
index fc9e458..6e6007f 100644
--- a/service/res/values-ml/strings.xml
+++ b/service/res/values-ml/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"നിങ്ങളുടെ സുരക്ഷയ്ക്ക്, ഡ്രൈവ് ചെയ്യുമ്പോൾ ഈ ആക്റ്റിവിറ്റി ലഭ്യമല്ല.\nതുടരാൻ, നിങ്ങൾ പാർക്ക് ചെയ്യുന്നതുവരെ കാത്തിരിക്കുക."</string>
<string name="exit_button_message" msgid="8554690915924055685">"സുരക്ഷിതമായ ആപ്പ് ഫീച്ചറുകൾ ഉപയോഗിച്ച് പുനരാരംഭിക്കാൻ, <xliff:g id="EXIT_BUTTON">%s</xliff:g> തിരഞ്ഞെടുക്കുക."</string>
<string name="exit_button" msgid="5829638404777671253">"മടങ്ങുക"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"ഡീബഗ് വിവരം"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"പ്രശ്നനിർണ്ണയ ഡാറ്റ വായിക്കുക"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"കാറിൽ നിന്നുള്ള പ്രശ്നനിർണ്ണയ ഡാറ്റ വായിക്കുക."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"പ്രശ്നനിർണ്ണയ ഡാറ്റ മായ്ക്കുക"</string>
diff --git a/service/res/values-mn/config.xml b/service/res/values-mn/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-mn/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-mn/strings.xml b/service/res/values-mn/strings.xml
index 1808c32..83da614 100644
--- a/service/res/values-mn/strings.xml
+++ b/service/res/values-mn/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Таны аюулгүй байдлын үүднээс жолоодох явцад энэ үйл ажиллагааг хийх боломжгүй.\nМашинаа зогсоолд байршуулаад үргэлжлүүлнэ үү."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Аппын аюулгүй онцлогуудтайгаар дахин эхлүүлэхийн тулд <xliff:g id="EXIT_BUTTON">%s</xliff:g>-г сонгоно уу."</string>
<string name="exit_button" msgid="5829638404777671253">"Буцах"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Дебаг хийх мэдээлэл"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"оношилгооны өгөгдлийг унших"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Машины оношилгооны өгөгдлийг унших."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"оношилгооны өгөгдлийг устгах"</string>
diff --git a/service/res/values-mr/config.xml b/service/res/values-mr/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-mr/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-mr/strings.xml b/service/res/values-mr/strings.xml
index 0afb98e..efdc646 100644
--- a/service/res/values-mr/strings.xml
+++ b/service/res/values-mr/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"तुमच्या सुरक्षेसाठी, ड्रायव्हिंग करत असताना ही अॅक्टिव्हिटी उपलब्ध नाही.\nसुरू ठेवण्यासाठी, पार्क करेपर्यंत वाट पहा."</string>
<string name="exit_button_message" msgid="8554690915924055685">"सुरक्षित अॅप वैशिष्ट्यांसोबत पुन्हा सुरुवात करण्यासाठी, <xliff:g id="EXIT_BUTTON">%s</xliff:g> निवडा."</string>
<string name="exit_button" msgid="5829638404777671253">"मागे जा"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"डीबग माहिती"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"निदान डेटा वाचा"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"कारचा निदान डेटा वाचा."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"निदान डेटा साफ करा"</string>
diff --git a/service/res/values-ms/config.xml b/service/res/values-ms/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-ms/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-ms/strings.xml b/service/res/values-ms/strings.xml
index 23332b8..6869364 100644
--- a/service/res/values-ms/strings.xml
+++ b/service/res/values-ms/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Untuk keselamatan anda, aktiviti ini tidak tersedia semasa memandu.\nUntuk meneruskan, tunggu kereta diberhentikan."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Untuk bermula semula dengan ciri apl selamat, pilih <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Kembali"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Nyhpepijat"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"baca data diagnostik"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Baca data diagnostik daripada kereta."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"kosongkan data diagnostik"</string>
diff --git a/service/res/values-my/config.xml b/service/res/values-my/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-my/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-my/strings.xml b/service/res/values-my/strings.xml
index f62bf4e..e2e8572 100644
--- a/service/res/values-my/strings.xml
+++ b/service/res/values-my/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"သင့် လုံခြုံမှုအတွက် ဤလုပ်ဆောင်ချက်ကို ကားမောင်းနေစဉ် အသုံးမပြုနိုင်ပါ။\nဆက်လက်လုပ်ဆောင်ရန် ကားရပ်နားသည်အထိစောင့်ပါ။"</string>
<string name="exit_button_message" msgid="8554690915924055685">"စိတ်ချရသော အက်ပ်လုပ်ဆောင်ချက်များနှင့်အတူ အစမှပြန်စရန် <xliff:g id="EXIT_BUTTON">%s</xliff:g> ကို ရွေးချယ်ပါ။"</string>
<string name="exit_button" msgid="5829638404777671253">"နောက်သို့"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"တွေ့ရှိမှု"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"အမှားရှာပြင်ခြင်းဒေတာများကို ကြည့်ပါမည်"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"ကားအတွင်း အမှားရှာပြင်ခြင်းဒေတာကို ကြည့်ပါမည်။"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"အမှားရှာပြင်ခြင်းဒေတာများကို ရှင်းလင်းပါမည်"</string>
diff --git a/service/res/values-nb/config.xml b/service/res/values-nb/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-nb/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-nb/strings.xml b/service/res/values-nb/strings.xml
index d273bcb..62108e6 100644
--- a/service/res/values-nb/strings.xml
+++ b/service/res/values-nb/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Av sikkerhetshensyn er denne aktiviteten utilgjengelig når du kjører.\nDu kan ikke fortsette før du stopper bilen."</string>
<string name="exit_button_message" msgid="8554690915924055685">"For å starte på nytt med sikre appfunksjoner, velg <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Tilbake"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"lese diagnostikkdata"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Les diagnostikkdata fra bilen."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"slette diagnostikkdata"</string>
diff --git a/service/res/values-ne/config.xml b/service/res/values-ne/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-ne/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-ne/strings.xml b/service/res/values-ne/strings.xml
index 5d9431c..add0fb9 100644
--- a/service/res/values-ne/strings.xml
+++ b/service/res/values-ne/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"तपाईंको सुरक्षाका लागि, तपाईंले सवारी साधन चलाइरहेका बेलामा यो क्रियाकलाप उपलब्ध हुँदैन।\nजारी राख्न, पार्क नगरुन्जेल पर्खनुहोस्।"</string>
<string name="exit_button_message" msgid="8554690915924055685">"अनुप्रयोगका सुरक्षित सुविधाहरूको प्रयोग गरी फेरि सुरु गर्न <xliff:g id="EXIT_BUTTON">%s</xliff:g> चयन गर्नुहोस्।"</string>
<string name="exit_button" msgid="5829638404777671253">"पछाडि"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"डिबगसम्बन्धी जानकारी"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"निदानसम्बन्धी डेटा पढ्ने"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"कारको निदानसम्बन्धी डेटा पढ्ने।"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"निदानसम्बन्धी डेटा हटाउने"</string>
diff --git a/service/res/values-nl/config.xml b/service/res/values-nl/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-nl/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-nl/strings.xml b/service/res/values-nl/strings.xml
index 659afb0..0959bb8 100644
--- a/service/res/values-nl/strings.xml
+++ b/service/res/values-nl/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Voor jouw veiligheid is deze activiteit niet beschikbaar als je aan het rijden bent.\nJe moet parkeren om door te gaan."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Selecteer <xliff:g id="EXIT_BUTTON">%s</xliff:g> om opnieuw te beginnen met de veilige app-functies."</string>
<string name="exit_button" msgid="5829638404777671253">"Vorige"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug-info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"diagnostische gegevens lezen"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Diagnostische gegevens van auto lezen."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"diagnostische gegevens wissen"</string>
diff --git a/service/res/values-or/config.xml b/service/res/values-or/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-or/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-or/strings.xml b/service/res/values-or/strings.xml
index b054470..2d90b94 100644
--- a/service/res/values-or/strings.xml
+++ b/service/res/values-or/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ, ଡ୍ରାଇଭିଂ କରିବା ସମୟରେ ଏହି ଗତିବିଧି ଉପଲବ୍ଧ ନାହିଁ।\nଜାରି ରଖିବା ପାଇଁ, ପାର୍କ କରିବା ପର୍ଯ୍ୟନ୍ତ ଅପେକ୍ଷା କରନ୍ତୁ।"</string>
<string name="exit_button_message" msgid="8554690915924055685">"ସୁରକ୍ଷିତ ଆପ୍ ବୈଶିଷ୍ଟ୍ୟଗୁଡ଼ିକୁ ନେଇ ପୁଣି ଆରମ୍ଭ କରିବା ପାଇଁ, <xliff:g id="EXIT_BUTTON">%s</xliff:g> ଚୟନ କରନ୍ତୁ।"</string>
<string name="exit_button" msgid="5829638404777671253">"ପଛକୁ ଫେରନ୍ତୁ"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"ଡିବଗ୍ ସୂଚନା"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"ଡାଏଗ୍ନୋଷ୍ଟିକ୍ ଡାଟାକୁ ପଢ଼ିବ"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"କାର୍ ମଧ୍ୟରୁ ଡାଏଗ୍ନୋଷ୍ଟିକ୍ ଡାଟାକୁ ପଢ଼ିବ।"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"ଡାଏଗ୍ନୋଷ୍ଟିକ୍ ଡାଟା ଖାଲି କରନ୍ତୁ"</string>
diff --git a/service/res/values-pa/config.xml b/service/res/values-pa/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-pa/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-pa/strings.xml b/service/res/values-pa/strings.xml
index 576e5b7..d3700ed 100644
--- a/service/res/values-pa/strings.xml
+++ b/service/res/values-pa/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਗੱਡੀ ਚਲਾਉਣ ਵੇਲੇ ਇਹ ਸਰਗਰਮੀ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।\nਜਾਰੀ ਰੱਖਣ ਲਈ, ਗੱਡੀ ਰੋਕਣ ਤੱਕ ਉਡੀਕ ਕਰੋ।"</string>
<string name="exit_button_message" msgid="8554690915924055685">"ਸੁਰੱਖਿਅਤ ਐਪ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨਾਲ ਮੁੜ ਤੋਂ ਸ਼ੁਰੂ ਕਰਨ ਲਈ, <xliff:g id="EXIT_BUTTON">%s</xliff:g> ਚੁਣੋ।"</string>
<string name="exit_button" msgid="5829638404777671253">"ਪਿੱਛੇ"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"ਡੀਬੱਗ ਜਾਣਕਾਰੀ"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"ਤਸ਼ਖੀਸੀ ਡਾਟੇ ਨੂੰ ਪੜ੍ਹਨਾ"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"ਕਾਰ ਦਾ ਤਸ਼ਖੀਸੀ ਡਾਟਾ ਪੜ੍ਹਨਾ।"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"ਤਸ਼ਖੀਸੀ ਡਾਟਾ ਕਲੀਅਰ ਕਰਨਾ"</string>
diff --git a/service/res/values-pl/config.xml b/service/res/values-pl/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-pl/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-pl/strings.xml b/service/res/values-pl/strings.xml
index 537d513..593181e 100644
--- a/service/res/values-pl/strings.xml
+++ b/service/res/values-pl/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Dla Twojego bezpieczeństwa ta funkcja jest wyłączona podczas jazdy.\nAby jej użyć, zaparkuj samochód."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Aby jeszcze raz przejść do funkcji bezpieczeństwa w aplikacji, wybierz <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Wstecz"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Dane debugowania"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"odczytywanie danych diagnostycznych"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Odczytywanie danych diagnostycznych samochodu."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"czyszczenie danych diagnostycznych"</string>
diff --git a/service/res/values-pt-rPT/config.xml b/service/res/values-pt-rPT/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-pt-rPT/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-pt-rPT/strings.xml b/service/res/values-pt-rPT/strings.xml
index bf327df..3ba192b 100644
--- a/service/res/values-pt-rPT/strings.xml
+++ b/service/res/values-pt-rPT/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Para sua segurança, esta atividade não está disponível enquanto estiver a conduzir.\nPode continuar após estacionar."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Para começar de novo com funcionalidades de aplicações seguras, selecione <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Anterior"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Informações de depuração"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"ler os dados de diagnóstico"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Ler os dados de diagnóstico do automóvel."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"limpar os dados de diagnóstico"</string>
diff --git a/service/res/values-pt/config.xml b/service/res/values-pt/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-pt/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-pt/strings.xml b/service/res/values-pt/strings.xml
index 5236c7b..3a002c3 100644
--- a/service/res/values-pt/strings.xml
+++ b/service/res/values-pt/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Para sua segurança, essa atividade não está disponível enquanto você dirige.\nPara continuar, aguarde até estacionar."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Para reiniciar o app com recursos de segurança, selecione <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Voltar"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Info de depuração"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"ler dados de diagnóstico"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Ler dados de diagnóstico do carro."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"limpar dados de diagnóstico"</string>
diff --git a/service/res/values-ro/config.xml b/service/res/values-ro/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-ro/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-ro/strings.xml b/service/res/values-ro/strings.xml
index 77d4b1e..6f48c30 100644
--- a/service/res/values-ro/strings.xml
+++ b/service/res/values-ro/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Pentru siguranța dvs., activitatea nu este disponibilă în timp ce conduceți.\nCa să continuați, așteptați să parcați."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Pentru a începe din nou cu funcțiile pentru aplicații sigure, selectați <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Înapoi"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Informații de remediere a erorilor"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"Citește datele de diagnosticare"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Citește datele de diagnosticare de la mașină."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"Șterge datele de diagnosticare"</string>
diff --git a/service/res/values-ru/config.xml b/service/res/values-ru/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-ru/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-ru/strings.xml b/service/res/values-ru/strings.xml
index a7439e5..205d54a 100644
--- a/service/res/values-ru/strings.xml
+++ b/service/res/values-ru/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Во время вождения это действие недоступно.\nСначала вам нужно припарковаться."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Чтобы перезапустить приложение в безопасном режиме, нажмите кнопку \"<xliff:g id="EXIT_BUTTON">%s</xliff:g>\"."</string>
<string name="exit_button" msgid="5829638404777671253">"Назад"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Данные отладки"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"чтение диагностических данных"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Чтение диагностических данных автомобиля."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"удаление диагностических данных"</string>
diff --git a/service/res/values-si/config.xml b/service/res/values-si/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-si/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-si/strings.xml b/service/res/values-si/strings.xml
index 4ad1eaf..49e9ce4 100644
--- a/service/res/values-si/strings.xml
+++ b/service/res/values-si/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"ඔබේ ආරක්ෂාව සඳහා, ඔබ රිය පදවන විට මෙම ක්රියාකාරකම නොලැබේ.\nඉදිරියට යාමට, ඔබ ගාල් කරන තෙක් රැඳී සිටින්න."</string>
<string name="exit_button_message" msgid="8554690915924055685">"ආරක්ෂිත යෙදුම් විශේෂාංග සමඟ පටන් ගැනීමට, <xliff:g id="EXIT_BUTTON">%s</xliff:g> තෝරන්න."</string>
<string name="exit_button" msgid="5829638404777671253">"ආපසු"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"නිදොසීම"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"දෝෂනිර්ණ දත්ත කියවන්න"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"මෝටර් රථයෙන් දෝෂනිර්ණ දත්ත කියවන්න."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"දෝෂනිර්ණ දත්ත හිස් කරන්න"</string>
diff --git a/service/res/values-sk/config.xml b/service/res/values-sk/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-sk/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-sk/strings.xml b/service/res/values-sk/strings.xml
index 3c16be6..8e5cb3e 100644
--- a/service/res/values-sk/strings.xml
+++ b/service/res/values-sk/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Z bezpečnostných dôvodov nie je táto aktivita k dispozícii počas jazdy.\nAk chcete pokračovať, počkajte, kým budete parkovať."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Ak chcete začať odznova s bezpečnými funkciami aplikácie, vyberte tlačidlo <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Späť"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Informácie o ladení"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"čítať diagnostické údaje"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Čítanie diagnostických údajov z auta."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"vymazať diagnostické údaje"</string>
diff --git a/service/res/values-sl/config.xml b/service/res/values-sl/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-sl/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-sl/strings.xml b/service/res/values-sl/strings.xml
index f1ff307..2e00b3a 100644
--- a/service/res/values-sl/strings.xml
+++ b/service/res/values-sl/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Zaradi varnosti ta dejavnost med vožnjo ni na voljo.\nČe želite nadaljevati, počakajte, da bo vozilo parkirano."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Če želite začeti znova z varnimi funkcijami aplikacij, izberite <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Nazaj"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Odpr. nap."</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"branje diagnostičnih podatkov"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Branje diagnostičnih podatkov avtomobila."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"brisanje diagnostičnih podatkov"</string>
diff --git a/service/res/values-sq/config.xml b/service/res/values-sq/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-sq/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-sq/strings.xml b/service/res/values-sq/strings.xml
index 8d56e6d..f7f4684 100644
--- a/service/res/values-sq/strings.xml
+++ b/service/res/values-sq/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Për sigurinë tënde, ky aktivitet nuk ofrohet kur je duke drejtuar makinën.\nPër të vazhduar, prit deri sa të parkosh."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Për të filluar nga e para me funksionet e sigurta të aplikacionit, zgjidh <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Prapa"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Informacionet e defekteve në kod"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"lexo të dhënat diagnostikuese"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Lexo të dhënat diagnostikuese nga makina."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"pastro të dhënat diagnostikuese"</string>
diff --git a/service/res/values-sr/config.xml b/service/res/values-sr/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-sr/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-sr/strings.xml b/service/res/values-sr/strings.xml
index 8c58e53..0983a07 100644
--- a/service/res/values-sr/strings.xml
+++ b/service/res/values-sr/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Ова активност није доступна док возите ради ваше безбедности.\nДа бисте наставили, прво се паркирајте."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Да бисте поново почели са безбедним функцијама апликације, изаберите <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Назад"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"читање дијагностичких података"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Читање дијагностичких података из аутомобила."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"брисање дијагностичких података"</string>
diff --git a/service/res/values-sv/config.xml b/service/res/values-sv/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-sv/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-sv/strings.xml b/service/res/values-sv/strings.xml
index 32dffc1..3f0ea0c 100644
--- a/service/res/values-sv/strings.xml
+++ b/service/res/values-sv/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Av säkerhetsskäl är den här aktiviteten inte tillgänglig under körning.\nDu kan fortsätta med detta när du har parkerat."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Välj <xliff:g id="EXIT_BUTTON">%s</xliff:g> om du vill starta om appen med säkra funktioner."</string>
<string name="exit_button" msgid="5829638404777671253">"Tillbaka"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"läsa diagnostikdata"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Läsa diagnostisk data om bilen."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"rensa diagnostikdata"</string>
diff --git a/service/res/values-sw/config.xml b/service/res/values-sw/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-sw/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-sw/strings.xml b/service/res/values-sw/strings.xml
index 66fa85f..0619eac 100644
--- a/service/res/values-sw/strings.xml
+++ b/service/res/values-sw/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Kwa usalama wako, shughuli haipatikani wakati unaendesha gari. \nIli uendelee, subiri hadi utakapoegesha gari."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Ili uanzishe tena ukitumia vipengele salama vya programu, chagua <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Rudi Nyuma"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"kusoma data ya uchunguzi"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Kusoma data ya uchunguzi kwenye gari."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"kufuta data ya uchunguzi wa gari"</string>
diff --git a/service/res/values-ta/config.xml b/service/res/values-ta/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-ta/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-ta/strings.xml b/service/res/values-ta/strings.xml
index 0fcb211..8eab4ef 100644
--- a/service/res/values-ta/strings.xml
+++ b/service/res/values-ta/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"உங்கள் பாதுகாப்பை முன்னிட்டு இந்தச் செயல்பாடு, வாகனம் ஓட்டும்போது இயங்காது.\nதொடர வாகனத்தை நிறுத்தும்வரை காத்திருக்கவும்."</string>
<string name="exit_button_message" msgid="8554690915924055685">"ஆப்ஸைப் பாதுகாப்பான அம்சங்களுடன் மீண்டும் தொடங்க <xliff:g id="EXIT_BUTTON">%s</xliff:g>ஐத் தேர்ந்தெடுக்கவும்."</string>
<string name="exit_button" msgid="5829638404777671253">"பின்செல்"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"பிழைதிருத்தத் தகவல்"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"ஆய்வுத் தரவை அறிய வேண்டும்"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"கார் தொடர்பான ஆய்வுத் தரவை அறிய வேண்டும்."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"ஆய்வுத் தரவை அழிக்க வேண்டும்"</string>
diff --git a/service/res/values-te/config.xml b/service/res/values-te/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-te/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-te/strings.xml b/service/res/values-te/strings.xml
index eec213e..494e476 100644
--- a/service/res/values-te/strings.xml
+++ b/service/res/values-te/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"మీ భద్రత విషయమై, ఈ కార్యాచరణ మీరు డ్రైవింగ్లో ఉన్నప్పుడు అందుబాటులో లేదు.\n కొనసాగించడానికి, మీరు పార్క్ చేయబడేవరకు వేచి ఉండండి."</string>
<string name="exit_button_message" msgid="8554690915924055685">"సురక్షిత యాప్ లక్షణాలతో ప్రారంభించడానికి, <xliff:g id="EXIT_BUTTON">%s</xliff:g>ని ఎంచుకోండి."</string>
<string name="exit_button" msgid="5829638404777671253">"వెనుకకు"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"డీబగ్ సమాచారం"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"సమస్య విశ్లేషణ డేటాను తెలుసుకోగలవు"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"కారు నుండి విశ్లేషణ డేటాను తెలుసుకోగలవు."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"సమస్య విశ్లేషణ డేటాను క్లియర్ చేయగలవు"</string>
diff --git a/service/res/values-th/config.xml b/service/res/values-th/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-th/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-th/strings.xml b/service/res/values-th/strings.xml
index e391708..197bc75 100644
--- a/service/res/values-th/strings.xml
+++ b/service/res/values-th/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"เพื่อความปลอดภัย กิจกรรมนี้จะไม่เปิดให้ใช้งานขณะขับรถ\nคุณต้องจอดรถให้เรียบร้อยก่อน จึงจะดำเนินการต่อได้"</string>
<string name="exit_button_message" msgid="8554690915924055685">"เลือก <xliff:g id="EXIT_BUTTON">%s</xliff:g> เพื่อเริ่มต้นใหม่โดยใช้ฟีเจอร์แอปที่ปลอดภัย"</string>
<string name="exit_button" msgid="5829638404777671253">"กลับ"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"อ่านข้อมูลการวินิจฉัย"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"อ่านข้อมูลการวินิจฉัยจากรถ"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"ล้างข้อมูลการวินิจฉัย"</string>
diff --git a/service/res/values-tl/config.xml b/service/res/values-tl/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-tl/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-tl/strings.xml b/service/res/values-tl/strings.xml
index a453ca1..d50637f 100644
--- a/service/res/values-tl/strings.xml
+++ b/service/res/values-tl/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Para sa seguridad, hindi available ang aktibidad habang nagmamaneho.\nPara magpatuloy, maghintay hanggang sa makaparada."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Para magsimula sa mga ligtas na feature ng app, piliin ang <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Bumalik"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Impormasyon sa Pag-debug"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"basahin ang data ng mga diagnostic"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Basahin ang data ng mga diagnostic mula sa sasakyan."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"i-clear ang data ng mga diagnostic"</string>
diff --git a/service/res/values-tr/config.xml b/service/res/values-tr/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-tr/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-tr/strings.xml b/service/res/values-tr/strings.xml
index 5ad22dd..861d4cb 100644
--- a/service/res/values-tr/strings.xml
+++ b/service/res/values-tr/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Güvenliğiniz için bu etkinlik sürüş sırasında gerçekleştirilemez.\nDevam etmek için park edene dek bekleyin."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Güvenli uygulama özellikleriyle baştan başlamak için <xliff:g id="EXIT_BUTTON">%s</xliff:g> düğmesini seçin."</string>
<string name="exit_button" msgid="5829638404777671253">"Geri"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Hata Ayıklama Bilgileri"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"teşhis verilerini okuma"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Araçtan teşhis verilerini okuma."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"teşhis verilerini temizleme"</string>
diff --git a/service/res/values-uk/config.xml b/service/res/values-uk/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-uk/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-uk/strings.xml b/service/res/values-uk/strings.xml
index ca4f8b5..24fc867 100644
--- a/service/res/values-uk/strings.xml
+++ b/service/res/values-uk/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Задля вашої безпеки ці дії недоступні під час поїздки.\nЩоб продовжити, зупиніть автомобіль."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Щоб почати знову з безпечними функціями додатка, натисніть кнопку \"<xliff:g id="EXIT_BUTTON">%s</xliff:g>\"."</string>
<string name="exit_button" msgid="5829638404777671253">"Назад"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"перегляд даних діагностики"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Перегляд даних діагностики автомобіля."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"очищення даних діагностики"</string>
diff --git a/service/res/values-ur/config.xml b/service/res/values-ur/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-ur/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-ur/strings.xml b/service/res/values-ur/strings.xml
index 517ae7b..58f1aca 100644
--- a/service/res/values-ur/strings.xml
+++ b/service/res/values-ur/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"آپ کی حفاظت کے لیے یہ سرگرمی آپ کے کار چلانے کے دوران دستیاب نہیں ہے۔\n جاری رکھنے کے لیے کار کے پارک ہونے تک انتظار کریں۔"</string>
<string name="exit_button_message" msgid="8554690915924055685">"محفوظ اپپ کی خصوصیات کے ساتھ شروع کرنے کے لیے <xliff:g id="EXIT_BUTTON">%s</xliff:g> پر کلک کریں۔"</string>
<string name="exit_button" msgid="5829638404777671253">"پیچھے"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"ڈیبگ کی معلومات"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"تشخیصی ڈیٹا پڑھیں"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"کار کے تشخیصی ڈیٹا کے بارے میں پڑھیں۔"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"تشخیصی ڈیٹا صاف کریں"</string>
diff --git a/service/res/values-uz/config.xml b/service/res/values-uz/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-uz/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-uz/strings.xml b/service/res/values-uz/strings.xml
index 893ba9d..f6bfb87 100644
--- a/service/res/values-uz/strings.xml
+++ b/service/res/values-uz/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Avtomobil haydayotganingizda bu harakatni amalga oshira olmaysiz.\nUni bajarish uchun avtomobilni toʻxtating."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Ilovani xavfsiz rejimda ishga tushirish uchun <xliff:g id="EXIT_BUTTON">%s</xliff:g> tugmasini bosing."</string>
<string name="exit_button" msgid="5829638404777671253">"Orqaga"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"diagnostika axborotini ochish"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Avtomobildan diagnostika axborotini olish."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"diagnostika axborotini tozalash"</string>
diff --git a/service/res/values-vi/config.xml b/service/res/values-vi/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-vi/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-vi/strings.xml b/service/res/values-vi/strings.xml
index 265173b..57be52a 100644
--- a/service/res/values-vi/strings.xml
+++ b/service/res/values-vi/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Vì lý do an toàn, bạn không sử dụng được hoạt động này trong khi lái xe.\nHãy đợi cho tới khi bạn đỗ xe để tiếp tục."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Để bắt đầu lại với các tính năng an toàn của ứng dụng, hãy chọn <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Quay lại"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Thông tin gỡ lỗi"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"đọc dữ liệu chẩn đoán"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Đọc dữ liệu chẩn đoán từ ô tô."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"xóa dữ liệu chẩn đoán"</string>
diff --git a/service/res/values-zh-rCN/config.xml b/service/res/values-zh-rCN/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-zh-rCN/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-zh-rCN/strings.xml b/service/res/values-zh-rCN/strings.xml
index ad55cda..b30acc4 100644
--- a/service/res/values-zh-rCN/strings.xml
+++ b/service/res/values-zh-rCN/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"为了确保您的安全,您无法在开车时执行这项活动。\n要继续,请先停车。"</string>
<string name="exit_button_message" msgid="8554690915924055685">"要重新开始使用安全的应用功能,请选择<xliff:g id="EXIT_BUTTON">%s</xliff:g>。"</string>
<string name="exit_button" msgid="5829638404777671253">"返回"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"调试信息"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"读取诊断数据"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"读取汽车的诊断数据。"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"清除诊断数据"</string>
diff --git a/service/res/values-zh-rHK/config.xml b/service/res/values-zh-rHK/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-zh-rHK/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-zh-rHK/strings.xml b/service/res/values-zh-rHK/strings.xml
index 0dca2f2..e344bfb 100644
--- a/service/res/values-zh-rHK/strings.xml
+++ b/service/res/values-zh-rHK/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"基於安全理由,駕駛時無法執行此操作。\n如要繼續,請留待泊車後操作。"</string>
<string name="exit_button_message" msgid="8554690915924055685">"如要以安全應用程式功能重新啟動,請選擇 <xliff:g id="EXIT_BUTTON">%s</xliff:g>。"</string>
<string name="exit_button" msgid="5829638404777671253">"返回"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"讀取診斷資料"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"讀取來自汽車的診斷資料。"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"清除診斷資料"</string>
diff --git a/service/res/values-zh-rTW/config.xml b/service/res/values-zh-rTW/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-zh-rTW/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-zh-rTW/strings.xml b/service/res/values-zh-rTW/strings.xml
index ffb8cc4..1848811 100644
--- a/service/res/values-zh-rTW/strings.xml
+++ b/service/res/values-zh-rTW/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"為了你的安全,開車期間不得進行這個活動。\n如要繼續,請先停車。"</string>
<string name="exit_button_message" msgid="8554690915924055685">"如要使用安全應用程式功能重新啟動,請選取「離開」按鈕 <xliff:g id="EXIT_BUTTON">%s</xliff:g>。"</string>
<string name="exit_button" msgid="5829638404777671253">"返回"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"偵錯資訊"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"讀取診斷資料"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"讀取車輛的診斷資料。"</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"清除診斷資料"</string>
diff --git a/service/res/values-zu/config.xml b/service/res/values-zu/config.xml
deleted file mode 100644
index f2b960f..0000000
--- a/service/res/values-zu/config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 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.
-*/
- -->
-
-<!-- Resources to configure car service based on each OEM's preference. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
- <string name="instrumentClusterRendererService" msgid="2416852774232083347">"android.car.cluster.sample/.ClusterRenderingServiceImpl"</string>
- <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
- <string name="activityWhitelist" msgid="1814434236909655273"></string>
- <!-- no translation found for systemActivityWhitelist (1256445723884668706) -->
- <skip />
- <string name="activityBlacklist" msgid="4824386090073724380"></string>
- <string-array name="allowedAppInstallSources">
- </string-array>
- <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
- <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
- <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
-</resources>
diff --git a/service/res/values-zu/strings.xml b/service/res/values-zu/strings.xml
index 9966b54..7225857 100644
--- a/service/res/values-zu/strings.xml
+++ b/service/res/values-zu/strings.xml
@@ -69,7 +69,6 @@
<string name="activity_blocked_text" msgid="5342114426610711378">"Ngokuphepha kwakho, lo msebenzi awutholakali uma ushayela.\nUkuze uqhubeke, linda uze umiswe."</string>
<string name="exit_button_message" msgid="8554690915924055685">"Ukuze uqalise futhi ngezici zohlelo lokusebenza, khetha <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
<string name="exit_button" msgid="5829638404777671253">"Emuva"</string>
- <string name="debug_button_text" msgid="6395881820644544676">"ulwazi Lokususa iphutha"</string>
<string name="car_permission_label_diag_read" msgid="7248894224877702604">"funda idatha yokuxilonga"</string>
<string name="car_permission_desc_diag_read" msgid="1121426363040966178">"Ukufunda idatha yokuxilonga kusuka emotweni."</string>
<string name="car_permission_label_diag_clear" msgid="4783070510879698157">"sula idatha yokuxilonga"</string>
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/res/values/strings.xml b/service/res/values/strings.xml
index c5216c3..3d8a402 100644
--- a/service/res/values/strings.xml
+++ b/service/res/values/strings.xml
@@ -261,4 +261,8 @@
<!-- The package name of the media application that will be selected as the default [CHAR LIMIT=NONE] -->
<string name="default_media_application" translatable="false">com.android.bluetooth</string>
+ <!-- The package name of the default bugreport application that can use CarBugreportServiceManager.
+ There is no default bugreporting app.-->
+ <string name="default_car_bugreport_application" translatable="false"></string>
+
</resources>
diff --git a/service/src/com/android/car/CarBugreportManagerService.java b/service/src/com/android/car/CarBugreportManagerService.java
index 25592e8..26a306b 100644
--- a/service/src/com/android/car/CarBugreportManagerService.java
+++ b/service/src/com/android/car/CarBugreportManagerService.java
@@ -21,12 +21,14 @@
import android.car.ICarBugreportCallback;
import android.car.ICarBugreportService;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.net.LocalSocket;
import android.net.LocalSocketAddress;
-import android.os.Build;
+import android.os.Binder;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.ParcelFileDescriptor;
+import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.SystemProperties;
@@ -63,6 +65,11 @@
// The socket at /dev/socket/dumpstate to communicate with dumpstate.
private static final String DUMPSTATE_SOCKET = "dumpstate";
+ // The socket definitions must match the actual socket names defined in car_bugreportd service
+ // definition.
+ private static final String BUGREPORT_PROGRESS_SOCKET = "car_br_progress_socket";
+ private static final String BUGREPORT_OUTPUT_SOCKET = "car_br_output_socket";
+
private static final int SOCKET_CONNECTION_MAX_RETRY = 10;
/**
@@ -76,21 +83,136 @@
@Override
public void init() {
- // Initialize handler only if build is debuggable.
- if (Build.IS_DEBUGGABLE) {
- mHandlerThread = new HandlerThread(TAG);
- mHandlerThread.start();
- mHandler = new Handler(mHandlerThread.getLooper());
- }
+ mHandlerThread = new HandlerThread(TAG);
+ mHandlerThread.start();
+ mHandler = new Handler(mHandlerThread.getLooper());
}
@Override
public void release() {
- if (mHandlerThread != null) {
- mHandlerThread.quitSafely();
+ mHandlerThread.quitSafely();
+ }
+
+ @Override
+ @RequiresPermission(android.Manifest.permission.DUMP)
+ public void requestZippedBugreport(ParcelFileDescriptor data, ParcelFileDescriptor progress,
+ ICarBugreportCallback callback) {
+
+ // Check the caller has proper permission
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP,
+ "requestZippedBugreport");
+ // Check the caller is signed with platform keys
+ PackageManager pm = mContext.getPackageManager();
+ int callingUid = Binder.getCallingUid();
+ if (pm.checkSignatures(Process.myUid(), callingUid) != PackageManager.SIGNATURE_MATCH) {
+ throw new SecurityException("Caller " + pm.getNameForUid(callingUid)
+ + " does not have the right signature");
+ }
+ // Check the caller is the default designated bugreport app
+ String defaultAppPkgName = mContext.getString(R.string.default_car_bugreport_application);
+ String[] packageNamesForCallerUid = pm.getPackagesForUid(callingUid);
+ boolean found = false;
+ if (packageNamesForCallerUid != null) {
+ for (String packageName : packageNamesForCallerUid) {
+ if (defaultAppPkgName.equals(packageName)) {
+ found = true;
+ break;
+ }
+ }
+ }
+ if (!found) {
+ throw new SecurityException("Caller " + pm.getNameForUid(callingUid)
+ + " is not a designated bugreport app");
+ }
+
+ synchronized (mLock) {
+ requestZippedBugReportLocked(data, progress, callback);
}
}
+ @GuardedBy("mLock")
+ private void requestZippedBugReportLocked(ParcelFileDescriptor data,
+ ParcelFileDescriptor progress, ICarBugreportCallback callback) {
+ if (mIsServiceRunning) {
+ Slog.w(TAG, "Bugreport Service already running");
+ reportError(callback, CarBugreportManagerCallback.CAR_BUGREPORT_IN_PROGRESS);
+ return;
+ }
+ mIsServiceRunning = true;
+ mHandler.post(() -> startBugreportd(data, progress, callback));
+ }
+
+ private void startBugreportd(ParcelFileDescriptor data, ParcelFileDescriptor progress,
+ ICarBugreportCallback callback) {
+ readBugreport(data, progress, callback);
+ synchronized (mLock) {
+ mIsServiceRunning = false;
+ }
+ }
+
+ private void readBugreport(ParcelFileDescriptor output, ParcelFileDescriptor progress,
+ ICarBugreportCallback callback) {
+ Slog.i(TAG, "Starting car-bugreportd");
+ try {
+ SystemProperties.set("ctl.start", "car-bugreportd");
+ } catch (RuntimeException e) {
+ Slog.e(TAG, "Failed to start car-bugreportd", e);
+ reportError(callback, CarBugreportManagerCallback.CAR_BUGREPORT_DUMPSTATE_FAILED);
+ return;
+ }
+ // The native service first generates the progress data. Once it writes the progress
+ // data fully, it closes the socket and writes the zip file. So we read both files
+ // sequentially here.
+ if (!readSocket(BUGREPORT_PROGRESS_SOCKET, progress, callback)) {
+ Slog.e(TAG, "failed reading bugreport progress socket");
+ reportError(callback, CarBugreportManagerCallback.CAR_BUGREPORT_DUMPSTATE_FAILED);
+ return;
+ }
+ if (!readSocket(BUGREPORT_OUTPUT_SOCKET, output, callback)) {
+ Slog.i(TAG, "failed reading bugreport output socket");
+ reportError(callback, CarBugreportManagerCallback.CAR_BUGREPORT_DUMPSTATE_FAILED);
+ return;
+ }
+ Slog.i(TAG, "finished reading bugreport");
+ try {
+ callback.onFinished();
+ } catch (RemoteException e) {
+ Slog.e(TAG, "onFinished() failed: " + e.getMessage());
+ }
+ }
+
+ private boolean readSocket(String name, ParcelFileDescriptor pfd,
+ ICarBugreportCallback callback) {
+ LocalSocket localSocket;
+
+ try {
+ localSocket = connectSocket(name);
+ } catch (IOException e) {
+ Slog.e(TAG, "Failed connecting to socket " + name, e);
+ reportError(callback,
+ CarBugreportManagerCallback.CAR_BUGREPORT_DUMPSTATE_CONNECTION_FAILED);
+ // Early out if connection to socket fails.
+ return false;
+ }
+
+ try (
+ DataInputStream in = new DataInputStream(localSocket.getInputStream());
+ DataOutputStream out =
+ new DataOutputStream(new ParcelFileDescriptor.AutoCloseOutputStream(pfd));
+ ) {
+ rawCopyStream(out, in);
+ } catch (IOException | RuntimeException e) {
+ Slog.e(TAG, "Failed to grab dump state " + name, e);
+ reportError(callback, CarBugreportManagerCallback.CAR_BUGREPORT_DUMPSTATE_FAILED);
+ return false;
+ }
+ return true;
+ }
+
+
+ /**
+ * This API and all descendants will be removed once the clients transition to new method
+ */
@Override
@RequiresPermission(android.Manifest.permission.DUMP)
public void requestBugreport(ParcelFileDescriptor pfd, ICarBugreportCallback callback) {
@@ -127,10 +249,6 @@
}
}
- @Override
- public void dump(PrintWriter writer) {
- }
-
private void dumpStateToFileWrapper(ParcelFileDescriptor pfd, ICarBugreportCallback callback) {
dumpStateToFile(pfd, callback);
synchronized (mLock) {
@@ -138,6 +256,11 @@
}
}
+ @Override
+ public void dump(PrintWriter writer) {
+ // TODO(sgurun) implement
+ }
+
private void dumpStateToFile(ParcelFileDescriptor pfd, ICarBugreportCallback callback) {
if (DEBUG) {
Slog.d(TAG, "Dumpstate to file");
@@ -155,7 +278,7 @@
}
try {
- localSocket = connectToDumpstateService();
+ localSocket = connectSocket(DUMPSTATE_SOCKET);
} catch (IOException e) {
Slog.e(TAG, "Timed out connecting to dumpstate socket", e);
reportError(callback,
@@ -184,7 +307,7 @@
}
}
- private LocalSocket connectToDumpstateService() throws IOException {
+ private LocalSocket connectSocket(String socketName) throws IOException {
LocalSocket socket = new LocalSocket();
// The dumpstate socket will be created by init upon receiving the
// service request. It may not be ready by this point. So we will
@@ -195,14 +318,15 @@
// first time too.
SystemClock.sleep(/* ms= */ 1000);
try {
- socket.connect(new LocalSocketAddress(DUMPSTATE_SOCKET,
+ socket.connect(new LocalSocketAddress(socketName,
LocalSocketAddress.Namespace.RESERVED));
return socket;
} catch (IOException e) {
if (++retryCount >= SOCKET_CONNECTION_MAX_RETRY) {
throw e;
}
- Log.i(TAG, "Failed to connect to dumpstate, will try again: " + e.getMessage());
+ Log.i(TAG, "Failed to connect to" + socketName + ". will try again"
+ + e.getMessage());
}
}
}
diff --git a/service/src/com/android/car/CarMediaService.java b/service/src/com/android/car/CarMediaService.java
index a4e0d6e..bac93f9 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;
@@ -81,10 +83,15 @@
// null if playback has not been started yet.
private MediaController mActiveUserMediaController;
private SessionChangedListener mSessionsListener;
+ private boolean mStartPlayback;
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 +135,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);
@@ -147,6 +158,8 @@
CarLocalServices.getService(CarUserService.class).runOnUser0Unlock(() -> {
mSharedPrefs = mContext.getSharedPreferences(SHARED_PREF, Context.MODE_PRIVATE);
mPrimaryMediaPackage = getLastMediaPackage();
+ mStartPlayback = mSharedPrefs.getInt(PLAYBACK_STATE_KEY, PlaybackState.STATE_NONE)
+ == PlaybackState.STATE_PLAYING;
notifyListeners();
});
}
@@ -217,6 +230,18 @@
}
/**
+ * Attempts to play the current source using MediaController.TransportControls.play()
+ */
+ private void play() {
+ if (mActiveUserMediaController != null) {
+ TransportControls controls = mActiveUserMediaController.getTransportControls();
+ if (controls != null) {
+ controls.play();
+ }
+ }
+ }
+
+ /**
* Attempts to stop the current source using MediaController.TransportControls.stop()
*/
private void stop() {
@@ -331,6 +356,7 @@
stop();
+ mStartPlayback = false;
mPrimaryMediaPackage = packageName;
updateActiveMediaController(mMediaSessionManager
.getActiveSessionsForUser(null, ActivityManager.getCurrentUser()));
@@ -364,6 +390,8 @@
@Override
public void onPlaybackStateChanged(PlaybackState state) {
savePlaybackState(state);
+ // Try to start playback if the new state allows the play action
+ maybeRestartPlayback(state);
}
};
@@ -442,9 +470,22 @@
return new ArrayDeque(Arrays.asList(packageNames));
}
- private void savePlaybackState(PlaybackState state) {
- mSharedPrefs.edit().putInt(PLAYBACK_STATE_KEY, state != null ? state.getState()
- : PlaybackState.STATE_NONE).apply();
+ private void savePlaybackState(PlaybackState playbackState) {
+ int state = playbackState != null ? playbackState.getState() : PlaybackState.STATE_NONE;
+ if (state == PlaybackState.STATE_PLAYING) {
+ // No longer need to request play if audio was resumed already via some other means,
+ // e.g. Assistant starts playback, user uses hardware button, etc.
+ mStartPlayback = false;
+ }
+ mSharedPrefs.edit().putInt(PLAYBACK_STATE_KEY, state).apply();
+ }
+
+ private void maybeRestartPlayback(PlaybackState state) {
+ if (mStartPlayback && state != null
+ && (state.getActions() & PlaybackState.ACTION_PLAY) != 0) {
+ play();
+ mStartPlayback = false;
+ }
}
/**
@@ -462,8 +503,14 @@
for (MediaController controller : mediaControllers) {
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.
+ PlaybackState state = mActiveUserMediaController.getPlaybackState();
+ savePlaybackState(state);
+ mActiveUserMediaController.registerCallback(mMediaControllerCallback, mHandler);
+ maybeRestartPlayback(state);
return;
}
}
diff --git a/service/src/com/android/car/CarProjectionService.java b/service/src/com/android/car/CarProjectionService.java
index 33ed8f6..144804e 100644
--- a/service/src/com/android/car/CarProjectionService.java
+++ b/service/src/com/android/car/CarProjectionService.java
@@ -17,6 +17,7 @@
import static android.car.CarProjectionManager.ProjectionAccessPointCallback.ERROR_GENERIC;
import static android.car.projection.ProjectionStatus.PROJECTION_STATE_INACTIVE;
+import static android.car.projection.ProjectionStatus.PROJECTION_STATE_READY_TO_PROJECT;
import static android.net.wifi.WifiManager.EXTRA_PREVIOUS_WIFI_AP_STATE;
import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_FAILURE_REASON;
import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_INTERFACE_NAME;
@@ -410,7 +411,15 @@
ProjectionReceiverClient client = getOrCreateProjectionReceiverClientLocked(token);
client.mProjectionStatus = status;
- if (status.isActive() || TextUtils.equals(packageName, mCurrentProjectionPackage)) {
+ // If the projection package that's reporting its projection state is the currently
+ // active projection package, update the state. If it is a different package, update the
+ // current projection state if the new package is reporting that it is projecting or if
+ // it is reporting that it's ready to project, and the current package has an inactive
+ // projection state.
+ if (status.isActive()
+ || (status.getState() == PROJECTION_STATE_READY_TO_PROJECT
+ && mCurrentProjectionState == PROJECTION_STATE_INACTIVE)
+ || TextUtils.equals(packageName, mCurrentProjectionPackage)) {
mCurrentProjectionState = status.getState();
mCurrentProjectionPackage = packageName;
}
diff --git a/service/src/com/android/car/ICarImpl.java b/service/src/com/android/car/ICarImpl.java
index 2f90d3d..244ee8b 100644
--- a/service/src/com/android/car/ICarImpl.java
+++ b/service/src/com/android/car/ICarImpl.java
@@ -449,7 +449,7 @@
+ " without permission " + android.Manifest.permission.DUMP);
return;
}
- if (args == null || args.length == 0) {
+ if (args == null || args.length == 0 || (args.length > 0 && "-a".equals(args[0]))) {
writer.println("*dump car service*");
writer.println("*FutureConfig, DEFAULT:" + FeatureConfiguration.DEFAULT);
@@ -702,19 +702,19 @@
switch (arg) {
case PARAM_ON_MODE:
mGarageModeService.forceStartGarageMode();
+ writer.println("Garage mode: " + mGarageModeService.isGarageModeActive());
break;
case PARAM_OFF_MODE:
mGarageModeService.stopAndResetGarageMode();
+ writer.println("Garage mode: " + mGarageModeService.isGarageModeActive());
break;
case PARAM_QUERY_MODE:
- // Nothing to do. Always query at the end anyway.
+ mGarageModeService.dump(writer);
break;
default:
writer.println("Unknown value. Valid argument: " + PARAM_ON_MODE + "|"
+ PARAM_OFF_MODE + "|" + PARAM_QUERY_MODE);
- return;
}
- writer.println("Garage mode: " + mGarageModeService.isGarageModeActive());
}
/**
diff --git a/service/src/com/android/car/VmsSubscriberService.java b/service/src/com/android/car/VmsSubscriberService.java
index fc28978..aaadf4f 100644
--- a/service/src/com/android/car/VmsSubscriberService.java
+++ b/service/src/com/android/car/VmsSubscriberService.java
@@ -200,7 +200,7 @@
VmsHalService hal) {
mContext = context;
mBrokerService = brokerService;
- hal.setVmsSubscriberService(this);
+ hal.setVmsSubscriberService(this, mBrokerService::removeDeadSubscriber);
}
// Implements CarServiceBase interface.
diff --git a/service/src/com/android/car/audio/CarAudioFocus.java b/service/src/com/android/car/audio/CarAudioFocus.java
index 714459e..165caad 100644
--- a/service/src/com/android/car/audio/CarAudioFocus.java
+++ b/service/src/com/android/car/audio/CarAudioFocus.java
@@ -47,6 +47,7 @@
static final int INTERACTION_EXCLUSIVE = 1; // Focus granted, others loose focus
static final int INTERACTION_CONCURRENT = 2; // Focus granted, others keep focus
+
// TODO: Make this an overlayable resource...
// MUSIC = 1, // Music playback
// NAVIGATION = 2, // Navigation directions
@@ -434,6 +435,21 @@
public synchronized void onAudioFocusAbandon(AudioFocusInfo afi) {
Log.i(TAG, "onAudioFocusAbandon " + afi.getClientId());
+ FocusEntry deadEntry = removeFocusEntry(afi);
+
+ if (deadEntry != null) {
+ removeFocusEntryAndRestoreUnblockedWaiters(deadEntry);
+ }
+ }
+
+ /**
+ * Remove Focus entry from focus holder or losers entry lists
+ * @param afi Audio Focus Info to remove
+ * @return Removed Focus Entry
+ */
+ private FocusEntry removeFocusEntry(AudioFocusInfo afi) {
+ Log.i(TAG, "removeFocusEntry " + afi.getClientId());
+
// Remove this entry from our active or pending list
FocusEntry deadEntry = mFocusHolders.remove(afi.getClientId());
if (deadEntry == null) {
@@ -450,11 +466,9 @@
// silently, or else take unexpected action (eg: resume playing spontaneously), or
// else to see "Failure to signal ..." gain/loss error messages in the log from
// this module when a focus change tries to take action on a truly zombie entry.
- return;
}
}
-
- removeFocusEntryAndRestoreUnblockedWaiters(deadEntry);
+ return deadEntry;
}
private void removeFocusEntryAndRestoreUnblockedWaiters(FocusEntry deadEntry) {
@@ -475,32 +489,113 @@
// Add it back into the focus holders list
mFocusHolders.put(entry.getClientId(), entry);
- // Send the focus (re)gain notification
- int result = mAudioManager.dispatchAudioFocusChange(
- entry.mAfi,
- entry.mAfi.getGainRequest(),
- mAudioPolicy);
- if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
- // TODO: Is this actually an error, or is it okay for an entry in the focus
- // stack to NOT have a listener? If that's the case, should we even keep
- // it in the focus stack?
- Log.e(TAG, "Failure to signal gain of audio focus with error: " + result);
- }
+ dispatchFocusGained(entry.mAfi);
+
}
}
}
- public synchronized void dump(PrintWriter writer) {
- writer.println("*CarAudioFocus*");
+ /**
+ * Dispatch focus gain
+ * @param afi Audio focus info
+ * @return AudioManager.AUDIOFOCUS_REQUEST_GRANTED if focus is dispatched successfully
+ */
+ private int dispatchFocusGained(AudioFocusInfo afi) {
+ // Send the focus (re)gain notification
+ int result = mAudioManager.dispatchAudioFocusChange(
+ afi,
+ afi.getGainRequest(),
+ mAudioPolicy);
+ if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+ // TODO: Is this actually an error, or is it okay for an entry in the focus
+ // stack to NOT have a listener? If that's the case, should we even keep
+ // it in the focus stack?
+ Log.e(TAG, "Failure to signal gain of audio focus with error: " + result);
+ }
+ return result;
+ }
- writer.println(" Current Focus Holders:");
+
+ /**
+ * Query the current list of focus loser for uid
+ * @param uid uid to query current focus loser
+ * @return list of current focus losers for uid
+ */
+ ArrayList<AudioFocusInfo> getAudioFocusLosersForUid(int uid) {
+ return getAudioFocusListForUid(uid, mFocusLosers);
+ }
+
+ /**
+ * Query the current list of focus holders for uid
+ * @param uid uid to query current focus holders
+ * @return list of current focus holders that for uid
+ */
+ ArrayList<AudioFocusInfo> getAudioFocusHoldersForUid(int uid) {
+ return getAudioFocusListForUid(uid, mFocusHolders);
+ }
+
+ /**
+ * Query input list for matching uid
+ * @param uid uid to match in map
+ * @param mapToQuery map to query for uid info
+ * @return list of audio focus info that match uid
+ */
+ private ArrayList<AudioFocusInfo> getAudioFocusListForUid(int uid,
+ HashMap<String, FocusEntry> mapToQuery) {
+ ArrayList<AudioFocusInfo> matchingInfoList = new ArrayList<>();
+ for (String clientId : mapToQuery.keySet()) {
+ AudioFocusInfo afi = mapToQuery.get(clientId).mAfi;
+ if (afi.getClientUid() == uid) {
+ matchingInfoList.add(afi);
+ }
+ }
+ return matchingInfoList;
+ }
+
+ /**
+ * Remove the audio focus info, if entry is still active
+ * dispatch lose focus transient to listeners
+ * @param afi Audio Focus info to remove
+ */
+ void removeAudioFocusInfoAndTransientlyLoseFocus(AudioFocusInfo afi) {
+ FocusEntry deadEntry = removeFocusEntry(afi);
+
+ if (deadEntry != null) {
+ sendFocusLoss(deadEntry, AudioManager.AUDIOFOCUS_LOSS_TRANSIENT);
+ removeFocusEntryAndRestoreUnblockedWaiters(deadEntry);
+ }
+ }
+
+ /**
+ * Reevaluate focus request and regain focus
+ * @param afi audio focus info to reevaluate
+ * @return AudioManager.AUDIOFOCUS_REQUEST_GRANTED if focus is granted
+ */
+ int reevaluateAndRegainAudioFocus(AudioFocusInfo afi) {
+ int results = evaluateFocusRequest(afi);
+
+ if (results == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+ return dispatchFocusGained(afi);
+ }
+ return results;
+ }
+
+ /**
+ * dumps the current state of the CarAudioFocus object
+ * @param indent indent to add to each line in the current stream
+ * @param writer stream to write to
+ */
+ public synchronized void dump(String indent, PrintWriter writer) {
+ writer.printf("%s*CarAudioFocus*\n", indent);
+
+ writer.printf("%s\tCurrent Focus Holders:\n", indent);
for (String clientId : mFocusHolders.keySet()) {
- System.out.println(clientId);
+ writer.printf("%s\t\t%s\n", indent, clientId);
}
- writer.println(" Transient Focus Losers:");
+ writer.printf("%s\tTransient Focus Losers:\n", indent);
for (String clientId : mFocusLosers.keySet()) {
- System.out.println(clientId);
+ writer.printf("%s\t\t%s\n", indent, clientId);
}
}
diff --git a/service/src/com/android/car/audio/CarAudioService.java b/service/src/com/android/car/audio/CarAudioService.java
index 88d3463..62bcd00 100644
--- a/service/src/com/android/car/audio/CarAudioService.java
+++ b/service/src/com/android/car/audio/CarAudioService.java
@@ -31,6 +31,7 @@
import android.media.AudioAttributes;
import android.media.AudioDeviceInfo;
import android.media.AudioDevicePort;
+import android.media.AudioFocusInfo;
import android.media.AudioFormat;
import android.media.AudioGain;
import android.media.AudioGainConfig;
@@ -65,7 +66,9 @@
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.stream.Collectors;
@@ -187,10 +190,14 @@
};
private AudioPolicy mAudioPolicy;
- private CarAudioFocus mFocusHandler;
+ private CarZonesAudioFocus mFocusHandler;
private String mCarAudioConfigurationPath;
private CarAudioZone[] mCarAudioZones;
+ // TODO do not store uid mapping here instead use the uid
+ // device affinity in audio policy when available
+ private Map<Integer, Integer> mUidToZoneMap;
+
public CarAudioService(Context context) {
mContext = context;
mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
@@ -198,6 +205,7 @@
mUseDynamicRouting = mContext.getResources().getBoolean(R.bool.audioUseDynamicRouting);
mPersistMasterMuteState = mContext.getResources().getBoolean(
R.bool.audioPersistMasterMuteState);
+ mUidToZoneMap = new HashMap<>();
}
/**
@@ -277,7 +285,18 @@
for (CarAudioZone zone : mCarAudioZones) {
zone.dump("\t", writer);
}
+ writer.println();
+ writer.println("\tUID to Zone Mapping:");
+ for (int callingId : mUidToZoneMap.keySet()) {
+ writer.printf("\t\tUID %d mapped to zone %d\n",
+ callingId,
+ mUidToZoneMap.get(callingId));
+ }
+ //Print focus handler info
+ writer.println();
+ mFocusHandler.dump("\t", writer);
}
+
}
@Override
@@ -460,7 +479,9 @@
// Configure our AudioPolicy to handle focus events.
// This gives us the ability to decide which audio focus requests to accept and bypasses
// the framework ducking logic.
- mFocusHandler = new CarAudioFocus(mAudioManager, mContext.getPackageManager());
+ mFocusHandler = new CarZonesAudioFocus(mAudioManager,
+ mContext.getPackageManager(),
+ mCarAudioZones);
builder.setAudioPolicyFocusListener(mFocusHandler);
builder.setIsAudioFocusPolicy(true);
}
@@ -736,6 +757,182 @@
}
}
+ /**
+ * Gets the ids of all available audio zones
+ *
+ * @return Array of available audio zones ids
+ */
+ @Override
+ public @NonNull int[] getAudioZoneIds() {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS);
+ synchronized (mImplLock) {
+ return Arrays.stream(mCarAudioZones).mapToInt(CarAudioZone::getId).toArray();
+ }
+ }
+
+ /**
+ * Gets the audio zone id currently mapped to uid,
+ * defaults to PRIMARY_AUDIO_ZONE if no mapping exist
+ *
+ * @param uid The uid
+ * @return zone id mapped to uid
+ */
+ @Override
+ public int getZoneIdForUid(int uid) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS);
+ synchronized (mImplLock) {
+ if (!mUidToZoneMap.containsKey(uid)) {
+ Log.i(CarLog.TAG_AUDIO, "getZoneIdForUid uid "
+ + uid + " does not have a zone. Defaulting to PRIMARY_AUDIO_ZONE: "
+ + CarAudioManager.PRIMARY_AUDIO_ZONE);
+
+ // Must be added to PRIMARY_AUDIO_ZONE otherwise
+ // audio may be routed to other devices
+ // that match the audio criterion (i.e. usage)
+ setZoneIdForUidNoCheckLocked(CarAudioManager.PRIMARY_AUDIO_ZONE, uid);
+ }
+
+ return mUidToZoneMap.get(uid);
+ }
+ }
+ /**
+ * Maps the audio zone id to uid
+ *
+ * @param zoneId The audio zone id
+ * @param uid The uid to map
+ * @return true if the device affinities, for devices in zone, are successfully set
+ */
+ @Override
+ public boolean setZoneIdForUid(int zoneId, int uid) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS);
+ synchronized (mImplLock) {
+ Log.i(CarLog.TAG_AUDIO, "setZoneIdForUid Calling uid "
+ + uid + " mapped to : "
+ + zoneId);
+
+ // Figure out if anything is currently holding focus,
+ // This will change the focus to transient loss while we are switching zones
+ Integer currentZoneId = mUidToZoneMap.get(uid);
+ ArrayList<AudioFocusInfo> currentFocusHoldersForUid = new ArrayList<>();
+ ArrayList<AudioFocusInfo> currentFocusLosersForUid = new ArrayList<>();
+ if (currentZoneId != null) {
+ currentFocusHoldersForUid = mFocusHandler.getAudioFocusHoldersForUid(uid,
+ currentZoneId.intValue());
+ currentFocusLosersForUid = mFocusHandler.getAudioFocusLosersForUid(uid,
+ currentZoneId.intValue());
+ if (!currentFocusHoldersForUid.isEmpty() || !currentFocusLosersForUid.isEmpty()) {
+ // Order matters here: Remove the focus losers first
+ // then do the current holder to prevent loser from popping up while
+ // the focus is being remove for current holders
+ // Remove focus for current focus losers
+ mFocusHandler.transientlyLoseInFocusInZone(currentFocusLosersForUid,
+ currentZoneId.intValue());
+ // Remove focus for current holders
+ mFocusHandler.transientlyLoseInFocusInZone(currentFocusHoldersForUid,
+ currentZoneId.intValue());
+ }
+ }
+
+ // if the current uid is in the list
+ // remove it from the list
+
+ if (checkAndRemoveUidLocked(uid)) {
+ if (setZoneIdForUidNoCheckLocked(zoneId, uid)) {
+ // Order matters here: Regain focus for
+ // Previously lost focus holders then regain
+ // focus for holders that had it last
+ // Regain focus for the focus losers from previous zone
+ if (!currentFocusLosersForUid.isEmpty()) {
+ regainAudioFocusLocked(currentFocusLosersForUid, zoneId);
+ }
+ // Regain focus for the focus holders from previous zone
+ if (!currentFocusHoldersForUid.isEmpty()) {
+ regainAudioFocusLocked(currentFocusHoldersForUid, zoneId);
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+
+ /**
+ * Regain focus for the focus list passed in
+ * @param afiList focus info list to regain
+ * @param zoneId zone id where the focus holder belong
+ */
+ void regainAudioFocusLocked(ArrayList<AudioFocusInfo> afiList, int zoneId) {
+ for (AudioFocusInfo info : afiList) {
+ if (mFocusHandler.reevaluateAndRegainAudioFocus(info)
+ != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+ Log.i(CarLog.TAG_AUDIO,
+ " Focus could not be granted for entry "
+ + info.getClientId()
+ + " uid " + info.getClientUid()
+ + " in zone " + zoneId);
+ }
+ }
+ }
+
+ /**
+ * Removes the current mapping of the uid, focus will be lost in zone
+ * @param uid The uid to remove
+ * return true if all the devices affinities currently
+ * mapped to uid are successfully removed
+ */
+ @Override
+ public boolean clearZoneIdForUid(int uid) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS);
+ synchronized (mImplLock) {
+ return checkAndRemoveUidLocked(uid);
+ }
+ }
+
+ /**
+ * Sets the zone id for uid
+ * @param zoneId zone id to map to uid
+ * @param uid uid to map
+ * @return true if setting uid device affinity is successful
+ */
+ private boolean setZoneIdForUidNoCheckLocked(int zoneId, int uid) {
+ Log.d(CarLog.TAG_AUDIO, "setZoneIdForUidNoCheck Calling uid "
+ + uid + " mapped to " + zoneId);
+ //Request to add uid device affinity
+ if (mAudioPolicy.setUidDeviceAffinity(uid, mCarAudioZones[zoneId].getAudioDeviceInfos())) {
+ // TODO do not store uid mapping here instead use the uid
+ // device affinity in audio policy when available
+ mUidToZoneMap.put(uid, zoneId);
+ return true;
+ }
+ Log.w(CarLog.TAG_AUDIO, "setZoneIdForUidNoCheck Failed set device affinity for uid "
+ + uid + " in zone " + zoneId);
+ return false;
+ }
+
+ /**
+ * Check if uid is attached to a zone and remove it
+ * @param uid unique id to remove
+ * @return true if the uid was successfully removed or mapping was not assigned
+ */
+ private boolean checkAndRemoveUidLocked(int uid) {
+ Integer zoneId = mUidToZoneMap.get(uid);
+ if (zoneId != null) {
+ Log.i(CarLog.TAG_AUDIO, "checkAndRemoveUid removing Calling uid "
+ + uid + " from zone " + zoneId);
+ if (mAudioPolicy.removeUidDeviceAffinity(uid)) {
+ // TODO use the uid device affinity in audio policy when available
+ mUidToZoneMap.remove(uid);
+ return true;
+ }
+ //failed to remove device affinity from zone devices
+ Log.w(CarLog.TAG_AUDIO,
+ "checkAndRemoveUid Failed remove device affinity for uid "
+ + uid + " in zone " + zoneId);
+ return false;
+ }
+ return true;
+ }
+
@Override
public void registerVolumeCallback(@NonNull IBinder binder) {
synchronized (mImplLock) {
diff --git a/service/src/com/android/car/audio/CarAudioZone.java b/service/src/com/android/car/audio/CarAudioZone.java
index 36bbf42..4bdf0b7 100644
--- a/service/src/com/android/car/audio/CarAudioZone.java
+++ b/service/src/com/android/car/audio/CarAudioZone.java
@@ -16,6 +16,7 @@
package com.android.car.audio;
import android.car.media.CarAudioManager;
+import android.media.AudioDeviceInfo;
import android.util.Log;
import android.view.DisplayAddress;
@@ -74,6 +75,19 @@
return mVolumeGroups.get(groupId);
}
+ /**
+ * @return Snapshot of available {@link AudioDeviceInfo}s in List.
+ */
+ List<AudioDeviceInfo> getAudioDeviceInfos() {
+ final List<AudioDeviceInfo> devices = new ArrayList<>();
+ for (CarVolumeGroup group : mVolumeGroups) {
+ for (int busNumber : group.getBusNumbers()) {
+ devices.add(group.getCarAudioDeviceInfoForBus(busNumber).getAudioDeviceInfo());
+ }
+ }
+ return devices;
+ }
+
int getVolumeGroupCount() {
return mVolumeGroups.size();
}
diff --git a/service/src/com/android/car/audio/CarAudioZonesHelper.java b/service/src/com/android/car/audio/CarAudioZonesHelper.java
index 00cbb4b..17d9393 100644
--- a/service/src/com/android/car/audio/CarAudioZonesHelper.java
+++ b/service/src/com/android/car/audio/CarAudioZonesHelper.java
@@ -31,6 +31,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -59,7 +60,6 @@
private static final String ATTR_CONTEXT_NAME = "context";
private static final String ATTR_PHYSICAL_PORT = "port";
private static final int SUPPORTED_VERSION = 1;
- private static final int NO_XML_RESOURCE = 0;
private static final Map<String, Integer> CONTEXT_NAME_MAP;
@@ -93,7 +93,7 @@
mPortIds = new HashSet<>();
}
- public CarAudioZone[] loadAudioZones() throws IOException, XmlPullParserException {
+ CarAudioZone[] loadAudioZones() throws IOException, XmlPullParserException {
List<CarAudioZone> carAudioZones = new ArrayList<>();
parseCarAudioZones(carAudioZones, mInputStream);
return carAudioZones.toArray(new CarAudioZone[0]);
@@ -139,6 +139,7 @@
}
}
Preconditions.checkArgument(mHasPrimaryZone, "Requires one primary zone");
+ carAudioZones.sort(Comparator.comparing(CarAudioZone::getId));
}
private CarAudioZone parseAudioZone(XmlPullParser parser)
@@ -181,7 +182,7 @@
private DisplayAddress.Physical parsePhysicalDisplayAddress(XmlPullParser parser) {
String port = parser.getAttributeValue(NAMESPACE, ATTR_PHYSICAL_PORT);
- Long portId;
+ long portId;
try {
portId = Long.parseLong(port);
} catch (NumberFormatException e) {
diff --git a/service/src/com/android/car/audio/CarAudioZonesHelperLegacy.java b/service/src/com/android/car/audio/CarAudioZonesHelperLegacy.java
index b0df7e8..7f11275 100644
--- a/service/src/com/android/car/audio/CarAudioZonesHelperLegacy.java
+++ b/service/src/com/android/car/audio/CarAudioZonesHelperLegacy.java
@@ -74,7 +74,7 @@
}
}
- public CarAudioZone[] loadAudioZones() {
+ CarAudioZone[] loadAudioZones() {
final CarAudioZone zone = new CarAudioZone(CarAudioManager.PRIMARY_AUDIO_ZONE,
"Primary zone");
for (CarVolumeGroup group : loadVolumeGroups()) {
diff --git a/service/src/com/android/car/audio/CarZonesAudioFocus.java b/service/src/com/android/car/audio/CarZonesAudioFocus.java
new file mode 100644
index 0000000..9b4b945
--- /dev/null
+++ b/service/src/com/android/car/audio/CarZonesAudioFocus.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.audio;
+
+import android.annotation.NonNull;
+import android.content.pm.PackageManager;
+import android.media.AudioAttributes;
+import android.media.AudioFocusInfo;
+import android.media.AudioManager;
+import android.media.audiopolicy.AudioPolicy;
+import android.util.Log;
+
+import com.android.car.CarLog;
+import com.android.internal.util.Preconditions;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Implements {@link AudioPolicy.AudioPolicyFocusListener}
+ *
+ * @note Manages audio focus on a per zone basis.
+ */
+class CarZonesAudioFocus extends AudioPolicy.AudioPolicyFocusListener {
+
+ private CarAudioService mCarAudioService; // Dynamically assigned just after construction
+ private AudioPolicy mAudioPolicy; // Dynamically assigned just after construction
+
+ private final Map<Integer, CarAudioFocus> mFocusZones = new HashMap<>();
+
+ CarZonesAudioFocus(AudioManager audioManager,
+ PackageManager packageManager,
+ @NonNull CarAudioZone[] carAudioZones) {
+ //Create the zones here, the policy will be set setOwningPolicy,
+ // which is called right after this constructor.
+
+ Preconditions.checkNotNull(carAudioZones);
+ Preconditions.checkArgument(carAudioZones.length != 0,
+ "There must be a minimum of one audio zone");
+
+ //Create focus for all the zones
+ for (CarAudioZone audioZone : carAudioZones) {
+ Log.d(CarLog.TAG_AUDIO,
+ "CarZonesAudioFocus adding new zone " + audioZone.getId());
+ CarAudioFocus zoneFocusListener = new CarAudioFocus(audioManager, packageManager);
+ mFocusZones.put(audioZone.getId(), zoneFocusListener);
+ }
+ }
+
+
+ /**
+ * Query the current list of focus loser in zoneId for uid
+ * @param uid uid to query for current focus losers
+ * @param zoneId zone id to query for info
+ * @return list of current focus losers for uid
+ */
+ ArrayList<AudioFocusInfo> getAudioFocusLosersForUid(int uid, int zoneId) {
+ CarAudioFocus focus = mFocusZones.get(zoneId);
+ return focus.getAudioFocusLosersForUid(uid);
+ }
+
+ /**
+ * Query the current list of focus holders in zoneId for uid
+ * @param uid uid to query for current focus holders
+ * @param zoneId zone id to query
+ * @return list of current focus holders that for uid
+ */
+ ArrayList<AudioFocusInfo> getAudioFocusHoldersForUid(int uid, int zoneId) {
+ CarAudioFocus focus = mFocusZones.get(zoneId);
+ return focus.getAudioFocusHoldersForUid(uid);
+ }
+
+ /**
+ * For each entry in list, transiently lose focus
+ * @param afiList list of audio focus entries
+ * @param zoneId zone id where focus should should be lost
+ */
+ void transientlyLoseInFocusInZone(@NonNull ArrayList<AudioFocusInfo> afiList,
+ int zoneId) {
+ CarAudioFocus focus = mFocusZones.get(zoneId);
+
+ for (AudioFocusInfo info : afiList) {
+ focus.removeAudioFocusInfoAndTransientlyLoseFocus(info);
+ }
+ }
+
+ int reevaluateAndRegainAudioFocus(AudioFocusInfo afi) {
+ CarAudioFocus focus = getFocusForUid(afi.getClientUid());
+ return focus.reevaluateAndRegainAudioFocus(afi);
+ }
+
+
+ /**
+ * Sets the owning policy of the audio focus
+ *
+ * @param audioService owning car audio service
+ * @param parentPolicy owning parent car audio policy
+ * @Note This has to happen after the construction to avoid a chicken and egg
+ * problem when setting up the AudioPolicy which must depend on this object.
+ */
+ void setOwningPolicy(CarAudioService audioService, AudioPolicy parentPolicy) {
+ mCarAudioService = audioService;
+ mAudioPolicy = parentPolicy;
+
+ for (int zoneId : mFocusZones.keySet()) {
+ mFocusZones.get(zoneId).setOwningPolicy(mCarAudioService, mAudioPolicy);
+ }
+ }
+
+ @Override
+ public void onAudioFocusRequest(AudioFocusInfo afi, int requestResult) {
+ CarAudioFocus focus = getFocusForUid(afi.getClientUid());
+ focus.onAudioFocusRequest(afi, requestResult);
+ }
+
+ /**
+ * @see AudioManager#abandonAudioFocus(AudioManager.OnAudioFocusChangeListener, AudioAttributes)
+ * Note that we'll get this call for a focus holder that dies while in the focus stack, so
+ * we don't need to watch for death notifications directly.
+ */
+ @Override
+ public void onAudioFocusAbandon(AudioFocusInfo afi) {
+ CarAudioFocus focus = getFocusForUid(afi.getClientUid());
+ focus.onAudioFocusAbandon(afi);
+ }
+
+ private CarAudioFocus getFocusForUid(int uid) {
+ //getZoneIdForUid defaults to returning default zoneId
+ //if uid has not been mapped, thus the value returned will be
+ //default zone focus
+ int zoneId = mCarAudioService.getZoneIdForUid(uid);
+
+ CarAudioFocus focus = mFocusZones.get(zoneId);
+ return focus;
+ }
+
+ /**
+ * dumps the current state of the CarZoneAudioFocus
+ *
+ * @param indent indent to append to each new line
+ * @param writer stream to write current state
+ */
+ synchronized void dump(String indent, PrintWriter writer) {
+ writer.printf("%s*CarZonesAudioFocus*\n", indent);
+
+ writer.printf("%s\tCar Zones Audio Focus Listeners:\n", indent);
+ Integer[] keys = mFocusZones.keySet().stream().sorted().toArray(Integer[]::new);
+ for (Integer zoneId : keys) {
+ writer.printf("%s\tZone Id: %s", indent, zoneId.toString());
+ mFocusZones.get(zoneId).dump(indent + "\t", writer);
+ }
+ }
+}
diff --git a/service/src/com/android/car/garagemode/Controller.java b/service/src/com/android/car/garagemode/Controller.java
index 347ba73..d7235dd 100644
--- a/service/src/com/android/car/garagemode/Controller.java
+++ b/service/src/com/android/car/garagemode/Controller.java
@@ -28,6 +28,7 @@
import com.android.car.CarLocalServices;
import com.android.internal.annotations.VisibleForTesting;
+import java.util.List;
import java.util.concurrent.CompletableFuture;
/**
@@ -105,6 +106,13 @@
}
/**
+ * @return The names of the jobs that Garage Mode is waiting for
+ */
+ List<String> pendingGarageModeJobs() {
+ return mGarageMode.pendingJobs();
+ }
+
+ /**
* Wrapper method to send a broadcast
*
* @param i intent that contains broadcast data
diff --git a/service/src/com/android/car/garagemode/GarageMode.java b/service/src/com/android/car/garagemode/GarageMode.java
index b13045e..1165de5 100644
--- a/service/src/com/android/car/garagemode/GarageMode.java
+++ b/service/src/com/android/car/garagemode/GarageMode.java
@@ -63,6 +63,7 @@
private boolean mGarageModeActive;
private JobScheduler mJobScheduler;
+ private List<String> mPendingJobs = new ArrayList<>();
private Handler mHandler;
private Runnable mRunnable = new Runnable() {
@Override
@@ -129,6 +130,10 @@
return mGarageModeActive;
}
+ synchronized List<String> pendingJobs() {
+ return mPendingJobs;
+ }
+
void enterGarageMode(CompletableFuture<Void> future) {
LOG.d("Entering GarageMode");
synchronized (this) {
@@ -141,9 +146,7 @@
ArrayList<Integer> startedUsers =
CarLocalServices.getService(CarUserService.class).startAllBackgroundUsers();
synchronized (this) {
- for (Integer user : startedUsers) {
- mStartedBackgroundUsers.add(user);
- }
+ mStartedBackgroundUsers.addAll(startedUsers);
}
}
@@ -224,15 +227,22 @@
mHandler.removeCallbacks(mRunnable);
}
- private int numberOfJobsRunning() {
+ private synchronized int numberOfJobsRunning() {
List<JobInfo> startedJobs = mJobScheduler.getStartedJobs();
int count = 0;
+ List<String> currentPendingJobs = new ArrayList<>();
for (JobSnapshot snap : mJobScheduler.getAllJobSnapshots()) {
if (startedJobs.contains(snap.getJobInfo())
&& snap.getJobInfo().isRequireDeviceIdle()) {
+ currentPendingJobs.add(snap.getJobInfo().toString());
count++;
}
}
+ if (count > 0) {
+ // We have something pending, so update the list.
+ // (Otherwise, keep the old list.)
+ mPendingJobs = currentPendingJobs;
+ }
return count;
}
}
diff --git a/service/src/com/android/car/garagemode/GarageModeService.java b/service/src/com/android/car/garagemode/GarageModeService.java
index f28bb35..8527bc7 100644
--- a/service/src/com/android/car/garagemode/GarageModeService.java
+++ b/service/src/com/android/car/garagemode/GarageModeService.java
@@ -23,6 +23,7 @@
import com.android.internal.annotations.VisibleForTesting;
import java.io.PrintWriter;
+import java.util.List;
/**
* Main service container for car Garage Mode.
@@ -63,11 +64,24 @@
/**
* Dumps useful information about GarageMode
- * @param writer
+ * @param writer Where to dump the information
*/
@Override
public void dump(PrintWriter writer) {
- writer.println("GarageModeInProgress " + mController.isGarageModeActive());
+ boolean isActive = mController.isGarageModeActive();
+ writer.println("GarageModeInProgress " + isActive);
+ List<String> jobs = mController.pendingGarageModeJobs();
+ if (isActive) {
+ writer.println("GarageMode is currently waiting for " + jobs.size() + " jobs:");
+ } else {
+ writer.println("GarageMode was last waiting for " + jobs.size() + " jobs:");
+ }
+ // Dump the names of the jobs that GM is/was waiting for
+ int jobNumber = 1;
+ for (String job : jobs) {
+ writer.println(" " + jobNumber + ": " + job);
+ jobNumber++;
+ }
}
/**
diff --git a/service/src/com/android/car/hal/InputHalService.java b/service/src/com/android/car/hal/InputHalService.java
index f0993eb..d719510 100644
--- a/service/src/com/android/car/hal/InputHalService.java
+++ b/service/src/com/android/car/hal/InputHalService.java
@@ -140,12 +140,19 @@
KeyEvent.ACTION_DOWN : KeyEvent.ACTION_UP;
int code = v.value.int32Values.get(1);
int display = v.value.int32Values.get(2);
+ int indentsCount = v.value.int32Values.size() < 4 ? 1 : v.value.int32Values.get(3);
if (DBG) {
- Log.i(CarLog.TAG_INPUT, "hal event code:" + code + ", action:" + action +
- ", display:" + display);
+ Log.i(CarLog.TAG_INPUT, new StringBuilder()
+ .append("hal event code:").append(code)
+ .append(", action:").append(action)
+ .append(", display: ").append(display)
+ .append(", number of indents: ").append(indentsCount)
+ .toString());
}
-
- dispatchKeyEvent(listener, action, code, display);
+ while (indentsCount > 0) {
+ indentsCount--;
+ dispatchKeyEvent(listener, action, code, display);
+ }
}
}
diff --git a/service/src/com/android/car/hal/VmsHalService.java b/service/src/com/android/car/hal/VmsHalService.java
index 1f6c2e2..487ec1f 100644
--- a/service/src/com/android/car/hal/VmsHalService.java
+++ b/service/src/com/android/car/hal/VmsHalService.java
@@ -40,26 +40,30 @@
import android.hardware.automotive.vehicle.V2_0.VmsMessageWithLayerIntegerValuesIndex;
import android.hardware.automotive.vehicle.V2_0.VmsOfferingMessageIntegerValuesIndex;
import android.hardware.automotive.vehicle.V2_0.VmsPublisherInformationIntegerValuesIndex;
+import android.hardware.automotive.vehicle.V2_0.VmsStartSessionMessageIntegerValuesIndex;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
+import android.os.SystemClock;
import android.util.ArraySet;
import android.util.Log;
-import androidx.annotation.GuardedBy;
import androidx.annotation.VisibleForTesting;
import com.android.car.CarLog;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
/**
* VMS client implementation that proxies VmsPublisher/VmsSubscriber API calls to the Vehicle HAL
@@ -72,18 +76,20 @@
private static final String TAG = "VmsHalService";
private static final int HAL_PROPERTY_ID = VehicleProperty.VEHICLE_MAP_SERVICE;
private static final int NUM_INTEGERS_IN_VMS_LAYER = 3;
+ private static final int UNKNOWN_CLIENT_ID = -1;
private final VehicleHal mVehicleHal;
+ private final int mCoreId;
+ private final MessageQueue mMessageQueue;
private volatile boolean mIsSupported = false;
- private IBinder mPublisherToken;
private IVmsPublisherService mPublisherService;
- private IVmsSubscriberService mSubscriberService;
+ private Consumer<IBinder> mPublisherOnHalConnected;
+ private Runnable mPublisherOnHalDisconnected;
+ private IBinder mPublisherToken;
- @GuardedBy("this")
- private HandlerThread mHandlerThread;
- @GuardedBy("this")
- private Handler mHandler;
+ private IVmsSubscriberService mSubscriberService;
+ private Consumer<IVmsSubscriberClient> mSuscriberOnHalDisconnected;
private int mSubscriptionStateSequence = -1;
private int mAvailableLayersSequence = -1;
@@ -97,14 +103,19 @@
@Override
public void onVmsSubscriptionChange(VmsSubscriptionState subscriptionState) {
- // Registration of this callback is handled by VmsPublisherService.
- // As a result, HAL support must be checked whenever the callback is triggered.
- if (!mIsSupported) {
+ if (DBG) Log.d(TAG, "Handling a subscription state change");
+ // Drop out-of-order notifications
+ if (subscriptionState.getSequenceNumber() <= mSubscriptionStateSequence) {
+ Log.w(TAG,
+ String.format("Out of order subscription state received: %d (expecting %d)",
+ subscriptionState.getSequenceNumber(),
+ mSubscriptionStateSequence + 1));
return;
}
- if (DBG) Log.d(TAG, "Handling a subscription state change");
- Message.obtain(mHandler, VmsMessageType.SUBSCRIPTIONS_CHANGE, subscriptionState)
- .sendToTarget();
+ mSubscriptionStateSequence = subscriptionState.getSequenceNumber();
+ mMessageQueue.enqueue(VmsMessageType.SUBSCRIPTIONS_CHANGE,
+ createSubscriptionStateMessage(VmsMessageType.SUBSCRIPTIONS_CHANGE,
+ subscriptionState));
}
};
@@ -112,67 +123,87 @@
@Override
public void onVmsMessageReceived(VmsLayer layer, byte[] payload) {
if (DBG) Log.d(TAG, "Handling a data message for Layer: " + layer);
- // TODO(b/124130256): Set publisher ID of data message
- Message.obtain(mHandler, VmsMessageType.DATA, createDataMessage(layer, 0, payload))
- .sendToTarget();
+ mMessageQueue.enqueue(VmsMessageType.DATA, createDataMessage(layer, payload));
}
@Override
public void onLayersAvailabilityChanged(VmsAvailableLayers availableLayers) {
if (DBG) Log.d(TAG, "Handling a layer availability change");
- Message.obtain(mHandler, VmsMessageType.AVAILABILITY_CHANGE, availableLayers)
- .sendToTarget();
+ // Drop out-of-order notifications
+ if (availableLayers.getSequence() <= mAvailableLayersSequence) {
+ Log.w(TAG,
+ String.format("Out of order layer availability received: %d (expecting %d)",
+ availableLayers.getSequence(),
+ mAvailableLayersSequence + 1));
+ return;
+ }
+ mAvailableLayersSequence = availableLayers.getSequence();
+ mMessageQueue.enqueue(VmsMessageType.AVAILABILITY_CHANGE,
+ createAvailableLayersMessage(VmsMessageType.AVAILABILITY_CHANGE,
+ availableLayers));
}
};
- private final Handler.Callback mHandlerCallback = msg -> {
- int messageType = msg.what;
- VehiclePropValue vehicleProp = null;
- switch (messageType) {
- case VmsMessageType.DATA:
- vehicleProp = (VehiclePropValue) msg.obj;
- break;
- case VmsMessageType.SUBSCRIPTIONS_CHANGE:
- VmsSubscriptionState subscriptionState = (VmsSubscriptionState) msg.obj;
- // Drop out-of-order notifications
- if (subscriptionState.getSequenceNumber() <= mSubscriptionStateSequence) {
- break;
- }
- vehicleProp = createSubscriptionStateMessage(
- VmsMessageType.SUBSCRIPTIONS_CHANGE,
- subscriptionState);
- mSubscriptionStateSequence = subscriptionState.getSequenceNumber();
- break;
- case VmsMessageType.AVAILABILITY_CHANGE:
- VmsAvailableLayers availableLayers = (VmsAvailableLayers) msg.obj;
- // Drop out-of-order notifications
- if (availableLayers.getSequence() <= mAvailableLayersSequence) {
- break;
- }
- vehicleProp = createAvailableLayersMessage(
- VmsMessageType.AVAILABILITY_CHANGE,
- availableLayers);
- mAvailableLayersSequence = availableLayers.getSequence();
- break;
- default:
- Log.e(TAG, "Unexpected message type: " + messageType);
+ private class MessageQueue implements Handler.Callback {
+ private final Set<Integer> mSupportedMessageTypes = new ArraySet<>(Arrays.asList(
+ VmsMessageType.DATA,
+ VmsMessageType.START_SESSION,
+ VmsMessageType.AVAILABILITY_CHANGE,
+ VmsMessageType.SUBSCRIPTIONS_CHANGE
+ ));
+ private HandlerThread mHandlerThread;
+ private Handler mHandler;
+
+ synchronized void init() {
+ mHandlerThread = new HandlerThread(TAG);
+ mHandlerThread.start();
+ mHandler = new Handler(mHandlerThread.getLooper(), this);
}
- if (vehicleProp != null) {
+
+ synchronized void release() {
+ if (mHandlerThread != null) {
+ mHandlerThread.quitSafely();
+ }
+ }
+
+ synchronized void enqueue(int messageType, Object message) {
+ if (mSupportedMessageTypes.contains(messageType)) {
+ Message.obtain(mHandler, messageType, message).sendToTarget();
+ } else {
+ Log.e(TAG, "Unexpected message type: " + VmsMessageType.toString(messageType));
+ }
+ }
+
+ synchronized void clear() {
+ mSupportedMessageTypes.forEach(mHandler::removeMessages);
+ }
+
+ @Override
+ public boolean handleMessage(Message msg) {
+ int messageType = msg.what;
+ VehiclePropValue vehicleProp = (VehiclePropValue) msg.obj;
if (DBG) Log.d(TAG, "Sending " + VmsMessageType.toString(messageType) + " message");
try {
setPropertyValue(vehicleProp);
} catch (RemoteException e) {
Log.e(TAG, "While sending " + VmsMessageType.toString(messageType));
}
+ return true;
}
- return true;
- };
+ }
/**
* Constructor used by {@link VehicleHal}
*/
VmsHalService(VehicleHal vehicleHal) {
+ this(vehicleHal, SystemClock::uptimeMillis);
+ }
+
+ @VisibleForTesting
+ VmsHalService(VehicleHal vehicleHal, Supplier<Long> getCoreId) {
mVehicleHal = vehicleHal;
+ mCoreId = (int) (getCoreId.get() % Integer.MAX_VALUE);
+ mMessageQueue = new MessageQueue();
}
/**
@@ -180,21 +211,25 @@
*/
@VisibleForTesting
Handler getHandler() {
- return mHandler;
+ return mMessageQueue.mHandler;
}
/**
* Gets the {@link IVmsPublisherClient} implementation for the HAL's publisher callback.
*/
- public IBinder getPublisherClient() {
- return mPublisherClient.asBinder();
+ public void setPublisherConnectionCallbacks(Consumer<IBinder> onHalConnected,
+ Runnable onHalDisconnected) {
+ mPublisherOnHalConnected = onHalConnected;
+ mPublisherOnHalDisconnected = onHalDisconnected;
}
/**
* Sets a reference to the {@link IVmsSubscriberService} implementation for use by the HAL.
*/
- public void setVmsSubscriberService(IVmsSubscriberService service) {
+ public void setVmsSubscriberService(IVmsSubscriberService service,
+ Consumer<IVmsSubscriberClient> onHalDisconnected) {
mSubscriberService = service;
+ mSuscriberOnHalDisconnected = onHalDisconnected;
}
@Override
@@ -219,39 +254,14 @@
return; // Do not continue initialization
}
- synchronized (this) {
- mHandlerThread = new HandlerThread(TAG);
- mHandlerThread.start();
- mHandler = new Handler(mHandlerThread.getLooper(), mHandlerCallback);
- }
-
- if (mSubscriberService != null) {
- try {
- mSubscriberService.addVmsSubscriberToNotifications(mSubscriberClient);
- } catch (RemoteException e) {
- Log.e(TAG, "While adding subscriber callback", e);
- }
-
- // Publish layer availability to HAL clients (this triggers HAL client initialization)
- try {
- mSubscriberClient.onLayersAvailabilityChanged(
- mSubscriberService.getAvailableLayers());
- } catch (RemoteException e) {
- Log.e(TAG, "While publishing layer availability", e);
- }
- } else if (DBG) {
- Log.d(TAG, "VmsSubscriberService not registered");
- }
+ mMessageQueue.init();
+ mMessageQueue.enqueue(VmsMessageType.START_SESSION,
+ createStartSessionMessage(mCoreId, UNKNOWN_CLIENT_ID));
}
@Override
public void release() {
- synchronized (this) {
- if (mHandlerThread != null) {
- mHandlerThread.quitSafely();
- }
- }
-
+ mMessageQueue.release();
mSubscriptionStateSequence = -1;
mAvailableLayersSequence = -1;
@@ -330,6 +340,9 @@
case VmsMessageType.SUBSCRIPTIONS_REQUEST:
handleSubscriptionsRequestEvent();
break;
+ case VmsMessageType.START_SESSION:
+ handleStartSessionEvent(vec);
+ break;
default:
Log.e(TAG, "Unexpected message type: " + messageType);
}
@@ -340,6 +353,72 @@
}
/**
+ * SESSION_START message format:
+ * <ul>
+ * <li>Message type
+ * <li>Core ID
+ * <li>Client ID
+ * </ul>
+ */
+ private void handleStartSessionEvent(List<Integer> message) {
+ int coreId = message.get(VmsStartSessionMessageIntegerValuesIndex.SERVICE_ID);
+ int clientId = message.get(VmsStartSessionMessageIntegerValuesIndex.CLIENT_ID);
+ if (DBG) {
+ Log.d(TAG,
+ "Handling a session start event with coreId: " + coreId + " client: "
+ + clientId);
+ }
+
+ if (coreId != mCoreId) {
+ if (mPublisherOnHalDisconnected != null) {
+ mPublisherOnHalDisconnected.run();
+ } else {
+ Log.w(TAG, "Publisher disconnect callback not registered");
+ }
+ if (mSuscriberOnHalDisconnected != null) {
+ mSuscriberOnHalDisconnected.accept(mSubscriberClient);
+ } else {
+ Log.w(TAG, "Subscriber disconnect callback not registered");
+ }
+
+ // Drop all queued messages and client state
+ mMessageQueue.clear();
+ mSubscriptionStateSequence = -1;
+ mAvailableLayersSequence = -1;
+
+ // Enqueue an acknowledgement message
+ mMessageQueue.enqueue(VmsMessageType.START_SESSION,
+ createStartSessionMessage(mCoreId, clientId));
+ }
+
+ // Notify client manager of connection
+ if (mPublisherOnHalConnected != null) {
+ mPublisherOnHalConnected.accept(mPublisherClient);
+ } else {
+ Log.w(TAG, "Publisher connect callback not registered");
+ }
+
+ // Notify subscriber service of connection
+ if (mSubscriberService != null) {
+ try {
+ mSubscriberService.addVmsSubscriberToNotifications(mSubscriberClient);
+ } catch (RemoteException e) {
+ Log.e(TAG, "While adding subscriber callback", e);
+ }
+
+ // Publish layer availability to HAL clients (this triggers HAL client initialization)
+ try {
+ mSubscriberClient.onLayersAvailabilityChanged(
+ mSubscriberService.getAvailableLayers());
+ } catch (RemoteException e) {
+ Log.e(TAG, "While publishing layer availability", e);
+ }
+ } else {
+ Log.w(TAG, "Subscriber connect callback not registered");
+ }
+ }
+
+ /**
* DATA message format:
* <ul>
* <li>Message type
@@ -588,6 +667,30 @@
}
/**
+ * Creates a SESSION_START type {@link VehiclePropValue}.
+ *
+ * SESSION_START message format:
+ * <ul>
+ * <li>Message type
+ * <li>Core ID
+ * <li>Client ID
+ * </ul>
+ */
+ private static VehiclePropValue createStartSessionMessage(int coreId, int clientId) {
+ // Message type + layer
+ VehiclePropValue vehicleProp = createVmsMessage(VmsMessageType.START_SESSION);
+ List<Integer> message = vehicleProp.value.int32Values;
+
+ // Core ID
+ message.add(coreId);
+
+ // Client ID
+ message.add(clientId);
+
+ return vehicleProp;
+ }
+
+ /**
* Creates a DATA type {@link VehiclePropValue}.
*
* DATA message format:
@@ -602,14 +705,15 @@
*
* @param layer Layer for which message was published.
*/
- private static VehiclePropValue createDataMessage(VmsLayer layer, int publisherId,
- byte[] payload) {
+ private static VehiclePropValue createDataMessage(VmsLayer layer, byte[] payload) {
// Message type + layer
- VehiclePropValue vehicleProp = createVmsMessageWithLayer(VmsMessageType.DATA, layer);
+ VehiclePropValue vehicleProp = createVmsMessage(VmsMessageType.DATA);
+ appendLayer(vehicleProp.value.int32Values, layer);
List<Integer> message = vehicleProp.value.int32Values;
// Publisher ID
- message.add(publisherId);
+ // TODO(b/124130256): Set publisher ID of data message
+ message.add(0);
// Payload
appendBytes(vehicleProp.value.bytes, payload);
@@ -709,20 +813,6 @@
}
/**
- * Creates a {@link VehiclePropValue} of the requested message type, with layer message fields
- * populated. Other message fields are *not* populated.
- *
- * @param messageType Type of message, from {@link VmsMessageType}
- * @param layer Layer affected by message.
- */
- private static VehiclePropValue createVmsMessageWithLayer(
- int messageType, VmsLayer layer) {
- VehiclePropValue vehicleProp = createVmsMessage(messageType);
- appendLayer(vehicleProp.value.int32Values, layer);
- return vehicleProp;
- }
-
- /**
* Appends a {@link VmsLayer} to an encoded VMS message.
*
* Layer format:
@@ -761,9 +851,7 @@
message.add(layer.getVmsLayer().getSubtype());
message.add(layer.getVmsLayer().getVersion());
message.add(layer.getPublisherIds().size());
- for (int publisherId : layer.getPublisherIds()) {
- message.add(publisherId);
- }
+ message.addAll(layer.getPublisherIds());
}
private static void appendBytes(ArrayList<Byte> dst, byte[] src) {
diff --git a/service/src/com/android/car/trust/BleManager.java b/service/src/com/android/car/trust/BleManager.java
index 61e1be6..24a3b79 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) {
@@ -209,6 +225,9 @@
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "stopGattServer");
}
+ if (mBluetoothGatt != null) {
+ mBluetoothGatt.disconnect();
+ }
mGattServer.close();
mGattServer = null;
}
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/service/src/com/android/car/trust/CarTrustAgentEnrollmentService.java b/service/src/com/android/car/trust/CarTrustAgentEnrollmentService.java
index 812cb63..6743375 100644
--- a/service/src/com/android/car/trust/CarTrustAgentEnrollmentService.java
+++ b/service/src/com/android/car/trust/CarTrustAgentEnrollmentService.java
@@ -16,6 +16,7 @@
package com.android.car.trust;
+import static android.car.trust.CarTrustAgentEnrollmentManager.ENROLLMENT_HANDSHAKE_FAILURE;
import static android.car.trust.CarTrustAgentEnrollmentManager.ENROLLMENT_NOT_ALLOWED;
import android.app.ActivityManager;
@@ -134,7 +135,6 @@
client.mListenerBinder.unlinkToDeath(client, 0);
}
mEnrollmentStateClients.clear();
- setEnrollmentHandshakeAccepted(false);
}
// Implementing the ICarTrustAgentEnrollment interface
@@ -148,13 +148,7 @@
if (!mTrustedDeviceService.getSharedPrefs()
.getBoolean(TRUSTED_DEVICE_ENROLLMENT_ENABLED_KEY, true)) {
Log.e(TAG, "Trusted Device Enrollment disabled");
- for (EnrollmentStateClient client : mEnrollmentStateClients) {
- try {
- client.mListener.onEnrollmentHandshakeFailure(null, ENROLLMENT_NOT_ALLOWED);
- } catch (RemoteException e) {
- Log.e(TAG, "onEnrollmentHandshakeFailure dispatch failed", e);
- }
- }
+ dispatchEnrollmentFailure(ENROLLMENT_NOT_ALLOWED);
return;
}
// Stop any current broadcasts
@@ -191,7 +185,7 @@
addEnrollmentServiceLog("enrollmentHandshakeAccepted");
mCarTrustAgentBleManager.sendMessage(device, CONFIRMATION_SIGNAL,
OperationType.ENCRYPTION_HANDSHAKE, /* isPayloadEncrypted= */ false);
- setEnrollmentHandshakeAccepted(true);
+ setEnrollmentHandshakeAccepted();
}
/**
@@ -201,7 +195,6 @@
*/
@Override
public void terminateEnrollmentHandshake() {
- setEnrollmentHandshakeAccepted(false);
addEnrollmentServiceLog("terminateEnrollmentHandshake");
// Disconnect from BLE
mCarTrustAgentBleManager.disconnectRemoteDevice();
@@ -269,7 +262,10 @@
public void setTrustedDeviceEnrollmentEnabled(boolean isEnabled) {
SharedPreferences.Editor editor = mTrustedDeviceService.getSharedPrefs().edit();
editor.putBoolean(TRUSTED_DEVICE_ENROLLMENT_ENABLED_KEY, isEnabled);
- editor.apply();
+ if (!editor.commit()) {
+ Log.wtf(TAG,
+ "Enrollment Failure: Commit to SharedPreferences failed. Enable? " + isEnabled);
+ }
}
/**
@@ -340,10 +336,10 @@
if (mRemoteEnrollmentDevice == null) {
Log.e(TAG, "onEscrowTokenAdded() but no remote device connected!");
removeEscrowToken(handle, uid);
+ dispatchEnrollmentFailure(ENROLLMENT_HANDSHAKE_FAILURE);
return;
}
- // To conveniently get the user id to unlock when handle is received.
- mTrustedDeviceService.getSharedPrefs().edit().putInt(String.valueOf(handle), uid).apply();
+
mTokenActiveStateMap.put(handle, false);
for (EnrollmentStateClient client : mEnrollmentStateClients) {
try {
@@ -372,14 +368,18 @@
Iterator<String> iterator = deviceInfos.iterator();
while (iterator.hasNext()) {
String deviceInfoString = iterator.next();
- if (TrustedDeviceInfo.deserialize(deviceInfoString).getHandle()
- == handle) {
+ if (TrustedDeviceInfo.deserialize(deviceInfoString).getHandle() == handle) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Removing trusted device handle: " + handle);
+ }
iterator.remove();
break;
}
}
editor.putStringSet(String.valueOf(uid), deviceInfos);
- editor.apply();
+ if (!editor.commit()) {
+ Log.e(TAG, "EscrowToken removed, but shared prefs update failed");
+ }
}
/**
@@ -391,36 +391,65 @@
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "onEscrowTokenActiveStateChanged: " + Long.toHexString(handle));
}
- mTokenActiveStateMap.put(handle, isTokenActive);
- dispatchEscrowTokenActiveStateChanged(handle, isTokenActive);
- if (isTokenActive) {
- Set<String> deviceInfo = mTrustedDeviceService.getSharedPrefs().getStringSet(
- String.valueOf(uid), new HashSet<>());
- String deviceName;
- if (mRemoteEnrollmentDevice.getName() != null) {
- deviceName = mRemoteEnrollmentDevice.getName();
- } else if (mDeviceName != null) {
- deviceName = mDeviceName;
- } else {
- deviceName = mContext.getString(R.string.trust_device_default_name);
+ if (mRemoteEnrollmentDevice == null || !isTokenActive) {
+ if (mRemoteEnrollmentDevice == null) {
+ Log.e(TAG,
+ "Device disconnected before sending back handle. Enrollment incomplete");
}
- addEnrollmentServiceLog("trustedDeviceAdded (handle:" + handle + ", uid:" + uid
- + ", addr:" + mRemoteEnrollmentDevice.getAddress()
- + ", name:" + deviceName + ")");
- deviceInfo.add(new TrustedDeviceInfo(handle, mRemoteEnrollmentDevice.getAddress(),
- deviceName).serialize());
- // To conveniently get the devices info regarding certain user.
- mTrustedDeviceService.getSharedPrefs().edit().putStringSet(String.valueOf(uid),
- deviceInfo).apply();
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "Sending handle: " + handle);
+ if (!isTokenActive) {
+ Log.e(TAG, "Unexpected: Escrow Token activation failed");
}
- mCarTrustAgentBleManager.sendMessage(mRemoteEnrollmentDevice,
- mEncryptionKey.encryptData(Utils.longToBytes(handle)),
- OperationType.CLIENT_MESSAGE, /* isPayloadEncrypted= */ true);
- } else {
removeEscrowToken(handle, uid);
+ dispatchEnrollmentFailure(ENROLLMENT_HANDSHAKE_FAILURE);
+ return;
}
+
+ mTokenActiveStateMap.put(handle, isTokenActive);
+ Set<String> deviceInfo = mTrustedDeviceService.getSharedPrefs().getStringSet(
+ String.valueOf(uid), new HashSet<>());
+ String deviceName;
+ if (mRemoteEnrollmentDevice.getName() != null) {
+ deviceName = mRemoteEnrollmentDevice.getName();
+ } else if (mDeviceName != null) {
+ deviceName = mDeviceName;
+ } else {
+ deviceName = mContext.getString(R.string.trust_device_default_name);
+ }
+ StringBuffer log = new StringBuffer()
+ .append("trustedDeviceAdded (handle:").append(handle)
+ .append(", uid:").append(uid)
+ .append(", addr:").append(mRemoteEnrollmentDevice.getAddress())
+ .append(", name:").append(deviceName).append(")");
+ addEnrollmentServiceLog(log.toString());
+ deviceInfo.add(new TrustedDeviceInfo(handle, mRemoteEnrollmentDevice.getAddress(),
+ deviceName).serialize());
+
+ // To conveniently get the devices info regarding certain user.
+ SharedPreferences.Editor editor = mTrustedDeviceService.getSharedPrefs().edit();
+ editor.putStringSet(String.valueOf(uid), deviceInfo);
+ if (!editor.commit()) {
+ Log.e(TAG, "Writing DeviceInfo to shared prefs Failed");
+ removeEscrowToken(handle, uid);
+ dispatchEnrollmentFailure(ENROLLMENT_HANDSHAKE_FAILURE);
+ return;
+ }
+
+ // To conveniently get the user id to unlock when handle is received.
+ editor.putInt(String.valueOf(handle), uid);
+ if (!editor.commit()) {
+ Log.e(TAG, "Writing (handle, uid) to shared prefs Failed");
+ removeEscrowToken(handle, uid);
+ dispatchEnrollmentFailure(ENROLLMENT_HANDSHAKE_FAILURE);
+ return;
+ }
+
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Sending handle: " + handle);
+ }
+ mCarTrustAgentBleManager.sendMessage(mRemoteEnrollmentDevice,
+ mEncryptionKey.encryptData(Utils.longToBytes(handle)),
+ OperationType.CLIENT_MESSAGE, /* isPayloadEncrypted= */ true);
+ dispatchEscrowTokenActiveStateChanged(handle, isTokenActive);
}
void onEnrollmentAdvertiseStartSuccess() {
@@ -444,9 +473,8 @@
}
void onRemoteDeviceConnected(BluetoothDevice device) {
- resetEncryptionState();
-
addEnrollmentServiceLog("onRemoteDeviceConnected (addr:" + device.getAddress() + ")");
+ resetEncryptionState();
synchronized (mRemoteDeviceLock) {
mRemoteEnrollmentDevice = device;
}
@@ -454,16 +482,21 @@
try {
client.mListener.onBleEnrollmentDeviceConnected(device);
} catch (RemoteException e) {
- Log.e(TAG, "onAdvertiseSuccess dispatch failed", e);
+ Log.e(TAG, "onRemoteDeviceConnected dispatch failed", e);
}
}
mCarTrustAgentBleManager.stopEnrollmentAdvertising();
}
void onRemoteDeviceDisconnected(BluetoothDevice device) {
- resetEncryptionState();
-
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Device Disconnected: " + device.getAddress() + " Enrollment State: "
+ + mEnrollmentState + " Encryption State: " + mEncryptionState);
+ }
addEnrollmentServiceLog("onRemoteDeviceDisconnected (addr:" + device.getAddress() + ")");
+ addEnrollmentServiceLog(
+ "Enrollment State: " + mEnrollmentState + " EncryptionState: " + mEncryptionState);
+ resetEncryptionState();
synchronized (mRemoteDeviceLock) {
mRemoteEnrollmentDevice = null;
}
@@ -471,7 +504,7 @@
try {
client.mListener.onBleEnrollmentDeviceDisconnected(device);
} catch (RemoteException e) {
- Log.e(TAG, "onAdvertiseSuccess dispatch failed", e);
+ Log.e(TAG, "onRemoteDeviceDisconnected dispatch failed", e);
}
}
}
@@ -498,7 +531,7 @@
notifyEscrowTokenReceived(value);
break;
case ENROLLMENT_STATE_HANDLE:
- // TODO(danharms): React to ACK. Shut down server?
+ mCarTrustAgentBleManager.disconnectRemoteDevice();
break;
default:
// Should never get here
@@ -521,6 +554,12 @@
Log.d(TAG, "Received device id: " + mDeviceId);
}
UUID uniqueId = mTrustedDeviceService.getUniqueId();
+ if (uniqueId == null) {
+ Log.e(TAG, "Cannot get Unique ID for the IHU");
+ resetEnrollmentStateOnFailure();
+ dispatchEnrollmentFailure(ENROLLMENT_HANDSHAKE_FAILURE);
+ return;
+ }
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Sending device id: " + uniqueId.toString());
}
@@ -628,36 +667,44 @@
}
/**
+ * Reset the whole enrollment state. Disconnects the peer device and removes any escrow token
+ * that has not been activated.
+ *
+ * <p>This method should be called from any stage in the middle of enrollment where we
+ * encounter a failure.
+ */
+ private void resetEnrollmentStateOnFailure() {
+ terminateEnrollmentHandshake();
+ resetEncryptionState();
+ }
+
+ /**
* Resets the encryption status of this service.
*
* <p>This method should be called each time a device connects so that a new handshake can be
* started and encryption keys exchanged.
*/
private void resetEncryptionState() {
- setEnrollmentHandshakeAccepted(false);
-
mEncryptionRunner = EncryptionRunnerFactory.newRunner();
mHandshakeMessage = null;
mEncryptionKey = null;
mEncryptionState = HandshakeState.UNKNOWN;
+ mEnrollmentState = ENROLLMENT_STATE_NONE;
}
- private synchronized void setEnrollmentHandshakeAccepted(boolean accepted) {
- if (!accepted) {
- return;
- }
-
+ private synchronized void setEnrollmentHandshakeAccepted() {
if (mEncryptionRunner == null) {
Log.e(TAG, "Received notification that enrollment handshake was accepted, "
+ "but encryption was never set up.");
return;
}
-
HandshakeMessage message;
try {
message = mEncryptionRunner.verifyPin();
} catch (HandshakeException e) {
Log.e(TAG, "Error during PIN verification", e);
+ resetEnrollmentStateOnFailure();
+ dispatchEnrollmentFailure(ENROLLMENT_HANDSHAKE_FAILURE);
return;
}
@@ -669,9 +716,12 @@
mEncryptionState = HandshakeState.FINISHED;
mEncryptionKey = message.getKey();
- mTrustedDeviceService.saveEncryptionKey(mDeviceId, mEncryptionKey.asBytes());
+ if (!mTrustedDeviceService.saveEncryptionKey(mDeviceId, mEncryptionKey.asBytes())) {
+ resetEnrollmentStateOnFailure();
+ dispatchEnrollmentFailure(ENROLLMENT_HANDSHAKE_FAILURE);
+ return;
+ }
mEnrollmentState++;
-
}
/**
@@ -843,6 +893,16 @@
}
}
+ private void dispatchEnrollmentFailure(int error) {
+ for (EnrollmentStateClient client : mEnrollmentStateClients) {
+ try {
+ client.mListener.onEnrollmentHandshakeFailure(null, error);
+ } catch (RemoteException e) {
+ Log.e(TAG, "onEnrollmentHandshakeFailure dispatch failed", e);
+ }
+ }
+ }
+
/**
* Class that holds onto client related information - listener interface, process that hosts the
* binder object etc.
diff --git a/service/src/com/android/car/trust/CarTrustAgentUnlockService.java b/service/src/com/android/car/trust/CarTrustAgentUnlockService.java
index e8a0afd..8808f50 100644
--- a/service/src/com/android/car/trust/CarTrustAgentUnlockService.java
+++ b/service/src/com/android/car/trust/CarTrustAgentUnlockService.java
@@ -83,7 +83,9 @@
public void setTrustedDeviceUnlockEnabled(boolean isEnabled) {
SharedPreferences.Editor editor = mTrustedDeviceService.getSharedPrefs().edit();
editor.putBoolean(TRUSTED_DEVICE_UNLOCK_ENABLED_KEY, isEnabled);
- editor.apply();
+ if (!editor.commit()) {
+ Log.wtf(TAG, "Unlock Enable Failed. Enable? " + isEnabled);
+ }
}
/**
* Set a delegate that implements {@link CarTrustAgentUnlockDelegate}. The delegate will be
diff --git a/service/src/com/android/car/trust/CarTrustedDeviceService.java b/service/src/com/android/car/trust/CarTrustedDeviceService.java
index 2948bec..9995aa7 100644
--- a/service/src/com/android/car/trust/CarTrustedDeviceService.java
+++ b/service/src/com/android/car/trust/CarTrustedDeviceService.java
@@ -202,8 +202,9 @@
}
} else {
mUniqueId = UUID.randomUUID();
- prefs.edit().putString(UNIQUE_ID_KEY, mUniqueId.toString()).commit();
- if (Log.isLoggable(TAG, Log.DEBUG)) {
+ if (!prefs.edit().putString(UNIQUE_ID_KEY, mUniqueId.toString()).commit()) {
+ mUniqueId = null;
+ } else if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Generated new trusted unique id: "
+ prefs.getString(UNIQUE_ID_KEY, ""));
}
@@ -235,14 +236,19 @@
*
* @param deviceId did of trusted device
* @param encryptionKey encryption key
+ * @return {@code true} if the operation succeeded
*/
- void saveEncryptionKey(String deviceId, byte[] encryptionKey) {
+ boolean saveEncryptionKey(String deviceId, byte[] encryptionKey) {
byte[] encryptedKey = encryptWithKeyStore(KEY_ALIAS, encryptionKey);
- getSharedPrefs()
+ if (encryptedKey == null) {
+ return false;
+ }
+
+ return getSharedPrefs()
.edit()
.putString(PREF_ENCRYPTION_KEY_PREFIX + deviceId,
Base64.encodeToString(encryptedKey, Base64.DEFAULT))
- .apply();
+ .commit();
}
/**
diff --git a/service/src/com/android/car/vms/VmsClientManager.java b/service/src/com/android/car/vms/VmsClientManager.java
index 5f5969e..14ef0a7 100644
--- a/service/src/com/android/car/vms/VmsClientManager.java
+++ b/service/src/com/android/car/vms/VmsClientManager.java
@@ -76,7 +76,6 @@
private final Handler mHandler;
private final CarUserService mUserService;
private final CarUserManagerHelper mUserManagerHelper;
- private final IBinder mHalClient;
private final int mMillisBeforeRebind;
@GuardedBy("mListeners")
@@ -84,6 +83,8 @@
@GuardedBy("mSystemClients")
private final Map<String, ClientConnection> mSystemClients = new ArrayMap<>();
@GuardedBy("mSystemClients")
+ private IBinder mHalClient;
+ @GuardedBy("mSystemClients")
private boolean mSystemUserUnlocked;
@GuardedBy("mCurrentUserClients")
@@ -132,9 +133,9 @@
mHandler = new Handler(Looper.getMainLooper());
mUserService = userService;
mUserManagerHelper = userManagerHelper;
- mHalClient = halService.getPublisherClient();
mMillisBeforeRebind = mContext.getResources().getInteger(
com.android.car.R.integer.millisecondsBeforeRebindToVmsPublisher);
+ halService.setPublisherConnectionCallbacks(this::onHalConnected, this::onHalDisconnected);
}
@Override
@@ -273,8 +274,10 @@
}
private void notifyListenerOfConnectedClients(ConnectionListener listener) {
- listener.onClientConnected(HAL_CLIENT_NAME, mHalClient);
synchronized (mSystemClients) {
+ if (mHalClient != null) {
+ listener.onClientConnected(HAL_CLIENT_NAME, mHalClient);
+ }
mSystemClients.values().forEach(conn -> conn.notifyIfConnected(listener));
}
synchronized (mCurrentUserClients) {
@@ -298,6 +301,20 @@
}
}
+ private void onHalConnected(IBinder halClient) {
+ synchronized (mSystemClients) {
+ mHalClient = halClient;
+ notifyListenersOnClientConnected(HAL_CLIENT_NAME, mHalClient);
+ }
+ }
+
+ private void onHalDisconnected() {
+ synchronized (mSystemClients) {
+ mHalClient = null;
+ notifyListenersOnClientDisconnected(HAL_CLIENT_NAME);
+ }
+ }
+
class ClientConnection implements ServiceConnection {
private final ComponentName mName;
private final UserHandle mUser;
diff --git a/tests/CarDeveloperOptions/res/values-es/strings.xml b/tests/CarDeveloperOptions/res/values-es/strings.xml
index 9c8131b..b2e8581 100644
--- a/tests/CarDeveloperOptions/res/values-es/strings.xml
+++ b/tests/CarDeveloperOptions/res/values-es/strings.xml
@@ -3935,8 +3935,7 @@
<skip />
<!-- no translation found for accessibility_touch_vibration_title (285890135612038092) -->
<skip />
- <!-- no translation found for accessibility_service_master_switch_title (2734791644475782924) -->
- <skip />
+ <string name="accessibility_service_master_switch_title" msgid="2734791644475782924">"Usar servicio"</string>
<!-- no translation found for accessibility_daltonizer_master_switch_title (4855011639012300777) -->
<skip />
<!-- no translation found for accessibility_caption_master_switch_title (6373335123229234053) -->
diff --git a/tests/CarDeveloperOptions/res/values-or/strings.xml b/tests/CarDeveloperOptions/res/values-or/strings.xml
index 3e19a25..b315f3e 100644
--- a/tests/CarDeveloperOptions/res/values-or/strings.xml
+++ b/tests/CarDeveloperOptions/res/values-or/strings.xml
@@ -4223,8 +4223,7 @@
<skip />
<!-- no translation found for battery_tip_summary_title (2750922152518825526) -->
<skip />
- <!-- no translation found for battery_tip_summary_summary (6294900413896440006) -->
- <skip />
+ <string name="battery_tip_summary_summary" product="default" msgid="6294900413896440006">"ଫୋନର ସାଧାରଣ ବ୍ୟାକଗ୍ରାଉଣ୍ଡ୍ ବ୍ୟାଟେରୀ ବ୍ୟବହାର ରହିଛି"</string>
<!-- no translation found for battery_tip_summary_summary (5280099016800644130) -->
<skip />
<!-- no translation found for battery_tip_summary_summary (4459840492610842705) -->
diff --git a/tests/CarDeveloperOptions/res/values-pt/strings.xml b/tests/CarDeveloperOptions/res/values-pt/strings.xml
index 52e8b5b..f91bfd5 100644
--- a/tests/CarDeveloperOptions/res/values-pt/strings.xml
+++ b/tests/CarDeveloperOptions/res/values-pt/strings.xml
@@ -3865,8 +3865,7 @@
<skip />
<!-- no translation found for accessibility_screen_magnification_navbar_configuration_warning (6477234309484795550) -->
<skip />
- <!-- no translation found for accessibility_global_gesture_preference_title (3842279082831426816) -->
- <skip />
+ <string name="accessibility_global_gesture_preference_title" msgid="3842279082831426816">"Atalho do volume"</string>
<!-- no translation found for accessibility_shortcut_service_title (3516052294376744060) -->
<skip />
<!-- no translation found for accessibility_shortcut_service_on_lock_screen_title (1279441617927949980) -->
diff --git a/tests/CarDeveloperOptions/res/values-th/strings.xml b/tests/CarDeveloperOptions/res/values-th/strings.xml
index 9c8131b..f4f98b1 100644
--- a/tests/CarDeveloperOptions/res/values-th/strings.xml
+++ b/tests/CarDeveloperOptions/res/values-th/strings.xml
@@ -6702,8 +6702,7 @@
<skip />
<!-- no translation found for launch_by_default (6106985160202769725) -->
<skip />
- <!-- no translation found for app_launch_domain_links_title (2987289657348349133) -->
- <skip />
+ <string name="app_launch_domain_links_title" msgid="2987289657348349133">"การเปิดลิงก์"</string>
<!-- no translation found for app_launch_open_domain_urls_title (8595126859922391331) -->
<skip />
<!-- no translation found for app_launch_open_domain_urls_summary (6803029846855502366) -->
@@ -6794,8 +6793,7 @@
<skip />
<!-- no translation found for tap_to_wake_summary (8485222120721006793) -->
<skip />
- <!-- no translation found for domain_urls_title (7939209950373945367) -->
- <skip />
+ <string name="domain_urls_title" msgid="7939209950373945367">"การเปิดลิงก์"</string>
<!-- no translation found for domain_urls_summary_none (5401203416941265109) -->
<skip />
<!-- no translation found for domain_urls_summary_one (3893975485064803435) -->
diff --git a/tests/CarDeveloperOptions/res/values-zh-rHK/strings.xml b/tests/CarDeveloperOptions/res/values-zh-rHK/strings.xml
index 9c8131b..0b6bf27 100644
--- a/tests/CarDeveloperOptions/res/values-zh-rHK/strings.xml
+++ b/tests/CarDeveloperOptions/res/values-zh-rHK/strings.xml
@@ -3945,8 +3945,7 @@
<skip />
<!-- no translation found for accessibility_hearingaid_title (3700978781235124891) -->
<skip />
- <!-- no translation found for accessibility_hearingaid_not_connected_summary (634573930469952213) -->
- <skip />
+ <string name="accessibility_hearingaid_not_connected_summary" msgid="634573930469952213">"無連接任何助聽器"</string>
<!-- no translation found for accessibility_hearingaid_adding_summary (4139031880828714300) -->
<skip />
<!-- no translation found for accessibility_hearingaid_pair_instructions_first_message (2671518890909750740) -->
diff --git a/tests/CarDeveloperOptions/res/xml/security_dashboard_settings.xml b/tests/CarDeveloperOptions/res/xml/security_dashboard_settings.xml
index a797b2d..d10b977 100644
--- a/tests/CarDeveloperOptions/res/xml/security_dashboard_settings.xml
+++ b/tests/CarDeveloperOptions/res/xml/security_dashboard_settings.xml
@@ -133,13 +133,6 @@
android:fragment="com.android.car.developeroptions.security.EncryptionAndCredential" />
<Preference
- android:order="70"
- android:key="manage_trust_agents"
- android:title="@string/manage_trust_agents"
- android:summary="@string/summary_placeholder"
- android:fragment="com.android.car.developeroptions.security.trustagent.TrustAgentSettings" />
-
- <Preference
android:order="80"
android:key="screen_pinning_settings"
android:title="@string/screen_pinning_title"
diff --git a/tests/CarDeveloperOptions/res/xml/trust_agent_settings.xml b/tests/CarDeveloperOptions/res/xml/trust_agent_settings.xml
deleted file mode 100644
index da6c9a8..0000000
--- a/tests/CarDeveloperOptions/res/xml/trust_agent_settings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2019 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:settings="http://schemas.android.com/apk/res-auto"
- android:key="trust_agents"
- android:title="@string/manage_trust_agents"
- settings:controller="com.android.car.developeroptions.security.trustagent.TrustAgentsPreferenceController">
-</PreferenceScreen>
diff --git a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/SecurityFeatureProvider.java b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/SecurityFeatureProvider.java
index d0872b5..95d601d 100644
--- a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/SecurityFeatureProvider.java
+++ b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/SecurityFeatureProvider.java
@@ -19,15 +19,11 @@
import android.content.Context;
import com.android.internal.widget.LockPatternUtils;
-import com.android.car.developeroptions.security.trustagent.TrustAgentManager;
/** FeatureProvider for security. */
public interface SecurityFeatureProvider {
- /** Returns the {@link TrustAgentManager} bound to this {@link SecurityFeatureProvider}. */
- TrustAgentManager getTrustAgentManager();
-
/**
* Returns a {@link LockPatternUtils} instance bound to application context.
*/
diff --git a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/SecurityFeatureProviderImpl.java b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/SecurityFeatureProviderImpl.java
index 4ea9ece..21df466 100644
--- a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/SecurityFeatureProviderImpl.java
+++ b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/SecurityFeatureProviderImpl.java
@@ -19,23 +19,13 @@
import android.content.Context;
import com.android.internal.widget.LockPatternUtils;
-import com.android.car.developeroptions.security.trustagent.TrustAgentManager;
/** Implementation for {@code SecurityFeatureProvider}. */
public class SecurityFeatureProviderImpl implements SecurityFeatureProvider {
- private TrustAgentManager mTrustAgentManager;
private LockPatternUtils mLockPatternUtils;
@Override
- public TrustAgentManager getTrustAgentManager() {
- if (mTrustAgentManager == null) {
- mTrustAgentManager = new TrustAgentManager();
- }
- return mTrustAgentManager;
- }
-
- @Override
public LockPatternUtils getLockPatternUtils(Context context) {
if (mLockPatternUtils == null) {
mLockPatternUtils = new LockPatternUtils(context.getApplicationContext());
diff --git a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/SecuritySettings.java b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/SecuritySettings.java
index e866727..5aa22e5 100644
--- a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/SecuritySettings.java
+++ b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/SecuritySettings.java
@@ -30,8 +30,6 @@
import com.android.car.developeroptions.dashboard.DashboardFragment;
import com.android.car.developeroptions.enterprise.EnterprisePrivacyPreferenceController;
import com.android.car.developeroptions.search.BaseSearchIndexProvider;
-import com.android.car.developeroptions.security.trustagent.ManageTrustAgentsPreferenceController;
-import com.android.car.developeroptions.security.trustagent.TrustAgentListPreferenceController;
import com.android.car.developeroptions.widget.PreferenceCategoryController;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -82,10 +80,6 @@
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (use(TrustAgentListPreferenceController.class)
- .handleActivityResult(requestCode, resultCode)) {
- return;
- }
if (use(LockUnificationPreferenceController.class)
.handleActivityResult(requestCode, resultCode, data)) {
return;
@@ -105,12 +99,10 @@
Lifecycle lifecycle, SecuritySettings host) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new EnterprisePrivacyPreferenceController(context));
- controllers.add(new ManageTrustAgentsPreferenceController(context));
controllers.add(new ScreenPinningPreferenceController(context));
controllers.add(new SimLockPreferenceController(context));
controllers.add(new EncryptionStatusPreferenceController(context,
PREF_KEY_ENCRYPTION_SECURITY_PAGE));
- controllers.add(new TrustAgentListPreferenceController(context, host, lifecycle));
final List<AbstractPreferenceController> securityPreferenceControllers = new ArrayList<>();
securityPreferenceControllers.add(new FaceStatusPreferenceController(context));
diff --git a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/screenlock/LockAfterTimeoutPreferenceController.java b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/screenlock/LockAfterTimeoutPreferenceController.java
index 9805171..79ced0c 100644
--- a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/screenlock/LockAfterTimeoutPreferenceController.java
+++ b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/screenlock/LockAfterTimeoutPreferenceController.java
@@ -22,17 +22,14 @@
import android.content.Context;
import android.os.UserHandle;
import android.provider.Settings;
-import android.text.TextUtils;
import android.util.Log;
import androidx.preference.Preference;
-import com.android.internal.widget.LockPatternUtils;
import com.android.car.developeroptions.R;
import com.android.car.developeroptions.core.PreferenceControllerMixin;
import com.android.car.developeroptions.display.TimeoutListPreference;
-import com.android.car.developeroptions.overlay.FeatureFactory;
-import com.android.car.developeroptions.security.trustagent.TrustAgentManager;
+import com.android.internal.widget.LockPatternUtils;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -44,7 +41,6 @@
private final int mUserId;
private final LockPatternUtils mLockPatternUtils;
- private final TrustAgentManager mTrustAgentManager;
private final DevicePolicyManager mDPM;
public LockAfterTimeoutPreferenceController(Context context, int userId,
@@ -53,8 +49,6 @@
mUserId = userId;
mLockPatternUtils = lockPatternUtils;
mDPM = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
- mTrustAgentManager = FeatureFactory.getFactory(context)
- .getSecurityFeatureProvider().getTrustAgentManager();
}
@Override
@@ -137,20 +131,7 @@
best = i;
}
}
-
- final CharSequence trustAgentLabel = mTrustAgentManager
- .getActiveTrustAgentLabel(mContext, mLockPatternUtils);
- if (!TextUtils.isEmpty(trustAgentLabel)) {
- if (Long.valueOf(values[best].toString()) == 0) {
- summary = mContext.getString(R.string.lock_immediately_summary_with_exception,
- trustAgentLabel);
- } else {
- summary = mContext.getString(R.string.lock_after_timeout_summary_with_exception,
- entries[best], trustAgentLabel);
- }
- } else {
- summary = mContext.getString(R.string.lock_after_timeout_summary, entries[best]);
- }
+ summary = mContext.getString(R.string.lock_after_timeout_summary, entries[best]);
}
preference.setSummary(summary);
}
diff --git a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/screenlock/PowerButtonInstantLockPreferenceController.java b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/screenlock/PowerButtonInstantLockPreferenceController.java
index adc7acf..27e1d58 100644
--- a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/screenlock/PowerButtonInstantLockPreferenceController.java
+++ b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/screenlock/PowerButtonInstantLockPreferenceController.java
@@ -18,16 +18,13 @@
import android.app.admin.DevicePolicyManager;
import android.content.Context;
-import android.text.TextUtils;
import androidx.preference.Preference;
import androidx.preference.TwoStatePreference;
-import com.android.internal.widget.LockPatternUtils;
import com.android.car.developeroptions.R;
import com.android.car.developeroptions.core.PreferenceControllerMixin;
-import com.android.car.developeroptions.overlay.FeatureFactory;
-import com.android.car.developeroptions.security.trustagent.TrustAgentManager;
+import com.android.internal.widget.LockPatternUtils;
import com.android.settingslib.core.AbstractPreferenceController;
public class PowerButtonInstantLockPreferenceController extends AbstractPreferenceController
@@ -37,15 +34,12 @@
private final int mUserId;
private final LockPatternUtils mLockPatternUtils;
- private final TrustAgentManager mTrustAgentManager;
public PowerButtonInstantLockPreferenceController(Context context, int userId,
LockPatternUtils lockPatternUtils) {
super(context);
mUserId = userId;
mLockPatternUtils = lockPatternUtils;
- mTrustAgentManager = FeatureFactory.getFactory(context)
- .getSecurityFeatureProvider().getTrustAgentManager();
}
@Override
@@ -71,15 +65,7 @@
public void updateState(Preference preference) {
((TwoStatePreference) preference).setChecked(
mLockPatternUtils.getPowerButtonInstantlyLocks(mUserId));
- final CharSequence trustAgentLabel = mTrustAgentManager.getActiveTrustAgentLabel(
- mContext, mLockPatternUtils);
- if (!TextUtils.isEmpty(trustAgentLabel)) {
- preference.setSummary(mContext.getString(
- R.string.lockpattern_settings_power_button_instantly_locks_summary,
- trustAgentLabel));
- } else {
- preference.setSummary(R.string.summary_placeholder);
- }
+ preference.setSummary(R.string.summary_placeholder);
}
@Override
diff --git a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/ManageTrustAgentsPreferenceController.java b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/ManageTrustAgentsPreferenceController.java
deleted file mode 100644
index 6633e34..0000000
--- a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/ManageTrustAgentsPreferenceController.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.developeroptions.security.trustagent;
-
-import android.content.Context;
-import android.os.UserHandle;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
-
-import com.android.internal.widget.LockPatternUtils;
-import com.android.car.developeroptions.R;
-import com.android.car.developeroptions.core.BasePreferenceController;
-import com.android.car.developeroptions.overlay.FeatureFactory;
-import com.android.car.developeroptions.security.SecurityFeatureProvider;
-
-public class ManageTrustAgentsPreferenceController extends BasePreferenceController {
-
- @VisibleForTesting
- static final String KEY_MANAGE_TRUST_AGENTS = "manage_trust_agents";
- private static final int MY_USER_ID = UserHandle.myUserId();
-
- private final LockPatternUtils mLockPatternUtils;
- private TrustAgentManager mTrustAgentManager;
-
- public ManageTrustAgentsPreferenceController(Context context) {
- super(context, KEY_MANAGE_TRUST_AGENTS);
- final SecurityFeatureProvider securityFeatureProvider = FeatureFactory.getFactory(context)
- .getSecurityFeatureProvider();
- mLockPatternUtils = securityFeatureProvider.getLockPatternUtils(context);
- mTrustAgentManager = securityFeatureProvider.getTrustAgentManager();
- }
-
- @Override
- public int getAvailabilityStatus() {
- return mContext.getResources().getBoolean(R.bool.config_show_manage_trust_agents)
- ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
- }
-
- @Override
- public void updateState(Preference preference) {
- final int numberOfTrustAgent = getTrustAgentCount();
- if (!mLockPatternUtils.isSecure(MY_USER_ID)) {
- preference.setEnabled(false);
- preference.setSummary(R.string.disabled_because_no_backup_security);
- } else if (numberOfTrustAgent > 0) {
- preference.setEnabled(true);
- preference.setSummary(mContext.getResources().getQuantityString(
- R.plurals.manage_trust_agents_summary_on,
- numberOfTrustAgent, numberOfTrustAgent));
- } else {
- preference.setEnabled(true);
- preference.setSummary(R.string.manage_trust_agents_summary);
- }
- }
-
- private int getTrustAgentCount() {
- return mTrustAgentManager.getActiveTrustAgents(mContext, mLockPatternUtils).size();
- }
-}
diff --git a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/TrustAgentInfo.java b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/TrustAgentInfo.java
deleted file mode 100644
index 634935a..0000000
--- a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/TrustAgentInfo.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.developeroptions.security.trustagent;
-
-import android.content.ComponentName;
-import android.graphics.drawable.Drawable;
-
-public class TrustAgentInfo implements Comparable<TrustAgentInfo> {
- private final CharSequence mLabel;
- private final ComponentName mComponentName;
- private final Drawable mIcon;
-
- public TrustAgentInfo(CharSequence label, ComponentName componentName, Drawable icon) {
- mLabel = label;
- mComponentName = componentName;
- mIcon = icon;
- }
-
- public CharSequence getLabel() {
- return mLabel;
- }
-
- public ComponentName getComponentName() {
- return mComponentName;
- }
-
- public Drawable getIcon() {
- return mIcon;
- }
-
- @Override
- public boolean equals(Object other) {
- if (other instanceof TrustAgentInfo) {
- return mComponentName.equals(((TrustAgentInfo) other).getComponentName());
- }
- return false;
- }
-
- @Override
- public int compareTo(TrustAgentInfo other) {
- return mComponentName.compareTo(other.getComponentName());
- }
-}
\ No newline at end of file
diff --git a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/TrustAgentListPreferenceController.java b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/TrustAgentListPreferenceController.java
deleted file mode 100644
index fde9b6c..0000000
--- a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/TrustAgentListPreferenceController.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.developeroptions.security.trustagent;
-
-import static com.android.car.developeroptions.security.SecuritySettings.CHANGE_TRUST_AGENT_SETTINGS;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.text.TextUtils;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceCategory;
-import androidx.preference.PreferenceScreen;
-
-import com.android.internal.widget.LockPatternUtils;
-import com.android.car.developeroptions.R;
-import com.android.car.developeroptions.core.PreferenceControllerMixin;
-import com.android.car.developeroptions.overlay.FeatureFactory;
-import com.android.car.developeroptions.password.ChooseLockSettingsHelper;
-import com.android.car.developeroptions.security.SecurityFeatureProvider;
-import com.android.car.developeroptions.security.SecuritySettings;
-import com.android.settingslib.RestrictedPreference;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnCreate;
-import com.android.settingslib.core.lifecycle.events.OnResume;
-import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
-
-import java.util.List;
-
-public class TrustAgentListPreferenceController extends AbstractPreferenceController
- implements PreferenceControllerMixin, LifecycleObserver, OnSaveInstanceState,
- OnCreate, OnResume {
-
- private static final String TRUST_AGENT_CLICK_INTENT = "trust_agent_click_intent";
- @VisibleForTesting
- static final String PREF_KEY_TRUST_AGENT = "trust_agent";
- @VisibleForTesting
- static final String PREF_KEY_SECURITY_CATEGORY = "security_category";
- private static final int MY_USER_ID = UserHandle.myUserId();
-
- private final LockPatternUtils mLockPatternUtils;
- private final TrustAgentManager mTrustAgentManager;
- private final SecuritySettings mHost;
-
- private Intent mTrustAgentClickIntent;
- private PreferenceCategory mSecurityCategory;
-
- public TrustAgentListPreferenceController(Context context, SecuritySettings host,
- Lifecycle lifecycle) {
- super(context);
- final SecurityFeatureProvider provider = FeatureFactory.getFactory(context)
- .getSecurityFeatureProvider();
- mHost = host;
- mLockPatternUtils = provider.getLockPatternUtils(context);
- mTrustAgentManager = provider.getTrustAgentManager();
- if (lifecycle != null) {
- lifecycle.addObserver(this);
- }
- }
-
- @Override
- public boolean isAvailable() {
- return mContext.getResources().getBoolean(R.bool.config_show_trust_agent_click_intent);
- }
-
- @Override
- public String getPreferenceKey() {
- return PREF_KEY_TRUST_AGENT;
- }
-
- @Override
- public void displayPreference(PreferenceScreen screen) {
- super.displayPreference(screen);
- mSecurityCategory = screen.findPreference(PREF_KEY_SECURITY_CATEGORY);
- updateTrustAgents();
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- if (savedInstanceState != null
- && savedInstanceState.containsKey(TRUST_AGENT_CLICK_INTENT)) {
- mTrustAgentClickIntent = savedInstanceState.getParcelable(TRUST_AGENT_CLICK_INTENT);
- }
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- if (mTrustAgentClickIntent != null) {
- outState.putParcelable(TRUST_AGENT_CLICK_INTENT, mTrustAgentClickIntent);
- }
- }
-
- @Override
- public boolean handlePreferenceTreeClick(Preference preference) {
- if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
- return super.handlePreferenceTreeClick(preference);
- }
- final ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(
- mHost.getActivity(), mHost);
- mTrustAgentClickIntent = preference.getIntent();
- boolean confirmationLaunched = helper.launchConfirmationActivity(
- CHANGE_TRUST_AGENT_SETTINGS, preference.getTitle());
-
- if (!confirmationLaunched && mTrustAgentClickIntent != null) {
- // If this returns false, it means no password confirmation is required.
- mHost.startActivity(mTrustAgentClickIntent);
- mTrustAgentClickIntent = null;
- }
- return true;
- }
-
- @Override
- public void onResume() {
- updateTrustAgents();
- }
-
- private void updateTrustAgents() {
- if (mSecurityCategory == null) {
- return;
- }
- // First remove all old trust agents.
- while (true) {
- final Preference oldAgent = mSecurityCategory.findPreference(PREF_KEY_TRUST_AGENT);
- if (oldAgent == null) {
- break;
- } else {
- mSecurityCategory.removePreference(oldAgent);
- }
- }
- // If for some reason the preference is no longer available, don't proceed to add.
- if (!isAvailable()) {
- return;
- }
- // Then add new ones.
- final boolean hasSecurity = mLockPatternUtils.isSecure(MY_USER_ID);
- final List<TrustAgentManager.TrustAgentComponentInfo> agents =
- mTrustAgentManager.getActiveTrustAgents(mContext, mLockPatternUtils);
- if (agents == null) {
- return;
- }
- for (TrustAgentManager.TrustAgentComponentInfo agent : agents) {
- final RestrictedPreference trustAgentPreference =
- new RestrictedPreference(mSecurityCategory.getContext());
- trustAgentPreference.setKey(PREF_KEY_TRUST_AGENT);
- trustAgentPreference.setTitle(agent.title);
- trustAgentPreference.setSummary(agent.summary);
- // Create intent for this preference.
- trustAgentPreference.setIntent(new Intent(Intent.ACTION_MAIN)
- .setComponent(agent.componentName));
- trustAgentPreference.setDisabledByAdmin(agent.admin);
- if (!trustAgentPreference.isDisabledByAdmin() && !hasSecurity) {
- trustAgentPreference.setEnabled(false);
- trustAgentPreference.setSummary(R.string.disabled_because_no_backup_security);
- }
- // Add preference to the settings menu.
- mSecurityCategory.addPreference(trustAgentPreference);
- }
- }
-
- public boolean handleActivityResult(int requestCode, int resultCode) {
- if (requestCode == CHANGE_TRUST_AGENT_SETTINGS && resultCode == Activity.RESULT_OK) {
- if (mTrustAgentClickIntent != null) {
- mHost.startActivity(mTrustAgentClickIntent);
- mTrustAgentClickIntent = null;
- }
- return true;
- }
- return false;
- }
-}
diff --git a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/TrustAgentManager.java b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/TrustAgentManager.java
deleted file mode 100644
index 9be291e..0000000
--- a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/TrustAgentManager.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.developeroptions.security.trustagent;
-
-import static android.service.trust.TrustAgentService.TRUST_AGENT_META_DATA;
-
-import android.app.admin.DevicePolicyManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.content.res.XmlResourceParser;
-import android.os.UserHandle;
-import android.service.trust.TrustAgentService;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.Slog;
-import android.util.Xml;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.internal.widget.LockPatternUtils;
-import com.android.settingslib.RestrictedLockUtils;
-import com.android.settingslib.RestrictedLockUtilsInternal;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-
-/** A manager for trust agent state. */
-public class TrustAgentManager {
-
- // Only allow one trust agent on the platform.
- private static final boolean ONLY_ONE_TRUST_AGENT = false;
-
- public static class TrustAgentComponentInfo {
- public ComponentName componentName;
- public String title;
- public String summary;
- public RestrictedLockUtils.EnforcedAdmin admin = null;
- }
-
- private static final String TAG = "TrustAgentManager";
- private static final Intent TRUST_AGENT_INTENT =
- new Intent(TrustAgentService.SERVICE_INTERFACE);
-
- @VisibleForTesting
- static final String PERMISSION_PROVIDE_AGENT =
- android.Manifest.permission.PROVIDE_TRUST_AGENT;
-
- /**
- * Determines if the service associated with a resolved trust agent intent is allowed to provide
- * trust on this device.
- *
- * @param resolveInfo The entry corresponding to the matched trust agent intent.
- * @param pm The package manager to be used to check for permissions.
- * @return {@code true} if the associated service is allowed to provide a trust agent, and
- * {@code false} if otherwise.
- */
- public boolean shouldProvideTrust(ResolveInfo resolveInfo, PackageManager pm) {
- final String packageName = resolveInfo.serviceInfo.packageName;
- if (pm.checkPermission(PERMISSION_PROVIDE_AGENT, packageName)
- != PackageManager.PERMISSION_GRANTED) {
- Log.w(TAG, "Skipping agent because package " + packageName
- + " does not have permission " + PERMISSION_PROVIDE_AGENT + ".");
- return false;
- }
- return true;
- }
-
- /**
- * Return the display label for active trust agent.
- */
- public CharSequence getActiveTrustAgentLabel(Context context, LockPatternUtils utils) {
- final List<TrustAgentComponentInfo> agents = getActiveTrustAgents(context, utils);
- return agents.isEmpty() ? null : agents.get(0).title;
- }
-
- /**
- * Returns a list of trust agents.
- *
- * If {@link #ONLY_ONE_TRUST_AGENT} is set, the list will contain up to 1 agent instead of all
- * available agents on device.
- */
- public List<TrustAgentComponentInfo> getActiveTrustAgents(Context context,
- LockPatternUtils utils) {
- final int myUserId = UserHandle.myUserId();
- final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
- final PackageManager pm = context.getPackageManager();
- final List<TrustAgentComponentInfo> result = new ArrayList<>();
-
- final List<ResolveInfo> resolveInfos = pm.queryIntentServices(TRUST_AGENT_INTENT,
- PackageManager.GET_META_DATA);
- final List<ComponentName> enabledTrustAgents = utils.getEnabledTrustAgents(myUserId);
- final RestrictedLockUtils.EnforcedAdmin admin = RestrictedLockUtilsInternal
- .checkIfKeyguardFeaturesDisabled(
- context, DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS, myUserId);
-
- if (enabledTrustAgents != null && !enabledTrustAgents.isEmpty()) {
- for (ResolveInfo resolveInfo : resolveInfos) {
- if (resolveInfo.serviceInfo == null || !shouldProvideTrust(resolveInfo, pm)) {
- continue;
- }
- final TrustAgentComponentInfo trustAgentComponentInfo =
- getSettingsComponent(pm, resolveInfo);
- if (trustAgentComponentInfo.componentName == null ||
- !enabledTrustAgents.contains(getComponentName(resolveInfo)) ||
- TextUtils.isEmpty(trustAgentComponentInfo.title)) {
- continue;
- }
- if (admin != null && dpm.getTrustAgentConfiguration(
- null, getComponentName(resolveInfo)) == null) {
- trustAgentComponentInfo.admin = admin;
- }
- result.add(trustAgentComponentInfo);
- if (ONLY_ONE_TRUST_AGENT) {
- break;
- }
- }
- }
- return result;
- }
-
- public ComponentName getComponentName(ResolveInfo resolveInfo) {
- if (resolveInfo == null || resolveInfo.serviceInfo == null) return null;
- return new ComponentName(resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name);
- }
-
- private TrustAgentComponentInfo getSettingsComponent(PackageManager pm,
- ResolveInfo resolveInfo) {
- if (resolveInfo == null || resolveInfo.serviceInfo == null
- || resolveInfo.serviceInfo.metaData == null) {
- return null;
- }
- String cn = null;
- TrustAgentComponentInfo trustAgentComponentInfo = new TrustAgentComponentInfo();
- XmlResourceParser parser = null;
- Exception caughtException = null;
- try {
- parser = resolveInfo.serviceInfo.loadXmlMetaData(pm, TRUST_AGENT_META_DATA);
- if (parser == null) {
- Slog.w(TAG, "Can't find " + TRUST_AGENT_META_DATA + " meta-data");
- return null;
- }
- Resources res = pm.getResourcesForApplication(resolveInfo.serviceInfo.applicationInfo);
- AttributeSet attrs = Xml.asAttributeSet(parser);
- int type;
- while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
- && type != XmlPullParser.START_TAG) {
- }
- String nodeName = parser.getName();
- if (!"trust-agent".equals(nodeName)) {
- Slog.w(TAG, "Meta-data does not start with trust-agent tag");
- return null;
- }
- TypedArray sa =
- res.obtainAttributes(attrs, com.android.internal.R.styleable.TrustAgent);
- trustAgentComponentInfo.summary =
- sa.getString(com.android.internal.R.styleable.TrustAgent_summary);
- trustAgentComponentInfo.title =
- sa.getString(com.android.internal.R.styleable.TrustAgent_title);
- cn = sa.getString(com.android.internal.R.styleable.TrustAgent_settingsActivity);
- sa.recycle();
- } catch (PackageManager.NameNotFoundException e) {
- caughtException = e;
- } catch (IOException e) {
- caughtException = e;
- } catch (XmlPullParserException e) {
- caughtException = e;
- } finally {
- if (parser != null) parser.close();
- }
- if (caughtException != null) {
- Slog.w(TAG, "Error parsing : " + resolveInfo.serviceInfo.packageName, caughtException);
- return null;
- }
- if (cn != null && cn.indexOf('/') < 0) {
- cn = resolveInfo.serviceInfo.packageName + "/" + cn;
- }
- trustAgentComponentInfo.componentName =
- (cn == null) ? null : ComponentName.unflattenFromString(cn);
- return trustAgentComponentInfo;
- }
-}
diff --git a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/TrustAgentSettings.java b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/TrustAgentSettings.java
deleted file mode 100644
index b861741..0000000
--- a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/TrustAgentSettings.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.developeroptions.security.trustagent;
-
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.provider.SearchIndexableResource;
-
-import com.android.car.developeroptions.R;
-import com.android.car.developeroptions.dashboard.DashboardFragment;
-import com.android.car.developeroptions.search.BaseSearchIndexProvider;
-import com.android.car.developeroptions.search.Indexable;
-import com.android.settingslib.search.SearchIndexable;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@SearchIndexable
-public class TrustAgentSettings extends DashboardFragment {
- private static final String TAG = "TrustAgentSettings";
-
- @Override
- public int getMetricsCategory() {
- return SettingsEnums.TRUST_AGENT;
- }
-
- @Override
- public int getHelpResource() {
- return R.string.help_url_trust_agent;
- }
-
- @Override
- protected String getLogTag() {
- return TAG;
- }
-
- @Override
- protected int getPreferenceScreenResId() {
- return R.xml.trust_agent_settings;
- }
-
- public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider() {
- @Override
- public List<SearchIndexableResource> getXmlResourcesToIndex(
- Context context, boolean enabled) {
- final List<SearchIndexableResource> result = new ArrayList<>();
- final SearchIndexableResource sir = new SearchIndexableResource(context);
- sir.xmlResId = R.xml.trust_agent_settings;
- result.add(sir);
- return result;
- }
- };
-}
diff --git a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/TrustAgentsPreferenceController.java b/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/TrustAgentsPreferenceController.java
deleted file mode 100644
index 926436b..0000000
--- a/tests/CarDeveloperOptions/src/com/android/car/developeroptions/security/trustagent/TrustAgentsPreferenceController.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.developeroptions.security.trustagent;
-
-import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-
-import android.app.admin.DevicePolicyManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.graphics.drawable.Drawable;
-import android.os.UserHandle;
-import android.service.trust.TrustAgentService;
-import android.text.TextUtils;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.IconDrawableFactory;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-import androidx.preference.SwitchPreference;
-
-import com.android.internal.widget.LockPatternUtils;
-import com.android.car.developeroptions.core.BasePreferenceController;
-import com.android.car.developeroptions.overlay.FeatureFactory;
-import com.android.car.developeroptions.security.SecurityFeatureProvider;
-import com.android.settingslib.RestrictedLockUtilsInternal;
-import com.android.settingslib.RestrictedSwitchPreference;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnStart;
-
-import java.util.List;
-
-public class TrustAgentsPreferenceController extends BasePreferenceController
- implements Preference.OnPreferenceChangeListener, LifecycleObserver, OnStart {
-
- private static final Intent TRUST_AGENT_INTENT =
- new Intent(TrustAgentService.SERVICE_INTERFACE);
-
- private final ArrayMap<ComponentName, TrustAgentInfo> mAvailableAgents;
- private final ArraySet<ComponentName> mActiveAgents;
- private final DevicePolicyManager mDevicePolicyManager;
- private final IconDrawableFactory mIconDrawableFactory;
- private final LockPatternUtils mLockPatternUtils;
- private final PackageManager mPackageManager;
- private final TrustAgentManager mTrustAgentManager;
-
- private PreferenceScreen mScreen;
-
- public TrustAgentsPreferenceController(Context context, String key) {
- super(context, key);
- mAvailableAgents = new ArrayMap<>();
- mActiveAgents = new ArraySet<>();
- mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
- mIconDrawableFactory = IconDrawableFactory.newInstance(context);
- final SecurityFeatureProvider securityFeatureProvider =
- FeatureFactory.getFactory(context).getSecurityFeatureProvider();
- mTrustAgentManager = securityFeatureProvider.getTrustAgentManager();
- mLockPatternUtils = securityFeatureProvider.getLockPatternUtils(context);
- mPackageManager = context.getPackageManager();
- }
-
- @Override
- public void displayPreference(PreferenceScreen screen) {
- super.displayPreference(screen);
- mScreen = screen;
- }
-
- @Override
- public int getAvailabilityStatus() {
- return AVAILABLE;
- }
-
- @Override
- public void onStart() {
- updateAgents();
- }
-
- private void updateAgents() {
- findAvailableTrustAgents();
- loadActiveAgents();
- removeUselessExistingPreferences();
-
- final EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled(
- mContext, DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS, UserHandle.myUserId());
-
- for (TrustAgentInfo agent : mAvailableAgents.values()) {
- final ComponentName componentName = agent.getComponentName();
- RestrictedSwitchPreference preference = (RestrictedSwitchPreference)
- mScreen.findPreference(componentName.flattenToString());
- if (preference == null) {
- preference = new RestrictedSwitchPreference(mScreen.getContext());
- }
- preference.setKey(componentName.flattenToString());
- preference.useAdminDisabledSummary(true);
- preference.setTitle(agent.getLabel());
- preference.setIcon(agent.getIcon());
- preference.setOnPreferenceChangeListener(this);
- preference.setChecked(mActiveAgents.contains(componentName));
- if (admin != null && mDevicePolicyManager.getTrustAgentConfiguration(null /* admin */,
- componentName) == null) {
- preference.setChecked(false);
- preference.setDisabledByAdmin(admin);
- }
- mScreen.addPreference(preference);
- }
- }
-
- private void loadActiveAgents() {
- final List<ComponentName> activeTrustAgents = mLockPatternUtils.getEnabledTrustAgents(
- UserHandle.myUserId());
- if (activeTrustAgents != null) {
- mActiveAgents.addAll(activeTrustAgents);
- }
- }
-
- private void saveActiveAgents() {
- mLockPatternUtils.setEnabledTrustAgents(mActiveAgents, UserHandle.myUserId());
- }
-
- private void findAvailableTrustAgents() {
- final List<ResolveInfo> resolveInfos = mPackageManager.queryIntentServices(
- TRUST_AGENT_INTENT, PackageManager.GET_META_DATA);
- mAvailableAgents.clear();
- for (ResolveInfo resolveInfo : resolveInfos) {
- if (resolveInfo.serviceInfo == null) {
- continue;
- }
- if (!mTrustAgentManager.shouldProvideTrust(resolveInfo, mPackageManager)) {
- continue;
- }
- final CharSequence label = resolveInfo.loadLabel(mPackageManager);
- final ComponentName componentName = mTrustAgentManager.getComponentName(resolveInfo);
- final Drawable icon = mIconDrawableFactory.getBadgedIcon(
- resolveInfo.getComponentInfo().applicationInfo);
- final TrustAgentInfo agentInfo = new TrustAgentInfo(label, componentName, icon);
- mAvailableAgents.put(componentName, agentInfo);
- }
- }
-
- private void removeUselessExistingPreferences() {
- final int count = mScreen.getPreferenceCount();
- if (count <= 0) {
- return;
- }
- for (int i = count - 1; i >= 0; i--) {
- final Preference pref = mScreen.getPreference(i);
- final String[] names = TextUtils.split(pref.getKey(), "/");
- final ComponentName componentName = new ComponentName(names[0], names[1]);
- if (!mAvailableAgents.containsKey(componentName)) {
- mScreen.removePreference(pref);
- mActiveAgents.remove(componentName);
- }
- }
- }
-
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- if (!(preference instanceof SwitchPreference)) {
- return false;
- }
- for (TrustAgentInfo agent : mAvailableAgents.values()) {
- final ComponentName componentName = agent.getComponentName();
- if (!TextUtils.equals(preference.getKey(), componentName.flattenToString())) {
- continue;
- }
- if ((Boolean) newValue && !mActiveAgents.contains(componentName)) {
- mActiveAgents.add(componentName);
- } else {
- mActiveAgents.remove(componentName);
- }
- saveActiveAgents();
- return true;
- }
- return false;
- }
-}
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/EmbeddedKitchenSinkApp/Android.mk b/tests/EmbeddedKitchenSinkApp/Android.mk
index 65de56e..386044c 100644
--- a/tests/EmbeddedKitchenSinkApp/Android.mk
+++ b/tests/EmbeddedKitchenSinkApp/Android.mk
@@ -49,6 +49,7 @@
android.hardware.automotive.vehicle-V2.0-java \
vehicle-hal-support-lib \
com.android.car.keventreader-client \
+ guava \
kitchensink-gson
LOCAL_JAVA_LIBRARIES += android.car
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/audio.xml b/tests/EmbeddedKitchenSinkApp/res/layout/audio.xml
index b918058..a7ff363 100644
--- a/tests/EmbeddedKitchenSinkApp/res/layout/audio.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/audio.xml
@@ -32,6 +32,22 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:layout_weight="1" >
+ <TextView
+ android:id="@+id/zone_selection_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/select_zone" />
+ <Spinner
+ android:id="@+id/zone_spinner"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="10dp"/>
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1" >
<LinearLayout
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/connectivity_fragment.xml b/tests/EmbeddedKitchenSinkApp/res/layout/connectivity_fragment.xml
index dc2d01a..c6e75fe 100644
--- a/tests/EmbeddedKitchenSinkApp/res/layout/connectivity_fragment.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/connectivity_fragment.xml
@@ -179,4 +179,39 @@
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</LinearLayout>
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="4dp">
+ <Button android:id="@+id/networkEnableWifiIntent"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Enable Wifi Intent"/>
+ <Button android:id="@+id/networkDisableWifiIntent"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Disable Wifi Intent"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="4dp">
+ <Button android:id="@+id/networkEnableBluetoothIntent"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Enable Bluetooth Intent"/>
+ <Button android:id="@+id/networkDisableBluetoothIntent"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Disable Bluetooth Intent"/>
+ <Button android:id="@+id/networkDiscoverableBluetoothIntent"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Discoverable Bluetooth Intent"/>
+ </LinearLayout>
+
</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/projection_status.xml b/tests/EmbeddedKitchenSinkApp/res/layout/projection_status.xml
new file mode 100644
index 0000000..65ccbe8
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/projection_status.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT 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:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Current Projection State: "/>
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Inactive"
+ android:id="@+id/current_projection_status"/>
+ </LinearLayout>
+ <LinearLayout android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Current Projection Package: "/>
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Unknown"
+ android:id="@+id/current_projection_package"/>
+ </LinearLayout>
+ <LinearLayout android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Current Projection Details: "/>
+ <LinearLayout android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:id="@+id/current_projection_details"/>
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/projection_status_details.xml b/tests/EmbeddedKitchenSinkApp/res/layout/projection_status_details.xml
new file mode 100644
index 0000000..ec06152
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/projection_status_details.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT 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:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <LinearLayout android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Package: "/>
+ <TextView android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:id="@+id/projection_detail_package"/>
+ </LinearLayout>
+ <LinearLayout android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Projection State: "/>
+ <TextView android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:id="@+id/projection_detail_state"/>
+ </LinearLayout>
+ <LinearLayout android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Transport: "/>
+ <TextView android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:id="@+id/projection_detail_transport"/>
+ </LinearLayout>
+ <LinearLayout android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Devices: "/>
+ <LinearLayout android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:orientation="vertical"
+ android:id="@+id/projection_detail_devices"/>
+ </LinearLayout>
+</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/projection_status_device.xml b/tests/EmbeddedKitchenSinkApp/res/layout/projection_status_device.xml
new file mode 100644
index 0000000..ae4d7a9
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/projection_status_device.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT 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:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <LinearLayout android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="ID: "/>
+ <TextView android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:id="@+id/projection_device_id"/>
+ </LinearLayout>
+ <LinearLayout android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Name: "/>
+ <TextView android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:id="@+id/projection_device_name"/>
+ </LinearLayout>
+ <LinearLayout android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Transports: "/>
+ <LinearLayout android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:orientation="vertical"
+ android:id="@+id/projection_device_transports"/>
+ </LinearLayout>
+ <LinearLayout android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Projecting: "/>
+ <TextView android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:id="@+id/projection_device_projecting"/>
+ </LinearLayout>
+</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/values/strings.xml b/tests/EmbeddedKitchenSinkApp/res/values/strings.xml
index 77b64c7..d1ce0d3 100644
--- a/tests/EmbeddedKitchenSinkApp/res/values/strings.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/values/strings.xml
@@ -131,6 +131,8 @@
<string name="microphone_off" translatable="false">Mic Off</string>
<string name="mock_audio_on" translatable="false">Audio Mocking On</string>
<string name="mock_audio_off" translatable="false">Audio Mocking Off</string>
+ <string name="select_zone" translatable="false">Select Zone</string>
+
<!-- keyboard test fragment -->
<string name="keyboard_test_title" translatable="false">Keyboard Test</string>
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java
index a80c3b4..70949a9 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java
@@ -18,6 +18,7 @@
import android.car.Car;
import android.car.CarAppFocusManager;
+import android.car.CarProjectionManager;
import android.car.hardware.CarSensorManager;
import android.car.hardware.hvac.CarHvacManager;
import android.car.hardware.power.CarPowerManager;
@@ -60,6 +61,7 @@
import com.google.android.car.kitchensink.notification.NotificationFragment;
import com.google.android.car.kitchensink.orientation.OrientationTestFragment;
import com.google.android.car.kitchensink.power.PowerTestFragment;
+import com.google.android.car.kitchensink.projection.ProjectionFragment;
import com.google.android.car.kitchensink.property.PropertyTestFragment;
import com.google.android.car.kitchensink.sensor.SensorsTestFragment;
import com.google.android.car.kitchensink.storagelifetime.StorageLifetimeFragment;
@@ -172,6 +174,7 @@
new FragmentMenuEntry("notification", NotificationFragment.class),
new FragmentMenuEntry("orientation test", OrientationTestFragment.class),
new FragmentMenuEntry("power test", PowerTestFragment.class),
+ new FragmentMenuEntry("projection", ProjectionFragment.class),
new FragmentMenuEntry("property test", PropertyTestFragment.class),
new FragmentMenuEntry("sensors", SensorsTestFragment.class),
new FragmentMenuEntry("storage lifetime", StorageLifetimeFragment.class),
@@ -189,6 +192,7 @@
private CarPropertyManager mPropertyManager;
private CarSensorManager mSensorManager;
private CarAppFocusManager mCarAppFocusManager;
+ private CarProjectionManager mCarProjectionManager;
private Object mPropertyManagerReady = new Object();
public CarHvacManager getHvacManager() {
@@ -207,6 +211,10 @@
return mSensorManager;
}
+ public CarProjectionManager getProjectionManager() {
+ return mCarProjectionManager;
+ }
+
/* Open any tab directly:
* adb shell am force-stop com.google.android.car.kitchensink
* adb shell am start -n com.google.android.car.kitchensink/.KitchenSinkActivity \
@@ -322,6 +330,8 @@
android.car.Car.SENSOR_SERVICE);
mCarAppFocusManager =
(CarAppFocusManager) mCarApi.getCarManager(Car.APP_FOCUS_SERVICE);
+ mCarProjectionManager =
+ (CarProjectionManager) mCarApi.getCarManager(Car.PROJECTION_SERVICE);
mPropertyManagerReady.notifyAll();
}
}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java
index cf74468..aa889b4 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java
@@ -20,9 +20,12 @@
import android.car.CarAppFocusManager;
import android.car.CarAppFocusManager.OnAppFocusChangedListener;
import android.car.CarAppFocusManager.OnAppFocusOwnershipCallback;
+import android.car.media.CarAudioManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.ServiceConnection;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
import android.media.AudioAttributes;
import android.media.AudioDeviceInfo;
import android.media.AudioFocusRequest;
@@ -36,8 +39,11 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.RadioGroup;
+import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
@@ -47,6 +53,8 @@
import com.google.android.car.kitchensink.CarEmulator;
import com.google.android.car.kitchensink.R;
+import java.util.Arrays;
+
public class AudioTestFragment extends Fragment {
private static final String TAG = "CAR.AUDIO.KS";
private static final boolean DBG = true;
@@ -75,6 +83,10 @@
private AudioAttributes mRadioAudioAttrib;
private AudioAttributes mSystemSoundAudioAttrib;
private CarEmulator mCarEmulator;
+ private CarAudioManager mCarAudioManager;
+ private Spinner mZoneSpinner;
+ ArrayAdapter<Integer> mZoneAdapter;
+ private int mOldZonePosition;
private final AudioManager.OnAudioFocusChangeListener mNavFocusListener = (focusChange) -> {
Log.i(TAG, "Nav focus change:" + focusChange);
@@ -113,6 +125,19 @@
CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
mAppFocusManager.addFocusListener(listener,
CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND);
+
+ mCarAudioManager = (CarAudioManager) mCar.getCarManager(Car.AUDIO_SERVICE);
+
+ //take care of zone selection
+ int[] zoneList = mCarAudioManager.getAudioZoneIds();
+ Integer[] zoneArray = Arrays.stream(zoneList).boxed().toArray(Integer[]::new);
+ mZoneAdapter = new ArrayAdapter<>(mContext,
+ android.R.layout.simple_spinner_item, zoneArray);
+ mZoneAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ mZoneSpinner.setAdapter(mZoneAdapter);
+ mZoneSpinner.setEnabled(true);
+
+
}
@Override
public void onServiceDisconnected(ComponentName name) {
@@ -283,9 +308,46 @@
mCarEmulator = null;
}
});
+
+ //Zone Spinner
+ mZoneSpinner = view.findViewById(R.id.zone_spinner);
+ mZoneSpinner.setEnabled(false);
+ mZoneSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+ @Override
+ public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
+ handleZoneSelection();
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView<?> parent) {
+ }
+ });
+
return view;
}
+ public void handleZoneSelection() {
+ int position = mZoneSpinner.getSelectedItemPosition();
+ int zone = mZoneAdapter.getItem(position);
+ Log.d(TAG, "Zone Selected: " + zone);
+ try {
+ ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
+ mContext.getPackageName(), 0);
+ int uid = info.uid;
+ Log.d(TAG, "handleZoneSelection App uid: " + uid);
+ if (mCarAudioManager.setZoneIdForUid(zone, uid)) {
+ Log.d(TAG, "Changed uid " + uid + " sound to zone " + zone);
+ mOldZonePosition = position;
+ } else {
+ Log.d(TAG, "Filed to changed uid " + uid + " sound to zone " + zone);
+ mZoneSpinner.setSelection(mOldZonePosition);
+ }
+
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG, "handleZoneSelection Failed to find name: " , e);
+ }
+ }
+
@Override
public void onDestroyView() {
super.onDestroyView();
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/connectivity/ConnectivityFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/connectivity/ConnectivityFragment.java
index 31b83cc..3bdfd22 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/connectivity/ConnectivityFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/connectivity/ConnectivityFragment.java
@@ -18,7 +18,9 @@
import android.annotation.Nullable;
import android.annotation.SuppressLint;
+import android.bluetooth.BluetoothAdapter;
import android.content.Context;
+import android.content.Intent;
import android.graphics.Color;
import android.location.LocationManager;
import android.net.ConnectivityManager;
@@ -491,9 +493,49 @@
mTetheringStatusPolled = (TextView) view.findViewById(R.id.tetheringStatusPolled);
mLocalOnlyStatus = (TextView) view.findViewById(R.id.localOnlyStatus);
+ view.findViewById(R.id.networkEnableWifiIntent).setOnClickListener(v -> enableWifiIntent());
+ view.findViewById(R.id.networkDisableWifiIntent)
+ .setOnClickListener(v -> disableWifiIntent());
+ view.findViewById(R.id.networkEnableBluetoothIntent)
+ .setOnClickListener(v -> enableBluetoothIntent());
+ view.findViewById(R.id.networkDisableBluetoothIntent)
+ .setOnClickListener(v -> disableBluetoothIntent());
+ view.findViewById(R.id.networkDiscoverableBluetoothIntent)
+ .setOnClickListener(v -> discoverableBluetoothIntent());
+
return view;
}
+ private void enableWifiIntent() {
+ Intent enableWifi = new Intent(WifiManager.ACTION_REQUEST_ENABLE);
+ enableWifi.putExtra(Intent.EXTRA_PACKAGE_NAME, getContext().getPackageName());
+ startActivity(enableWifi);
+ }
+
+ private void disableWifiIntent() {
+ Intent disableWifi = new Intent(WifiManager.ACTION_REQUEST_DISABLE);
+ disableWifi.putExtra(Intent.EXTRA_PACKAGE_NAME, getContext().getPackageName());
+ startActivity(disableWifi);
+ }
+
+ private void enableBluetoothIntent() {
+ Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
+ enableBluetooth.putExtra(Intent.EXTRA_PACKAGE_NAME, getContext().getPackageName());
+ startActivity(enableBluetooth);
+ }
+
+ private void disableBluetoothIntent() {
+ Intent disableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_DISABLE);
+ disableBluetooth.putExtra(Intent.EXTRA_PACKAGE_NAME, getContext().getPackageName());
+ startActivity(disableBluetooth);
+ }
+
+ private void discoverableBluetoothIntent() {
+ Intent discoverableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
+ discoverableBluetooth.putExtra(Intent.EXTRA_PACKAGE_NAME, getContext().getPackageName());
+ startActivity(discoverableBluetooth);
+ }
+
@Override
public void onResume() {
super.onResume();
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/projection/ProjectionFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/projection/ProjectionFragment.java
new file mode 100644
index 0000000..66fc1e2
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/projection/ProjectionFragment.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.google.android.car.kitchensink.projection;
+
+import android.car.CarProjectionManager;
+import android.car.CarProjectionManager.ProjectionStatusListener;
+import android.car.projection.ProjectionStatus;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.fragment.app.Fragment;
+
+import com.google.android.car.kitchensink.KitchenSinkActivity;
+import com.google.android.car.kitchensink.R;
+import com.google.common.collect.ImmutableMap;
+
+import java.util.List;
+
+/**
+ * Reports information about the current projection status.
+ */
+public class ProjectionFragment extends Fragment {
+ private KitchenSinkActivity mActivity;
+ private CarProjectionManager mCarProjectionManager;
+
+ private TextView mCurrentProjectionStatus;
+ private TextView mCurrentProjectionPackage;
+ private LinearLayout mCurrentProjectionDetails;
+
+ private static final ImmutableMap<Integer, String> STATE_TO_STRING = ImmutableMap.of(
+ ProjectionStatus.PROJECTION_STATE_INACTIVE, "Inactive",
+ ProjectionStatus.PROJECTION_STATE_READY_TO_PROJECT, "Ready to project",
+ ProjectionStatus.PROJECTION_STATE_ACTIVE_FOREGROUND, "Foreground",
+ ProjectionStatus.PROJECTION_STATE_ACTIVE_BACKGROUND, "Background");
+
+ private static final ImmutableMap<Integer, String> TRANSPORT_TO_STRING = ImmutableMap.of(
+ ProjectionStatus.PROJECTION_TRANSPORT_NONE, "None",
+ ProjectionStatus.PROJECTION_TRANSPORT_USB, "USB",
+ ProjectionStatus.PROJECTION_TRANSPORT_WIFI, "WiFi");
+
+ private class KitchenSinkProjectionStatusListener implements ProjectionStatusListener {
+ @Override
+ public void onProjectionStatusChanged(
+ int state,
+ String packageName,
+ List<ProjectionStatus> details) {
+ mCurrentProjectionStatus.setText(STATE_TO_STRING.get(state));
+ mCurrentProjectionPackage.setText(packageName);
+ mCurrentProjectionDetails.removeAllViews();
+ for (ProjectionStatus detail : details) {
+ LinearLayout detailLayout =
+ (LinearLayout)
+ getLayoutInflater()
+ .inflate(R.layout.projection_status_details, null);
+
+ TextView detailPackage = detailLayout.findViewById(R.id.projection_detail_package);
+ detailPackage.setText(detail.getPackageName());
+
+ TextView detailState = detailLayout.findViewById(R.id.projection_detail_state);
+ detailState.setText(STATE_TO_STRING.get(detail.getState()));
+
+ TextView detailTransport =
+ detailLayout.findViewById(R.id.projection_detail_transport);
+ detailTransport.setText(TRANSPORT_TO_STRING.get(detail.getTransport()));
+
+ for (ProjectionStatus.MobileDevice device : detail.getConnectedMobileDevices()) {
+ LinearLayout deviceLayout =
+ (LinearLayout)
+ getLayoutInflater()
+ .inflate(R.layout.projection_status_device, null);
+
+ TextView deviceId = deviceLayout.findViewById(R.id.projection_device_id);
+ deviceId.setText(String.valueOf(device.getId()));
+
+ TextView deviceName = deviceLayout.findViewById(R.id.projection_device_name);
+ deviceName.setText(device.getName());
+
+ LinearLayout deviceTransports =
+ deviceLayout.findViewById(R.id.projection_device_transports);
+ for (Integer transport : device.getAvailableTransports()) {
+ TextView transportView = new TextView(mActivity);
+ transportView.setText(TRANSPORT_TO_STRING.get(transport));
+
+ deviceTransports.addView(transportView);
+ }
+
+ TextView deviceProjecting =
+ deviceLayout.findViewById(R.id.projection_device_projecting);
+ deviceProjecting.setText(String.valueOf(device.isProjecting()));
+
+ detailLayout.addView(deviceLayout);
+ }
+ mCurrentProjectionDetails.addView(detailLayout);
+ }
+ }
+ }
+
+ private final KitchenSinkProjectionStatusListener mProjectionListener =
+ new KitchenSinkProjectionStatusListener();
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ mActivity = (KitchenSinkActivity) getActivity();
+ mCarProjectionManager = mActivity.getProjectionManager();
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public View onCreateView(
+ LayoutInflater inflater,
+ ViewGroup container,
+ Bundle savedInstanceState) {
+ View layout = inflater.inflate(R.layout.projection_status, container, false);
+
+ mCurrentProjectionStatus = (TextView) layout.findViewById(R.id.current_projection_status);
+ mCurrentProjectionPackage = (TextView) layout.findViewById(R.id.current_projection_package);
+ mCurrentProjectionDetails =
+ (LinearLayout) layout.findViewById(R.id.current_projection_details);
+
+ return layout;
+ }
+
+ @Override
+ public void onStart() {
+ mCarProjectionManager.registerProjectionStatusListener(mProjectionListener);
+ super.onStart();
+ }
+
+ @Override
+ public void onStop() {
+ mCarProjectionManager.unregisterProjectionStatusListener(mProjectionListener);
+ super.onStop();
+ }
+}
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/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-as/strings.xml
similarity index 62%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-as/strings.xml
index daa61a3..f4490dc 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-as/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"নমস্কাৰ, পৃথিৱী!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-bn/strings.xml
similarity index 62%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-bn/strings.xml
index daa61a3..a27bebe 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-bn/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"হ্যালো, ওয়ার্ল্ড!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-eu/strings.xml
similarity index 64%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-eu/strings.xml
index daa61a3..ff1a717 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-eu/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"Kaixo!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-gu/strings.xml
similarity index 62%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-gu/strings.xml
index daa61a3..ad17840 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-gu/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"વિશ્વને નમસ્કાર!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-hi/strings.xml
similarity index 62%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-hi/strings.xml
index daa61a3..5e6e732 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-hi/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"सभी को नमस्कार!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-iw/strings.xml
similarity index 64%
rename from car-cluster-logging-renderer/res/values-af/strings.xml
rename to tests/MultiDisplayTestHelloActivity/res/values-iw/strings.xml
index daa61a3..d5c90ec 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-iw/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"Hello world!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-ka/strings.xml
similarity index 62%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-ka/strings.xml
index daa61a3..fb1ff2f 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-ka/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"გამარჯობა, სამყაროვ!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-kk/strings.xml
similarity index 63%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-kk/strings.xml
index daa61a3..71dc98e 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-kk/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"Бәріне сәлем!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-kn/strings.xml
similarity index 62%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-kn/strings.xml
index daa61a3..283e7ac 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-kn/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"ಈ ಜಗತ್ತಿಗೆ, ನಮಸ್ಕಾರ!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-ml/strings.xml
similarity index 63%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-ml/strings.xml
index daa61a3..353fd0d 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-ml/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"ഹലോ, വേൾഡ്!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-mr/strings.xml
similarity index 63%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-mr/strings.xml
index daa61a3..b143ba3 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-mr/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"हॅलो, दुनिया!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-ne/strings.xml
similarity index 62%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-ne/strings.xml
index daa61a3..6ab57f4 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-ne/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"संसारलाई नमस्कार!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-or/strings.xml
similarity index 63%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-or/strings.xml
index daa61a3..9a18aae 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-or/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"ହେଲୋ ଦୁନିଆ!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-ta/strings.xml
similarity index 61%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-ta/strings.xml
index daa61a3..6faf2cd 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-ta/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"உலகத்தினருக்கு வணக்கம்!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-te/strings.xml
similarity index 63%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-te/strings.xml
index daa61a3..0ed1751 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-te/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"హలో ప్రపంచం!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-ur/strings.xml
similarity index 63%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-ur/strings.xml
index daa61a3..ffb21af 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-ur/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"ہیلو، دنیا والو!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-uz/strings.xml
similarity index 64%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-uz/strings.xml
index daa61a3..f44363a 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-uz/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"Salom, dunyo!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/tests/MultiDisplayTestHelloActivity/res/values-zh-rCN/strings.xml
similarity index 64%
copy from car-cluster-logging-renderer/res/values-af/strings.xml
copy to tests/MultiDisplayTestHelloActivity/res/values-zh-rCN/strings.xml
index daa61a3..da391de 100644
--- a/car-cluster-logging-renderer/res/values-af/strings.xml
+++ b/tests/MultiDisplayTestHelloActivity/res/values-zh-rCN/strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,5 +16,7 @@
<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>
+ <string name="hello_activity_text_text" msgid="8189259382863353832">"Hello, World!"</string>
+ <string name="app_name_default" msgid="110846623663619763">"MDTHelloDefault"</string>
+ <string name="app_name_always" msgid="6684579479829101738">"MDTHelloAlways"</string>
</resources>
diff --git a/tests/carservice_test/src/com/android/car/MockedVmsTestBase.java b/tests/carservice_test/src/com/android/car/MockedVmsTestBase.java
index 4c26e11..7214f8b 100644
--- a/tests/carservice_test/src/com/android/car/MockedVmsTestBase.java
+++ b/tests/carservice_test/src/com/android/car/MockedVmsTestBase.java
@@ -16,6 +16,7 @@
package com.android.car;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import android.car.Car;
import android.car.VehicleAreaType;
@@ -30,7 +31,9 @@
import android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess;
import android.hardware.automotive.vehicle.V2_0.VehiclePropertyChangeMode;
import android.hardware.automotive.vehicle.V2_0.VmsAvailabilityStateIntegerValuesIndex;
+import android.hardware.automotive.vehicle.V2_0.VmsBaseMessageIntegerValuesIndex;
import android.hardware.automotive.vehicle.V2_0.VmsMessageType;
+import android.hardware.automotive.vehicle.V2_0.VmsStartSessionMessageIntegerValuesIndex;
import android.os.UserHandle;
import android.util.Log;
import android.util.Pair;
@@ -38,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;
@@ -73,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);
@@ -86,8 +89,23 @@
mVmsSubscriberManager.setVmsSubscriberClientCallback(Executors.newSingleThreadExecutor(),
mSubscriberClient);
- // Validate layer availability sent to HAL
+ // Validate session handshake
List<Integer> v = mHalClient.receiveMessage().value.int32Values;
+ assertEquals(VmsMessageType.START_SESSION,
+ (int) v.get(VmsBaseMessageIntegerValuesIndex.MESSAGE_TYPE));
+ int coreId = v.get(VmsStartSessionMessageIntegerValuesIndex.SERVICE_ID);
+ assertTrue(coreId > 0);
+ assertEquals(-1, (int) v.get(VmsStartSessionMessageIntegerValuesIndex.CLIENT_ID));
+
+ // Send handshake acknowledgement
+ mHalClient.sendMessage(
+ VmsMessageType.START_SESSION,
+ coreId,
+ 12345 // Client ID
+ );
+
+ // Validate layer availability sent to HAL
+ v = mHalClient.receiveMessage().value.int32Values;
assertEquals(VmsMessageType.AVAILABILITY_CHANGE,
(int) v.get(VmsAvailabilityStateIntegerValuesIndex.MESSAGE_TYPE));
assertEquals(0,
@@ -107,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;
}
@@ -145,7 +159,7 @@
mSubscriptionState.add(subscriptionState);
}
- VmsSubscriptionState receiveSubscriptionState() throws InterruptedException {
+ VmsSubscriptionState receiveSubscriptionState() {
return receiveWithTimeout(mSubscriptionState);
}
}
@@ -166,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);
}
}
@@ -201,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);
}
}
diff --git a/tests/carservice_unit_test/Android.mk b/tests/carservice_unit_test/Android.mk
index b15dd41..6b715fc 100644
--- a/tests/carservice_unit_test/Android.mk
+++ b/tests/carservice_unit_test/Android.mk
@@ -53,9 +53,12 @@
car-service-lib-for-test \
com.android.car.test.utils \
junit \
- mockito-target-minus-junit4 \
+ mockito-target-inline-minus-junit4 \
frameworks-base-testutils \
truth-prebuilt
+# mockito-target-inline dependency
+LOCAL_JNI_SHARED_LIBRARIES := \
+ libdexmakerjvmtiagent \
include $(BUILD_PACKAGE)
diff --git a/tests/carservice_unit_test/AndroidManifest.xml b/tests/carservice_unit_test/AndroidManifest.xml
index 74f6aa1..e5e31bf 100644
--- a/tests/carservice_unit_test/AndroidManifest.xml
+++ b/tests/carservice_unit_test/AndroidManifest.xml
@@ -22,7 +22,8 @@
android:targetPackage="com.android.car.carservice_unittest"
android:label="Unit Tests for Car APIs"/>
- <application android:label="CarServiceUnitTest">
+ <application android:label="CarServiceUnitTest"
+ android:debuggable="true">
<uses-library android:name="android.test.runner" />
</application>
</manifest>
diff --git a/tests/carservice_unit_test/src/com/android/car/hal/InputHalServiceTest.java b/tests/carservice_unit_test/src/com/android/car/hal/InputHalServiceTest.java
index 32f8e1d..5cce922 100644
--- a/tests/carservice_unit_test/src/com/android/car/hal/InputHalServiceTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/hal/InputHalServiceTest.java
@@ -181,6 +181,28 @@
assertThat(event.getRepeatCount()).isEqualTo(0);
}
+ /**
+ * Test for handling rotary knob event.
+ */
+ @Test
+ public void handlesRepeatedKeyWithIndents() {
+ subscribeListener();
+ KeyEvent event = dispatchSingleEventWithIndents(KeyEvent.KEYCODE_VOLUME_UP, 5);
+ assertThat(event.getAction()).isEqualTo(KeyEvent.ACTION_DOWN);
+ assertThat(event.getKeyCode()).isEqualTo(KeyEvent.KEYCODE_VOLUME_UP);
+ assertThat(event.getEventTime()).isEqualTo(0L);
+ assertThat(event.getDownTime()).isEqualTo(0L);
+ assertThat(event.getRepeatCount()).isEqualTo(4);
+
+ when(mUptimeSupplier.getAsLong()).thenReturn(5L);
+ event = dispatchSingleEventWithIndents(KeyEvent.KEYCODE_VOLUME_UP, 5);
+ assertThat(event.getAction()).isEqualTo(KeyEvent.ACTION_DOWN);
+ assertThat(event.getKeyCode()).isEqualTo(KeyEvent.KEYCODE_VOLUME_UP);
+ assertThat(event.getEventTime()).isEqualTo(5L);
+ assertThat(event.getDownTime()).isEqualTo(5L);
+ assertThat(event.getRepeatCount()).isEqualTo(9);
+ }
+
@Test
public void handlesKeyUp_withoutKeyDown() {
subscribeListener();
@@ -237,4 +259,25 @@
reset(mInputListener);
return captor.getValue();
}
-}
+
+ private VehiclePropValue makeKeyPropValueWithIndents(int code, int indents) {
+ VehiclePropValue v = new VehiclePropValue();
+ v.prop = VehicleProperty.HW_KEY_INPUT;
+ // Only Key.down can have indents.
+ v.value.int32Values.add(VehicleHwKeyInputAction.ACTION_DOWN);
+ v.value.int32Values.add(code);
+ v.value.int32Values.add(DISPLAY);
+ v.value.int32Values.add(indents);
+ return v;
+ }
+
+ private KeyEvent dispatchSingleEventWithIndents(int code, int indents) {
+ ArgumentCaptor<KeyEvent> captor = ArgumentCaptor.forClass(KeyEvent.class);
+ reset(mInputListener);
+ mInputHalService.handleHalEvents(
+ ImmutableList.of(makeKeyPropValueWithIndents(code, indents)));
+ verify(mInputListener).onKeyEvent(captor.capture(), eq(DISPLAY));
+ reset(mInputListener);
+ return captor.getValue();
+ }
+}
\ No newline at end of file
diff --git a/tests/carservice_unit_test/src/com/android/car/hal/VmsHalServiceTest.java b/tests/carservice_unit_test/src/com/android/car/hal/VmsHalServiceTest.java
index baaab26..f42c52a 100644
--- a/tests/carservice_unit_test/src/com/android/car/hal/VmsHalServiceTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/hal/VmsHalServiceTest.java
@@ -37,14 +37,13 @@
import android.os.Binder;
import android.os.IBinder;
-import androidx.test.runner.AndroidJUnit4;
-
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
-import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import org.mockito.InOrder;
import org.mockito.Mock;
+import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
@@ -54,8 +53,8 @@
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
-@RunWith(AndroidJUnit4.class)
public class VmsHalServiceTest {
private static final int LAYER_TYPE = 1;
private static final int LAYER_SUBTYPE = 2;
@@ -64,6 +63,8 @@
private static final int PUBLISHER_ID = 12345;
private static final byte[] PAYLOAD = new byte[]{1, 2, 3, 4};
private static final List<Byte> PAYLOAD_AS_LIST = Arrays.asList(new Byte[]{1, 2, 3, 4});
+ private static final int CORE_ID = 54321;
+ private static final int CLIENT_ID = 98765;
@Rule
public MockitoRule mockito = MockitoJUnit.rule();
@@ -73,6 +74,12 @@
private IVmsPublisherService mPublisherService;
@Mock
private IVmsSubscriberService mSubscriberService;
+ @Mock
+ private Consumer<IBinder> mPublisherOnHalConnected;
+ @Mock
+ private Runnable mPublisherOnHalDisconnected;
+ @Mock
+ private Consumer<IVmsSubscriberClient> mSubscriberOnHalDisconnected;
private IBinder mToken;
private VmsHalService mHalService;
@@ -81,12 +88,10 @@
@Before
public void setUp() throws Exception {
- mHalService = new VmsHalService(mVehicleHal);
- mHalService.setVmsSubscriberService(mSubscriberService);
-
- mToken = new Binder();
- mPublisherClient = IVmsPublisherClient.Stub.asInterface(mHalService.getPublisherClient());
- mPublisherClient.setVmsPublisherService(mToken, mPublisherService);
+ mHalService = new VmsHalService(mVehicleHal, () -> (long) CORE_ID);
+ mHalService.setPublisherConnectionCallbacks(
+ mPublisherOnHalConnected, mPublisherOnHalDisconnected);
+ mHalService.setVmsSubscriberService(mSubscriberService, mSubscriberOnHalDisconnected);
VehiclePropConfig propConfig = new VehiclePropConfig();
propConfig.prop = VehicleProperty.VEHICLE_MAP_SERVICE;
@@ -97,16 +102,68 @@
mHalService.init();
waitForHandlerCompletion();
+ // Verify START_SESSION message was sent
+ InOrder initOrder =
+ Mockito.inOrder(mPublisherOnHalConnected, mSubscriberService, mVehicleHal);
+ initOrder.verify(mVehicleHal).subscribeProperty(mHalService,
+ VehicleProperty.VEHICLE_MAP_SERVICE);
+ initOrder.verify(mVehicleHal).set(createHalMessage(
+ VmsMessageType.START_SESSION, // Message type
+ CORE_ID, // Core ID
+ -1)); // Client ID (unknown)
+
+ // Verify no more interections until handshake received
+ initOrder.verifyNoMoreInteractions();
+
+ // Send START_SESSION response from client
+ sendHalMessage(createHalMessage(
+ VmsMessageType.START_SESSION, // Message type
+ 0, // Core ID (unknown)
+ CLIENT_ID // Client ID
+ ));
+ waitForHandlerCompletion();
+
+ // Verify client is marked as connected
+ ArgumentCaptor<IBinder> publisherCaptor = ArgumentCaptor.forClass(IBinder.class);
+ initOrder.verify(mPublisherOnHalConnected).accept(publisherCaptor.capture());
+ mPublisherClient = IVmsPublisherClient.Stub.asInterface(publisherCaptor.getValue());
+
+ mToken = new Binder();
+ mPublisherClient.setVmsPublisherService(mToken, mPublisherService);
+
ArgumentCaptor<IVmsSubscriberClient> subscriberCaptor = ArgumentCaptor.forClass(
IVmsSubscriberClient.class);
- verify(mSubscriberService).addVmsSubscriberToNotifications(subscriberCaptor.capture());
+ initOrder.verify(mSubscriberService).addVmsSubscriberToNotifications(
+ subscriberCaptor.capture());
mSubscriberClient = subscriberCaptor.getValue();
- reset(mSubscriberService);
- verify(mVehicleHal).set(createHalMessage(
+
+ initOrder.verify(mSubscriberService).getAvailableLayers();
+ initOrder.verify(mVehicleHal).set(createHalMessage(
VmsMessageType.AVAILABILITY_CHANGE, // Message type
0, // Sequence number
0)); // # of associated layers
- reset(mVehicleHal);
+
+ initOrder.verifyNoMoreInteractions();
+ reset(mPublisherOnHalConnected, mSubscriberService, mVehicleHal);
+ }
+
+ @Test
+ public void testCoreId_IntegerOverflow() throws Exception {
+ mHalService = new VmsHalService(mVehicleHal, () -> (long) Integer.MAX_VALUE + CORE_ID);
+
+ VehiclePropConfig propConfig = new VehiclePropConfig();
+ propConfig.prop = VehicleProperty.VEHICLE_MAP_SERVICE;
+ mHalService.takeSupportedProperties(Collections.singleton(propConfig));
+
+ when(mSubscriberService.getAvailableLayers()).thenReturn(
+ new VmsAvailableLayers(Collections.emptySet(), 0));
+ mHalService.init();
+ waitForHandlerCompletion();
+
+ verify(mVehicleHal).set(createHalMessage(
+ VmsMessageType.START_SESSION, // Message type
+ CORE_ID, // Core ID
+ -1)); // Client ID (unknown)
}
@Test
@@ -506,6 +563,40 @@
}
/**
+ * START_SESSION message format:
+ * <ul>
+ * <li>Message type
+ * <li>Core ID
+ * <li>Client ID
+ * </ul>
+ */
+ @Test
+ public void testHandleStartSessionEvent() throws Exception {
+ when(mSubscriberService.getAvailableLayers()).thenReturn(
+ new VmsAvailableLayers(Collections.emptySet(), 5));
+
+ VehiclePropValue request = createHalMessage(
+ VmsMessageType.START_SESSION, // Message type
+ 0, // Core ID (unknown)
+ CLIENT_ID // Client ID
+ );
+
+ VehiclePropValue response = createHalMessage(
+ VmsMessageType.START_SESSION, // Message type
+ CORE_ID, // Core ID
+ CLIENT_ID // Client ID
+ );
+
+ sendHalMessage(request);
+ InOrder inOrder = Mockito.inOrder(mVehicleHal);
+ inOrder.verify(mVehicleHal).set(response);
+ inOrder.verify(mVehicleHal).set(createHalMessage(
+ VmsMessageType.AVAILABILITY_CHANGE, // Message type
+ 5, // Sequence number
+ 0)); // # of associated layers
+ }
+
+ /**
* AVAILABILITY_CHANGE message format:
* <ul>
* <li>Message type
@@ -865,9 +956,7 @@
private void waitForHandlerCompletion() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);
- mHalService.getHandler().post(() -> {
- latch.countDown();
- });
+ mHalService.getHandler().post(latch::countDown);
latch.await(5, TimeUnit.SECONDS);
}
}
diff --git a/tests/carservice_unit_test/src/com/android/car/vms/VmsClientManagerTest.java b/tests/carservice_unit_test/src/com/android/car/vms/VmsClientManagerTest.java
index 6519f0c..772abc7 100644
--- a/tests/carservice_unit_test/src/com/android/car/vms/VmsClientManagerTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/vms/VmsClientManagerTest.java
@@ -60,6 +60,8 @@
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
+import java.util.function.Consumer;
+
@SmallTest
public class VmsClientManagerTest {
private static final String HAL_CLIENT_NAME = "VmsHalClient";
@@ -84,7 +86,8 @@
@Mock
private VmsHalService mHal;
- private IBinder mHalClient;
+ private Consumer<IBinder> mHalClientConnected;
+ private Runnable mHalClientDisconnected;
@Mock
private VmsClientManager.ConnectionListener mConnectionListener;
@@ -115,13 +118,18 @@
mUserId = 10;
when(mUserManager.getCurrentForegroundUserId()).thenAnswer((invocation) -> mUserId);
- mHalClient = new Binder();
- when(mHal.getPublisherClient()).thenReturn(mHalClient);
-
mClientManager = new VmsClientManager(mContext, mUserService, mUserManager, mHal);
mClientManager.registerConnectionListener(mConnectionListener);
- verify(mConnectionListener).onClientConnected(HAL_CLIENT_NAME, mHalClient);
- reset(mConnectionListener);
+
+ @SuppressWarnings("unchecked")
+ ArgumentCaptor<Consumer<IBinder>> onClientConnectedCaptor =
+ ArgumentCaptor.forClass(Consumer.class);
+ ArgumentCaptor<Runnable> onClientDisconnectedCaptor =
+ ArgumentCaptor.forClass(Runnable.class);
+ verify(mHal).setPublisherConnectionCallbacks(
+ onClientConnectedCaptor.capture(), onClientDisconnectedCaptor.capture());
+ mHalClientConnected = onClientConnectedCaptor.getValue();
+ mHalClientDisconnected = onClientDisconnectedCaptor.getValue();
}
@After
@@ -130,6 +138,7 @@
verify(mContext, atLeast(0)).getResources();
verify(mContext, atLeast(0)).getPackageManager();
verifyNoMoreInteractions(mContext);
+ verifyNoMoreInteractions(mHal);
}
@Test
@@ -162,18 +171,28 @@
VmsClientManager.ConnectionListener listener =
Mockito.mock(VmsClientManager.ConnectionListener.class);
mClientManager.registerConnectionListener(listener);
- verify(listener).onClientConnected(HAL_CLIENT_NAME, mHalClient);
+ }
+
+ @Test
+ public void testRegisterConnectionListener_AfterHalClientConnected() {
+ IBinder halClient = bindHalClient();
+
+ VmsClientManager.ConnectionListener listener =
+ Mockito.mock(VmsClientManager.ConnectionListener.class);
+ mClientManager.registerConnectionListener(listener);
+ verify(listener).onClientConnected(HAL_CLIENT_NAME, halClient);
}
@Test
public void testRegisterConnectionListener_AfterClientsConnected() {
+ IBinder halClient = bindHalClient();
IBinder systemBinder = bindSystemClient();
IBinder userBinder = bindUserClient();
VmsClientManager.ConnectionListener listener =
Mockito.mock(VmsClientManager.ConnectionListener.class);
mClientManager.registerConnectionListener(listener);
- verify(listener).onClientConnected(HAL_CLIENT_NAME, mHalClient);
+ verify(listener).onClientConnected(HAL_CLIENT_NAME, halClient);
verify(listener).onClientConnected(eq(SYSTEM_CLIENT_NAME), eq(systemBinder));
verify(listener).onClientConnected(eq(USER_CLIENT_NAME), eq(userBinder));
}
@@ -334,6 +353,18 @@
}
@Test
+ public void testHalClientConnected() {
+ IBinder binder = bindHalClient();
+ verify(mConnectionListener).onClientConnected(eq(HAL_CLIENT_NAME), eq(binder));
+ }
+
+ private IBinder bindHalClient() {
+ IBinder binder = new Binder();
+ mHalClientConnected.accept(binder);
+ return binder;
+ }
+
+ @Test
public void testOnSystemServiceConnected() {
IBinder binder = bindSystemClient();
verify(mConnectionListener).onClientConnected(eq(SYSTEM_CLIENT_NAME), eq(binder));
@@ -368,6 +399,14 @@
}
@Test
+ public void testOnHalClientDisconnected() throws Exception {
+ bindHalClient();
+ mHalClientDisconnected.run();
+
+ verify(mConnectionListener).onClientDisconnected(eq(HAL_CLIENT_NAME));
+ }
+
+ @Test
public void testOnSystemServiceDisconnected() throws Exception {
notifySystemUserUnlocked();
verifySystemBind(1);
diff --git a/user/car-user-lib/src/android/car/userlib/CarUserManagerHelper.java b/user/car-user-lib/src/android/car/userlib/CarUserManagerHelper.java
index a46cf37..0745945 100644
--- a/user/car-user-lib/src/android/car/userlib/CarUserManagerHelper.java
+++ b/user/car-user-lib/src/android/car/userlib/CarUserManagerHelper.java
@@ -60,7 +60,7 @@
*
* @hide
*/
-public class CarUserManagerHelper {
+public final class CarUserManagerHelper {
private static final String TAG = "CarUserManagerHelper";
private static final int BOOT_USER_NOT_FOUND = -1;