Merge "Set user type for com.android.networkstack.tethering.inprocess" into rvc-qpr-dev
diff --git a/car_product/build/car_base.mk b/car_product/build/car_base.mk
index d6b62bc..6fdd02a 100644
--- a/car_product/build/car_base.mk
+++ b/car_product/build/car_base.mk
@@ -17,7 +17,13 @@
# Base platform for car builds
# car packages should be added to car.mk instead of here
+ifeq ($(DISABLE_CAR_PRODUCT_CONFIG_OVERLAY),)
PRODUCT_PACKAGE_OVERLAYS += packages/services/Car/car_product/overlay
+endif
+
+ifeq ($(DISABLE_CAR_PRODUCT_VISUAL_OVERLAY),)
+PRODUCT_PACKAGE_OVERLAYS += packages/services/Car/car_product/overlay-visual
+endif
PRODUCT_COPY_FILES += \
packages/services/Car/car_product/build/component-overrides.xml:$(TARGET_COPY_OUT_VENDOR)/etc/sysconfig/component-overrides.xml \
diff --git a/car_product/overlay/frameworks/base/core/res/res/anim/fade_in.xml b/car_product/overlay-visual/frameworks/base/core/res/res/anim/fade_in.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/anim/fade_in.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/anim/fade_in.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/anim/fade_out.xml b/car_product/overlay-visual/frameworks/base/core/res/res/anim/fade_out.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/anim/fade_out.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/anim/fade_out.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable-night-nodpi/default_wallpaper.png b/car_product/overlay-visual/frameworks/base/core/res/res/drawable-night-nodpi/default_wallpaper.png
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/drawable-night-nodpi/default_wallpaper.png
rename to car_product/overlay-visual/frameworks/base/core/res/res/drawable-night-nodpi/default_wallpaper.png
Binary files differ
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png b/car_product/overlay-visual/frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png
rename to car_product/overlay-visual/frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png
Binary files differ
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable-sw600dp-night/default_wallpaper.png b/car_product/overlay-visual/frameworks/base/core/res/res/drawable-sw600dp-night/default_wallpaper.png
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/drawable-sw600dp-night/default_wallpaper.png
rename to car_product/overlay-visual/frameworks/base/core/res/res/drawable-sw600dp-night/default_wallpaper.png
Binary files differ
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png b/car_product/overlay-visual/frameworks/base/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png
rename to car_product/overlay-visual/frameworks/base/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png
Binary files differ
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable-sw720dp-night/default_wallpaper.png b/car_product/overlay-visual/frameworks/base/core/res/res/drawable-sw720dp-night/default_wallpaper.png
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/drawable-sw720dp-night/default_wallpaper.png
rename to car_product/overlay-visual/frameworks/base/core/res/res/drawable-sw720dp-night/default_wallpaper.png
Binary files differ
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png b/car_product/overlay-visual/frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png
rename to car_product/overlay-visual/frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png
Binary files differ
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable/ic_account_circle.xml b/car_product/overlay-visual/frameworks/base/core/res/res/drawable/ic_account_circle.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/drawable/ic_account_circle.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/drawable/ic_account_circle.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable/ic_collapse_notification.xml b/car_product/overlay-visual/frameworks/base/core/res/res/drawable/ic_collapse_notification.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/drawable/ic_collapse_notification.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/drawable/ic_collapse_notification.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable/ic_expand_notification.xml b/car_product/overlay-visual/frameworks/base/core/res/res/drawable/ic_expand_notification.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/drawable/ic_expand_notification.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/drawable/ic_expand_notification.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable/item_background.xml b/car_product/overlay-visual/frameworks/base/core/res/res/drawable/item_background.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/drawable/item_background.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/drawable/item_background.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable/toast_frame.xml b/car_product/overlay-visual/frameworks/base/core/res/res/drawable/toast_frame.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/drawable/toast_frame.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/drawable/toast_frame.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/layout/notification_template_right_icon.xml b/car_product/overlay-visual/frameworks/base/core/res/res/layout/notification_template_right_icon.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/layout/notification_template_right_icon.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/layout/notification_template_right_icon.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/layout/resolve_list_item.xml b/car_product/overlay-visual/frameworks/base/core/res/res/layout/resolve_list_item.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/layout/resolve_list_item.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/layout/resolve_list_item.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/layout/resolver_different_item_header.xml b/car_product/overlay-visual/frameworks/base/core/res/res/layout/resolver_different_item_header.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/layout/resolver_different_item_header.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/layout/resolver_different_item_header.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/layout/resolver_list.xml b/car_product/overlay-visual/frameworks/base/core/res/res/layout/resolver_list.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/layout/resolver_list.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/layout/resolver_list.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/layout/resolver_list_with_default.xml b/car_product/overlay-visual/frameworks/base/core/res/res/layout/resolver_list_with_default.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/layout/resolver_list_with_default.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/layout/resolver_list_with_default.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/layout/transient_notification.xml b/car_product/overlay-visual/frameworks/base/core/res/res/layout/transient_notification.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/layout/transient_notification.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/layout/transient_notification.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-h1752dp/dimens.xml b/car_product/overlay-visual/frameworks/base/core/res/res/values-h1752dp/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/values-h1752dp/dimens.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/values-h1752dp/dimens.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-h600dp/dimens.xml b/car_product/overlay-visual/frameworks/base/core/res/res/values-h600dp/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/values-h600dp/dimens.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/values-h600dp/dimens.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-night/colors_car.xml b/car_product/overlay-visual/frameworks/base/core/res/res/values-night/colors_car.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/values-night/colors_car.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/values-night/colors_car.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-night/colors_device_defaults.xml b/car_product/overlay-visual/frameworks/base/core/res/res/values-night/colors_device_defaults.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/values-night/colors_device_defaults.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/values-night/colors_device_defaults.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-w1280dp/dimens.xml b/car_product/overlay-visual/frameworks/base/core/res/res/values-w1280dp/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/values-w1280dp/dimens.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/values-w1280dp/dimens.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-w1920dp/dimens.xml b/car_product/overlay-visual/frameworks/base/core/res/res/values-w1920dp/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/values-w1920dp/dimens.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/values-w1920dp/dimens.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-w690dp/dimens.xml b/car_product/overlay-visual/frameworks/base/core/res/res/values-w690dp/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/values-w690dp/dimens.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/values-w690dp/dimens.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-w840dp/dimens.xml b/car_product/overlay-visual/frameworks/base/core/res/res/values-w840dp/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/values-w840dp/dimens.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/values-w840dp/dimens.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/colors.xml b/car_product/overlay-visual/frameworks/base/core/res/res/values/colors.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/values/colors.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/values/colors.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/colors_device_defaults.xml b/car_product/overlay-visual/frameworks/base/core/res/res/values/colors_device_defaults.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/values/colors_device_defaults.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/values/colors_device_defaults.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/dimens.xml b/car_product/overlay-visual/frameworks/base/core/res/res/values/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/values/dimens.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/values/dimens.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/styles.xml b/car_product/overlay-visual/frameworks/base/core/res/res/values/styles.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/values/styles.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/values/styles.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/styles_device_default.xml b/car_product/overlay-visual/frameworks/base/core/res/res/values/styles_device_default.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/values/styles_device_default.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/values/styles_device_default.xml
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/themes_device_defaults.xml b/car_product/overlay-visual/frameworks/base/core/res/res/values/themes_device_defaults.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/core/res/res/values/themes_device_defaults.xml
rename to car_product/overlay-visual/frameworks/base/core/res/res/values/themes_device_defaults.xml
diff --git a/car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-h600dp/dimens.xml b/car_product/overlay-visual/frameworks/base/packages/CarSystemUI/res/values-h600dp/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-h600dp/dimens.xml
rename to car_product/overlay-visual/frameworks/base/packages/CarSystemUI/res/values-h600dp/dimens.xml
diff --git a/car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-sw600dp/dimens.xml b/car_product/overlay-visual/frameworks/base/packages/CarSystemUI/res/values-sw600dp/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-sw600dp/dimens.xml
rename to car_product/overlay-visual/frameworks/base/packages/CarSystemUI/res/values-sw600dp/dimens.xml
diff --git a/car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-w1024dp/dimens.xml b/car_product/overlay-visual/frameworks/base/packages/CarSystemUI/res/values-w1024dp/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-w1024dp/dimens.xml
rename to car_product/overlay-visual/frameworks/base/packages/CarSystemUI/res/values-w1024dp/dimens.xml
diff --git a/car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-w550dp-land/dimens.xml b/car_product/overlay-visual/frameworks/base/packages/CarSystemUI/res/values-w550dp-land/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-w550dp-land/dimens.xml
rename to car_product/overlay-visual/frameworks/base/packages/CarSystemUI/res/values-w550dp-land/dimens.xml
diff --git a/car_product/overlay/frameworks/base/packages/SettingsLib/res/values/dimens.xml b/car_product/overlay-visual/frameworks/base/packages/SettingsLib/res/values/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/packages/SettingsLib/res/values/dimens.xml
rename to car_product/overlay-visual/frameworks/base/packages/SettingsLib/res/values/dimens.xml
diff --git a/car_product/overlay/frameworks/base/packages/SettingsLib/res/values/styles.xml b/car_product/overlay-visual/frameworks/base/packages/SettingsLib/res/values/styles.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/packages/SettingsLib/res/values/styles.xml
rename to car_product/overlay-visual/frameworks/base/packages/SettingsLib/res/values/styles.xml
diff --git a/car_product/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/car_product/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
index 81a9a3d..5b53dcf 100644
--- a/car_product/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
+++ b/car_product/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
@@ -26,4 +26,7 @@
<!-- Disable system heads-up notifications -->
<integer name="def_heads_up_enabled">0</integer>
+
+ <!-- Default for UI touch sounds disabled -->
+ <bool name="def_sound_effects_enabled">false</bool>
</resources>
diff --git a/car_product/sepolicy/private/carservice_app.te b/car_product/sepolicy/private/carservice_app.te
index 49a3c6f..2fd2095 100644
--- a/car_product/sepolicy/private/carservice_app.te
+++ b/car_product/sepolicy/private/carservice_app.te
@@ -66,8 +66,9 @@
allow carservice_app statsd:binder call;
# To access /sys/fs/<type>/<partition>/lifetime_write_kbytes
-r_dir_file(carservice_app, sysfs_fs_ext4)
-r_dir_file(carservice_app, sysfs_fs_f2fs)
+allow carservice_app sysfs:dir { open read search };
+allow carservice_app sysfs_fs_ext4_features:dir { open read search};
+allow carservice_app sysfs_fs_f2fs:dir { open read search };
set_prop(carservice_app, ctl_start_prop)
set_prop(carservice_app, ctl_stop_prop)
diff --git a/car_product/sepolicy/private/genfs_contexts b/car_product/sepolicy/private/genfs_contexts
deleted file mode 100644
index e8e6e9f..0000000
--- a/car_product/sepolicy/private/genfs_contexts
+++ /dev/null
@@ -1 +0,0 @@
-genfscon sysfs /fs/ext4 u:object_r:sysfs_fs_ext4:s0
diff --git a/car_product/sepolicy/public/file.te b/car_product/sepolicy/public/file.te
index 8703f35..11bf839 100644
--- a/car_product/sepolicy/public/file.te
+++ b/car_product/sepolicy/public/file.te
@@ -1,4 +1,8 @@
+# This type for lifetime_write_kbytes files which resides in
+# /sys/fs/<filesystem>/<partition>/lifetime_writes_kbytes
+# Vendors are supposed to extend genfs_contexts with the
+# partition names for their devices.
+type sysfs_fs_lifetime_write, sysfs_type, fs_type;
+
# /data/system/car
type system_car_data_file, file_type, data_file_type, core_data_file_type;
-# /sys/fs/ext4
-type sysfs_fs_ext4, sysfs_type, fs_type;
diff --git a/evs/manager/1.1/Android.bp b/evs/manager/1.1/Android.bp
index 891d615..d9c7d33 100644
--- a/evs/manager/1.1/Android.bp
+++ b/evs/manager/1.1/Android.bp
@@ -14,6 +14,65 @@
//
//
+cc_library {
+ name: "android.automotive.evs.manager.fuzzlib",
+
+ srcs: [
+ "Enumerator.cpp",
+ "HalCamera.cpp",
+ "HalDisplay.cpp",
+ "VirtualCamera.cpp",
+ "stats/CameraUsageStats.cpp",
+ "stats/LooperWrapper.cpp",
+ "stats/StatsCollector.cpp",
+ "sync/unique_fd.cpp",
+ "sync/unique_fence.cpp",
+ "sync/unique_timeline.cpp",
+ ],
+
+ shared_libs: [
+ "android.hardware.automotive.evs@1.0",
+ "android.hardware.automotive.evs@1.1",
+ "libbase",
+ "libcamera_metadata",
+ "libcutils",
+ "libhardware",
+ "libhidlbase",
+ "libprocessgroup",
+ "libstatslog",
+ "libsync",
+ "libui",
+ "libutils",
+ ],
+
+ cflags: ["-DLOG_TAG=\"EvsManagerFuzzlibV1_1\""] + [
+ "-D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS",
+ "-Wall",
+ "-Werror",
+ "-Wunused",
+ "-Wunreachable-code",
+ "-Wthread-safety",
+ ],
+
+ include_dirs: [
+ "system/core/libsync",
+ ],
+
+ export_include_dirs: [
+ "./",
+ "stats/",
+ "sync/",
+ ],
+
+ product_variables: {
+ debuggable: {
+ cflags: [
+ "-DEVS_DEBUG",
+ ]
+ }
+ },
+}
+
//#################################
cc_binary {
diff --git a/evs/manager/1.1/test/fuzzer/Android.bp b/evs/manager/1.1/test/fuzzer/Android.bp
new file mode 100644
index 0000000..dfe0203
--- /dev/null
+++ b/evs/manager/1.1/test/fuzzer/Android.bp
@@ -0,0 +1,61 @@
+// Copyright 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+cc_defaults {
+ name: "evs_fuzz_default",
+ static_libs: [
+ "libgmock",
+ "libgtest",
+ ],
+
+ shared_libs: [
+ "android.automotive.evs.manager.fuzzlib",
+ "android.hardware.automotive.evs@1.0",
+ "android.hardware.automotive.evs@1.1",
+ "libbase",
+ "libcamera_metadata",
+ "libcutils",
+ "libhardware",
+ "libhidlbase",
+ "libprocessgroup",
+ "libstatslog",
+ "libsync",
+ "libui",
+ "libutils",
+ ],
+
+ cflags: [
+ "-Wno-unused-parameter",
+ ],
+
+ include_dirs: [
+ "system/core/libsync",
+ ],
+}
+
+cc_fuzz {
+ name: "evs_halcamera_fuzzer",
+ srcs: [
+ "HalCameraFuzzer.cpp",
+ ],
+ defaults: ["evs_fuzz_default"],
+}
+
+cc_fuzz {
+ name: "evs_virtual_camera_fuzzer",
+ srcs: [
+ "VirtualCameraFuzzer.cpp",
+ ],
+ defaults: ["evs_fuzz_default"],
+}
\ No newline at end of file
diff --git a/evs/manager/1.1/test/fuzzer/Common.h b/evs/manager/1.1/test/fuzzer/Common.h
new file mode 100644
index 0000000..b3b53a6
--- /dev/null
+++ b/evs/manager/1.1/test/fuzzer/Common.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef EVS_MANAGER_1_1_TEST_FUZZER_COMMON_H_
+#define EVS_MANAGER_1_1_TEST_FUZZER_COMMON_H_
+
+namespace android {
+namespace automotive {
+namespace evs {
+namespace V1_1 {
+namespace implementation {
+
+#define EVS_FUZZ_BASE_ENUM \
+ EVS_FUZZ_NOTIFY, /*verify notify*/ \
+ EVS_FUZZ_GET_HW_CAMERA, /*verify getHalCameras*/ \
+ EVS_FUZZ_DELIVER_FRAME, /* verify deliverFrame */ \
+ EVS_FUZZ_DONE_WITH_FRAME_1_0, /* verify doneWithFrame */ \
+ EVS_FUZZ_DONE_WITH_FRAME_1_1, /* verify doneWithFrame_1_1 */ \
+ EVS_FUZZ_SET_PRIMARY, /* verify setPrimary */ \
+ EVS_FUZZ_FORCE_PRIMARY, /* verify forcePrimary */ \
+ EVS_FUZZ_UNSET_PRIMARY, /* verify unsetPrimary */ \
+ EVS_FUZZ_SET_PARAMETER, /* verify setIntParameter */ \
+ EVS_FUZZ_GET_PARAMETER, /* verify getIntParameter */ \
+ EVS_FUZZ_API_SUM
+
+} // namespace implementation
+} // namespace V1_1
+} // namespace evs
+} // namespace automotive
+} // namespace android
+
+#endif // EVS_MANAGER_1_1_TEST_FUZZER_COMMON_H_
diff --git a/evs/manager/1.1/test/fuzzer/HalCameraFuzzer.cpp b/evs/manager/1.1/test/fuzzer/HalCameraFuzzer.cpp
new file mode 100644
index 0000000..4660182
--- /dev/null
+++ b/evs/manager/1.1/test/fuzzer/HalCameraFuzzer.cpp
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <fuzzer/FuzzedDataProvider.h>
+#include <iostream>
+#include "Common.h"
+#include "Enumerator.h"
+#include "HalCamera.h"
+#include "MockHWCamera.h"
+
+namespace android {
+namespace automotive {
+namespace evs {
+namespace V1_1 {
+namespace implementation {
+
+namespace {
+
+enum EvsFuzzFuncs {
+ EVS_FUZZ_MAKE_VIRTUAL_CAMERA = 0, // verify makeVirtualCamera
+ EVS_FUZZ_OWN_VIRTUAL_CAMERA, // verify ownVirtualCamera
+ EVS_FUZZ_DISOWN_VIRTUAL_CAMERA, // verify disownVirtualCamera
+ EVS_FUZZ_GET_CLIENT_COUNT, // verify getClientCount
+ EVS_FUZZ_GET_ID, // verify getId
+ EVS_FUZZ_GET_STREAM_CONFIG, // verify getStreamConfig
+ EVS_FUZZ_CHANGE_FRAMES_IN_FLIGHT, // verify changeFramesInFlight
+ EVS_FUZZ_CHANGE_FRAMES_IN_FLIGHT_1, // verify overloaded changeFramesInFlight
+ EVS_FUZZ_REQUEST_NEW_FRAME, // verify requestNewFrame
+ EVS_FUZZ_CLIENT_STREAM_STARTING, // verify clientStreamStarting
+ EVS_FUZZ_CLIENT_STREAM_ENDING, // verify clientStreamEnding
+ EVS_FUZZ_GET_STATS, // verify getStats
+ EVS_FUZZ_GET_STREAM_CONFIGURATION, // verify getStreamConfiguration
+ EVS_FUZZ_DELIVER_FRAME_1_1, // verify deliverFrame_1_1
+ EVS_FUZZ_BASE_ENUM // verify common functions
+};
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ FuzzedDataProvider fdp(data, size);
+ sp<IEvsCamera_1_1> mockHWCamera = new MockHWCamera();
+ sp<HalCamera> halCamera = new HalCamera(mockHWCamera);
+ std::vector<sp<VirtualCamera>> virtualCameras;
+
+ while (fdp.remaining_bytes() > 4) {
+ switch (fdp.ConsumeIntegralInRange<uint32_t>(0, EVS_FUZZ_API_SUM)) {
+ case EVS_FUZZ_MAKE_VIRTUAL_CAMERA: {
+ sp<VirtualCamera> virtualCamera = halCamera->makeVirtualCamera();
+ virtualCameras.emplace_back(virtualCamera);
+ break;
+ }
+ case EVS_FUZZ_OWN_VIRTUAL_CAMERA: {
+ if (!virtualCameras.empty()) {
+ uint32_t whichCam =
+ fdp.ConsumeIntegralInRange<uint32_t>(0, virtualCameras.size() - 1);
+ halCamera->ownVirtualCamera(virtualCameras[whichCam]);
+ }
+ break;
+ }
+ case EVS_FUZZ_DISOWN_VIRTUAL_CAMERA: {
+ if (!virtualCameras.empty()) {
+ uint32_t whichCam =
+ fdp.ConsumeIntegralInRange<uint32_t>(0, virtualCameras.size() - 1);
+ halCamera->disownVirtualCamera(virtualCameras[whichCam]);
+ }
+ break;
+ }
+ case EVS_FUZZ_GET_HW_CAMERA: {
+ halCamera->getHwCamera();
+ break;
+ }
+ case EVS_FUZZ_GET_CLIENT_COUNT: {
+ halCamera->getClientCount();
+ break;
+ }
+ case EVS_FUZZ_GET_ID: {
+ halCamera->getId();
+ break;
+ }
+ case EVS_FUZZ_GET_STREAM_CONFIG: {
+ halCamera->getStreamConfig();
+ break;
+ }
+ case EVS_FUZZ_CHANGE_FRAMES_IN_FLIGHT: {
+ uint32_t delta = fdp.ConsumeIntegral<int32_t>();
+ halCamera->changeFramesInFlight(delta);
+ break;
+ }
+ default:
+ LOG(ERROR) << "Unexpected option, aborting...";
+ break;
+ }
+ }
+ return 0;
+}
+
+} // namespace
+} // namespace implementation
+} // namespace V1_1
+} // namespace evs
+} // namespace automotive
+} // namespace android
diff --git a/evs/manager/1.1/test/fuzzer/MockHWCamera.h b/evs/manager/1.1/test/fuzzer/MockHWCamera.h
new file mode 100644
index 0000000..a4e0638
--- /dev/null
+++ b/evs/manager/1.1/test/fuzzer/MockHWCamera.h
@@ -0,0 +1,109 @@
+// Copyright 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef EVS_MANAGER_1_1_TEST_FUZZER_MOCKHWCAMERA_H_
+#define EVS_MANAGER_1_1_TEST_FUZZER_MOCKHWCAMERA_H_
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+namespace android {
+namespace automotive {
+namespace evs {
+namespace V1_1 {
+namespace implementation {
+
+class MockHWCamera : public IEvsCamera_1_1 {
+public:
+ MockHWCamera() = default;
+
+ // v1.0 methods
+ Return<void> getCameraInfo(getCameraInfo_cb _hidl_cb) override { return {}; }
+ Return<EvsResult> setMaxFramesInFlight(uint32_t bufferCount) override {
+ if (bufferCount > 1024) {
+ return EvsResult::INVALID_ARG;
+ }
+ return EvsResult::OK;
+ }
+ Return<EvsResult> startVideoStream(const ::android::sp<IEvsCameraStream_1_0>& stream) override {
+ return EvsResult::OK;
+ }
+ Return<void> doneWithFrame(const BufferDesc_1_0& buffer) override { return {}; }
+ Return<void> stopVideoStream() override { return {}; }
+ Return<int32_t> getExtendedInfo(uint32_t opaqueIdentifier) override {
+ if (mExtendedInfo.find(opaqueIdentifier) != mExtendedInfo.end()) {
+ return mExtendedInfo[opaqueIdentifier];
+ }
+ return 0;
+ }
+ Return<EvsResult> setExtendedInfo(uint32_t opaqueIdentifier, int32_t opaqueValue) override {
+ mExtendedInfo[opaqueIdentifier] = opaqueValue;
+ return EvsResult::OK;
+ }
+
+ // v1.1 methods
+ Return<void> getCameraInfo_1_1(getCameraInfo_1_1_cb _hidl_cb) override { return {}; }
+ MOCK_METHOD(Return<void>, getPhysicalCameraInfo,
+ (const hidl_string& deviceId, getPhysicalCameraInfo_cb _hidl_cb), (override));
+ MOCK_METHOD(Return<EvsResult>, pauseVideoStream, (), (override));
+ MOCK_METHOD(Return<EvsResult>, resumeVideoStream, (), (override));
+ MOCK_METHOD(Return<EvsResult>, doneWithFrame_1_1,
+ (const hardware::hidl_vec<BufferDesc_1_1>& buffer), (override));
+ MOCK_METHOD(Return<EvsResult>, setMaster, (), (override));
+ MOCK_METHOD(Return<EvsResult>, forceMaster, (const sp<IEvsDisplay_1_0>& display), (override));
+ MOCK_METHOD(Return<EvsResult>, unsetMaster, (), (override));
+ Return<void> getParameterList(getParameterList_cb _hidl_cb) override { return {}; }
+ Return<void> getIntParameterRange(CameraParam id, getIntParameterRange_cb _hidl_cb) override {
+ return {};
+ }
+ Return<void> setIntParameter(CameraParam id, int32_t value,
+ setIntParameter_cb _hidl_cb) override {
+ // FIXME in default implementation, it's _hidl_cb(EvsResult::INVALID_ARG, 0); which will
+ // always cause a segfault what's the predefined behavior of _hidl_cb?
+ std::vector<int32_t> vec;
+ vec.push_back(0);
+ _hidl_cb(EvsResult::INVALID_ARG, vec);
+ return {};
+ }
+
+ Return<void> getIntParameter(CameraParam id, getIntParameter_cb _hidl_cb) {
+ _hidl_cb(EvsResult::INVALID_ARG, 0);
+ return {};
+ }
+
+ Return<void> getExtendedInfo_1_1(uint32_t opaqueIdentifier,
+ getExtendedInfo_1_1_cb _hidl_cb) override {
+ return {};
+ }
+ Return<EvsResult> setExtendedInfo_1_1(uint32_t opaqueIdentifier,
+ const hidl_vec<uint8_t>& opaqueValue) override {
+ return EvsResult::OK;
+ }
+ Return<void> importExternalBuffers(const hidl_vec<BufferDesc_1_1>& buffers,
+ importExternalBuffers_cb _hidl_cb) override {
+ return {};
+ }
+
+private:
+ std::map<uint32_t, int32_t> mExtendedInfo;
+ std::map<uint32_t, int32_t> mExtendedInfo_1_1;
+};
+
+} // namespace implementation
+} // namespace V1_1
+} // namespace evs
+} // namespace automotive
+} // namespace android
+
+#endif // EVS_MANAGER_1_1_TEST_FUZZER_MOCKHWCAMERA_H_
diff --git a/evs/manager/1.1/test/fuzzer/VirtualCameraFuzzer.cpp b/evs/manager/1.1/test/fuzzer/VirtualCameraFuzzer.cpp
new file mode 100644
index 0000000..3776f4b
--- /dev/null
+++ b/evs/manager/1.1/test/fuzzer/VirtualCameraFuzzer.cpp
@@ -0,0 +1,262 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <fuzzer/FuzzedDataProvider.h>
+#include <iostream>
+#include "Common.h"
+#include "Enumerator.h"
+#include "MockHWCamera.h"
+#include "VirtualCamera.h"
+
+namespace android {
+namespace automotive {
+namespace evs {
+namespace V1_1 {
+namespace implementation {
+
+namespace {
+
+using CameraDesc_1_0 = ::android::hardware::automotive::evs::V1_0::CameraDesc;
+
+enum EvsFuzzFuncs {
+ EVS_FUZZ_GET_ALLOWED_BUFFERS, // verify getAllowedBuffers
+ EVS_FUZZ_IS_STREAMING, // verify isStreaming
+ EVS_FUZZ_GET_VERSION, // verify getVersion
+ EVS_FUZZ_SET_DESCRIPTOR, // verify setDescriptor
+ EVS_FUZZ_GET_CAMERA_INFO, // verify getCameraInfo
+ EVS_FUZZ_SETMAX_FRAMES_IN_FLIGHT, // verify setMaxFramesInFlight
+ EVS_FUZZ_START_VIDEO_STREAM, // verify startVideoStream
+ EVS_FUZZ_STOP_VIDEO_STREAM, // verify stopVideoStream
+ EVS_FUZZ_GET_EXTENDED_INFO, // verify getExtendedInfo
+ EVS_FUZZ_SET_EXTENDED_INFO, // verify setExtendedInfo
+ EVS_FUZZ_GET_CAMERA_INFO_1_1, // verify getCameraInfo_1_1
+ EVS_FUZZ_GET_PHYSICAL_CAMERA_INFO, // verify getPhysicalCameraInfo
+ EVS_FUZZ_PAUSE_VIDEO_STREAM, // verify pauseVideoStream
+ EVS_FUZZ_RESUME_VIDEO_STREAM, // verify resumeVideoStream
+ EVS_FUZZ_GET_PARAMETER_LIST, // verify getParameterList
+ EVS_FUZZ_GET_INT_PARAMETER_RANGE, // verify getIntParameterRange
+ EVS_FUZZ_SET_EXTENDED_INFO_1_1, // verify setExtendedInfo_1_1
+ EVS_FUZZ_GET_EXTENDED_INFO_1_1, // verify getExtendedInfo_1_1
+ EVS_FUZZ_IMPORT_EXTERNAL_BUFFERS, // verify importExternalBuffers
+ EVS_FUZZ_BASE_ENUM // verify common functions
+};
+
+const int kMaxFuzzerConsumedBytes = 12;
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ FuzzedDataProvider fdp(data, size);
+ sp<IEvsCamera_1_1> mockHWCamera = new MockHWCamera();
+ sp<HalCamera> halCamera = new HalCamera(mockHWCamera);
+ sp<VirtualCamera> virtualCamera = halCamera->makeVirtualCamera();
+
+ std::vector<BufferDesc_1_0> vBufferDesc_1_0;
+ std::vector<BufferDesc_1_1> vBufferDesc_1_1;
+
+ bool videoStarted = false;
+
+ while (fdp.remaining_bytes() > kMaxFuzzerConsumedBytes) {
+ switch (fdp.ConsumeIntegralInRange<uint32_t>(0, EVS_FUZZ_API_SUM)) {
+ case EVS_FUZZ_GET_ALLOWED_BUFFERS: {
+ virtualCamera->getAllowedBuffers();
+ break;
+ }
+ case EVS_FUZZ_IS_STREAMING: {
+ virtualCamera->isStreaming();
+ break;
+ }
+ case EVS_FUZZ_GET_VERSION: {
+ virtualCamera->getVersion();
+ break;
+ }
+ case EVS_FUZZ_GET_HW_CAMERA: {
+ virtualCamera->getHalCameras();
+ break;
+ }
+ case EVS_FUZZ_SET_DESCRIPTOR: {
+ CameraDesc* desc = new CameraDesc();
+ virtualCamera->setDescriptor(desc);
+ break;
+ }
+ case EVS_FUZZ_NOTIFY: {
+ if (videoStarted) {
+ EvsEventDesc event;
+ uint32_t type = fdp.ConsumeIntegralInRange<
+ uint32_t>(0, static_cast<uint32_t>(EvsEventType::STREAM_ERROR));
+ event.aType = static_cast<EvsEventType>(type);
+ virtualCamera->notify(event);
+ }
+ break;
+ }
+ case EVS_FUZZ_DELIVER_FRAME: {
+ BufferDesc buffer;
+ buffer.bufferId = fdp.ConsumeIntegral<int32_t>();
+ virtualCamera->deliverFrame(buffer);
+ vBufferDesc_1_1.emplace_back(buffer);
+ break;
+ }
+ case EVS_FUZZ_GET_CAMERA_INFO: {
+ virtualCamera->getCameraInfo([](CameraDesc_1_0 desc) {});
+ break;
+ }
+ case EVS_FUZZ_SETMAX_FRAMES_IN_FLIGHT: {
+ uint32_t delta = fdp.ConsumeIntegral<uint32_t>();
+ virtualCamera->setMaxFramesInFlight(delta);
+ break;
+ }
+ case EVS_FUZZ_START_VIDEO_STREAM: {
+ if (!videoStarted) {
+ sp<IEvsCamera_1_1> mockHWCamera1 = new MockHWCamera();
+ sp<HalCamera> halCamera1 = new HalCamera(mockHWCamera1);
+ virtualCamera->startVideoStream(halCamera1);
+ videoStarted = true;
+ }
+ break;
+ }
+ case EVS_FUZZ_DONE_WITH_FRAME_1_0: {
+ if (!vBufferDesc_1_0.empty()) {
+ uint32_t whichBuffer =
+ fdp.ConsumeIntegralInRange<uint32_t>(0, vBufferDesc_1_0.size() - 1);
+ virtualCamera->doneWithFrame(vBufferDesc_1_0[whichBuffer]);
+ }
+ break;
+ }
+ case EVS_FUZZ_STOP_VIDEO_STREAM: {
+ virtualCamera->stopVideoStream();
+ videoStarted = false;
+ break;
+ }
+ case EVS_FUZZ_GET_EXTENDED_INFO: {
+ uint32_t opaqueIdentifier = fdp.ConsumeIntegral<uint32_t>();
+ virtualCamera->getExtendedInfo(opaqueIdentifier);
+ break;
+ }
+ case EVS_FUZZ_SET_EXTENDED_INFO: {
+ uint32_t opaqueIdentifier = fdp.ConsumeIntegral<uint32_t>();
+ int32_t opaqueValue = fdp.ConsumeIntegral<int32_t>();
+ virtualCamera->setExtendedInfo(opaqueIdentifier, opaqueValue);
+ break;
+ }
+ case EVS_FUZZ_GET_CAMERA_INFO_1_1: {
+ virtualCamera->getCameraInfo_1_1([](CameraDesc desc) {});
+ break;
+ }
+ case EVS_FUZZ_GET_PHYSICAL_CAMERA_INFO: {
+ hidl_string deviceId("");
+ virtualCamera->getPhysicalCameraInfo(deviceId, [](const CameraDesc& info) {});
+ break;
+ }
+ case EVS_FUZZ_DONE_WITH_FRAME_1_1: {
+ if (!vBufferDesc_1_1.empty()) {
+ hidl_vec<BufferDesc_1_1> buffers(vBufferDesc_1_1);
+ virtualCamera->doneWithFrame_1_1(buffers);
+ }
+ break;
+ }
+ case EVS_FUZZ_PAUSE_VIDEO_STREAM: {
+ virtualCamera->pauseVideoStream();
+ break;
+ }
+ case EVS_FUZZ_RESUME_VIDEO_STREAM: {
+ virtualCamera->resumeVideoStream();
+ break;
+ }
+ case EVS_FUZZ_SET_PRIMARY: {
+ virtualCamera->setMaster();
+ break;
+ }
+ case EVS_FUZZ_FORCE_PRIMARY: {
+ // TODO(161388489) skip this until we finished fuzzing evs display
+ break;
+ }
+ case EVS_FUZZ_UNSET_PRIMARY: {
+ virtualCamera->unsetMaster();
+ break;
+ }
+ case EVS_FUZZ_GET_PARAMETER_LIST: {
+ virtualCamera->getParameterList([](hidl_vec<CameraParam> cmdList) {});
+ break;
+ }
+ case EVS_FUZZ_GET_INT_PARAMETER_RANGE: {
+ uint32_t whichParam =
+ fdp.ConsumeIntegralInRange<uint32_t>(0,
+ static_cast<uint32_t>(
+ CameraParam::ABSOLUTE_ZOOM));
+ virtualCamera->getIntParameterRange(static_cast<CameraParam>(whichParam),
+ [](int32_t val0, int32_t val1, int32_t val2) {
+ });
+ break;
+ }
+ case EVS_FUZZ_SET_PARAMETER: {
+ uint32_t whichParam =
+ fdp.ConsumeIntegralInRange<uint32_t>(0,
+ static_cast<uint32_t>(
+ CameraParam::ABSOLUTE_ZOOM));
+ int32_t val = fdp.ConsumeIntegral<int32_t>();
+ virtualCamera->setIntParameter(static_cast<CameraParam>(whichParam), val,
+ [](auto status, auto effectiveValues) {});
+ break;
+ }
+ case EVS_FUZZ_GET_PARAMETER: {
+ uint32_t whichParam =
+ fdp.ConsumeIntegralInRange<uint32_t>(0,
+ static_cast<uint32_t>(
+ CameraParam::ABSOLUTE_ZOOM));
+ virtualCamera->getIntParameter(static_cast<CameraParam>(whichParam),
+ [](auto status, auto effectiveValues) {});
+ break;
+ }
+ case EVS_FUZZ_SET_EXTENDED_INFO_1_1: {
+ uint32_t opaqueIdentifier = fdp.ConsumeIntegral<uint32_t>();
+ uint8_t opaqueValue = fdp.ConsumeIntegral<uint8_t>();
+ vector<uint8_t> v;
+ v.push_back(opaqueValue);
+ hidl_vec<uint8_t> vec(v);
+ virtualCamera->setExtendedInfo_1_1(opaqueIdentifier, vec);
+ break;
+ }
+ case EVS_FUZZ_GET_EXTENDED_INFO_1_1: {
+ uint32_t opaqueIdentifier = fdp.ConsumeIntegral<uint32_t>();
+ virtualCamera->getExtendedInfo_1_1(opaqueIdentifier,
+ [](const auto& result, const auto& data) {});
+ break;
+ }
+ case EVS_FUZZ_IMPORT_EXTERNAL_BUFFERS: {
+ if (!vBufferDesc_1_1.empty()) {
+ hidl_vec<BufferDesc_1_1> buffers(vBufferDesc_1_1);
+ virtualCamera->importExternalBuffers(buffers, [](auto _result, auto _delta) {});
+ }
+ break;
+ }
+ default:
+ LOG(ERROR) << "Unexpected option, aborting...";
+ break;
+ }
+ }
+
+ if (videoStarted) {
+ // TODO(b/161762538) if we do not stop video stream manually here,
+ // there will be crash at VirtualCamera.cpp::pHwCamera->unsetMaster(this);
+ virtualCamera->stopVideoStream();
+ }
+ return 0;
+}
+
+} // namespace
+} // namespace implementation
+} // namespace V1_1
+} // namespace evs
+} // namespace automotive
+} // namespace android
diff --git a/service/src/com/android/car/am/FixedActivityService.java b/service/src/com/android/car/am/FixedActivityService.java
index 38e31d1..19d1f70 100644
--- a/service/src/com/android/car/am/FixedActivityService.java
+++ b/service/src/com/android/car/am/FixedActivityService.java
@@ -17,6 +17,7 @@
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static android.os.Process.INVALID_UID;
+import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;
import static com.android.car.CarLog.TAG_AM;
@@ -444,6 +445,9 @@
}
mBlockingPresentations.append(displayIdForActivity, p);
}
+ // Change the window type, since we can't show the Presentation window
+ // in the internal display.
+ p.getWindow().setType(TYPE_SYSTEM_DIALOG);
p.show();
});
}
diff --git a/service/src/com/android/car/audio/CarAudioService.java b/service/src/com/android/car/audio/CarAudioService.java
index db081eb..bc67085 100644
--- a/service/src/com/android/car/audio/CarAudioService.java
+++ b/service/src/com/android/car/audio/CarAudioService.java
@@ -892,6 +892,10 @@
*
* @param zoneId The audio zone id
* @param uid The uid to map
+ *
+ * <p><b>Note:</b> Will throw if occupant zone mapping exist, as uid and occupant zone mapping
+ * do not work in conjunction.
+ *
* @return true if the device affinities, for devices in zone, are successfully set
*/
@Override
@@ -905,6 +909,9 @@
+ uid + " mapped to : "
+ zoneId);
+ // If occupant mapping exist uid routing can not be used
+ requiredOccupantZoneMappingDisabledLocked();
+
// 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);
@@ -985,6 +992,10 @@
/**
* Removes the current mapping of the uid, focus will be lost in zone
* @param uid The uid to remove
+ *
+ * <p><b>Note:</b> Will throw if occupant zone mapping exist, as uid and occupant zone mapping
+ * do not work in conjunction.
+ *
* return true if all the devices affinities currently
* mapped to uid are successfully removed
*/
@@ -993,6 +1004,10 @@
enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS);
requireDynamicRouting();
synchronized (mImplLock) {
+ // Throw so as to not set the wrong expectation,
+ // that routing will be changed if clearZoneIdForUid is called.
+ requiredOccupantZoneMappingDisabledLocked();
+
return checkAndRemoveUidLocked(uid);
}
}
@@ -1083,6 +1098,13 @@
Preconditions.checkState(mUseDynamicRouting, "Dynamic routing is required");
}
+ private void requiredOccupantZoneMappingDisabledLocked() {
+ if (isOccupantZoneMappingAvailableLocked()) {
+ throw new IllegalStateException(
+ "UID based routing is not supported while using occupant zone mapping");
+ }
+ }
+
/**
* @return {@link AudioDevicePort} that handles the given car audio usage.
* Multiple usages may share one {@link AudioDevicePort}
@@ -1123,7 +1145,7 @@
private void handleOccupantZoneUserChanged() {
int driverUserId = mOccupantZoneService.getDriverUserId();
synchronized (mImplLock) {
- if (!isOccupantZoneMappingAvailable()) {
+ if (!isOccupantZoneMappingAvailableLocked()) {
//No occupant zone to audio zone mapping, re-adjust to settings driver.
for (int index = 0; index < mCarAudioZones.length; index++) {
CarAudioZone zone = mCarAudioZones[index];
@@ -1142,7 +1164,7 @@
}
}
- private boolean isOccupantZoneMappingAvailable() {
+ private boolean isOccupantZoneMappingAvailableLocked() {
return mAudioZoneIdToOccupantZoneIdMapping.size() > 0;
}
diff --git a/tests/CarSecurityPermissionTest/Android.bp b/tests/CarSecurityPermissionTest/Android.bp
index 066ecc8..7be1d0b 100644
--- a/tests/CarSecurityPermissionTest/Android.bp
+++ b/tests/CarSecurityPermissionTest/Android.bp
@@ -21,6 +21,7 @@
libs: [
"android.car",
+ "android.hardware.automotive.vehicle-V2.0-java",
"android.test.runner",
"android.test.base",
"android.test.mock",
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/window_insets_fragment.xml b/tests/EmbeddedKitchenSinkApp/res/layout/window_insets_fragment.xml
new file mode 100644
index 0000000..5533668
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/window_insets_fragment.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<ScrollView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/content"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:fadeScrollbars="false">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Control Status Bar Insets"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <Button
+ android:id="@+id/show_status_bar_insets"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Show Status Bar Insets"
+ android:textSize="30sp"/>
+
+ <Button
+ android:id="@+id/hide_status_bar_insets"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Hide Status Bar Insets"
+ android:textSize="30sp"/>
+
+ </LinearLayout>
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Control Navigation Bar Insets"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <Button
+ android:id="@+id/show_nav_bar_insets"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Show Navigation Bar Insets"
+ android:textSize="30sp"/>
+
+ <Button
+ android:id="@+id/hide_nav_bar_insets"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Hide Navigation Bar Insets"
+ android:textSize="30sp"/>
+
+ </LinearLayout>
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Control System Bar Insets (both Status and Navigation)"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <Button
+ android:id="@+id/show_system_bar_insets"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Show System Bar Insets"
+ android:textSize="30sp"/>
+
+ <Button
+ android:id="@+id/hide_system_bar_insets"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Hide System Bar Insets"
+ android:textSize="30sp"/>
+
+ </LinearLayout>
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Set System Bar Behavior"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <Button
+ android:id="@+id/show_bars_by_touch"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Show By Touch"
+ android:textSize="30sp"/>
+
+ <Button
+ android:id="@+id/show_bars_by_swipe"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Show By Swipe"
+ android:textSize="30sp"/>
+
+ <Button
+ android:id="@+id/show_transient_bars_by_swipe"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Show Transient By Swipe"
+ android:textSize="30sp"/>
+
+ </LinearLayout>
+
+ </LinearLayout>
+</ScrollView>
\ No newline at end of file
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 20dd9fc..e883501 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java
@@ -56,6 +56,7 @@
import com.google.android.car.kitchensink.displayinfo.DisplayInfoFragment;
import com.google.android.car.kitchensink.experimental.ExperimentalFeatureTestFragment;
import com.google.android.car.kitchensink.hvac.HvacTestFragment;
+import com.google.android.car.kitchensink.insets.WindowInsetsFragment;
import com.google.android.car.kitchensink.notification.NotificationFragment;
import com.google.android.car.kitchensink.orientation.OrientationTestFragment;
import com.google.android.car.kitchensink.packageinfo.PackageInfoFragment;
@@ -198,7 +199,8 @@
new FragmentMenuEntry("vehicle ctrl", VehicleCtrlFragment.class),
new FragmentMenuEntry("vehicle hal", VehicleHalFragment.class),
new FragmentMenuEntry("volume test", VolumeTestFragment.class),
- new FragmentMenuEntry("web links", WebLinksTestFragment.class));
+ new FragmentMenuEntry("web links", WebLinksTestFragment.class),
+ new FragmentMenuEntry("window insets", WindowInsetsFragment.class));
private Car mCarApi;
private CarHvacManager mHvacManager;
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/insets/WindowInsetsFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/insets/WindowInsetsFragment.java
new file mode 100644
index 0000000..f4d52cf
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/insets/WindowInsetsFragment.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.car.kitchensink.insets;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowInsets;
+import android.view.WindowInsetsController;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.google.android.car.kitchensink.R;
+
+/** Test fragment for controlling window insets. */
+public final class WindowInsetsFragment extends Fragment {
+
+ private WindowInsetsController mWindowInsetsController;
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.window_insets_fragment, container,
+ /* attachToRoot= */ false);
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ mWindowInsetsController = view.getWindowInsetsController();
+ initStatusBarInsetsButtons(view);
+ initNavigationBarInsetsButtons(view);
+ initSystemBarInsetsButtons(view);
+ initSystemBarBehaviorButtons(view);
+ }
+
+ private void initStatusBarInsetsButtons(View view) {
+ view.findViewById(R.id.show_status_bar_insets).setOnClickListener(
+ v -> mWindowInsetsController.show(WindowInsets.Type.statusBars()));
+ view.findViewById(R.id.hide_status_bar_insets).setOnClickListener(
+ v -> mWindowInsetsController.hide(WindowInsets.Type.statusBars()));
+ }
+
+ private void initNavigationBarInsetsButtons(View view) {
+ view.findViewById(R.id.show_nav_bar_insets).setOnClickListener(
+ v -> mWindowInsetsController.show(WindowInsets.Type.navigationBars()));
+ view.findViewById(R.id.hide_nav_bar_insets).setOnClickListener(
+ v -> mWindowInsetsController.hide(WindowInsets.Type.navigationBars()));
+ }
+
+ private void initSystemBarInsetsButtons(View view) {
+ view.findViewById(R.id.show_system_bar_insets).setOnClickListener(
+ v -> mWindowInsetsController.show(WindowInsets.Type.systemBars()));
+ view.findViewById(R.id.hide_system_bar_insets).setOnClickListener(
+ v -> mWindowInsetsController.hide(WindowInsets.Type.systemBars()));
+ }
+
+ private void initSystemBarBehaviorButtons(View view) {
+ view.findViewById(R.id.show_bars_by_touch).setOnClickListener(
+ v -> mWindowInsetsController.setSystemBarsBehavior(
+ WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_TOUCH));
+ view.findViewById(R.id.show_bars_by_swipe).setOnClickListener(
+ v -> mWindowInsetsController.setSystemBarsBehavior(
+ WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE));
+ view.findViewById(R.id.show_transient_bars_by_swipe).setOnClickListener(
+ v -> mWindowInsetsController.setSystemBarsBehavior(
+ WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE));
+ }
+}
diff --git a/user/car-user-lib/Android.bp b/user/car-user-lib/Android.bp
index 12bc950..940751a 100644
--- a/user/car-user-lib/Android.bp
+++ b/user/car-user-lib/Android.bp
@@ -17,9 +17,11 @@
srcs: [
"src/**/*.java",
],
+ libs: [
+ "android.hardware.automotive.vehicle-V2.0-java",
+ ],
static_libs: [
"android.car.settings",
- "android.hardware.automotive.vehicle-V2.0-java",
],
product_variables: {
pdk: {