diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-07-07 00:55:27 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-07-07 00:55:27 +0000 |
commit | 3d4e56a8fae37d4295057f488538226ab46f2db7 (patch) | |
tree | 5b4454f2d580cd508a0ae813426d1af7c2918985 | |
parent | f8b8da9aa4c6988d3a5f16d6d0bab5e1e998989f (diff) | |
parent | cdc234e51141674a4ff6a4d89b50f0764c50cd94 (diff) | |
download | car-3d4e56a8fae37d4295057f488538226ab46f2db7.tar.gz |
Snap for 10447354 from cdc234e51141674a4ff6a4d89b50f0764c50cd94 to mainline-cellbroadcast-releaseaml_cbr_341710000aml_cbr_341610000aml_cbr_341510010aml_cbr_341410010aml_cbr_341311010aml_cbr_341110000aml_cbr_341011000aml_cbr_340914000android14-mainline-cellbroadcast-release
Change-Id: I007a565e3c73b105d8920509cbecc0a8c9383fda
120 files changed, 3331 insertions, 609 deletions
diff --git a/AndroidProducts.mk b/AndroidProducts.mk index 0240d02..e84ad9f 100644 --- a/AndroidProducts.mk +++ b/AndroidProducts.mk @@ -23,7 +23,13 @@ PRODUCT_MAKEFILES := \ $(LOCAL_DIR)/car_x86_64.mk \ $(LOCAL_DIR)/gsi_car_arm64.mk \ $(LOCAL_DIR)/gsi_car_x86_64.mk \ - + $(LOCAL_DIR)/sdk_car_arm64.mk \ + $(LOCAL_DIR)/sdk_car_arm.mk \ + $(LOCAL_DIR)/sdk_car_md_arm64.mk \ + $(LOCAL_DIR)/sdk_car_md_x86_64.mk \ + $(LOCAL_DIR)/sdk_car_portrait_x86_64.mk \ + $(LOCAL_DIR)/sdk_car_x86.mk \ + $(LOCAL_DIR)/sdk_car_x86_64.mk \ COMMON_LUNCH_CHOICES := \ aosp_car_arm-userdebug \ @@ -34,6 +40,11 @@ COMMON_LUNCH_CHOICES := \ car_x86_64-userdebug \ gsi_car_arm64-userdebug \ gsi_car_x86_64-userdebug \ - + sdk_car_arm-userdebug \ + sdk_car_arm64-userdebug \ + sdk_car_md_x86_64-userdebug \ + sdk_car_portrait_x86_64-userdebug \ + sdk_car_x86-userdebug \ + sdk_car_x86_64-userdebug \ EMULATOR_VENDOR_NO_SOUND_TRIGGER := false diff --git a/car_ui_portrait.mk b/car_ui_portrait.mk index c65fbdb..9303e67 100644 --- a/car_ui_portrait.mk +++ b/car_ui_portrait.mk @@ -13,12 +13,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -BUILD_EMULATOR_CLUSTER_DISPLAY := false - PRODUCT_COPY_FILES += \ packages/services/Car/car_product/car_ui_portrait/car_ui_portrait.ini:config.ini \ packages/services/Car/car_product/car_ui_portrait/bootanimation/bootanimation.zip:system/media/bootanimation.zip +$(call inherit-product, device/generic/goldfish/soong_namespaces.mk) + PRODUCT_PACKAGE_OVERLAYS := \ device/generic/car/common/overlay diff --git a/common/car.mk b/common/car.mk index cbcf55a..a0c783c 100644 --- a/common/car.mk +++ b/common/car.mk @@ -17,16 +17,20 @@ # Auto modules PRODUCT_PACKAGES += \ android.hardware.automotive.vehicle@V1-emulator-service \ - android.hardware.broadcastradio@2.0-service \ - android.hardware.audio.service-caremu + android.hardware.broadcastradio-service.default \ + android.hardware.audio.service-caremu \ + android.hardware.automotive.remoteaccess@V1-default-service \ + android.hardware.automotive.ivn@V1-default-service # Runtime Resource Overlay for Connectivity PRODUCT_PACKAGES += \ CarConnectivityOverlay +ifneq ($(EMULATOR_DYNAMIC_MULTIDISPLAY_CONFIG),true) # Emulator configuration PRODUCT_COPY_FILES += \ device/generic/car/common/config.ini:config.ini +endif # EMULATOR_DYNAMIC_MULTIDISPLAY_CONFIG # Car init.rc PRODUCT_COPY_FILES += \ @@ -49,6 +53,10 @@ PRODUCT_COPY_FILES += \ device/generic/car/common/android.hardware.disable.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml \ device/generic/car/common/android.hardware.disable.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.direct.xml \ +# Overwrite goldfish fstab.ranchu to turn off adoptable_storage +PRODUCT_COPY_FILES += \ + device/generic/car/common/fstab.ranchu.car:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.ranchu + # Enable landscape PRODUCT_COPY_FILES += \ frameworks/native/data/etc/android.hardware.screen.landscape.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.screen.landscape.xml @@ -97,3 +105,6 @@ $(call inherit-product, $(SRC_TARGET_DIR)/product/gsi_release.mk) endif $(call inherit-product, packages/services/Car/car_product/build/car.mk) + +# TODO(b/253459812): find a better way to handle it. +DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE += device/generic/car/common/device_framework_matrix_product.xml
\ No newline at end of file diff --git a/common/car_core_hardware.xml b/common/car_core_hardware.xml index 99ff362..4cf4f7e 100644 --- a/common/car_core_hardware.xml +++ b/common/car_core_hardware.xml @@ -49,7 +49,6 @@ <feature name="android.software.home_screen" /> <feature name="android.software.companion_device_setup" /> <feature name="android.software.cant_save_state" /> - <feature name="android.software.midi" /> <feature name="android.software.secure_lock_screen" /> <!-- devices with GPS must include android.hardware.location.gps.xml --> diff --git a/common/car_md.mk b/common/car_md.mk new file mode 100644 index 0000000..4b5ed2b --- /dev/null +++ b/common/car_md.mk @@ -0,0 +1,58 @@ +# +# Copyright (C) 2023 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# this overwrites Android Emulator's default input devices for virtual displays in device/generic/goldfish/input/ +PRODUCT_COPY_FILES += \ + device/generic/car/emulator/multi-display/input/virtio_input_multi_touch_7.idc:$(TARGET_COPY_OUT_VENDOR)/usr/idc/virtio_input_multi_touch_7.idc \ + device/generic/car/emulator/multi-display/input/virtio_input_multi_touch_8.idc:$(TARGET_COPY_OUT_VENDOR)/usr/idc/virtio_input_multi_touch_8.idc \ + device/generic/car/emulator/multi-display/input/virtio_input_multi_touch_9.idc:$(TARGET_COPY_OUT_VENDOR)/usr/idc/virtio_input_multi_touch_9.idc + +PRODUCT_COPY_FILES += device/generic/car/common/config.ini.car_md:config.ini + +# Overrides Goldfish's default display settings +PRODUCT_COPY_FILES += \ + device/generic/car/emulator/multi-display/display_layout_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/displayconfig/display_layout_configuration.xml \ + device/generic/car/emulator/multi-display/display_settings.xml:$(TARGET_COPY_OUT_VENDOR)/etc/display_settings.xml + +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.software.managed_users.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.managed_users.xml + +PRODUCT_PACKAGE_OVERLAYS += \ + device/generic/car/emulator/multi-display/overlay + +PRODUCT_COPY_FILES += \ + device/generic/car/emulator/multi-display/car_audio_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/car_audio_configuration.xml + +EMULATOR_DYNAMIC_MULTIDISPLAY_CONFIG := false +BUILD_EMULATOR_CLUSTER_DISPLAY := true +# Set up additional displays +EMULATOR_MULTIDISPLAY_HW_CONFIG := 1,968,792,160,0,2,1408,792,160,0,3,1408,792,160,0 +EMULATOR_MULTIDISPLAY_BOOTANIM_CONFIG := 4619827551948147201,4619827124781842690,4619827540095559171 +ENABLE_CLUSTER_OS_DOUBLE:=true + +PRODUCT_PACKAGES += CarServiceOverlayMdEmulatorOsDouble + +# Enable MZ audio by default +PRODUCT_SYSTEM_DEFAULT_PROPERTIES += \ + ro.vendor.simulateMultiZoneAudio=true \ + persist.sys.max_profiles=5 \ + com.android.car.internal.debug.num_auto_populated_users=1 + +PRODUCT_PACKAGES += \ + MultiDisplaySecondaryHomeTestLauncher \ + MultiDisplayTest + +# enables the rro package for passenger(secondary) user. +ENABLE_PASSENGER_SYSTEMUI_RRO := true diff --git a/common/config.ini b/common/config.ini index 4b6f766..8576698 100644 --- a/common/config.ini +++ b/common/config.ini @@ -1,14 +1,18 @@ hw.audioInput=yes -hw.lcd.density=120 +hw.lcd.density=160 +hw.cpu.ncore=6 hw.gpu.enabled=yes hw.camera.back=none hw.camera.front=none hw.mainKeys=no +hw.ramSize=4096 +hw.keyboard=yes skin.dynamic=yes -skin.name=1080x600 -skin.path=1080x600 +skin.name=1408x792 +skin.path=1408x792 disk.dataPartition.size=6G hw.accelerometer=yes +hw.accelerometer_uncalibrated=yes hw.gyroscope=yes hw.sensors.light=no hw.sensors.pressure=no diff --git a/common/config.ini.car_md b/common/config.ini.car_md new file mode 100644 index 0000000..74e6abe --- /dev/null +++ b/common/config.ini.car_md @@ -0,0 +1,24 @@ +hw.audioInput=yes +hw.lcd.density=160 +hw.cpu.ncore=6 +hw.gpu.enabled=yes +hw.camera.back=none +hw.camera.front=none +hw.mainKeys=no +hw.ramSize=6144 +hw.keyboard=yes +skin.dynamic=yes +skin.name=1848x792 +skin.path=1848x792 +disk.dataPartition.size=6G +hw.accelerometer=yes +hw.accelerometer_uncalibrated=yes +hw.gyroscope=yes +hw.sensors.light=no +hw.sensors.pressure=no +hw.sensors.humidity=no +hw.sensors.proximity=no +hw.sensors.magnetic_field=no +hw.sensors.orientation=no +hw.sensors.temperature=no +hw.sensor.hinge=no diff --git a/common/device_framework_matrix_product.xml b/common/device_framework_matrix_product.xml new file mode 100644 index 0000000..a761974 --- /dev/null +++ b/common/device_framework_matrix_product.xml @@ -0,0 +1,10 @@ +<compatibility-matrix version="1.0" type="framework" level="8"> + <hal format="aidl" optional="true"> + <name>device.generic.car.emulator</name> + <version>1</version> + <interface> + <name>IVehicleBus</name> + <instance>protocanbus</instance> + </interface> + </hal> +</compatibility-matrix> diff --git a/common/fstab.ranchu.car b/common/fstab.ranchu.car new file mode 100644 index 0000000..8c51f28 --- /dev/null +++ b/common/fstab.ranchu.car @@ -0,0 +1,10 @@ +# Android fstab file. +#<dev> <mnt_point> <type> <mnt_flags options> <fs_mgr_flags> +system /system ext4 ro,barrier=1 wait,logical,avb=vbmeta,first_stage_mount +vendor /vendor ext4 ro,barrier=1 wait,logical,first_stage_mount +product /product ext4 ro,barrier=1 wait,logical,first_stage_mount +system_ext /system_ext ext4 ro,barrier=1 wait,logical,first_stage_mount +/dev/block/vdc /data ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check,quota,fileencryption=aes-256-xts:aes-256-cts,reservedsize=128M,fsverity,keydirectory=/metadata/vold/metadata_encryption,latemount +/dev/block/pci/pci0000:00/0000:00:06.0/by-name/metadata /metadata ext4 noatime,nosuid,nodev wait,formattable,first_stage_mount +/devices/*/block/vdf auto auto defaults voldmanaged=sdcard:auto +dev/block/zram0 none swap defaults zramsize=75% diff --git a/common/overlay/frameworks/base/core/res/res/values/config.xml b/common/overlay/frameworks/base/core/res/res/values/config.xml index fa815d2..b66aa87 100644 --- a/common/overlay/frameworks/base/core/res/res/values/config.xml +++ b/common/overlay/frameworks/base/core/res/res/values/config.xml @@ -29,4 +29,14 @@ <integer-array name="config_availableColorModes"> <item>0</item> <!-- COLOR_MODE_NATURAL --> </integer-array> + <!-- Device does not support near ultrasound audio--> + <bool name="config_supportMicNearUltrasound">false</bool> + <bool name="config_supportSpeakerNearUltrasound">false</bool> + + <!-- Controls if local secondary displays should be private or not. Value specified in the array + represents physical port address of each display and display in this list will be marked + as private. {@see android.view.Display#FLAG_PRIVATE} --> + <integer-array translatable="false" name="config_localPrivateDisplayPorts"> + <item>1</item> <!-- ClusterDisplay --> + </integer-array> </resources> diff --git a/common/preinstalled-packages-product-car-emulator.xml b/common/preinstalled-packages-product-car-emulator.xml index 68137ef..75ac5c8 100644 --- a/common/preinstalled-packages-product-car-emulator.xml +++ b/common/preinstalled-packages-product-car-emulator.xml @@ -26,10 +26,6 @@ <install-in user-type="FULL" /> <install-in user-type="SYSTEM" /> </install-in-user-type> - <install-in-user-type package="com.android.car.hvac"> - <install-in user-type="FULL" /> - <install-in user-type="SYSTEM" /> - </install-in-user-type> <install-in-user-type package="com.android.phone"> <install-in user-type="FULL" /> <install-in user-type="SYSTEM" /> @@ -47,12 +43,6 @@ <install-in user-type="SYSTEM" /> </install-in-user-type> - <!-- Android remote display which need to work for all users--> - <install-in-user-type package="com.android.car.acast.source"> - <install-in user-type="FULL" /> - <install-in user-type="SYSTEM" /> - </install-in-user-type> - <!-- This application is needed in ModuleInfoProvider --> <install-in-user-type package="com.android.modulemetadata"> <install-in user-type="FULL" /> @@ -98,9 +88,6 @@ <install-in-user-type package="com.android.car.datacenter"> <install-in user-type="FULL" /> </install-in-user-type> - <install-in-user-type package="com.android.car.dialer"> - <install-in user-type="FULL" /> - </install-in-user-type> <install-in-user-type package="com.android.car.goldilocks"> <install-in user-type="FULL" /> </install-in-user-type> @@ -131,9 +118,6 @@ <install-in-user-type package="com.android.car.radio"> <install-in user-type="FULL" /> </install-in-user-type> - <install-in-user-type package="com.android.car.messenger"> - <install-in user-type="FULL" /> - </install-in-user-type> <install-in-user-type package="com.android.car.media.localmediaplayer"> <install-in user-type="FULL" /> </install-in-user-type> diff --git a/common/sepolicy/hal_audio_caremu.te b/common/sepolicy/hal_audio_caremu.te index 5c0af23..34be2d8 100644 --- a/common/sepolicy/hal_audio_caremu.te +++ b/common/sepolicy/hal_audio_caremu.te @@ -11,3 +11,8 @@ binder_use(hal_audio_caremu) # Enable audiocontrol to listen to power policy daemon. carpowerpolicy_callback_domain(hal_audio_caremu) + +hal_client_domain(hal_audio_caremu, hal_allocator) +get_prop(hal_audio_caremu, vendor_caremu_audiohal_prop) + +allow hal_audio_caremu audioserver:fifo_file write; diff --git a/common/sepolicy/hal_ivn_default.te b/common/sepolicy/hal_ivn_default.te new file mode 100644 index 0000000..40740de --- /dev/null +++ b/common/sepolicy/hal_ivn_default.te @@ -0,0 +1,3 @@ +# Allow debug dump +allow hal_ivn_default shell:fd use; +allow hal_ivn_default shell:fifo_file write; diff --git a/common/sepolicy/hal_remoteaccess_default.te b/common/sepolicy/hal_remoteaccess_default.te new file mode 100644 index 0000000..b734334 --- /dev/null +++ b/common/sepolicy/hal_remoteaccess_default.te @@ -0,0 +1,13 @@ +# Allow remoteaccess HAL to communicate with remote wakeup client via local +# socket. +typeattribute hal_remoteaccess_default hal_automotive_socket_exemption; +net_domain(hal_remoteaccess_default) +allow hal_remoteaccess_default self:vsock_socket write; + +# Allow accessing VHAL. +binder_use(hal_remoteaccess_default) +hal_client_domain(hal_remoteaccess_default, hal_vehicle) + +# Allow debug dump +allow hal_remoteaccess_default shell:fd use; +allow hal_remoteaccess_default shell:fifo_file write; diff --git a/common/sepolicy/property.te b/common/sepolicy/property.te new file mode 100644 index 0000000..afa1f81 --- /dev/null +++ b/common/sepolicy/property.te @@ -0,0 +1,2 @@ +# Audio HAL +vendor_internal_prop(vendor_caremu_audiohal_prop) diff --git a/common/sepolicy/property_contexts b/common/sepolicy/property_contexts new file mode 100644 index 0000000..6833690 --- /dev/null +++ b/common/sepolicy/property_contexts @@ -0,0 +1,2 @@ +# Audio HAL +ro.vendor.caremu.audiohal. u:object_r:vendor_caremu_audiohal_prop:s0 diff --git a/common/sepolicy/surfaceflinger.te b/common/sepolicy/surfaceflinger.te new file mode 100644 index 0000000..c46089c --- /dev/null +++ b/common/sepolicy/surfaceflinger.te @@ -0,0 +1,2 @@ +# Allow surfaceflinger to perform binder IPC to automotive_display_service +binder_call(surfaceflinger, automotive_display_service_server) diff --git a/common/vhaloverride/ev.car.json b/common/vhaloverride/ev.car.json index b063765..c35b1f1 100644 --- a/common/vhaloverride/ev.car.json +++ b/common/vhaloverride/ev.car.json @@ -1,16 +1,22 @@ -[ - { - "timestamp": 0, - "areaId": 0, - "name": "INFO_FUEL_TYPE", - "value": [10], - "prop": 289472773 - }, - { - "timestamp": 0, - "name": "INFO_EV_CONNECTOR_TYPE", - "value": [1, 5], - "areaId": 0, - "prop": 289472775 - } -] +{ + "apiVersion": 1, + "properties": [ + { + "property": "VehicleProperty::INFO_FUEL_TYPE", + "defaultValue": { + "int32Values": [ + "FuelType::FUEL_TYPE_ELECTRIC" + ] + } + }, + { + "property": "VehicleProperty::INFO_EV_CONNECTOR_TYPE", + "defaultValue": { + "int32Values": [ + "EvConnectorType::IEC_TYPE_1_AC", + "EvConnectorType::IEC_TYPE_1_CCS_DC" + ] + } + } + ] +} diff --git a/common/vhaloverride/uxr.car.json b/common/vhaloverride/uxr.car.json index c7652ba..c06d3d0 100644 --- a/common/vhaloverride/uxr.car.json +++ b/common/vhaloverride/uxr.car.json @@ -1,23 +1,42 @@ -[ - { - "timestamp": 0, - "areaId": 0, - "name": "PERF_VEHICLE_SPEED", - "value": 50.0, - "prop": 291504647 - }, - { - "timestamp": 0, - "areaId": 0, - "name": "GEAR_SELECTION", - "value": 8, - "prop": 289408000 - }, - { - "timestamp": 0, - "areaId": 0, - "name": "PARKING_BRAKE_ON", - "value": 0, - "prop": 287310850 - } -] +{ + "apiVersion": 1, + "properties": [ + { + "property": "VehicleProperty::PERF_VEHICLE_SPEED", + "defaultValue": { + "floatValues": [ + 50.0 + ] + }, + "maxSampleRate": 10.0, + "minSampleRate": 1.0 + }, + { + "property": "VehicleProperty::GEAR_SELECTION", + "defaultValue": { + "int32Values": [ + "VehicleGear::GEAR_DRIVE" + ] + }, + "configArray": [ + "VehicleGear::GEAR_PARK", + "VehicleGear::GEAR_NEUTRAL", + "VehicleGear::GEAR_REVERSE", + "VehicleGear::GEAR_DRIVE", + "VehicleGear::GEAR_1", + "VehicleGear::GEAR_2", + "VehicleGear::GEAR_3", + "VehicleGear::GEAR_4", + "VehicleGear::GEAR_5" + ] + }, + { + "property": "VehicleProperty::PARKING_BRAKE_ON", + "defaultValue": { + "int32Values": [ + 0 + ] + } + } + ] +} diff --git a/emulator/Conn/CommConn/CommConn.cpp b/emulator/Conn/CommConn/CommConn.cpp index c800edc..241c6a9 100644 --- a/emulator/Conn/CommConn/CommConn.cpp +++ b/emulator/Conn/CommConn/CommConn.cpp @@ -48,6 +48,8 @@ void CommConn::sendMessage(vhal_proto::EmulatorMessage const& msg) { return; } + std::lock_guard<std::mutex> lock(mSendMessageLock); + write(buffer); } diff --git a/emulator/Conn/CommConn/include/CommConn.h b/emulator/Conn/CommConn/include/CommConn.h index ba5fd9f..ae6b9fb 100644 --- a/emulator/Conn/CommConn/include/CommConn.h +++ b/emulator/Conn/CommConn/include/CommConn.h @@ -97,6 +97,24 @@ class CommConn : public MessageSender { virtual bool isOpen() = 0; /** + * Serialized and send the given message to the other side. + */ + void sendMessage(const vhal_proto::EmulatorMessage& msg) final; + + protected: + MessageProcessor* mMessageProcessor; + + private: + std::unique_ptr<std::thread> mReadThread; + std::mutex mSendMessageLock; + + /** + * A thread that reads messages in a loop, and responds. You can stop this thread by calling + * stop(). + */ + void readThread(); + + /** * Blocking call to read data from the connection. * * @return std::vector<uint8_t> Serialized protobuf data received from emulator. This will be @@ -112,21 +130,6 @@ class CommConn : public MessageSender { * @return int Number of bytes transmitted, or -1 if failed. */ virtual int write(const std::vector<uint8_t>& data) = 0; - - /** - * Serialized and send the given message to the other side. - */ - void sendMessage(const vhal_proto::EmulatorMessage& msg); - - protected: - std::unique_ptr<std::thread> mReadThread; - MessageProcessor* mMessageProcessor; - - /** - * A thread that reads messages in a loop, and responds. You can stop this thread by calling - * stop(). - */ - void readThread(); }; } // namespace impl diff --git a/emulator/Conn/PipeComm/Android.bp b/emulator/Conn/PipeComm/Android.bp index 6f8e3b4..4def19c 100644 --- a/emulator/Conn/PipeComm/Android.bp +++ b/emulator/Conn/PipeComm/Android.bp @@ -32,4 +32,7 @@ cc_library { "android.hardware.automotive.vehicle@2.0-libproto-native", "EmulatorCommConn", ], + whole_static_libs: [ + "//device/generic/goldfish:libqemud.ranchu", + ], } diff --git a/emulator/Conn/PipeComm/PipeComm.cpp b/emulator/Conn/PipeComm/PipeComm.cpp index c54bf9f..789cffb 100644 --- a/emulator/Conn/PipeComm/PipeComm.cpp +++ b/emulator/Conn/PipeComm/PipeComm.cpp @@ -18,11 +18,11 @@ #include <log/log.h> -#include "qemu_pipe.h" +#include "qemud.h" #include "PipeComm.h" -#define CAR_SERVICE_NAME "pipe:qemud:car" +#define CAR_SERVICE_NAME "car" namespace android { @@ -36,7 +36,7 @@ namespace impl { PipeComm::PipeComm(MessageProcessor* messageProcessor) : CommConn(messageProcessor), mPipeFd(-1) {} void PipeComm::start() { - int fd = qemu_pipe_open(CAR_SERVICE_NAME); + int fd = qemud_channel_open(CAR_SERVICE_NAME); if (fd < 0) { ALOGE("%s: Could not open connection to service: %s %d", __FUNCTION__, strerror(errno), fd); @@ -62,7 +62,7 @@ std::vector<uint8_t> PipeComm::read() { std::vector<uint8_t> msg = std::vector<uint8_t>(MAX_RX_MSG_SZ); int numBytes; - numBytes = qemu_pipe_frame_recv(mPipeFd, msg.data(), msg.size()); + numBytes = qemud_channel_recv(mPipeFd, msg.data(), msg.size()); if (numBytes == MAX_RX_MSG_SZ) { ALOGE("%s: Received max size = %d", __FUNCTION__, MAX_RX_MSG_SZ); @@ -81,7 +81,7 @@ int PipeComm::write(const std::vector<uint8_t>& data) { int retVal = 0; if (mPipeFd != -1) { - retVal = qemu_pipe_frame_send(mPipeFd, data.data(), data.size()); + retVal = qemud_channel_send(mPipeFd, data.data(), data.size()); } if (retVal < 0) { diff --git a/emulator/Conn/PipeComm/include/PipeComm.h b/emulator/Conn/PipeComm/include/PipeComm.h index 24dd686..2043ac4 100644 --- a/emulator/Conn/PipeComm/include/PipeComm.h +++ b/emulator/Conn/PipeComm/include/PipeComm.h @@ -44,16 +44,16 @@ class PipeComm : public CommConn { void start() override; void stop() override; - std::vector<uint8_t> read() override; - int write(const std::vector<uint8_t>& data) override; - inline bool isOpen() override { return mPipeFd > 0; } private: int mPipeFd; + + std::vector<uint8_t> read() override; + int write(const std::vector<uint8_t>& data) override; }; -} // impl +} // namespace impl } // namespace V2_0 } // namespace vehicle diff --git a/emulator/Conn/PipeComm/include/qemu_pipe.h b/emulator/Conn/PipeComm/include/qemu_pipe.h deleted file mode 100644 index bd3e71d..0000000 --- a/emulator/Conn/PipeComm/include/qemu_pipe.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT 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 ANDROID_EMULATORPIPECOMM_QEMU_PIPE_H -#define ANDROID_EMULATORPIPECOMM_QEMU_PIPE_H - -#include <stddef.h> - -#ifdef __cplusplus -extern "C" { -#endif -// Try to open a new Qemu fast-pipe. This function returns a file descriptor -// that can be used to communicate with a named service managed by the -// emulator. -// -// This file descriptor can be used as a standard pipe/socket descriptor. -// -// 'pipeName' is the name of the emulator service you want to connect to, -// and should begin with 'pipe:' (e.g. 'pipe:camera' or 'pipe:opengles'). -// For backward compatibility, the 'pipe:' prefix can be omitted, and in -// that case, qemu_pipe_open will add it for you. - -// On success, return a valid file descriptor, or -1/errno on failure. E.g.: -// -// EINVAL -> unknown/unsupported pipeName -// ENOSYS -> fast pipes not available in this system. -// -// ENOSYS should never happen, except if you're trying to run within a -// misconfigured emulator. -// -// You should be able to open several pipes to the same pipe service, -// except for a few special cases (e.g. GSM modem), where EBUSY will be -// returned if more than one client tries to connect to it. -int qemu_pipe_open(const char* pipeName); - -// Send a framed message |buff| of |len| bytes through the |fd| descriptor. -// This really adds a 4-hexchar prefix describing the payload size. -// Returns 0 on success, and -1 on error. -int qemu_pipe_frame_send(int fd, const void* buff, size_t len); - -// Read a frame message from |fd|, and store it into |buff| of |len| bytes. -// If the framed message is larger than |len|, then this returns -1 and the -// content is lost. Otherwise, this returns the size of the message. NOTE: -// empty messages are possible in a framed wire protocol and do not mean -// end-of-stream. -int qemu_pipe_frame_recv(int fd, void* buff, size_t len); - -#ifdef __cplusplus -} -#endif - -#endif // ANDROID_EMULATORPIPECOMM_QEMU_PIPE_H diff --git a/emulator/Conn/PipeComm/qemu_pipe.cpp b/emulator/Conn/PipeComm/qemu_pipe.cpp deleted file mode 100644 index 1f541b5..0000000 --- a/emulator/Conn/PipeComm/qemu_pipe.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT 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 <errno.h> -#include <fcntl.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -#include <android-base/file.h> - -#include "qemu_pipe.h" - -using android::base::ReadFully; -using android::base::WriteFully; - -// Define QEMU_PIPE_DEBUG if you want to print error messages when an error -// occurs during pipe operations. The macro should simply take a printf-style -// formatting string followed by optional arguments. -#ifndef QEMU_PIPE_DEBUG -#define QEMU_PIPE_DEBUG(...) (void)0 -#endif - -int qemu_pipe_open(const char* pipeName) { - if (!pipeName) { - errno = EINVAL; - return -1; - } - - int fd = TEMP_FAILURE_RETRY(open("/dev/qemu_pipe", O_RDWR)); - if (fd < 0) { - QEMU_PIPE_DEBUG("%s: Could not open /dev/qemu_pipe: %s", __FUNCTION__, strerror(errno)); - return -1; - } - - // Write the pipe name, *including* the trailing zero which is necessary. - size_t pipeNameLen = strlen(pipeName); - if (WriteFully(fd, pipeName, pipeNameLen + 1U)) { - return fd; - } - - // now, add 'pipe:' prefix and try again - // Note: host side will wait for the trailing '\0' to start - // service lookup. - const char pipe_prefix[] = "pipe:"; - if (WriteFully(fd, pipe_prefix, strlen(pipe_prefix)) && - WriteFully(fd, pipeName, pipeNameLen + 1U)) { - return fd; - } - QEMU_PIPE_DEBUG("%s: Could not write to %s pipe service: %s", __FUNCTION__, pipeName, - strerror(errno)); - close(fd); - return -1; -} - -int qemu_pipe_frame_send(int fd, const void* buff, size_t len) { - char header[5]; - snprintf(header, sizeof(header), "%04zx", len); - if (!WriteFully(fd, header, 4)) { - QEMU_PIPE_DEBUG("Can't write qemud frame header: %s", strerror(errno)); - return -1; - } - if (!WriteFully(fd, buff, len)) { - QEMU_PIPE_DEBUG("Can't write qemud frame payload: %s", strerror(errno)); - return -1; - } - return 0; -} - -int qemu_pipe_frame_recv(int fd, void* buff, size_t len) { - char header[5]; - if (!ReadFully(fd, header, 4)) { - QEMU_PIPE_DEBUG("Can't read qemud frame header: %s", strerror(errno)); - return -1; - } - header[4] = '\0'; - size_t size; - if (sscanf(header, "%04zx", &size) != 1) { - QEMU_PIPE_DEBUG("Malformed qemud frame header: [%.*s]", 4, header); - return -1; - } - if (size > len) { - QEMU_PIPE_DEBUG("Oversized qemud frame (% bytes, expected <= %)", size, len); - return -1; - } - if (!ReadFully(fd, buff, size)) { - QEMU_PIPE_DEBUG("Could not read qemud frame payload: %s", strerror(errno)); - return -1; - } - return size; -} diff --git a/emulator/Conn/SocketComm/include/SocketComm.h b/emulator/Conn/SocketComm/include/SocketComm.h index 4e385c3..7da546b 100644 --- a/emulator/Conn/SocketComm/include/SocketComm.h +++ b/emulator/Conn/SocketComm/include/SocketComm.h @@ -81,36 +81,19 @@ class SocketComm : public MessageSender { * SocketConn represents a single connection to a client. */ class SocketConn : public CommConn { - public: + public: SocketConn(MessageProcessor* messageProcessor, int sfd); virtual ~SocketConn() = default; - /** - * Blocking call to read data from the connection. - * - * @return std::vector<uint8_t> Serialized protobuf data received from emulator. This will be - * an empty vector if the connection was closed or some other error occurred. - */ - std::vector<uint8_t> read() override; - - /** - * Closes a connection if it is open. - */ void stop() override; - /** - * Transmits a string of data to the emulator. - * - * @param data Serialized protobuf data to transmit. - * - * @return int Number of bytes transmitted, or -1 if failed. - */ - int write(const std::vector<uint8_t>& data) override; - inline bool isOpen() override { return mSockFd > 0; } - private: + private: int mSockFd; + + std::vector<uint8_t> read() override; + int write(const std::vector<uint8_t>& data) override; }; } // impl diff --git a/emulator/aosp_car_emulator.mk b/emulator/aosp_car_emulator.mk index f0810a9..85e18ac 100644 --- a/emulator/aosp_car_emulator.mk +++ b/emulator/aosp_car_emulator.mk @@ -21,6 +21,8 @@ ifeq (,$(ENABLE_REAR_VIEW_CAMERA_SAMPLE)) ENABLE_REAR_VIEW_CAMERA_SAMPLE:=true endif +PRODUCT_PACKAGE_OVERLAYS := device/generic/car/emulator/overlay + $(call inherit-product, device/generic/car/common/car.mk) # This overrides device/generic/car/common/car.mk $(call inherit-product, device/generic/car/emulator/audio/car_emulator_audio.mk) @@ -28,21 +30,48 @@ $(call inherit-product, device/generic/car/emulator/rotary/car_rotary.mk) # Enables USB related passthrough $(call inherit-product, device/generic/car/emulator/usbpt/car_usbpt.mk) -ifeq (true,$(BUILD_EMULATOR_CLUSTER_DISPLAY)) -PRODUCT_COPY_FILES += \ - device/generic/car/emulator/cluster/display_settings.xml:system/etc/display_settings.xml \ +TARGET_PRODUCT_PROP := device/generic/car/emulator/usbpt/bluetooth/bluetooth.prop -PRODUCT_PRODUCT_PROPERTIES += \ - hwservicemanager.external.displays=1,400,600,120,0 \ - persist.service.bootanim.displays=8140900251843329 \ +# EVS +# By default, we enable EvsManager, a sample EVS app, and a mock EVS HAL implementation. +# If you want to use your own EVS HAL implementation, please set ENABLE_MOCK_EVSHAL as false +# and add your HAL implementation to the product. Please also check init.evs.rc and see how +# you can configure EvsManager to use your EVS HAL implementation. Similarly, please set +# ENABLE_SAMPLE_EVS_APP as false if you want to use your own EVS app configuration or own EVS +# app implementation. +ENABLE_EVS_SAMPLE ?= false +ENABLE_EVS_SERVICE ?= true +ENABLE_MOCK_EVSHAL ?= true +ENABLE_CAREVSSERVICE_SAMPLE ?= false +ENABLE_SAMPLE_EVS_APP ?= false +ENABLE_CARTELEMETRY_SERVICE ?= false +ifeq ($(ENABLE_MOCK_EVSHAL), true) +CUSTOMIZE_EVS_SERVICE_PARAMETER := true +endif # ENABLE_MOCK_EVSHAL +$(call inherit-product, device/generic/car/emulator/evs/evs.mk) + +ifeq ($(EMULATOR_DYNAMIC_MULTIDISPLAY_CONFIG),true) +# This section configures multi-display without hardcoding the +# displays on hwservicemanager. +$(call inherit-product, device/generic/car/emulator/multi-display-dynamic/multi-display-dynamic.mk) +else # EMULATOR_DYNAMIC_MULTIDISPLAY_CONFIG +ifeq (true,$(BUILD_EMULATOR_CLUSTER_DISPLAY)) +$(call inherit-product, device/generic/car/emulator/cluster/cluster-hwservicemanager.mk) +endif # BUILD_EMULATOR_CLUSTER_DISPLAY +endif # EMULATOR_DYNAMIC_MULTIDISPLAY_CONFIG -ifeq (true,$(ENABLE_CLUSTER_OS_DOUBLE)) -PRODUCT_PACKAGES += CarServiceOverlayEmulatorOsDouble -else -PRODUCT_PACKAGES += CarServiceOverlayEmulator -endif # ENABLE_CLUSTER_OS_DOUBLE -endif # BUILD_EMULATOR_CLUSTER_DISPLAY +PRODUCT_PACKAGES += CarServiceOverlayEmulatorMedia PRODUCT_PRODUCT_PROPERTIES += \ ro.carwatchdog.vhal_healthcheck.interval=10 \ ro.carwatchdog.client_healthcheck.interval=20 \ + +# Drive Mode RROs +PRODUCT_PACKAGES += \ + DriveModeEcoRRO \ + DriveModeSportRRO \ + DriveModeOnRRO \ + +# Enable socket for qemu VHAL +BOARD_SEPOLICY_DIRS += device/generic/car/emulator/sepolicy + diff --git a/emulator/audio/audio_policy_configuration.xml b/emulator/audio/audio_policy_configuration.xml index d2a2b26..bf9b585 100644 --- a/emulator/audio/audio_policy_configuration.xml +++ b/emulator/audio/audio_policy_configuration.xml @@ -62,7 +62,14 @@ <!-- names with _audio_zone_# are used for defined an emulator rear seat audio zone where each number # is the zone id number --> <item>bus100_audio_zone_1</item> + <item>bus101_audio_zone_1</item> + <item>bus110_audio_zone_1</item> + <item>bus111_audio_zone_1</item> <item>bus200_audio_zone_2</item> + <item>bus201_audio_zone_2</item> + <item>bus210_audio_zone_2</item> + <item>bus211_audio_zone_2</item> + <item>bus1000_mirror_device</item> <item>Built-In Mic</item> <item>Built-In Back Mic</item> <item>Echo-Reference Mic</item> @@ -118,11 +125,46 @@ samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> + <mixPort name="mixport_bus101_audio_zone_1" role="source"> + <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" + samplingRates="48000" + channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> + </mixPort> + <mixPort name="mixport_bus110_audio_zone_1" role="source"> + <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" + samplingRates="48000" + channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> + </mixPort> + <mixPort name="mixport_bus111_audio_zone_1" role="source"> + <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" + samplingRates="48000" + channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> + </mixPort> <mixPort name="mixport_bus200_audio_zone_2" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> + <mixPort name="mixport_bus201_audio_zone_2" role="source"> + <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" + samplingRates="48000" + channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> + </mixPort> + <mixPort name="mixport_bus210_audio_zone_2" role="source"> + <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" + samplingRates="48000" + channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> + </mixPort> + <mixPort name="mixport_bus211_audio_zone_2" role="source"> + <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" + samplingRates="48000" + channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> + </mixPort> + <mixPort name="mixport_bus1000_mirror_device" role="source"> + <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" + samplingRates="48000" + channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> + </mixPort> <mixPort name="primary input" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000" @@ -235,6 +277,46 @@ defaultValueMB="0" stepValueMB="100"/> </gains> </devicePort> + <devicePort tagName="bus101_audio_zone_1" role="sink" type="AUDIO_DEVICE_OUT_BUS" + address="bus101_audio_zone_1"> + <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" + samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> + <gains> + <gain name="" mode="AUDIO_GAIN_MODE_JOINT" + minValueMB="-3200" maxValueMB="600" + defaultValueMB="0" stepValueMB="100"/> + </gains> + </devicePort> + <devicePort tagName="bus110_audio_zone_1" role="sink" type="AUDIO_DEVICE_OUT_BUS" + address="bus110_audio_zone_1"> + <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" + samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> + <gains> + <gain name="" mode="AUDIO_GAIN_MODE_JOINT" + minValueMB="-3200" maxValueMB="600" + defaultValueMB="0" stepValueMB="100"/> + </gains> + </devicePort> + <devicePort tagName="bus111_audio_zone_1" role="sink" type="AUDIO_DEVICE_OUT_BUS" + address="bus111_audio_zone_1"> + <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" + samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> + <gains> + <gain name="" mode="AUDIO_GAIN_MODE_JOINT" + minValueMB="-3200" maxValueMB="600" + defaultValueMB="0" stepValueMB="100"/> + </gains> + </devicePort> + <devicePort tagName="bus1000_mirror_device" role="sink" type="AUDIO_DEVICE_OUT_BUS" + address="bus1000_mirror_device"> + <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" + samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> + <gains> + <gain name="" mode="AUDIO_GAIN_MODE_JOINT" + minValueMB="-3200" maxValueMB="600" + defaultValueMB="0" stepValueMB="100"/> + </gains> + </devicePort> <devicePort tagName="bus200_audio_zone_2" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus200_audio_zone_2"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" @@ -245,6 +327,36 @@ defaultValueMB="0" stepValueMB="100"/> </gains> </devicePort> + <devicePort tagName="bus201_audio_zone_2" role="sink" type="AUDIO_DEVICE_OUT_BUS" + address="bus201_audio_zone_2"> + <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" + samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> + <gains> + <gain name="" mode="AUDIO_GAIN_MODE_JOINT" + minValueMB="-3200" maxValueMB="600" + defaultValueMB="0" stepValueMB="100"/> + </gains> + </devicePort> + <devicePort tagName="bus210_audio_zone_2" role="sink" type="AUDIO_DEVICE_OUT_BUS" + address="bus210_audio_zone_2"> + <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" + samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> + <gains> + <gain name="" mode="AUDIO_GAIN_MODE_JOINT" + minValueMB="-3200" maxValueMB="600" + defaultValueMB="0" stepValueMB="100"/> + </gains> + </devicePort> + <devicePort tagName="bus211_audio_zone_2" role="sink" type="AUDIO_DEVICE_OUT_BUS" + address="bus211_audio_zone_2"> + <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" + samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> + <gains> + <gain name="" mode="AUDIO_GAIN_MODE_JOINT" + minValueMB="-3200" maxValueMB="600" + defaultValueMB="0" stepValueMB="100"/> + </gains> + </devicePort> <devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source" address="Built-In Mic" > <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" @@ -307,7 +419,14 @@ <route type="mix" sink="bus7_system_sound_out" sources="mixport_bus7_system_sound_out"/> <route type="mix" sink="bus100_audio_zone_1" sources="mixport_bus100_audio_zone_1"/> + <route type="mix" sink="bus101_audio_zone_1" sources="mixport_bus101_audio_zone_1"/> + <route type="mix" sink="bus110_audio_zone_1" sources="mixport_bus110_audio_zone_1"/> + <route type="mix" sink="bus111_audio_zone_1" sources="mixport_bus111_audio_zone_1"/> + <route type="mix" sink="bus1000_mirror_device" sources="mixport_bus1000_mirror_device"/> <route type="mix" sink="bus200_audio_zone_2" sources="mixport_bus200_audio_zone_2"/> + <route type="mix" sink="bus201_audio_zone_2" sources="mixport_bus201_audio_zone_2"/> + <route type="mix" sink="bus210_audio_zone_2" sources="mixport_bus210_audio_zone_2"/> + <route type="mix" sink="bus211_audio_zone_2" sources="mixport_bus211_audio_zone_2"/> <route type="mix" sink="primary input" sources="Built-In Mic,Built-In Back Mic,Echo-Reference Mic"/> <route type="mix" sink="mixport_tuner0" sources="FM Tuner"/> diff --git a/emulator/audio/car_audio_configuration.xml b/emulator/audio/car_audio_configuration.xml index 5c0a880..81ccbfa 100644 --- a/emulator/audio/car_audio_configuration.xml +++ b/emulator/audio/car_audio_configuration.xml @@ -21,87 +21,155 @@ - Volume groups in the car environment. --> -<carAudioConfiguration version="2"> +<carAudioConfiguration version="3"> <zones> <zone name="primary zone" isPrimary="true" occupantZoneId="0"> - <volumeGroups> - <group> - <device address="bus0_media_out"> - <context context="music"/> - <context context="announcement"/> - </device> - <device address="bus6_notification_out"> - <context context="notification"/> - </device> - </group> - <group> - <device address="bus1_navigation_out"> - <context context="navigation"/> - </device> - <device address="bus2_voice_command_out"> - <context context="voice_command"/> - </device> - </group> - <group> - <device address="bus4_call_out"> - <context context="call"/> - </device> - <device address="bus3_call_ring_out"> - <context context="call_ring"/> - </device> - </group> - <group> - <device address="bus5_alarm_out"> - <context context="alarm"/> - </device> - <device address="bus7_system_sound_out"> - <context context="system_sound"/> - <context context="emergency"/> - <context context="safety"/> - <context context="vehicle_status"/> - </device> - </group> - </volumeGroups> + <zoneConfigs> + <zoneConfig name="primary zone config 0" isDefault="true"> + <volumeGroups> + <group> + <device address="bus0_media_out"> + <context context="music"/> + <context context="announcement"/> + </device> + <device address="bus6_notification_out"> + <context context="notification"/> + </device> + </group> + <group> + <device address="bus1_navigation_out"> + <context context="navigation"/> + </device> + <device address="bus2_voice_command_out"> + <context context="voice_command"/> + </device> + </group> + <group> + <device address="bus4_call_out"> + <context context="call"/> + </device> + <device address="bus3_call_ring_out"> + <context context="call_ring"/> + </device> + </group> + <group> + <device address="bus5_alarm_out"> + <context context="alarm"/> + </device> + <device address="bus7_system_sound_out"> + <context context="system_sound"/> + <context context="emergency"/> + <context context="safety"/> + <context context="vehicle_status"/> + </device> + </group> + </volumeGroups> + </zoneConfig> + </zoneConfigs> </zone> <zone name="rear seat zone 1" audioZoneId="1"> - <volumeGroups> - <group> - <device address="bus100_audio_zone_1"> - <context context="music"/> - <context context="navigation"/> - <context context="voice_command"/> - <context context="call_ring"/> - <context context="call"/> - <context context="alarm"/> - <context context="notification"/> - <context context="system_sound"/> - <context context="emergency"/> - <context context="safety"/> - <context context="vehicle_status"/> - <context context="announcement"/> - </device> - </group> - </volumeGroups> + <zoneConfigs> + <zoneConfig name="rear seat zone 1 config 0" isDefault="true"> + <volumeGroups> + <group> + <device address="bus100_audio_zone_1"> + <context context="music"/> + </device> + </group> + <group> + <device address="bus101_audio_zone_1"> + <context context="navigation"/> + <context context="voice_command"/> + <context context="call_ring"/> + <context context="call"/> + <context context="alarm"/> + <context context="notification"/> + <context context="system_sound"/> + <context context="emergency"/> + <context context="safety"/> + <context context="vehicle_status"/> + <context context="announcement"/> + </device> + </group> + </volumeGroups> + </zoneConfig> + <zoneConfig name="rear seat zone 1 config 1"> + <volumeGroups> + <group> + <device address="bus110_audio_zone_1"> + <context context="music"/> + </device> + </group> + <group> + <device address="bus111_audio_zone_1"> + <context context="navigation"/> + <context context="voice_command"/> + <context context="call_ring"/> + <context context="call"/> + <context context="alarm"/> + <context context="notification"/> + <context context="system_sound"/> + <context context="emergency"/> + <context context="safety"/> + <context context="vehicle_status"/> + <context context="announcement"/> + </device> + </group> + </volumeGroups> + </zoneConfig> + </zoneConfigs> </zone> <zone name="rear seat zone 2" audioZoneId="2"> - <volumeGroups> - <group> - <device address="bus200_audio_zone_2"> - <context context="music"/> - <context context="navigation"/> - <context context="voice_command"/> - <context context="call_ring"/> - <context context="call"/> - <context context="alarm"/> - <context context="notification"/> - <context context="system_sound"/> - <context context="emergency"/> - <context context="safety"/> - <context context="vehicle_status"/> - <context context="announcement"/> - </device> - </group> - </volumeGroups> + <zoneConfigs> + <zoneConfig name="rear seat zone 2 config 0" isDefault="true"> + <volumeGroups> + <group> + <device address="bus200_audio_zone_2"> + <context context="music"/> + </device> + </group> + <group> + <device address="bus201_audio_zone_2"> + <context context="navigation"/> + <context context="voice_command"/> + <context context="call_ring"/> + <context context="call"/> + <context context="alarm"/> + <context context="notification"/> + <context context="system_sound"/> + <context context="emergency"/> + <context context="safety"/> + <context context="vehicle_status"/> + <context context="announcement"/> + </device> + </group> + </volumeGroups> + </zoneConfig> + <zoneConfig name="rear seat zone 2 config 1"> + <volumeGroups> + <group> + <device address="bus210_audio_zone_2"> + <context context="music"/> + </device> + </group> + <group> + <device address="bus211_audio_zone_2"> + <context context="navigation"/> + <context context="voice_command"/> + <context context="call_ring"/> + <context context="call"/> + <context context="alarm"/> + <context context="notification"/> + <context context="system_sound"/> + <context context="emergency"/> + <context context="safety"/> + <context context="vehicle_status"/> + <context context="announcement"/> + </device> + </group> + </volumeGroups> + </zoneConfig> + </zoneConfigs> </zone> </zones> </carAudioConfiguration> diff --git a/emulator/audio/car_emulator_audio.mk b/emulator/audio/car_emulator_audio.mk index 80e59f7..6b3147f 100644 --- a/emulator/audio/car_emulator_audio.mk +++ b/emulator/audio/car_emulator_audio.mk @@ -22,12 +22,12 @@ PRODUCT_PACKAGES += audio.primary.caremu PRODUCT_PACKAGES += \ android.hardware.audio@6.0-impl:32 -DEVICE_MANIFEST_FILE += device/generic/car/emulator/audio/android.hardware.audio.effects@6.0.xml +PRODUCT_COPY_FILES += \ + device/generic/car/emulator/audio/android.hardware.audio.effects@6.0.xml:/vendor/etc/vintf/manifest/android.hardware.audio.effects@6.0.xml PRODUCT_PROPERTY_OVERRIDES += ro.hardware.audio.primary=caremu PRODUCT_COPY_FILES += \ - frameworks/native/data/etc/android.hardware.broadcastradio.xml:system/etc/permissions/android.hardware.broadcastradio.xml \ frameworks/av/services/audiopolicy/config/a2dp_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/a2dp_audio_policy_configuration.xml \ frameworks/av/services/audiopolicy/config/usb_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/usb_audio_policy_configuration.xml \ frameworks/av/services/audiopolicy/config/r_submix_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/r_submix_audio_policy_configuration.xml \ diff --git a/emulator/audio/driver/audio_hw.c b/emulator/audio/driver/audio_hw.c index 94a4205..7714087 100644 --- a/emulator/audio/driver/audio_hw.c +++ b/emulator/audio/driver/audio_hw.c @@ -55,10 +55,26 @@ #define DEFAULT_IN_PERIOD_MS 15 #define DEFAULT_IN_PERIOD_COUNT 4 -static const char* PROP_KEY_OUT_PERIOD_MS = "ro.vendor.caremu.audiohal.out_period_ms"; -static const char* PROP_KEY_OUT_PERIOD_COUNT = "ro.vendor.caremu.audiohal.out_period_count"; -static const char* PROP_KEY_IN_PERIOD_MS = "ro.vendor.caremu.audiohal.in_period_ms"; -static const char* PROP_KEY_IN_PERIOD_COUNT = "ro.vendor.caremu.audiohal.in_period_count"; +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) +#endif + +static const char* PROP_KEY_OUT_PERIOD_MS[2] = { + "ro.boot.vendor.caremu.audiohal.out_period_ms", + "ro.vendor.caremu.audiohal.out_period_ms", +}; +static const char* PROP_KEY_OUT_PERIOD_COUNT[2] = { + "ro.boot.vendor.caremu.audiohal.out_period_count", + "ro.vendor.caremu.audiohal.out_period_count", +}; +static const char* PROP_KEY_IN_PERIOD_MS[2] = { + "ro.boot.vendor.caremu.audiohal.in_period_ms", + "ro.vendor.caremu.audiohal.in_period_ms", +}; +static const char* PROP_KEY_IN_PERIOD_COUNT[2] = { + "ro.boot.vendor.caremu.audiohal.in_period_count", + "ro.vendor.caremu.audiohal.in_period_count", +}; #define PI 3.14159265 #define TWO_PI (2*PI) @@ -75,7 +91,7 @@ static const char* PROP_KEY_IN_PERIOD_COUNT = "ro.vendor.caremu.audiohal.in_peri #define _bool_str(x) ((x)?"true":"false") -static const char * const PROP_KEY_SIMULATE_MULTI_ZONE_AUDIO = "ro.aae.simulateMultiZoneAudio"; +static const char * const PROP_KEY_SIMULATE_MULTI_ZONE_AUDIO = "ro.vendor.caremu.audiohal.simulateMultiZoneAudio"; static const char * const AAE_PARAMETER_KEY_FOR_SELECTED_ZONE = "com.android.car.emulator.selected_zone"; #define PRIMARY_ZONE_ID 0 #define INVALID_ZONE_ID -1 @@ -92,10 +108,23 @@ static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state); +static int audio_get_property(const char** keys, size_t num_keys, int32_t default_value) { + static char prop_value[PROP_VALUE_MAX] = {0}; + for (size_t i = 0; i < num_keys; ++i) { + if (property_get(keys[i], prop_value, NULL) > 0) { + return property_get_int32(keys[i], default_value); + } + } + + return default_value; +} + static int get_out_period_ms() { static int out_period_ms = -1; if (out_period_ms == -1) { - out_period_ms = property_get_int32(PROP_KEY_OUT_PERIOD_MS, DEFAULT_OUT_PERIOD_MS); + out_period_ms = audio_get_property(PROP_KEY_OUT_PERIOD_MS, + ARRAY_SIZE(PROP_KEY_OUT_PERIOD_MS), + DEFAULT_OUT_PERIOD_MS); } return out_period_ms; } @@ -103,7 +132,9 @@ static int get_out_period_ms() { static int get_out_period_count() { static int out_period_count = -1; if (out_period_count == -1) { - out_period_count = property_get_int32(PROP_KEY_OUT_PERIOD_COUNT, DEFAULT_OUT_PERIOD_COUNT); + out_period_count = audio_get_property(PROP_KEY_OUT_PERIOD_COUNT, + ARRAY_SIZE(PROP_KEY_OUT_PERIOD_COUNT), + DEFAULT_OUT_PERIOD_COUNT); } return out_period_count; } @@ -111,7 +142,9 @@ static int get_out_period_count() { static int get_in_period_ms() { static int in_period_ms = -1; if (in_period_ms == -1) { - in_period_ms = property_get_int32(PROP_KEY_IN_PERIOD_MS, DEFAULT_IN_PERIOD_MS); + in_period_ms = audio_get_property(PROP_KEY_IN_PERIOD_MS, + ARRAY_SIZE(PROP_KEY_IN_PERIOD_MS), + DEFAULT_IN_PERIOD_MS); } return in_period_ms; } @@ -119,7 +152,9 @@ static int get_in_period_ms() { static int get_in_period_count() { static int in_period_count = -1; if (in_period_count == -1) { - in_period_count = property_get_int32(PROP_KEY_IN_PERIOD_COUNT, DEFAULT_IN_PERIOD_COUNT); + in_period_count = audio_get_property(PROP_KEY_IN_PERIOD_COUNT, + ARRAY_SIZE(PROP_KEY_IN_PERIOD_COUNT), + DEFAULT_IN_PERIOD_COUNT); } return in_period_count; } @@ -1002,12 +1037,19 @@ static bool is_tone_generator_device(struct generic_stream_in *in) { address_has_tone_keyword(in->bus_address)); } +static bool is_microphone_device(struct generic_stream_in *in) { + return in->device == AUDIO_DEVICE_IN_BACK_MIC || + in->device == AUDIO_DEVICE_IN_BUILTIN_MIC; +} + static ssize_t in_read(struct audio_stream_in *stream, void *buffer, size_t bytes) { struct generic_stream_in *in = (struct generic_stream_in *)stream; struct generic_audio_device *adev = in->dev; const size_t frames = bytes / audio_stream_in_frame_size(stream); int ret = 0; + bool read_mute = false; bool mic_mute = false; + bool is_tone_generator = false; size_t read_bytes = 0; set_shortened_thread_name(pthread_self(), __func__); @@ -1019,8 +1061,13 @@ static ssize_t in_read(struct audio_stream_in *stream, void *buffer, size_t byte in->worker_standby = false; } + // Only mute read if mic is muted and device is mic. + // Other devices, e.g. FM_TUNER, are not muted by mic mute + read_mute = mic_mute && is_microphone_device(in); + + is_tone_generator = is_tone_generator_device(in); // Tone generators fill the buffer via pseudo_pcm_read directly - if (!is_tone_generator_device(in)) { + if (!is_tone_generator) { pthread_cond_signal(&in->worker_wake); } @@ -1057,7 +1104,7 @@ static ssize_t in_read(struct audio_stream_in *stream, void *buffer, size_t byte } in->standby_frames_read += frames; - if (is_tone_generator_device(in)) { + if (is_tone_generator) { int read_bytes = pseudo_pcm_read(buffer, bytes, &in->oscillator); read_frames = read_bytes / audio_stream_in_frame_size(stream); } else if (popcount(in->req_config.channel_mask) == 1 && @@ -1091,7 +1138,7 @@ static ssize_t in_read(struct audio_stream_in *stream, void *buffer, size_t byte exit: read_bytes = read_frames*audio_stream_in_frame_size(stream); - if (mic_mute) { + if (read_mute) { read_bytes = 0; } @@ -1192,8 +1239,6 @@ static int adev_open_output_stream(struct audio_hw_device *dev, pthread_cond_init(&out->worker_wake, NULL); out->worker_standby = true; out->worker_exit = false; - pthread_create(&out->worker_thread, NULL, out_write_worker, out); - set_shortened_thread_name(out->worker_thread, address); out->enabled_channels = BOTH_CHANNELS; // For targets where output streams are closed regularly, currently ducked/muted addresses @@ -1219,6 +1264,8 @@ static int adev_open_output_stream(struct audio_hw_device *dev, out->bus_address, out->enabled_channels == RIGHT_CHANNEL ? "Right" : "Left"); } } + pthread_create(&out->worker_thread, NULL, out_write_worker, out); + set_shortened_thread_name(out->worker_thread, address); *stream_out = &out->stream; ALOGD("%s bus: %s", __func__, out->bus_address); } diff --git a/emulator/audio/driver/ext_pcm.c b/emulator/audio/driver/ext_pcm.c index 2b0e825..5bbc547 100644 --- a/emulator/audio/driver/ext_pcm.c +++ b/emulator/audio/driver/ext_pcm.c @@ -87,7 +87,7 @@ static void *mixer_thread_loop(void *context) { int ret = pcm_write(ext_pcm->pcm, (void *)ext_pcm->mixer_pipeline.buffer, ext_pcm->mixer_pipeline.position * sizeof(int16_t)); if (ret != 0) { - ALOGE("%s error[%d] writing data to pcm"); + ALOGE("%s error[%d] writing data to pcm", __func__, ret); } } memset(&ext_pcm->mixer_pipeline, 0, sizeof(struct ext_mixer_pipeline)); diff --git a/emulator/car_emulator_product.mk b/emulator/car_emulator_product.mk new file mode 100644 index 0000000..0f1c94a --- /dev/null +++ b/emulator/car_emulator_product.mk @@ -0,0 +1,28 @@ +# +# Copyright (C) 2022 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +$(call inherit-product, packages/services/Car/car_product/build/car_product.mk) + +# Runtime Resource Overlay for Connectivity +PRODUCT_PACKAGES += \ + CarConnectivityOverlay + +# Allowed packages per user type +PRODUCT_COPY_FILES += \ + device/generic/car/common/preinstalled-packages-product-car-emulator.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/sysconfig/preinstalled-packages-product-car-emulator.xml + +# TODO(b/253459812): find a better way to handle it. +DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE += \ + device/generic/car/common/device_framework_matrix_product.xml diff --git a/emulator/car_emulator_vendor.mk b/emulator/car_emulator_vendor.mk new file mode 100644 index 0000000..3e32d4c --- /dev/null +++ b/emulator/car_emulator_vendor.mk @@ -0,0 +1,141 @@ +# +# Copyright (C) 2022 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +$(call inherit-product, packages/services/Car/car_product/build/car_vendor.mk) + +# Need this for gles libraries to load properly +# after moving to /vendor/lib/ +PRODUCT_PACKAGES += \ + vndk-sp + +DEVICE_PACKAGE_OVERLAYS := device/generic/goldfish/overlay + +PRODUCT_CHARACTERISTICS := emulator + +PRODUCT_FULL_TREBLE_OVERRIDE := true + +# Enable Google-specific location features, +# like NetworkLocationProvider and LocationCollector +PRODUCT_VENDOR_PROPERTIES += \ + ro.com.google.locationfeatures=1 + +# Enable setupwizard +PRODUCT_VENDOR_PROPERTIES += \ + ro.setupwizard.mode?=OPTIONAL + +# More configurations +PRODUCT_VENDOR_PROPERTIES += \ + ro.carwatchdog.client_healthcheck.interval=20 \ + ro.carwatchdog.vhal_healthcheck.interval=10 \ + +ifeq (,$(ENABLE_REAR_VIEW_CAMERA_SAMPLE)) +ENABLE_REAR_VIEW_CAMERA_SAMPLE:=true +endif + +# Auto modules +PRODUCT_PACKAGES += \ + android.hardware.automotive.vehicle@V1-emulator-service \ + android.hardware.broadcastradio-service.default \ + android.hardware.audio.service-caremu \ + android.hardware.automotive.remoteaccess@V1-default-service \ + android.hardware.automotive.ivn@V1-default-service + +# Copy car_core_hardware and overwrite handheld_core_hardware.xml with a disable config. +# Overwrite goldfish related xml with a disable config. +PRODUCT_COPY_FILES += \ + device/generic/car/common/android.hardware.disable.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/handheld_core_hardware.xml \ + device/generic/car/common/car_core_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/car_core_hardware.xml \ + device/generic/car/common/android.hardware.disable.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.ar.xml \ + device/generic/car/common/android.hardware.disable.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.autofocus.xml \ + device/generic/car/common/android.hardware.disable.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.concurrent.xml \ + device/generic/car/common/android.hardware.disable.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.full.xml \ + device/generic/car/common/android.hardware.disable.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.front.xml \ + device/generic/car/common/android.hardware.disable.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.any.xml \ + device/generic/car/common/android.hardware.disable.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.flash-autofocus.xml \ + device/generic/car/common/android.hardware.disable.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.raw.xml \ + device/generic/car/common/android.hardware.disable.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml \ + device/generic/car/common/android.hardware.disable.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.direct.xml \ + +# Overwrite goldfish fstab.ranchu to turn off adoptable_storage +PRODUCT_COPY_FILES += \ + device/generic/car/common/fstab.ranchu.car:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.ranchu + +# Enable landscape +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.hardware.screen.landscape.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.screen.landscape.xml + +# Used to embed a map in an activity view +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.software.activities_on_secondary_displays.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.activities_on_secondary_displays.xml + +# Permission for Wi-Fi passpoint support +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.hardware.wifi.passpoint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.passpoint.xml + +# Additional permissions +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.hardware.bluetooth_le.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth_le.xml \ + frameworks/native/data/etc/android.hardware.bluetooth.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \ + frameworks/native/data/etc/android.hardware.broadcastradio.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.broadcastradio.xml \ + frameworks/native/data/etc/android.hardware.type.automotive.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.type.automotive.xml \ + +# Sensor features +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.accelerometer.xml \ + frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.gyroscope.xml \ + frameworks/native/data/etc/android.hardware.sensor.accelerometer_limited_axes.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.accelerometer_limited_axes.xml \ + frameworks/native/data/etc/android.hardware.sensor.gyroscope_limited_axes.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.gyroscope_limited_axes.xml \ + frameworks/native/data/etc/android.hardware.sensor.accelerometer_limited_axes_uncalibrated.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.accelerometer_limited_axes_uncalibrated.xml \ + frameworks/native/data/etc/android.hardware.sensor.gyroscope_limited_axes_uncalibrated.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.gyroscope_limited_axes_uncalibrated.xml \ + +# Additional selinux policy +BOARD_SEPOLICY_DIRS += device/generic/car/common/sepolicy + +# This overrides device/generic/car/common/car.mk +$(call inherit-product, device/generic/car/emulator/audio/car_emulator_audio.mk) +$(call inherit-product, device/generic/car/emulator/rotary/car_rotary.mk) +# Enables USB related passthrough +$(call inherit-product, device/generic/car/emulator/usbpt/car_usbpt.mk) + +# EVS +# By default, we enable EvsManager, a sample EVS app, and a mock EVS HAL implementation. +# If you want to use your own EVS HAL implementation, please set ENABLE_MOCK_EVSHAL as false +# and add your HAL implementation to the product. Please also check init.evs.rc and see how +# you can configure EvsManager to use your EVS HAL implementation. Similarly, please set +# ENABLE_SAMPLE_EVS_APP as false if you want to use your own EVS app configuration or own EVS +# app implementation. +ENABLE_EVS_SAMPLE ?= false +ENABLE_EVS_SERVICE ?= true +ENABLE_MOCK_EVSHAL ?= true +ENABLE_CAREVSSERVICE_SAMPLE ?= false +ENABLE_SAMPLE_EVS_APP ?= false +ENABLE_CARTELEMETRY_SERVICE ?= false +ifeq ($(ENABLE_MOCK_EVSHAL), true) +CUSTOMIZE_EVS_SERVICE_PARAMETER := true +endif # ENABLE_MOCK_EVSHAL +$(call inherit-product, device/generic/car/emulator/evs/evs.mk) + +ifeq ($(EMULATOR_DYNAMIC_MULTIDISPLAY_CONFIG),true) +# This section configures multi-display without hardcoding the +# displays on hwservicemanager. +$(call inherit-product, device/generic/car/emulator/multi-display-dynamic/multi-display-dynamic.mk) +else # EMULATOR_DYNAMIC_MULTIDISPLAY_CONFIG +ifeq (true,$(BUILD_EMULATOR_CLUSTER_DISPLAY)) +$(call inherit-product, device/generic/car/emulator/cluster/cluster-hwservicemanager.mk) +endif # BUILD_EMULATOR_CLUSTER_DISPLAY +endif # EMULATOR_DYNAMIC_MULTIDISPLAY_CONFIG + +# Goldfish vendor partition configurations +$(call inherit-product-if-exists, device/generic/goldfish/vendor.mk) diff --git a/emulator/cluster/cluster-hwservicemanager.mk b/emulator/cluster/cluster-hwservicemanager.mk new file mode 100644 index 0000000..718c1d3 --- /dev/null +++ b/emulator/cluster/cluster-hwservicemanager.mk @@ -0,0 +1,43 @@ +# +# Copyright (C) 2022 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Add non-removable cluster by creating a display on hwservicemanager. +PRODUCT_COPY_FILES += \ + device/generic/car/emulator/cluster/display_settings.xml:$(TARGET_COPY_OUT_VENDOR)/etc/display_settings.xml \ + +ifeq ($(EMULATOR_MULTIDISPLAY_HW_CONFIG),) +PRODUCT_PRODUCT_PROPERTIES += \ + hwservicemanager.external.displays=1,400,600,120,0 \ + persist.service.bootanim.displays=8140900251843329 +else +ifneq ($(EMULATOR_MULTIDISPLAY_BOOTANIM_CONFIG),) + PRODUCT_PRODUCT_PROPERTIES += \ + hwservicemanager.external.displays=$(EMULATOR_MULTIDISPLAY_HW_CONFIG) \ + persist.service.bootanim.displays=$(EMULATOR_MULTIDISPLAY_BOOTANIM_CONFIG) +else # EMULATOR_MULTIDISPLAY_BOOTANIM_CONFIG +$(error EMULATOR_MULTIDISPLAY_BOOTANIM_CONFIG has to be defined when EMULATOR_MULTIDISPLAY_BOOTANIM_CONFIG is defined) +endif # EMULATOR_MULTIDISPLAY_BOOTANIM_CONFIG +endif # EMULATOR_HW_MULTIDISPLAY_CONFIG + +ifeq (true,$(ENABLE_CLUSTER_OS_DOUBLE)) +PRODUCT_PACKAGES += ClusterHomeSampleOverlay CarServiceOverlayEmulatorOsDouble ClusterOsDoubleEmulatorPhysicalDisplayOverlay +else +PRODUCT_PACKAGES += CarServiceOverlayEmulator +endif # ENABLE_CLUSTER_OS_DOUBLE + +# Disable dynamic multidisplay for emulators with display added by +# hwservicemanager. +EMULATOR_DYNAMIC_MULTIDISPLAY_CONFIG := false + diff --git a/emulator/cluster/display_settings.xml b/emulator/cluster/display_settings.xml index 1014c59..e06053e 100644 --- a/emulator/cluster/display_settings.xml +++ b/emulator/cluster/display_settings.xml @@ -4,5 +4,5 @@ <config identifier="1" /> <!-- Display settings for cluster --> - <display name="port:1" forcedDensity="120" dontMoveToTop="true" /> + <display name="port:1" forcedDensity="160" dontMoveToTop="true" /> </display-settings> diff --git a/emulator/cluster/rro_overlays/CarServiceOverlay/res/values/config.xml b/emulator/cluster/rro_overlays/CarServiceOverlay/res/values/config.xml index 40f47eb..c77764d 100644 --- a/emulator/cluster/rro_overlays/CarServiceOverlay/res/values/config.xml +++ b/emulator/cluster/rro_overlays/CarServiceOverlay/res/values/config.xml @@ -24,22 +24,27 @@ occupant. Some examples are: - <item>displayPort=0,displayType=MAIN,occupantZoneId=0</item> - <item>displayPort=1,displayType=INSTRUMENT_CLUSTER,occupantZoneId=0</item> - <item>displayPort=2,displayType=MAIN,occupantZoneId=1</item> - <item>displayPort=3,displayType=MAIN,occupantZoneId=2</item> - <item>displayPort=4,displayType=MAIN,occupantZoneId=3</item> + <item>displayPort=0,displayType=MAIN,occupantZoneId=0,inputTypes=TOUCH_SCREEN|DPAD_KEYS| + NAVIGATE_KEYS|ROTARY_NAVIGATION</item> + <item>displayPort=1,displayType=INSTRUMENT_CLUSTER,occupantZoneId=0, + inputTypes=DPAD_KEYS</item> + <item>displayPort=2,displayType=MAIN,occupantZoneId=1, + inputTypes=NAVIGATE_KEYS</item> + <item>displayPort=3,displayType=MAIN,occupantZoneId=2, + inputTypes=NAVIGATE_KEYS</item> + <item>displayUniqueId=virtual:com.example:MainD,displayType=MAIN,occupantZoneId=3, + inputTypes=NAVIGATE_KEYS</item> displayPort: Unique port id for the display. displayType: Display type for the display. Use * part from CarOccupantZoneManager.DISPLAY_TYPE_* like MAIN, INSTRUMENT_CLUSTER and etc. occupantZoneId: occupantZoneId specified from config_occupant_zones. - + inputTypes: supported input types for the corresponding display. --> <string-array translatable="false" name="config_occupant_display_mapping"> - <item>displayPort=0,displayType=MAIN,occupantZoneId=0</item> - <item>displayPort=1,displayType=INSTRUMENT_CLUSTER,occupantZoneId=0</item> + <item>displayPort=0,displayType=MAIN,occupantZoneId=0,inputTypes=TOUCH_SCREEN|DPAD_KEYS|NAVIGATE_KEYS|ROTARY_NAVIGATION</item> + <item>displayPort=1,displayType=INSTRUMENT_CLUSTER,occupantZoneId=0,inputTypes=DPAD_KEYS</item> </string-array> <!-- @@ -56,8 +61,8 @@ The default list defined below will enable all optional features defined. --> - <!-- TODO(b/205908527): this overlay is to temporarily disable CarEvsService by default. --> <string-array translatable="false" name="config_allowed_optional_car_features"> + <item>car_evs_service</item> <item>car_navigation_service</item> <item>cluster_service</item> <item>com.android.car.user.CarUserNoticeService</item> diff --git a/emulator/cluster/rro_overlays/CarServiceOverlay_MdNd/Android.bp b/emulator/cluster/rro_overlays/CarServiceOverlay_MdNd/Android.bp new file mode 100644 index 0000000..9cff5fb --- /dev/null +++ b/emulator/cluster/rro_overlays/CarServiceOverlay_MdNd/Android.bp @@ -0,0 +1,35 @@ +// Copyright (C) 2023 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +package { + default_applicable_licenses: ["device_generic_car_license"], +} + +runtime_resource_overlay { + name: "CarServiceOverlayMdNdEmulator", + resource_dirs: ["res"], + manifest: "AndroidManifest.xml", + sdk_version: "current", + product_specific: true +} + +override_runtime_resource_overlay { + name: "CarServiceOverlayMdNdEmulatorGoogle", + base: "CarServiceOverlayMdNdEmulator", + package_name: "com.google.android.car.resources.mdnd_emulator", + target_package_name: "com.google.android.car.updatable", +} + diff --git a/emulator/cluster/rro_overlays/CarServiceOverlay_MdNd/AndroidManifest.xml b/emulator/cluster/rro_overlays/CarServiceOverlay_MdNd/AndroidManifest.xml new file mode 100644 index 0000000..caf4090 --- /dev/null +++ b/emulator/cluster/rro_overlays/CarServiceOverlay_MdNd/AndroidManifest.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2023 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT 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.resources.mdnd_emulator"> + <application android:hasCode="false"/> + <!-- priority should be higher than CarServiceOverlayMdEmulatorOsDouble --> + <overlay android:priority="5003" + android:targetPackage="com.android.car.updatable" + android:targetName="CarServiceCustomization" + android:resourcesMap="@xml/overlays" + android:isStatic="true" /> +</manifest> + diff --git a/emulator/cluster/rro_overlays/CarServiceOverlay_MdNd/res/values/config.xml b/emulator/cluster/rro_overlays/CarServiceOverlay_MdNd/res/values/config.xml new file mode 100644 index 0000000..2182a64 --- /dev/null +++ b/emulator/cluster/rro_overlays/CarServiceOverlay_MdNd/res/values/config.xml @@ -0,0 +1,157 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2023, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES 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> + <!-- + Lists all occupant zones available in the car. + Some examples are: + <item>occupantZoneId=0,occupantType=DRIVER,seatRow=1,seatSide=driver</item> + <item>occupantZoneId=1,occupantType=FRONT_PASSENGER,seatRow=1,seatSide=oppositeDriver</item> + <item>occupantZoneId=2,occupantType=REAR_PASSENGER,seatRow=2,seatSide=left</item> + <item>occupantZoneId=3,occupantType=REAR_PASSENGER,seatRow=2,seatSide=right</item> + + occupantZoneId: Unique unsigned integer id to represent each passenger zone. Each zone + should have different id. + occupantType: Occupant type for the display. Use * part from + CarOccupantZoneManager.OCCUPANT_TYPE_* like DRIVER, FRONT_PASSENGER, + REAR_PASSENGER and etc. + seatRow: Integer telling which row the seat is located. Row 1 is for front seats. + seatSide: left/center/right for known side. Or can use driver/center/oppositeDriver to + handle both right-hand driving and left-hand driving in one place. + If car's RHD / LHD is not specified, LHD will be assumed and driver side becomes + left. + --> + <string-array translatable="false" name="config_occupant_zones"> + <item>occupantZoneId=0,occupantType=FRONT_PASSENGER,seatRow=1,seatSide=driver</item> + <item>occupantZoneId=1,occupantType=FRONT_PASSENGER,seatRow=1,seatSide=oppositeDriver</item> + <item>occupantZoneId=2,occupantType=REAR_PASSENGER,seatRow=2,seatSide=left</item> + <item>occupantZoneId=3,occupantType=REAR_PASSENGER,seatRow=2,seatSide=right</item> + </string-array> + + <!-- + Specifies configuration of displays in system telling its usage / type and assigned + occupant. + + Some examples are: + <item>displayPort=0,displayType=MAIN,occupantZoneId=0,inputTypes=TOUCH_SCREEN|DPAD_KEYS|NAVIGATE_KEYS|ROTARY_NAVIGATION</item> + <item>displayPort=1,displayType=INSTRUMENT_CLUSTER,occupantZoneId=0,inputTypes=DPAD_KEYS</item> + <item>displayPort=2,displayType=MAIN,occupantZoneId=1,inputTypes=TOUCH_SCREEN</item> + <item>displayPort=3,displayType=MAIN,occupantZoneId=2,inputTypes=TOUCH_SCREEN</item> + <item>displayPort=4,displayType=MAIN,occupantZoneId=3,inputTypes=TOUCH_SCREEN</item> + + displayPort: Unique port id for the display. + displayType: Display type for the display. Use * part from + CarOccupantZoneManager.DISPLAY_TYPE_* like MAIN, INSTRUMENT_CLUSTER and + etc. + occupantZoneId: occupantZoneId specified from config_occupant_zones. + + inputTypes: supported input types for the corresponding display. + --> + <string-array translatable="false" name="config_occupant_display_mapping"> + <item>displayPort=0,displayType=MAIN,occupantZoneId=0,inputTypes=TOUCH_SCREEN|DPAD_KEYS|NAVIGATE_KEYS|ROTARY_NAVIGATION</item> + <item>displayUniqueId=virtual:com.android.car.cluster.osdouble:ClusterDisplay,displayType=INSTRUMENT_CLUSTER,occupantZoneId=0,inputTypes=DPAD_KEYS</item> + <item>displayPort=2,displayType=MAIN,occupantZoneId=1,inputTypes=TOUCH_SCREEN</item> + <item>displayPort=3,displayType=MAIN,occupantZoneId=2,inputTypes=TOUCH_SCREEN</item> + <item>displayPort=4,displayType=MAIN,occupantZoneId=3,inputTypes=TOUCH_SCREEN</item> + </string-array> + + <!-- + Specifies optional features that can be enabled by this image. Note that vhal can disable + them depending on product variation. + Feature name can be either service name defined in Car.*_SERVICE for Car*Manager or any + optional feature defined under @OptionalFeature annotation. + Note that '/' is used to have subfeature under main feature like "MAIN_FEATURE/SUB_FEATURE". + + Some examples are: + <item>storage_monitoring</item> + <item>com.android.car.user.CarUserNoticeService</item> + <item>com.example.Feature/SubFeature</item> + + The default list defined below will enable all optional features defined. + --> + <string-array translatable="false" name="config_allowed_optional_car_features"> + <item>car_evs_service</item> + <item>car_navigation_service</item> + <item>car_occupant_connection_service</item> + <item>car_remote_device_service</item> + <item>cluster_home_service</item> + <item>com.android.car.user.CarUserNoticeService</item> + <item>diagnostic</item> + <item>storage_monitoring</item> + <item>vehicle_map_service</item> + <item>car_telemetry_service</item> + </string-array> + + <!-- Enable profile user assignment per each CarOccupantZone for per display android user + assignments. This feature is still experimental. --> + <bool name="enableProfileUserAssignmentForMultiDisplay" translatable="false">true</bool> + + <!-- The services that need to be started earlier in the boot sequence and in particular order. + Every item in this array contains a flatten component name of a service that needs to be + started and a list of parameters after hashtag symbol. Here's the format: + + <item>com.bar.foo/.Service#bind={bind|start|startForeground},user={all|system|foreground}, + trigger={asap,userUnlocked}</item> + + bind: bind - start service with Context#bindService + start - start service with Context#startService + startForeground - start service with Context#startForegroundService + If service was bound it will be restarted unless it is constantly crashing. + The default value is 'start' + user: all - the service will be bound/started for system and all foreground users + system - the service will be started/bound only for system user (u0) + foreground - the service will be bound/started only for foreground users + backgroundVisible - the service will be bound/started only for background users that + are visible. + The default value is 'all' + trigger: indicates when the service needs to be started/bound + asap - the service might be bound when user is not fully loaded, be careful with + this value, the service also needs to have directBootAware flag set to true + userUnlocked - start service when user unlocked the device + The default value is 'userUnlocked' + + If the service bound/started for foreground user it will be unbound/stopped when user + is no longer foreground. + --> + <string-array translatable="false" name="config_earlyStartupServices"> + <item>com.android.car.messenger/.MessengerService#bind=startForeground,user=foreground,trigger=userUnlocked</item> + <item>com.google.android.companiondevicesupport/com.google.android.connecteddevice.service.ConnectedDeviceService#bind=bind,user=system,trigger=asap</item> + <item>com.google.android.companiondevicesupport/com.google.android.connecteddevice.service.ConnectedDeviceFgUserService#bind=bind,user=foreground,trigger=asap</item> + <!-- Starting Android Auto receiver service earlier for wireless projection. --> + <item>com.google.android.embedded.projection/com.google.android.apps.auto.aareceiver.service.PersistentService#bind=bind,user=foreground,trigger=userUnlocked</item> + + <!-- eGMM Vehicle Map Service Provider --> + <item>com.google.android.apps.maps/com.google.android.apps.geo.autograph.vms.platform.car.CarVmsPublisherClientService#bind=bind,user=foreground,trigger=userUnlocked</item> + + <!-- OEM Custom Input Reference Service --> + <item>com.android.car.custominput.sample/.SampleCustomInputService#bind=bind,user=foreground,trigger=userUnlocked</item> + + <!-- Car Telemetry Collector Service --> + <item>com.android.car.cartelemetryapp/.CarMetricsCollectorService#bind=bind,user=system,trigger=asap</item> + + <!-- GSR Failover service to facilitate the publishing of speed limit information when eGMM is unable to do so --> + <item>com.google.android.apps.geo.automotive.adas/.failover.FailoverControllerService#bind=bind,user=foreground,trigger=userUnlocked</item> + + <!-- The service responsible for starting/stopping the Cast receiver. --> + <item>com.android.car.castreceiver/.AutomotiveCastReceiverService#bind=bind,user=foreground,trigger=userUnlocked</item> + <!-- Early start service for Multi-display Control Center app --> + <item>com.android.car.multidisplay.controlcenter/com.android.car.multidisplay.controlcenter.service.ControlCenterService#bind=bind,user=backgroundVisible,trigger=userPostUnlocked</item> + </string-array> +</resources> diff --git a/emulator/cluster/rro_overlays/CarServiceOverlay_MdNd/res/xml/car_ux_restrictions_map.xml b/emulator/cluster/rro_overlays/CarServiceOverlay_MdNd/res/xml/car_ux_restrictions_map.xml new file mode 100644 index 0000000..337b63a --- /dev/null +++ b/emulator/cluster/rro_overlays/CarServiceOverlay_MdNd/res/xml/car_ux_restrictions_map.xml @@ -0,0 +1,104 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2023, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<UxRestrictions xmlns:car="http://schemas.android.com/apk/res-auto"> + <!-- Map the driving states to UX restrictions here --> + <!-- Note - The platform takes a fully restricted approach when there is no information or if + the information is malformed. As a result, + 1. Default values for requiresDistractionOptimization is true, and uxr is fully_restricted. + 2. If uxr != baseline, then requiresDistractionOptimization is automatically promoted to true, + even if it is declared as false. Because it doesn't make sense to have an non baseline UX + restriction without requiresDistractionOptimization set to true. + So if we don't want any restrictions, requiresDistractionOptimization should be explicitly + marked as false and uxr should be explicitly set to baseline. --> + + <!--Setting baseline restrictions for all displays as this is a passenger only system--> + <RestrictionMapping physicalPort="0"> + <DrivingState state="parked"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="idling"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="moving"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + </RestrictionMapping> + + <RestrictionMapping physicalPort="2"> + <DrivingState state="parked"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="idling"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="moving"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + </RestrictionMapping> + + <RestrictionMapping physicalPort="3"> + <DrivingState state="parked"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="idling"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="moving"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + </RestrictionMapping> + + <RestrictionMapping physicalPort="4"> + <DrivingState state="parked"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="idling"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="moving"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + </RestrictionMapping> + + <!-- Configure restriction parameters here--> + <RestrictionParameters> + <!-- Parameters to express displayed String related restrictions --> + <!-- Max allowed length of general purpose strings when limit_string_length is imposed--> + <StringRestrictions maxLength="120"/> + <!-- Parameters to express content related restrictions --> + <!-- Max number of cumulative content items allowed to be displayed when + limit_content is imposed. --> + <!-- Maximum levels deep that the user can navigate to when limit_content is imposed. --> + <ContentRestrictions maxCumulativeItems="21" maxDepth="3"/> + </RestrictionParameters> + +</UxRestrictions> diff --git a/emulator/cluster/rro_overlays/CarServiceOverlay_MdNd/res/xml/overlays.xml b/emulator/cluster/rro_overlays/CarServiceOverlay_MdNd/res/xml/overlays.xml new file mode 100644 index 0000000..b0018f2 --- /dev/null +++ b/emulator/cluster/rro_overlays/CarServiceOverlay_MdNd/res/xml/overlays.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2023 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<overlay> + <item target="array/config_occupant_zones" value="@array/config_occupant_zones" /> + <item target="array/config_occupant_display_mapping" value="@array/config_occupant_display_mapping" /> + <item target="array/config_allowed_optional_car_features" value="@array/config_allowed_optional_car_features" /> + <item target="bool/enableProfileUserAssignmentForMultiDisplay" value="@bool/enableProfileUserAssignmentForMultiDisplay" /> + <item target="array/config_earlyStartupServices" value="@array/config_earlyStartupServices" /> + <item target="xml/car_ux_restrictions_map" value="@xml/car_ux_restrictions_map" /> +</overlay> diff --git a/emulator/cluster/rro_overlays/CarServiceOverlay_MdOsDouble/Android.bp b/emulator/cluster/rro_overlays/CarServiceOverlay_MdOsDouble/Android.bp new file mode 100644 index 0000000..db30649 --- /dev/null +++ b/emulator/cluster/rro_overlays/CarServiceOverlay_MdOsDouble/Android.bp @@ -0,0 +1,34 @@ +// Copyright (C) 2022 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +package { + default_applicable_licenses: ["device_generic_car_license"], +} + +runtime_resource_overlay { + name: "CarServiceOverlayMdEmulatorOsDouble", + resource_dirs: ["res"], + manifest: "AndroidManifest.xml", + sdk_version: "current", + product_specific: true +} + +override_runtime_resource_overlay { + name: "CarServiceOverlayMdEmulatorOsDoubleGoogle", + base: "CarServiceOverlayMdEmulatorOsDouble", + package_name: "com.google.android.car.resources.md_emulator.osdouble", + target_package_name: "com.google.android.car.updatable", +} diff --git a/emulator/cluster/rro_overlays/CarServiceOverlay_MdOsDouble/AndroidManifest.xml b/emulator/cluster/rro_overlays/CarServiceOverlay_MdOsDouble/AndroidManifest.xml new file mode 100644 index 0000000..7795c0b --- /dev/null +++ b/emulator/cluster/rro_overlays/CarServiceOverlay_MdOsDouble/AndroidManifest.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2022 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.car.resources.md_emulator.osdouble"> + <application android:hasCode="false"/> + <!-- priority should be higher than CarServiceOverlayEmulatorOsDouble --> + <overlay android:priority="5002" + android:targetPackage="com.android.car.updatable" + android:targetName="CarServiceCustomization" + android:resourcesMap="@xml/overlays" + android:isStatic="true" /> +</manifest> diff --git a/emulator/cluster/rro_overlays/CarServiceOverlay_MdOsDouble/res/values/config.xml b/emulator/cluster/rro_overlays/CarServiceOverlay_MdOsDouble/res/values/config.xml new file mode 100644 index 0000000..d88c016 --- /dev/null +++ b/emulator/cluster/rro_overlays/CarServiceOverlay_MdOsDouble/res/values/config.xml @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2022, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- Resources to configure car service based on each OEM's preference. --> +<resources> + <!-- + Lists all occupant (= driver + passenger) zones available in the car. + Some examples are: + <item>occupantZoneId=0,occupantType=DRIVER,seatRow=1,seatSide=driver</item> + <item>occupantZoneId=1,occupantType=FRONT_PASSENGER,seatRow=1,seatSide=oppositeDriver</item> + <item>occupantZoneId=2,occupantType=REAR_PASSENGER,seatRow=2,seatSide=left</item> + <item>occupantZoneId=3,occupantType=REAR_PASSENGER,seatRow=2,seatSide=right</item> + + occupantZoneId: Unique unsigned integer id to represent each passenger zone. Each zone + should have different id. + occupantType: Occupant type for the display. Use * part from + CarOccupantZoneManager.OCCUPANT_TYPE_* like DRIVER, FRONT_PASSENGER, + REAR_PASSENGER and etc. + seatRow: Integer telling which row the seat is located. Row 1 is for front seats. + seatSide: left/center/right for known side. Or can use driver/center/oppositeDriver to + handle both right-hand driving and left-hand driving in one place. + If car's RHD / LHD is not specified, LHD will be assumed and driver side becomes + left. + --> + <string-array translatable="false" name="config_occupant_zones"> + <item>occupantZoneId=0,occupantType=DRIVER,seatRow=1,seatSide=driver</item> + <item>occupantZoneId=1,occupantType=FRONT_PASSENGER,seatRow=1,seatSide=oppositeDriver</item> + <item>occupantZoneId=2,occupantType=REAR_PASSENGER,seatRow=2,seatSide=left</item> + <item>occupantZoneId=3,occupantType=REAR_PASSENGER,seatRow=2,seatSide=right</item> + </string-array> + + <!-- + Specifies configuration of displays in system telling its usage / type and assigned + occupant. + + Some examples are: + <item>displayPort=0,displayType=MAIN,occupantZoneId=0,inputTypes=TOUCH_SCREEN|DPAD_KEYS|NAVIGATE_KEYS|ROTARY_NAVIGATION</item> + <item>displayPort=1,displayType=INSTRUMENT_CLUSTER,occupantZoneId=0,inputTypes=DPAD_KEYS</item> + <item>displayPort=2,displayType=MAIN,occupantZoneId=1,inputTypes=TOUCH_SCREEN</item> + <item>displayPort=3,displayType=MAIN,occupantZoneId=2,inputTypes=TOUCH_SCREEN</item> + <item>displayPort=4,displayType=MAIN,occupantZoneId=3,inputTypes=TOUCH_SCREEN</item> + + displayPort: Unique port id for the display. + displayType: Display type for the display. Use * part from + CarOccupantZoneManager.DISPLAY_TYPE_* like MAIN, INSTRUMENT_CLUSTER and + etc. + occupantZoneId: occupantZoneId specified from config_occupant_zones. + + inputTypes: supported input types for the corresponding display. + --> + <string-array translatable="false" name="config_occupant_display_mapping"> + <item>displayPort=0,displayType=MAIN,occupantZoneId=0,inputTypes=TOUCH_SCREEN|DPAD_KEYS|NAVIGATE_KEYS|ROTARY_NAVIGATION</item> + <item>displayUniqueId=virtual:com.android.car.cluster.osdouble:ClusterDisplay,displayType=INSTRUMENT_CLUSTER,occupantZoneId=0,inputTypes=DPAD_KEYS</item> + <item>displayPort=2,displayType=MAIN,occupantZoneId=1,inputTypes=TOUCH_SCREEN</item> + <item>displayPort=3,displayType=MAIN,occupantZoneId=2,inputTypes=TOUCH_SCREEN</item> + <item>displayPort=4,displayType=MAIN,occupantZoneId=3,inputTypes=TOUCH_SCREEN</item> + </string-array> + + <!-- + Specifies optional features that can be enabled by this image. Note that vhal can disable + them depending on product variation. + Feature name can be either service name defined in Car.*_SERVICE for Car*Manager or any + optional feature defined under @OptionalFeature annotation. + Note that '/' is used to have subfeature under main feature like "MAIN_FEATURE/SUB_FEATURE". + + Some examples are: + <item>storage_monitoring</item> + <item>com.android.car.user.CarUserNoticeService</item> + <item>com.example.Feature/SubFeature</item> + + The default list defined below will enable all optional features defined. + --> + <string-array translatable="false" name="config_allowed_optional_car_features"> + <item>car_evs_service</item> + <item>car_navigation_service</item> + <item>car_occupant_connection_service</item> + <item>car_remote_device_service</item> + <item>cluster_home_service</item> + <item>com.android.car.user.CarUserNoticeService</item> + <item>diagnostic</item> + <item>storage_monitoring</item> + <item>vehicle_map_service</item> + <item>car_telemetry_service</item> + </string-array> + + <!-- Enable profile user assignment per each CarOccupantZone for per display android user + assignments. This feature is still experimental. --> + <bool name="enableProfileUserAssignmentForMultiDisplay" translatable="false">true</bool> +</resources> diff --git a/emulator/cluster/rro_overlays/CarServiceOverlay_MdOsDouble/res/xml/car_ux_restrictions_map.xml b/emulator/cluster/rro_overlays/CarServiceOverlay_MdOsDouble/res/xml/car_ux_restrictions_map.xml new file mode 100644 index 0000000..018c3fe --- /dev/null +++ b/emulator/cluster/rro_overlays/CarServiceOverlay_MdOsDouble/res/xml/car_ux_restrictions_map.xml @@ -0,0 +1,94 @@ +<?xml version="1.0" encoding="utf-8"?> + +<UxRestrictions xmlns:car="http://schemas.android.com/apk/res-auto"> + <!-- Map the driving states to UX restrictions here --> + <!-- Note - The platform takes a fully restricted approach when there is no information or if + the information is malformed. As a result, + 1. Default values for requiresDistractionOptimization is true, and uxr is fully_restricted. + 2. If uxr != baseline, then requiresDistractionOptimization is automatically promoted to true, + even if it is declared as false. Because it doesn't make sense to have an non baseline UX + restriction without requiresDistractionOptimization set to true. + So if we don't want any restrictions, requiresDistractionOptimization should be explicitly + marked as false and uxr should be explicitly set to baseline. --> + + <RestrictionMapping physicalPort="0"> + <DrivingState state="parked"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="idling"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline" mode="baseline"/> + </DrivingState> + + <!-- This is restrictions for moving and speed [0,5m/s) --> + <DrivingState state="moving" minSpeed="0" maxSpeed="5.0"> + <Restrictions requiresDistractionOptimization="true" uxr="no_dialpad|no_filtering|limit_string_length|no_keyboard|no_video|limit_content|no_setup|no_text_message"/> + </DrivingState> + + <!-- Restrictions for speed >=5 --> + <DrivingState state="moving" minSpeed="5.0"> + <Restrictions requiresDistractionOptimization="true" uxr="no_dialpad|no_filtering|limit_string_length|no_keyboard|no_video|limit_content|no_setup|no_text_message"/> + </DrivingState> + + </RestrictionMapping> + + <!--Setting baseline restrictions for all passenger displays --> + <RestrictionMapping physicalPort="2"> + <DrivingState state="parked"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="idling"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="moving"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + </RestrictionMapping> + + <RestrictionMapping physicalPort="3"> + <DrivingState state="parked"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="idling"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="moving"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + </RestrictionMapping> + + <RestrictionMapping physicalPort="4"> + <DrivingState state="parked"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="idling"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="moving"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + </RestrictionMapping> + + <!-- Configure restriction parameters here--> + <RestrictionParameters> + <!-- Parameters to express displayed String related restrictions --> + <!-- Max allowed length of general purpose strings when limit_string_length is imposed--> + <StringRestrictions maxLength="120"/> + <!-- Parameters to express content related restrictions --> + <!-- Max number of cumulative content items allowed to be displayed when + limit_content is imposed. --> + <!-- Maximum levels deep that the user can navigate to when limit_content is imposed. --> + <ContentRestrictions maxCumulativeItems="21" maxDepth="3"/> + </RestrictionParameters> + +</UxRestrictions> + diff --git a/emulator/cluster/rro_overlays/CarServiceOverlay_MdOsDouble/res/xml/overlays.xml b/emulator/cluster/rro_overlays/CarServiceOverlay_MdOsDouble/res/xml/overlays.xml new file mode 100644 index 0000000..290c9db --- /dev/null +++ b/emulator/cluster/rro_overlays/CarServiceOverlay_MdOsDouble/res/xml/overlays.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2022 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<overlay> + <item target="array/config_occupant_zones" value="@array/config_occupant_zones" /> + <item target="array/config_occupant_display_mapping" value="@array/config_occupant_display_mapping" /> + <item target="array/config_allowed_optional_car_features" value="@array/config_allowed_optional_car_features" /> + <item target="bool/enableProfileUserAssignmentForMultiDisplay" value="@bool/enableProfileUserAssignmentForMultiDisplay" /> + <item target="xml/car_ux_restrictions_map" value="@xml/car_ux_restrictions_map" /> +</overlay> diff --git a/emulator/cluster/rro_overlays/CarServiceOverlay_OsDouble/res/values/config.xml b/emulator/cluster/rro_overlays/CarServiceOverlay_OsDouble/res/values/config.xml index 08ecf4b..ca59963 100644 --- a/emulator/cluster/rro_overlays/CarServiceOverlay_OsDouble/res/values/config.xml +++ b/emulator/cluster/rro_overlays/CarServiceOverlay_OsDouble/res/values/config.xml @@ -24,22 +24,22 @@ occupant. Some examples are: - <item>displayPort=0,displayType=MAIN,occupantZoneId=0</item> - <item>displayPort=1,displayType=INSTRUMENT_CLUSTER,occupantZoneId=0</item> - <item>displayPort=2,displayType=MAIN,occupantZoneId=1</item> - <item>displayPort=3,displayType=MAIN,occupantZoneId=2</item> - <item>displayPort=4,displayType=MAIN,occupantZoneId=3</item> + <item>displayPort=0,displayType=MAIN,occupantZoneId=0,inputTypes=TOUCH_SCREEN|DPAD_KEYS|NAVIGATE_KEYS|ROTARY_NAVIGATION</item> + <item>displayPort=1,displayType=INSTRUMENT_CLUSTER,occupantZoneId=0,inputTypes=DPAD_KEYS</item> + <item>displayPort=2,displayType=MAIN,occupantZoneId=1,inputTypes=TOUCH_SCREEN</item> + <item>displayPort=3,displayType=MAIN,occupantZoneId=2,inputTypes=TOUCH_SCREEN</item> + <item>displayPort=4,displayType=MAIN,occupantZoneId=3,inputTypes=TOUCH_SCREEN</item> displayPort: Unique port id for the display. displayType: Display type for the display. Use * part from CarOccupantZoneManager.DISPLAY_TYPE_* like MAIN, INSTRUMENT_CLUSTER and etc. occupantZoneId: occupantZoneId specified from config_occupant_zones. - + inputTypes: supported input types for the corresponding display. --> <string-array translatable="false" name="config_occupant_display_mapping"> - <item>displayPort=0,displayType=MAIN,occupantZoneId=0</item> - <item>displayUniqueId=virtual:com.android.car.cluster.osdouble:ClusterDisplay,displayType=INSTRUMENT_CLUSTER,occupantZoneId=0</item> + <item>displayPort=0,displayType=MAIN,occupantZoneId=0,inputTypes=TOUCH_SCREEN|DPAD_KEYS|NAVIGATE_KEYS|ROTARY_NAVIGATION</item> + <item>displayUniqueId=virtual:com.android.car.cluster.osdouble:ClusterDisplay,displayType=INSTRUMENT_CLUSTER,occupantZoneId=0,inputTypes=DPAD_KEYS</item> </string-array> <!-- @@ -57,8 +57,8 @@ The default list defined below will enable all optional features defined. --> <!-- Override cluster_service with cluster_home_service. --> - <!-- TODO(b/205908527): this overlay is to temporarily disable CarEvsService by default. --> <string-array translatable="false" name="config_allowed_optional_car_features"> + <item>car_evs_service</item> <item>car_navigation_service</item> <item>cluster_home_service</item> <item>com.android.car.user.CarUserNoticeService</item> diff --git a/emulator/evs/evs.mk b/emulator/evs/evs.mk new file mode 100644 index 0000000..bc013ac --- /dev/null +++ b/emulator/evs/evs.mk @@ -0,0 +1,42 @@ +# +# Copyright (C) 2022 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +PRODUCT_PACKAGES += CarEvsServiceOverlay + +ifeq ($(ENABLE_MOCK_EVSHAL), true) +CUSTOMIZE_EVS_SERVICE_PARAMETER := true +PRODUCT_PACKAGES += \ + android.hardware.automotive.evs-aidl-default-service + +# TODO(b/277389752): Below line should be removed when AAOS baseline is fully supported. +PRODUCT_PACKAGES += cardisplayproxyd + +# EVS HAL implementation for the emulators requires AIDL version of the automotive display +# service implementation. +USE_AIDL_DISPLAY_SERVICE := true + +PRODUCT_COPY_FILES += \ + device/generic/car/emulator/evs/init.evs.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/init.evs.rc +endif + +ifeq ($(ENABLE_SAMPLE_EVS_APP), true) +PRODUCT_COPY_FILES += \ + device/generic/car/emulator/evs/evs_app_config.json:$(TARGET_COPY_OUT_VENDOR)/etc/automotive/evs/config_override.json +ifneq ($(ENABLE_EVS_SAMPLE), true) +# We need to add evs_app package and its selinux policy if ENABLE_EVS_SAMPLE is not set as true. +PRODUCT_PACKAGES += evs_app +$(call inherit-product, packages/services/Car/cpp/evs/apps/sepolicy/evsapp.mk) +endif # ENABLE_EVS_SAMPLE +endif # ENABLE_SAMPLE_EVS_APP diff --git a/emulator/evs/evs_app_config.json b/emulator/evs/evs_app_config.json new file mode 100644 index 0000000..bf0c5c4 --- /dev/null +++ b/emulator/evs/evs_app_config.json @@ -0,0 +1,55 @@ +{ + "car" : { + "width" : 76.7, + "wheelBase" : 117.9, + "frontExtent" : 44.7, + "rearExtent" : 40 + }, + "displays" : [ + { + "_comment": "Display0", + "displayPort" : 0, + "frontRange" : 100, + "rearRange" : 100 + }, + { + "_comment": "Display1", + "displayPort" : 1, + "frontRange" : 100, + "rearRange" : 100 + }, + { + "_comment": "Display2", + "displayPort" : 2, + "frontRange" : 100, + "rearRange" : 100 + }, + { + "_comment": "Display3", + "displayPort" : 3, + "frontRange" : 100, + "rearRange" : 100 + } + + ], + "graphic" : { + "frontPixel" : -20, + "rearPixel" : 260 + }, + "cameras" : [ + { + "cameraId" : "/dev/video10", + "function" : "reverse", + "x" : 0.0, + "y" : 20.0, + "z" : 48, + "yaw" : 180, + "pitch" : -10, + "roll" : 0, + "hfov" : 115, + "vfov" : 80, + "hflip" : true, + "vflip" : false + } + ] +} diff --git a/emulator/evs/init.evs.rc b/emulator/evs/init.evs.rc new file mode 100644 index 0000000..d0b997a --- /dev/null +++ b/emulator/evs/init.evs.rc @@ -0,0 +1,20 @@ +on late-init + start cardisplayproxyd + start vendor.evs-hal-cf + start evs_manager_cf + +service evs_manager_cf /system/bin/evsmanagerd --target hw/0 + class hal + priority -20 + user automotive_evs + group automotive_evs system + disabled # will not automatically start with its class; must be explicitly started. + +service vendor.evs-hal-cf /vendor/bin/hw/android.hardware.automotive.evs-aidl-default-service + class hal + priority -20 + user graphics + group automotive_evs camera + onrestart restart cardisplayproxyd + onrestart restart evs_manager_cf + disabled # will not automatically start with its class; must be explicitly started. diff --git a/emulator/evs/rro_overlays/CarEvsServiceOverlay/Android.bp b/emulator/evs/rro_overlays/CarEvsServiceOverlay/Android.bp new file mode 100644 index 0000000..a86dcd4 --- /dev/null +++ b/emulator/evs/rro_overlays/CarEvsServiceOverlay/Android.bp @@ -0,0 +1,27 @@ +// Copyright (C) 2022 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +package { + default_applicable_licenses: ["device_generic_car_license"], +} + +runtime_resource_overlay { + name: "CarEvsServiceOverlay", + resource_dirs: ["res"], + manifest: "AndroidManifest.xml", + sdk_version: "current", + product_specific: true +} diff --git a/emulator/evs/rro_overlays/CarEvsServiceOverlay/AndroidManifest.xml b/emulator/evs/rro_overlays/CarEvsServiceOverlay/AndroidManifest.xml new file mode 100644 index 0000000..cfdf768 --- /dev/null +++ b/emulator/evs/rro_overlays/CarEvsServiceOverlay/AndroidManifest.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2022 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.car.resources.carevsservice"> + <application android:hasCode="false"/> + <overlay android:targetPackage="com.android.car.updatable" + android:targetName="CarServiceCustomization" + android:resourcesMap="@xml/overlays" + android:isStatic="false" /> +</manifest> diff --git a/emulator/evs/rro_overlays/CarEvsServiceOverlay/res/values/config.xml b/emulator/evs/rro_overlays/CarEvsServiceOverlay/res/values/config.xml new file mode 100644 index 0000000..55a57df --- /dev/null +++ b/emulator/evs/rro_overlays/CarEvsServiceOverlay/res/values/config.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2022, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- Resources to configure car service based on each OEM's preference. --> +<resources> + <!-- A name of a camera device that provides the rearview through EVS service --> + <string translatable="false" name="config_evsRearviewCameraId">/dev/video10</string> + + <!-- The camera Activity name for EVS, if defined, the Activity will be launched by + CarEvsService. --> + <string name="config_evsCameraActivity" translatable="false"> + com.google.android.car.evs/com.google.android.car.evs.CarEvsCameraPreviewActivity + </string> +</resources> diff --git a/emulator/evs/rro_overlays/CarEvsServiceOverlay/res/xml/overlays.xml b/emulator/evs/rro_overlays/CarEvsServiceOverlay/res/xml/overlays.xml new file mode 100644 index 0000000..66272b6 --- /dev/null +++ b/emulator/evs/rro_overlays/CarEvsServiceOverlay/res/xml/overlays.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2022 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<overlay> + <item target="string/config_evsRearviewCameraId" value="@string/config_evsRearviewCameraId" /> + <item target="string/config_evsCameraActivity" value="@string/config_evsCameraActivity" /> +</overlay> diff --git a/emulator/media/rro_overlay/CarServiceOverlay/Android.bp b/emulator/media/rro_overlay/CarServiceOverlay/Android.bp new file mode 100644 index 0000000..292373c --- /dev/null +++ b/emulator/media/rro_overlay/CarServiceOverlay/Android.bp @@ -0,0 +1,34 @@ +// Copyright (C) 2023 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +package { + default_applicable_licenses: ["device_generic_car_license"], +} + +runtime_resource_overlay { + name: "CarServiceOverlayEmulatorMedia", + resource_dirs: ["res"], + manifest: "AndroidManifest.xml", + sdk_version: "current", + product_specific: true +} + +override_runtime_resource_overlay { + name: "CarServiceOverlayEmulatorMediaGoogle", + base: "CarServiceOverlayEmulatorMedia", + package_name: "com.google.android.car.resources.emulator.media", + target_package_name: "com.google.android.car.updatable", +} diff --git a/emulator/media/rro_overlay/CarServiceOverlay/AndroidManifest.xml b/emulator/media/rro_overlay/CarServiceOverlay/AndroidManifest.xml new file mode 100644 index 0000000..d4620fd --- /dev/null +++ b/emulator/media/rro_overlay/CarServiceOverlay/AndroidManifest.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2023 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT 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.resources.emulator.media"> + <application android:hasCode="false"/> + <overlay android:priority="5001" + android:targetPackage="com.android.car.updatable" + android:targetName="CarServiceCustomization" + android:resourcesMap="@xml/overlays" + android:isStatic="true" /> +</manifest> diff --git a/emulator/media/rro_overlay/CarServiceOverlay/res/values/config.xml b/emulator/media/rro_overlay/CarServiceOverlay/res/values/config.xml new file mode 100644 index 0000000..ec39832 --- /dev/null +++ b/emulator/media/rro_overlay/CarServiceOverlay/res/values/config.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2023, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES 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> + <!-- The ComponentName of the media source that will be selected as the default --> + <string name="config_defaultMediaSource">com.android.car.media.localmediaplayer/.LocalMediaBrowserService</string> +</resources> diff --git a/emulator/media/rro_overlay/CarServiceOverlay/res/xml/overlays.xml b/emulator/media/rro_overlay/CarServiceOverlay/res/xml/overlays.xml new file mode 100644 index 0000000..c605422 --- /dev/null +++ b/emulator/media/rro_overlay/CarServiceOverlay/res/xml/overlays.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2023 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<overlay> + <item target="string/config_defaultMediaSource" value="@string/config_defaultMediaSource" /> +</overlay> diff --git a/emulator/multi-display-dynamic/CarServiceMultiDisplayOverlayEmulator/Android.bp b/emulator/multi-display-dynamic/CarServiceMultiDisplayOverlayEmulator/Android.bp new file mode 100644 index 0000000..85d14f3 --- /dev/null +++ b/emulator/multi-display-dynamic/CarServiceMultiDisplayOverlayEmulator/Android.bp @@ -0,0 +1,27 @@ +// Copyright (C) 2022 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +runtime_resource_overlay { + name: "CarServiceMultiDisplayOverlayEmulator", + resource_dirs: ["res"], + manifest: "AndroidManifest.xml", + sdk_version: "current", + product_specific: true +} diff --git a/emulator/multi-display-dynamic/CarServiceMultiDisplayOverlayEmulator/AndroidManifest.xml b/emulator/multi-display-dynamic/CarServiceMultiDisplayOverlayEmulator/AndroidManifest.xml new file mode 100644 index 0000000..692ed91 --- /dev/null +++ b/emulator/multi-display-dynamic/CarServiceMultiDisplayOverlayEmulator/AndroidManifest.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2022 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.car.resources.goldfish"> + <application android:hasCode="false"/> + <overlay android:priority="5001" + android:targetPackage="com.android.car.updatable" + android:targetName="CarServiceCustomization" + android:resourcesMap="@xml/overlays" + android:isStatic="true" /> +</manifest>
\ No newline at end of file diff --git a/emulator/multi-display-dynamic/CarServiceMultiDisplayOverlayEmulator/res/values/config.xml b/emulator/multi-display-dynamic/CarServiceMultiDisplayOverlayEmulator/res/values/config.xml new file mode 100644 index 0000000..8463455 --- /dev/null +++ b/emulator/multi-display-dynamic/CarServiceMultiDisplayOverlayEmulator/res/values/config.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2022, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- + Overlay resources to configure car service based on each OEM's preference. + See also packages/services/Car/service/res/values/config.xml +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- Assign occupant zones to seats/passengers. --> + <string-array translatable="false" name="config_occupant_zones"> + <item>occupantZoneId=0,occupantType=DRIVER,seatRow=1,seatSide=driver</item> + <item>occupantZoneId=1,occupantType=FRONT_PASSENGER,seatRow=1,seatSide=oppositeDriver</item> + <item>occupantZoneId=2,occupantType=REAR_PASSENGER,seatRow=2,seatSide=left</item> + <item>occupantZoneId=3,occupantType=REAR_PASSENGER,seatRow=2,seatSide=right</item> + <item>occupantZoneId=4,occupantType=REAR_PASSENGER,seatRow=3,seatSide=left</item> + </string-array> + + <!-- Assign displays to occupant zones. --> + <string-array translatable="false" name="config_occupant_display_mapping"> + <item>displayPort=0,displayType=MAIN,occupantZoneId=0,inputTypes=TOUCH_SCREEN|DPAD_KEYS|NAVIGATE_KEYS|ROTARY_NAVIGATION</item> + <item>displayUniqueId=virtual:com.android.car.cluster.osdouble:ClusterDisplay,displayType=INSTRUMENT_CLUSTER,occupantZoneId=0,inputTypes=DPAD_KEYS</item> + <item>displayUniqueId=virtual:com.android.emulator.multidisplay:1234563,displayType=MAIN,occupantZoneId=1,inputTypes=DPAD_KEYS</item> + <item>displayUniqueId=virtual:com.android.emulator.multidisplay:1234564,displayType=MAIN,occupantZoneId=2,inputTypes=DPAD_KEYS</item> + <item>displayUniqueId=virtual:com.android.emulator.multidisplay:1234565,displayType=MAIN,occupantZoneId=3,inputTypes=DPAD_KEYS</item> + <item>displayUniqueId=virtual:com.android.emulator.multidisplay:1234566,displayType=MAIN,occupantZoneId=4,inputTypes=DPAD_KEYS</item> + </string-array> + + <!-- Enable profile user assignment per each CarOccupantZone for per display android user + assignments. This feature is still experimental. --> + <bool name="enableProfileUserAssignmentForMultiDisplay" translatable="false">true</bool> + + <string-array translatable="false" name="config_allowed_optional_car_features"> + <item>car_navigation_service</item> + <item>cluster_home_service</item> + <item>com.android.car.user.CarUserNoticeService</item> + <item>diagnostic</item> + <item>storage_monitoring</item> + <item>vehicle_map_service</item> + <item>car_telemetry_service</item> + </string-array> + + <bool name="audioUseDynamicRouting">true</bool> + <bool name="audioUseCarVolumeGroupMuting">true</bool> +</resources> diff --git a/emulator/multi-display-dynamic/CarServiceMultiDisplayOverlayEmulator/res/xml/car_ux_restrictions_map.xml b/emulator/multi-display-dynamic/CarServiceMultiDisplayOverlayEmulator/res/xml/car_ux_restrictions_map.xml new file mode 100644 index 0000000..c2a242b --- /dev/null +++ b/emulator/multi-display-dynamic/CarServiceMultiDisplayOverlayEmulator/res/xml/car_ux_restrictions_map.xml @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- + ~ Copyright (C) 2023 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. +--> + +<UxRestrictions xmlns:car="http://schemas.android.com/apk/res-auto"> + <!-- Map the driving states to UX restrictions here --> + <!-- Note - The platform takes a fully restricted approach when there is no information or if + the information is malformed. As a result, + 1. Default values for requiresDistractionOptimization is true, and uxr is fully_restricted. + 2. If uxr != baseline, then requiresDistractionOptimization is automatically promoted to true, + even if it is declared as false. Because it doesn't make sense to have an non baseline UX + restriction without requiresDistractionOptimization set to true. + So if we don't want any restrictions, requiresDistractionOptimization should be explicitly + marked as false and uxr should be explicitly set to baseline. --> + + <RestrictionMapping physicalPort="0"> + <DrivingState state="parked"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="idling"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline" mode="baseline"/> + </DrivingState> + + <!-- This is restrictions for moving and speed [0,5m/s) --> + <DrivingState state="moving" minSpeed="0" maxSpeed="5.0"> + <Restrictions requiresDistractionOptimization="true" uxr="no_dialpad|no_filtering|limit_string_length|no_keyboard|no_video|limit_content|no_setup|no_text_message"/> + </DrivingState> + + <!-- Restrictions for speed >=5 --> + <DrivingState state="moving" minSpeed="5.0"> + <Restrictions requiresDistractionOptimization="true" uxr="no_dialpad|no_filtering|limit_string_length|no_keyboard|no_video|limit_content|no_setup|no_text_message"/> + </DrivingState> + + </RestrictionMapping> + + <!--Setting baseline restrictions for all dynamically added virtual displays --> + <RestrictionMapping occupantZoneId="1" displayType="1"> + <DrivingState state="parked"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="idling"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="moving"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + </RestrictionMapping> + + <RestrictionMapping occupantZoneId="2" displayType="1"> + <DrivingState state="parked"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="idling"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="moving"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + </RestrictionMapping> + + <RestrictionMapping occupantZoneId="3" displayType="1"> + <DrivingState state="parked"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="idling"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="moving"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + </RestrictionMapping> + + <RestrictionMapping occupantZoneId="4" displayType="1"> + <DrivingState state="parked"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="idling"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + <DrivingState state="moving"> + <Restrictions requiresDistractionOptimization="false" uxr="baseline"/> + </DrivingState> + + </RestrictionMapping> + + <!-- Configure restriction parameters here--> + <RestrictionParameters> + <!-- Parameters to express displayed String related restrictions --> + <!-- Max allowed length of general purpose strings when limit_string_length is imposed--> + <StringRestrictions maxLength="120"/> + <!-- Parameters to express content related restrictions --> + <!-- Max number of cumulative content items allowed to be displayed when + limit_content is imposed. --> + <!-- Maximum levels deep that the user can navigate to when limit_content is imposed. --> + <ContentRestrictions maxCumulativeItems="21" maxDepth="3"/> + </RestrictionParameters> + +</UxRestrictions> diff --git a/emulator/multi-display-dynamic/CarServiceMultiDisplayOverlayEmulator/res/xml/overlays.xml b/emulator/multi-display-dynamic/CarServiceMultiDisplayOverlayEmulator/res/xml/overlays.xml new file mode 100644 index 0000000..018d818 --- /dev/null +++ b/emulator/multi-display-dynamic/CarServiceMultiDisplayOverlayEmulator/res/xml/overlays.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2022 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<overlay> + <item target="array/config_occupant_zones" value="@array/config_occupant_zones" /> + <item target="array/config_occupant_display_mapping" value="@array/config_occupant_display_mapping" /> + <item target="bool/enableProfileUserAssignmentForMultiDisplay" value="@bool/enableProfileUserAssignmentForMultiDisplay" /> + <item target="array/config_allowed_optional_car_features" value="@array/config_allowed_optional_car_features" /> + <item target="bool/audioUseDynamicRouting" value="@bool/audioUseDynamicRouting" /> + <item target="bool/audioUseCarVolumeGroupMuting" value="@bool/audioUseCarVolumeGroupMuting" /> + <item target="xml/car_ux_restrictions_map" value="@xml/car_ux_restrictions_map" /> +</overlay> diff --git a/emulator/multi-display-dynamic/ClusterOsDoubleEmulatorVirtualDisplayOverlay/Android.bp b/emulator/multi-display-dynamic/ClusterOsDoubleEmulatorVirtualDisplayOverlay/Android.bp new file mode 100644 index 0000000..adc5a83 --- /dev/null +++ b/emulator/multi-display-dynamic/ClusterOsDoubleEmulatorVirtualDisplayOverlay/Android.bp @@ -0,0 +1,27 @@ +// Copyright (C) 2022 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +runtime_resource_overlay { + name: "ClusterOsDoubleEmulatorVirtualDisplayOverlay", + resource_dirs: ["res"], + manifest: "AndroidManifest.xml", + sdk_version: "current", + product_specific: true +} diff --git a/emulator/multi-display-dynamic/ClusterOsDoubleEmulatorVirtualDisplayOverlay/AndroidManifest.xml b/emulator/multi-display-dynamic/ClusterOsDoubleEmulatorVirtualDisplayOverlay/AndroidManifest.xml new file mode 100644 index 0000000..47149af --- /dev/null +++ b/emulator/multi-display-dynamic/ClusterOsDoubleEmulatorVirtualDisplayOverlay/AndroidManifest.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2022 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.car.cluster.osdouble.emulator.virtualdisplay.overlay"> + <application android:hasCode="false"/> + <overlay android:priority="1000" + android:targetPackage="com.android.car.cluster.osdouble" + android:targetName="ClusterOsConfig" + android:resourcesMap="@xml/overlays" + android:isStatic="true" /> +</manifest>
\ No newline at end of file diff --git a/emulator/multi-display-dynamic/ClusterOsDoubleEmulatorVirtualDisplayOverlay/res/values/config.xml b/emulator/multi-display-dynamic/ClusterOsDoubleEmulatorVirtualDisplayOverlay/res/values/config.xml new file mode 100644 index 0000000..462841c --- /dev/null +++ b/emulator/multi-display-dynamic/ClusterOsDoubleEmulatorVirtualDisplayOverlay/res/values/config.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2021 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- Specify the display unique id as added by qemu --> + <string name="config_clusterDisplayUniqueId">virtual:com.android.emulator.multidisplay:1234562</string> +</resources> diff --git a/emulator/multi-display-dynamic/ClusterOsDoubleEmulatorVirtualDisplayOverlay/res/xml/overlays.xml b/emulator/multi-display-dynamic/ClusterOsDoubleEmulatorVirtualDisplayOverlay/res/xml/overlays.xml new file mode 100644 index 0000000..60464de --- /dev/null +++ b/emulator/multi-display-dynamic/ClusterOsDoubleEmulatorVirtualDisplayOverlay/res/xml/overlays.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2022 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<overlay> + <item target="string/config_clusterDisplayUniqueId" value="@string/config_clusterDisplayUniqueId" /> +</overlay>
\ No newline at end of file diff --git a/emulator/multi-display-dynamic/config.ini b/emulator/multi-display-dynamic/config.ini new file mode 100644 index 0000000..b8c7f76 --- /dev/null +++ b/emulator/multi-display-dynamic/config.ini @@ -0,0 +1,31 @@ +hw.audioInput=yes +hw.lcd.density=160 +hw.cpu.ncore=6 +hw.gpu.enabled=yes +hw.camera.back=none +hw.camera.front=none +hw.mainKeys=no +hw.ramSize=4096 +hw.keyboard=yes +skin.dynamic=yes +skin.name=1408x792 +skin.path=1408x792 +disk.dataPartition.size=6G +hw.accelerometer=yes +hw.accelerometer_uncalibrated=yes +hw.gyroscope=yes +hw.sensors.light=no +hw.sensors.pressure=no +hw.sensors.humidity=no +hw.sensors.proximity=no +hw.sensors.magnetic_field=no +hw.sensors.orientation=no +hw.sensors.temperature=no +hw.sensor.hinge=no +# Instrument cluster display +hw.display1.width = 528 +hw.display1.height = 792 +hw.display1.density = 160 +# VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | VIRTUAL_DISPLAY_FLAG_TRUSTED +# | VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL | VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH = 1352 +hw.display1.flag = 1352 diff --git a/emulator/multi-display-dynamic/display_settings.xml b/emulator/multi-display-dynamic/display_settings.xml new file mode 100644 index 0000000..0576eb1 --- /dev/null +++ b/emulator/multi-display-dynamic/display_settings.xml @@ -0,0 +1,54 @@ +<?xml version='1.0' encoding='utf-8' standalone='yes' ?> +<!-- +/* +** Copyright 2022, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<display-settings> + <!-- Use unique local ids added by Goldfish --> + <config identifier="0" /> + + <!-- Display settings for cluster --> + <display name="virtual:com.android.emulator.multidisplay:1234562" + shouldShowSystemDecors="false" + forcedDensity="160" + dontMoveToTop="true"/> + + <!-- Display settings for 2nd Home --> + <display name="virtual:com.android.emulator.multidisplay:1234563" + shouldShowSystemDecors="true" + shouldShowIme="true" + forcedDensity="160" /> + + <!-- Display settings for 3rd Home --> + <display name="virtual:com.android.emulator.multidisplay:1234564" + shouldShowSystemDecors="true" + shouldShowIme="true" + forcedDensity="160" /> + + <!-- Display settings for 4th Home --> + <display name="virtual:com.android.emulator.multidisplay:1234565" + shouldShowSystemDecors="true" + shouldShowIme="true" + forcedDensity="160" /> + + <!-- Display settings for 5th Home --> + <display name="virtual:com.android.emulator.multidisplay:1234565" + shouldShowSystemDecors="true" + shouldShowIme="true" + forcedDensity="160" /> + +</display-settings> diff --git a/emulator/multi-display-dynamic/multi-display-dynamic.mk b/emulator/multi-display-dynamic/multi-display-dynamic.mk new file mode 100644 index 0000000..54516f8 --- /dev/null +++ b/emulator/multi-display-dynamic/multi-display-dynamic.mk @@ -0,0 +1,47 @@ +# +# Copyright (C) 2022 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Enable the displays UI on qEmu and add cluster display as default. + +# Use the config.ini with the cluster display declared. +PRODUCT_COPY_FILES += \ + device/generic/car/emulator/multi-display-dynamic/config.ini:config.ini +# Enable the displays UI in qemu. +PRODUCT_SYSTEM_PROPERTIES += \ + ro.emulator.car.multidisplay=true +# Must be before the emulator's vendor.mk. +PRODUCT_COPY_FILES += \ + device/generic/car/emulator/multi-display-dynamic/display_settings.xml:$(TARGET_COPY_OUT_VENDOR)/etc/display_settings.xml +# Keep the original audio configuration from the MD emulator. +PRODUCT_COPY_FILES += \ + device/generic/car/emulator/multi-display/car_audio_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/car_audio_configuration.xml + +# support packages for multi-display +$(call inherit-product, $(SRC_TARGET_DIR)/product/emulator_system.mk) +PRODUCT_PACKAGES += \ + MultiDisplaySecondaryHomeTestLauncher \ + MultiDisplayTest \ + SecondaryHomeApp \ + MultiDisplayProvider \ + CarServiceMultiDisplayOverlayEmulator + +PRODUCT_PACKAGES += ClusterHomeSample ClusterOsDouble ClusterHomeSampleOverlay ClusterOsDoubleEmulatorVirtualDisplayOverlay + +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.software.managed_users.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.managed_users.xml + +# Selects the MultiDisplaySecondaryHomeTestLauncher as secondaryHome +PRODUCT_PACKAGE_OVERLAYS += \ + device/generic/car/emulator/multi-display-dynamic/overlay diff --git a/emulator/multi-display-dynamic/overlay/frameworks/base/core/res/res/values/config.xml b/emulator/multi-display-dynamic/overlay/frameworks/base/core/res/res/values/config.xml new file mode 100644 index 0000000..17d24e6 --- /dev/null +++ b/emulator/multi-display-dynamic/overlay/frameworks/base/core/res/res/values/config.xml @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2022, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- + Overlay resources to configure car service based on each OEM's preference. + See also packages/services/Car/service/res/values/config.xml +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Maximum number of users we allow to be running at a time --> + <integer name="config_multiuserMaxRunningUsers">5</integer> + + <!-- True if the device supports system decorations on secondary displays. --> + <bool name="config_supportsSystemDecorsOnSecondaryDisplays">true</bool> + + <!-- This is the default launcher package with an activity to use on secondary displays that + support system decorations. + This launcher package must have an activity that supports multiple instances and has + corresponding launch mode set in AndroidManifest. + {@see android.view.Display#FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS} --> + <string name="config_secondaryHomePackage" translatable="false">com.android.car.multidisplay</string> + + <!-- Whether the system enables per-display focus. If the system has the input method for each + display, this value should be true. --> + <bool name="config_perDisplayFocusEnabled">true</bool> + + <!-- Whether to only install system packages on a user if they're allow-listed for that user + type. These are flags and can be freely combined. + 0 - disable allow-list (install all system packages; no logging) + 1 - enforce (only install system packages if they are allow-listed) + 2 - log (log non-allow-listed packages) + 4 - any package not mentioned in the allow-list file is implicitly allow-listed on all users + 8 - same as 4, but just for the SYSTEM user + 16 - ignore OTAs (don't install system packages during OTAs) + Common scenarios: + - to enable feature (fully enforced) for a complete allow-list: 1 + - to enable feature for an incomplete allow-list (so use implicit allow-list mode): 5 + - to enable feature but implicitly allow-list for SYSTEM user to ease local development: 9 + - to disable feature completely if it had never been enabled: 16 + - to henceforth disable feature and try to undo its previous effects: 0 + Note: This list must be kept current with PACKAGE_WHITELIST_MODE_PROP in + frameworks/base/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java + Package allow-list disabled for testing profile user as default allow-list does not + support PROFILE user. --> + <integer name="config_userTypePackageWhitelistMode">2</integer> + + <!-- Whether the device allows users to start in background visible on displays. + Should be false for most devices, except automotive vehicle with passenger displays. --> + <bool name="config_multiuserVisibleBackgroundUsers">true</bool> + +</resources> diff --git a/emulator/multi-display/ClusterOsDoubleEmulatorPhysicalDisplayOverlay/Android.bp b/emulator/multi-display/ClusterOsDoubleEmulatorPhysicalDisplayOverlay/Android.bp new file mode 100644 index 0000000..a1f3d42 --- /dev/null +++ b/emulator/multi-display/ClusterOsDoubleEmulatorPhysicalDisplayOverlay/Android.bp @@ -0,0 +1,27 @@ +// Copyright (C) 2022 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +runtime_resource_overlay { + name: "ClusterOsDoubleEmulatorPhysicalDisplayOverlay", + resource_dirs: ["res"], + manifest: "AndroidManifest.xml", + sdk_version: "current", + product_specific: true +} diff --git a/emulator/multi-display/ClusterOsDoubleEmulatorPhysicalDisplayOverlay/AndroidManifest.xml b/emulator/multi-display/ClusterOsDoubleEmulatorPhysicalDisplayOverlay/AndroidManifest.xml new file mode 100644 index 0000000..3b2f86c --- /dev/null +++ b/emulator/multi-display/ClusterOsDoubleEmulatorPhysicalDisplayOverlay/AndroidManifest.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2022 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.car.cluster.osdouble.emulator.physicaldisplay.overlay"> + <application android:hasCode="false"/> + <overlay android:priority="1000" + android:targetPackage="com.android.car.cluster.osdouble" + android:targetName="ClusterOsConfig" + android:resourcesMap="@xml/overlays" + android:isStatic="true" /> +</manifest>
\ No newline at end of file diff --git a/emulator/multi-display/ClusterOsDoubleEmulatorPhysicalDisplayOverlay/res/values/config.xml b/emulator/multi-display/ClusterOsDoubleEmulatorPhysicalDisplayOverlay/res/values/config.xml new file mode 100644 index 0000000..3e15a06 --- /dev/null +++ b/emulator/multi-display/ClusterOsDoubleEmulatorPhysicalDisplayOverlay/res/values/config.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2021 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- Use port:1 for the cluster display --> + <integer name="config_clusterDisplayPort">1</integer> +</resources> diff --git a/emulator/multi-display/ClusterOsDoubleEmulatorPhysicalDisplayOverlay/res/xml/overlays.xml b/emulator/multi-display/ClusterOsDoubleEmulatorPhysicalDisplayOverlay/res/xml/overlays.xml new file mode 100644 index 0000000..2f2044c --- /dev/null +++ b/emulator/multi-display/ClusterOsDoubleEmulatorPhysicalDisplayOverlay/res/xml/overlays.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2022 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<overlay> + <item target="integer/config_clusterDisplayPort" value="@integer/config_clusterDisplayPort" /> +</overlay>
\ No newline at end of file diff --git a/emulator/multi-display/car_audio_configuration.xml b/emulator/multi-display/car_audio_configuration.xml new file mode 100644 index 0000000..7109d3e --- /dev/null +++ b/emulator/multi-display/car_audio_configuration.xml @@ -0,0 +1,185 @@ +<?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. +--> + +<!-- + Defines the audio configuration in a car, including + - Audio zones + - Context to audio bus mappings + - Volume groups + in the car environment. +--> +<carAudioConfiguration version="3"> + <mirroringDevices> + <mirroringDevice address="bus1000_mirror_device"/> + </mirroringDevices> + <zones> + <zone name="primary zone" isPrimary="true" occupantZoneId="0"> + <zoneConfigs> + <zoneConfig name="primary zone config" isDefault="true"> + <volumeGroups> + <group> + <device address="bus0_media_out"> + <context context="music"/> + </device> + <device address="bus3_call_ring_out"> + <context context="call_ring"/> + </device> + <device address="bus6_notification_out"> + <context context="notification"/> + </device> + </group> + <group> + <device address="bus1_navigation_out"> + <context context="navigation"/> + </device> + <device address="bus2_voice_command_out"> + <context context="voice_command"/> + </device> + </group> + <group> + <device address="bus4_call_out"> + <context context="call"/> + </device> + </group> + <group> + <device address="bus5_alarm_out"> + <context context="alarm"/> + </device> + <device address="bus7_system_sound_out"> + <context context="system_sound"/> + <context context="emergency"/> + <context context="safety"/> + <context context="vehicle_status"/> + <context context="announcement"/> + </device> + </group> + </volumeGroups> + </zoneConfig> + </zoneConfigs> + <inputDevices> + <inputDevice address="input_bus_tone_zone_0"/> + <inputDevice address="tuner0"/> + </inputDevices> + </zone> + <zone name="front passenger zone 1" audioZoneId="1" occupantZoneId="1"> + <zoneConfigs> + <zoneConfig name="front passenger zone 1 config 0" isDefault="true"> + <volumeGroups> + <group> + <device address="bus100_audio_zone_1"> + <context context="music"/> + </device> + </group> + <group> + <device address="bus101_audio_zone_1"> + <context context="navigation"/> + <context context="voice_command"/> + <context context="call_ring"/> + <context context="call"/> + <context context="alarm"/> + <context context="notification"/> + <context context="system_sound"/> + <context context="emergency"/> + <context context="safety"/> + <context context="vehicle_status"/> + <context context="announcement"/> + </device> + </group> + </volumeGroups> + </zoneConfig> + <zoneConfig name="front passenger zone 1 config 1"> + <volumeGroups> + <group> + <device address="bus110_audio_zone_1"> + <context context="music"/> + </device> + </group> + <group> + <device address="bus111_audio_zone_1"> + <context context="navigation"/> + <context context="voice_command"/> + <context context="call_ring"/> + <context context="call"/> + <context context="alarm"/> + <context context="notification"/> + <context context="system_sound"/> + <context context="emergency"/> + <context context="safety"/> + <context context="vehicle_status"/> + <context context="announcement"/> + </device> + </group> + </volumeGroups> + </zoneConfig> + </zoneConfigs> + <inputDevices> + <inputDevice address="input_bus_tone_zone_1"/> + </inputDevices> + </zone> + <zone name="rear seat zone 2" audioZoneId="2" occupantZoneId="2"> + <zoneConfigs> + <zoneConfig name="rear seat zone 2 config 0" isDefault="true"> + <volumeGroups> + <group> + <device address="bus200_audio_zone_2"> + <context context="music"/> + </device> + </group> + <group> + <device address="bus201_audio_zone_2"> + <context context="navigation"/> + <context context="voice_command"/> + <context context="call_ring"/> + <context context="call"/> + <context context="alarm"/> + <context context="notification"/> + <context context="system_sound"/> + <context context="emergency"/> + <context context="safety"/> + <context context="vehicle_status"/> + <context context="announcement"/> + </device> + </group> + </volumeGroups> + </zoneConfig> + <zoneConfig name="rear seat zone 2 config 1"> + <volumeGroups> + <group> + <device address="bus210_audio_zone_2"> + <context context="music"/> + </device> + </group> + <group> + <device address="bus211_audio_zone_2"> + <context context="navigation"/> + <context context="voice_command"/> + <context context="call_ring"/> + <context context="call"/> + <context context="alarm"/> + <context context="notification"/> + <context context="system_sound"/> + <context context="emergency"/> + <context context="safety"/> + <context context="vehicle_status"/> + <context context="announcement"/> + </device> + </group> + </volumeGroups> + </zoneConfig> + </zoneConfigs> + </zone> + </zones> +</carAudioConfiguration> diff --git a/emulator/multi-display/display_layout_configuration.xml b/emulator/multi-display/display_layout_configuration.xml new file mode 100644 index 0000000..37b1cc8 --- /dev/null +++ b/emulator/multi-display/display_layout_configuration.xml @@ -0,0 +1,24 @@ +<?xml version='1.0' encoding='utf-8' standalone='yes' ?> +<layouts> + <layout> + <!-- Use the default state --> + <state>-1</state> + + <display enabled="true" defaultDisplay="true"> + <address>4619827259835644672</address> + </display> + + <display enabled="true" defaultDisplay="false"> + <address>4619827551948147201</address> + </display> + + <display enabled="true" defaultDisplay="false" displayGroup="passenger_display1"> + <address>4619827124781842690</address> + </display> + + <display enabled="true" defaultDisplay="false" displayGroup="passenger_display2"> + <address>4619827540095559171</address> + </display> + + </layout> +</layouts> diff --git a/emulator/multi-display/display_settings.xml b/emulator/multi-display/display_settings.xml new file mode 100644 index 0000000..8f63b42 --- /dev/null +++ b/emulator/multi-display/display_settings.xml @@ -0,0 +1,23 @@ +<?xml version='1.0' encoding='utf-8' standalone='yes' ?> +<display-settings> +<!-- Use physical port number instead of local id --> +<config identifier="1" /> + +<!-- Display settings for cluster --> +<display name="port:1" + forcedDensity="160" + dontMoveToTop="true"/> + +<!-- Display settings for 2nd Home --> +<display name="port:2" + shouldShowSystemDecors="true" + shouldShowIme="true" + forcedDensity="160" /> + +<!-- Display settings for 3rd Home --> +<display name="port:3" + shouldShowSystemDecors="true" + shouldShowIme="true" + forcedDensity="160" /> + +</display-settings> diff --git a/emulator/multi-display/input/virtio_input_multi_touch_7.idc b/emulator/multi-display/input/virtio_input_multi_touch_7.idc new file mode 100644 index 0000000..fe56a0c --- /dev/null +++ b/emulator/multi-display/input/virtio_input_multi_touch_7.idc @@ -0,0 +1,18 @@ +device.internal = 1 + +touch.deviceType = touchScreen +touch.orientationAware = 1 + +cursor.mode = navigation +cursor.orientationAware = 1 + +# This displayID matches the unique ID of the virtual display created for Emulator. +# This will indicate to input flinger than it should link this input device +# with the virtual display. +touch.displayId = local:4619827551948147201 + +# Allow touches while the screen is off +touch.enableForInactiveViewport = 1 + +# Tap on the display will wake the device. +touch.wake = 1 diff --git a/emulator/multi-display/input/virtio_input_multi_touch_8.idc b/emulator/multi-display/input/virtio_input_multi_touch_8.idc new file mode 100644 index 0000000..3c7c0d8 --- /dev/null +++ b/emulator/multi-display/input/virtio_input_multi_touch_8.idc @@ -0,0 +1,18 @@ +device.internal = 1 + +touch.deviceType = touchScreen +touch.orientationAware = 1 + +cursor.mode = navigation +cursor.orientationAware = 1 + +# This displayID matches the unique ID of the virtual display created for Emulator. +# This will indicate to input flinger than it should link this input device +# with the virtual display. +touch.displayId = local:4619827124781842690 + +# Allow touches while the screen is off +touch.enableForInactiveViewport = 1 + +# Tap on the display will wake the device. +touch.wake = 1 diff --git a/emulator/multi-display/input/virtio_input_multi_touch_9.idc b/emulator/multi-display/input/virtio_input_multi_touch_9.idc new file mode 100644 index 0000000..8035aad --- /dev/null +++ b/emulator/multi-display/input/virtio_input_multi_touch_9.idc @@ -0,0 +1,18 @@ +device.internal = 1 + +touch.deviceType = touchScreen +touch.orientationAware = 1 + +cursor.mode = navigation +cursor.orientationAware = 1 + +# This displayID matches the unique ID of the virtual display created for Emulator. +# This will indicate to input flinger than it should link this input device +# with the virtual display. +touch.displayId = local:4619827540095559171 + +# Allow touches while the screen is off +touch.enableForInactiveViewport = 1 + +# Tap on the display will wake the device. +touch.wake = 1 diff --git a/emulator/multi-display/overlay/frameworks/base/core/res/res/values/config.xml b/emulator/multi-display/overlay/frameworks/base/core/res/res/values/config.xml new file mode 100644 index 0000000..e9a7179 --- /dev/null +++ b/emulator/multi-display/overlay/frameworks/base/core/res/res/values/config.xml @@ -0,0 +1,68 @@ +<?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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- Whether the system enables per-display focus. If the system has the input method for each + display, this value should be true. --> + <bool name="config_perDisplayFocusEnabled">true</bool> + + <!-- Maximum number of supported users --> + <integer name="config_multiuserMaximumUsers">10</integer> + + <!-- Maximum number of users we allow to be running at a time --> + <integer name="config_multiuserMaxRunningUsers">5</integer> + + <!-- True if the device supports system decorations on secondary displays. --> + <bool name="config_supportsSystemDecorsOnSecondaryDisplays">true</bool> + <!-- This is the default launcher package with an activity to use on secondary displays that + support system decorations. + This launcher package must have an activity that supports multiple instances and has + corresponding launch mode set in AndroidManifest. + {@see android.view.Display#FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS} --> + <string name="config_secondaryHomePackage" translatable="false">com.android.car.multidisplay</string> + <!-- Whether to only install system packages on a user if they're whitelisted for that user + type. These are flags and can be freely combined. + 0 - disable whitelist (install all system packages; no logging) + 1 - enforce (only install system packages if they are whitelisted) + 2 - log (log non-whitelisted packages) + 4 - any package not mentioned in the whitelist file is implicitly whitelisted on all users + 8 - same as 4, but just for the SYSTEM user + 16 - ignore OTAs (don't install system packages during OTAs) + Common scenarios: + - to enable feature (fully enforced) for a complete whitelist: 1 + - to enable feature for an incomplete whitelist (so use implicit whitelist mode): 5 + - to enable feature but implicitly whitelist for SYSTEM user to ease local development: 9 + - to disable feature completely if it had never been enabled: 16 + - to henceforth disable feature and try to undo its previous effects: 0 + Note: This list must be kept current with PACKAGE_WHITELIST_MODE_PROP in + frameworks/base/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java + Package whitelist disabled for testing profile user as default whitelist does not + support PROFILE user. --> + <integer name="config_userTypePackageWhitelistMode">2</integer> + + <!-- Whether the device allows users to start in background visible on displays. + Should be false for most devices, except automotive vehicle with passenger displays. --> + <bool name="config_multiuserVisibleBackgroundUsers">true</bool> + + <!-- Enable multi-user IME sessions --> + <string translatable="false" name="config_deviceSpecificInputMethodManagerService">com.android.server.inputmethod.InputMethodManagerServiceProxy$Lifecycle</string> + <!-- Disable hidding the NavBars (CarSystemBars), as a workaround for b/259604616 --> + <bool name="config_hideNavBarForKeyboard">false</bool> + +</resources> diff --git a/emulator/multi-display/overlay/frameworks/base/core/res/res/xml/config_user_types.xml b/emulator/multi-display/overlay/frameworks/base/core/res/res/xml/config_user_types.xml new file mode 100644 index 0000000..07f21fe --- /dev/null +++ b/emulator/multi-display/overlay/frameworks/base/core/res/res/xml/config_user_types.xml @@ -0,0 +1,28 @@ +<?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. +--> + +<user-types> + <full-type name="android.os.usertype.full.GUEST" + max-allowed="3" > + <default-restrictions no_factory_reset="true" no_remove_user="true" + no_modify_accounts="true" no_install_apps="true" no_install_unknown_sources="true" + no_uninstall_apps="true"/> + </full-type> + + <profile-type name="android.os.usertype.profile.CLONE" + enabled='0' > + </profile-type> +</user-types> diff --git a/emulator/overlay/frameworks/base/core/res/res/values/config.xml b/emulator/overlay/frameworks/base/core/res/res/values/config.xml new file mode 100644 index 0000000..1544de4 --- /dev/null +++ b/emulator/overlay/frameworks/base/core/res/res/values/config.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2023, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <bool name="config_automatic_brightness_available">true</bool> +</resources> diff --git a/emulator/sepolicy/hal_vehicle_default.te b/emulator/sepolicy/hal_vehicle_default.te new file mode 100644 index 0000000..e201b75 --- /dev/null +++ b/emulator/sepolicy/hal_vehicle_default.te @@ -0,0 +1 @@ +allow hal_vehicle_default self:vsock_socket { connect create read write }; diff --git a/emulator/usbpt/BoardConfig.mk b/emulator/usbpt/BoardConfig.mk index ea43a0b..9352b25 100644 --- a/emulator/usbpt/BoardConfig.mk +++ b/emulator/usbpt/BoardConfig.mk @@ -13,4 +13,5 @@ # limitations under the License. # -include device/generic/car/emulator/usbpt/bluetooth/BoardConfig.mk +#include device/generic/car/emulator/usbpt/bluetooth/BoardConfig.mk +#include device/generic/car/emulator/usbpt/wifi/BoardConfig.mk diff --git a/emulator/usbpt/bluetooth/bluetooth.mk b/emulator/usbpt/bluetooth/bluetooth.mk index 935097f..599d455 100644 --- a/emulator/usbpt/bluetooth/bluetooth.mk +++ b/emulator/usbpt/bluetooth/bluetooth.mk @@ -18,10 +18,10 @@ PRODUCT_PACKAGES += \ android.hardware.bluetooth@1.1-service.btlinux \ + android.hardware.bluetooth.audio@2.2-impl \ PRODUCT_COPY_FILES += \ device/generic/car/emulator/usbpt/bluetooth/vendor.qemu.preferred.bt.service.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/vendor.qemu.preferred.bt.service.rc \ - device/generic/car/emulator/usbpt/bluetooth/modules.blocklist:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/lib/modules/modules.blocklist \ PRODUCT_SYSTEM_PROPERTIES += \ persist.bluetooth.enablenewavrcp=false \ diff --git a/emulator/usbpt/bluetooth/bluetooth.prop b/emulator/usbpt/bluetooth/bluetooth.prop new file mode 100644 index 0000000..fdd00c0 --- /dev/null +++ b/emulator/usbpt/bluetooth/bluetooth.prop @@ -0,0 +1,20 @@ +# The default Bluetooth Class of Device +# Service Field: 0x26 -> 38 +# - Bit 17: Networking +# - Bit 18: Rendering +# - Bit 21: Audio +# Major Class: 0x04 -> 4 (Audio / Video) +# Minor Class: 0x08 -> 8 (Car Audio) +bluetooth.device.class_of_device=38,4,8 +bluetooth.device.default_name=gCar Emulator + +# The Bluetooth profiles that cars expect to have enabled. All other profiles +# are disabled by default. +bluetooth.profile.a2dp.sink.enabled=true +bluetooth.profile.avrcp.controller.enabled=true +bluetooth.profile.gatt.enabled=true +bluetooth.profile.hfp.hf.enabled=true +bluetooth.profile.map.client.enabled=true +bluetooth.profile.pan.nap.enabled=true +bluetooth.profile.pan.panu.enabled=true +bluetooth.profile.pbap.client.enabled=true diff --git a/emulator/usbpt/bluetooth/btusb/BoardConfig.mk b/emulator/usbpt/bluetooth/btusb/BoardConfig.mk index 7011ee7..2a13328 100644 --- a/emulator/usbpt/bluetooth/btusb/BoardConfig.mk +++ b/emulator/usbpt/bluetooth/btusb/BoardConfig.mk @@ -12,13 +12,3 @@ # See the License for the specific language governing permissions and # limitations under the License. # - -BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/generic/car/emulator/usbpt/bluetooth/btusb/hal - -TARGET_KERNEL_USE ?= 5.10 - -ifeq ($(TARGET_ARCH),x86_64) -BOARD_VENDOR_KERNEL_MODULES += kernel/prebuilts/common-modules/virtual-device/$(TARGET_KERNEL_USE)/x86-64/btusb.ko -else ifeq ($(TARGET_ARCH),arm64) -BOARD_VENDOR_KERNEL_MODULES += kernel/prebuilts/common-modules/virtual-device/$(TARGET_KERNEL_USE)/arm64/btusb.ko -endif diff --git a/emulator/usbpt/bluetooth/btusb/hal/bdroid_buildcfg.h b/emulator/usbpt/bluetooth/btusb/hal/bdroid_buildcfg.h deleted file mode 100644 index 132b683..0000000 --- a/emulator/usbpt/bluetooth/btusb/hal/bdroid_buildcfg.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _BDROID_BUILDCFG_H -#define _BDROID_BUILDCFG_H -#define BTM_DEF_LOCAL_NAME "gCar Emulator" -#define BTA_AV_SINK_INCLUDED TRUE -/* Handsfree device */ -#define BTA_DM_COD {0x26, 0x04, 0x08} -/* Workaround for error at connection. */ -#define BT_CLEAN_TURN_ON_DISABLED 1 -#endif diff --git a/emulator/usbpt/bluetooth/btusb/init.btusb.rc b/emulator/usbpt/bluetooth/btusb/init.btusb.rc index 4603f83..55b5160 100644 --- a/emulator/usbpt/bluetooth/btusb/init.btusb.rc +++ b/emulator/usbpt/bluetooth/btusb/init.btusb.rc @@ -1,3 +1,17 @@ +# Copyright (C) 2022 The Android Open-Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + on early-init write /sys/module/firmware_class/parameters/path /vendor/firmware/ diff --git a/emulator/usbpt/bluetooth/modules.blocklist b/emulator/usbpt/bluetooth/modules.blocklist deleted file mode 100644 index 5816cd8..0000000 --- a/emulator/usbpt/bluetooth/modules.blocklist +++ /dev/null @@ -1,2 +0,0 @@ -# List of sub-device specific modules to not load automatically -blocklist btusb.ko diff --git a/emulator/usbpt/bluetooth/usb_modeswitch/usb_modeswitch.c b/emulator/usbpt/bluetooth/usb_modeswitch/usb_modeswitch.c index 3b7c48b..9b092ee 100644 --- a/emulator/usbpt/bluetooth/usb_modeswitch/usb_modeswitch.c +++ b/emulator/usbpt/bluetooth/usb_modeswitch/usb_modeswitch.c @@ -1707,13 +1707,13 @@ struct libusb_device* search_devices( int *numFound, int vendor, char* productLi if (!vendor || *productList == '\0') return NULL; - listcopy = malloc(strlen(productList)+1); - if (libusb_get_device_list(ctx, &devs) < 0) { perror("Libusb failed to get USB access!"); return 0; } + listcopy = malloc(strlen(productList)+1); + while ((dev = devs[i++]) != NULL) { struct libusb_device_descriptor descriptor; libusb_get_device_descriptor(dev, &descriptor); diff --git a/emulator/usbpt/car_usbpt.mk b/emulator/usbpt/car_usbpt.mk index 922c5b3..e0e24bc 100644 --- a/emulator/usbpt/car_usbpt.mk +++ b/emulator/usbpt/car_usbpt.mk @@ -16,7 +16,9 @@ $(call inherit-product, device/generic/car/emulator/usbpt/bluetooth/bluetooth.mk) $(call inherit-product, device/generic/car/emulator/usbpt/protocan/protocan.mk) $(call inherit-product, device/generic/car/emulator/usbpt/usbip-service/usbip-service.mk) +$(call inherit-product, device/generic/car/emulator/usbpt/wifi/wifi.mk) # Required for USB passthrough PRODUCT_COPY_FILES += \ - frameworks/native/data/etc/android.hardware.usb.host.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.host.xml + frameworks/native/data/etc/android.hardware.usb.host.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.host.xml \ + device/generic/car/emulator/usbpt/modules.blocklist:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/lib/modules/modules.blocklist \ diff --git a/emulator/usbpt/modules.blocklist b/emulator/usbpt/modules.blocklist new file mode 100644 index 0000000..34559e0 --- /dev/null +++ b/emulator/usbpt/modules.blocklist @@ -0,0 +1,10 @@ +# List of sub-device specific modules to not load automatically +blocklist btusb.ko +blocklist mt76x2u.ko +blocklist mt76x2_common.ko +blocklist mt76x0u.ko +blocklist mt76x02_usb.ko +blocklist mt76x0_common.ko +blocklist mt76x02_lib.ko +blocklist mt76_usb.ko +blocklist mt76.ko diff --git a/emulator/usbpt/protocan/manifest.protocan.xml b/emulator/usbpt/protocan/manifest.protocan.xml index f23cbf9..7227a48 100644 --- a/emulator/usbpt/protocan/manifest.protocan.xml +++ b/emulator/usbpt/protocan/manifest.protocan.xml @@ -5,10 +5,6 @@ <impl level="generic"></impl> <version>1.0</version> <interface> - <name>ICanController</name> - <instance>socketcan</instance> - </interface> - <interface> <name>ICanBus</name> <instance>BCAN</instance> <instance>CCAN</instance> diff --git a/emulator/usbpt/protocan/protocan.mk b/emulator/usbpt/protocan/protocan.mk index 4f02d52..4f54992 100644 --- a/emulator/usbpt/protocan/protocan.mk +++ b/emulator/usbpt/protocan/protocan.mk @@ -17,8 +17,12 @@ # CAN bus HAL PRODUCT_PACKAGES += android.hardware.automotive.can@1.0-service PRODUCT_PACKAGES += canhalconfigurator -PRODUCT_COPY_FILES += device/generic/car/emulator/usbpt/protocan/canbus_config.pb:system/etc/canbus_config.pb -PRODUCT_PACKAGES_DEBUG += canhalctrl \ +PRODUCT_COPY_FILES += device/generic/car/emulator/usbpt/protocan/canbus_config.pb:$(TARGET_COPY_OUT_VENDOR)/etc/canbus_config.pb + +# TODO(b/259994014): Remove CAN packages from here after AAOS baseline is +# applied to all car emulators +PRODUCT_PACKAGES_DEBUG += \ + canhalctrl \ canhaldump \ canhalsend diff --git a/emulator/usbpt/protocan/protocanbus/sepolicy/dumpstate.te b/emulator/usbpt/protocan/protocanbus/sepolicy/dumpstate.te new file mode 100644 index 0000000..b43e786 --- /dev/null +++ b/emulator/usbpt/protocan/protocanbus/sepolicy/dumpstate.te @@ -0,0 +1,2 @@ +# Allow dumpstate to make binder calls to hal_vehiclebus_default +binder_call(dumpstate, hal_vehiclebus_default) diff --git a/emulator/usbpt/protocan/protocanbus/sepolicy/service.te b/emulator/usbpt/protocan/protocanbus/sepolicy/service.te index 1016fe4..08c20e9 100644 --- a/emulator/usbpt/protocan/protocanbus/sepolicy/service.te +++ b/emulator/usbpt/protocan/protocanbus/sepolicy/service.te @@ -1 +1 @@ -type hal_vehiclebus_service, vendor_service, protected_service, service_manager_type; +type hal_vehiclebus_service, hal_service_type, protected_service, service_manager_type; diff --git a/emulator/usbpt/usbip-service/TEST_MAPPING b/emulator/usbpt/usbip-service/TEST_MAPPING index c977d11..61eb9ae 100644 --- a/emulator/usbpt/usbip-service/TEST_MAPPING +++ b/emulator/usbpt/usbip-service/TEST_MAPPING @@ -1,7 +1,7 @@ { "presubmit": [ { - "name": "usbpip_test", + "name": "usbip_test", "host": true } ] diff --git a/emulator/usbpt/wifi/BoardConfig.mk b/emulator/usbpt/wifi/BoardConfig.mk new file mode 100644 index 0000000..2a13328 --- /dev/null +++ b/emulator/usbpt/wifi/BoardConfig.mk @@ -0,0 +1,14 @@ +# Copyright (C) 2022 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/emulator/usbpt/wifi/init.wifiusb.rc b/emulator/usbpt/wifi/init.wifiusb.rc new file mode 100644 index 0000000..5b09e12 --- /dev/null +++ b/emulator/usbpt/wifi/init.wifiusb.rc @@ -0,0 +1,19 @@ +# Copyright (C) 2022 The Android Open-Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +on early-init + write /sys/module/firmware_class/parameters/path /vendor/firmware/ + +on boot + exec u:r:vendor_modprobe:s0 -- /vendor/bin/modprobe -a -d /vendor/lib/modules mt76.ko mt76-usb.ko mt76x02-lib.ko mt76x02-usb.ko mt76x0-common.ko mt76x0u.ko mt76x2-common.ko mt76x2u.ko diff --git a/emulator/usbpt/wifi/wifi.mk b/emulator/usbpt/wifi/wifi.mk new file mode 100644 index 0000000..e2da0f9 --- /dev/null +++ b/emulator/usbpt/wifi/wifi.mk @@ -0,0 +1,17 @@ +# +# Copyright (C) 2022 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +PRODUCT_COPY_FILES += \ + device/generic/car/emulator/usbpt/wifi/init.wifiusb.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/init.wifiusb.rc \ diff --git a/emulator/vhal_aidl/EmulatedVehicleService.cpp b/emulator/vhal_aidl/EmulatedVehicleService.cpp index aeada2f..28a7bca 100644 --- a/emulator/vhal_aidl/EmulatedVehicleService.cpp +++ b/emulator/vhal_aidl/EmulatedVehicleService.cpp @@ -27,6 +27,13 @@ using ::android::hardware::automotive::vehicle::DefaultVehicleHal; using ::android::hardware::automotive::vehicle::fake::EmulatedVehicleHardware; int main(int /* argc */, char* /* argv */[]) { + ALOGI("Starting thread pool..."); + if (!ABinderProcess_setThreadPoolMaxThreadCount(4)) { + ALOGE("%s", "failed to set thread pool max thread count"); + return 1; + } + ABinderProcess_startThreadPool(); + std::unique_ptr<EmulatedVehicleHardware> hardware = std::make_unique<EmulatedVehicleHardware>(); std::shared_ptr<DefaultVehicleHal> vhal = ::ndk::SharedRefBase::make<DefaultVehicleHal>(std::move(hardware)); @@ -39,12 +46,6 @@ int main(int /* argc */, char* /* argv */[]) { return 1; } - if (!ABinderProcess_setThreadPoolMaxThreadCount(4)) { - ALOGE("%s", "failed to set thread pool max thread count"); - return 1; - } - ABinderProcess_startThreadPool(); - ALOGI("Emulator Vehicle Service Ready"); ABinderProcess_joinThreadPool(); diff --git a/emulator/vhal_aidl/vhal-emulator-service.xml b/emulator/vhal_aidl/vhal-emulator-service.xml index adf40da..c0fffd3 100644 --- a/emulator/vhal_aidl/vhal-emulator-service.xml +++ b/emulator/vhal_aidl/vhal-emulator-service.xml @@ -1,7 +1,7 @@ <manifest version="1.0" type="device"> <hal format="aidl"> <name>android.hardware.automotive.vehicle</name> - <version>1</version> + <version>2</version> <interface> <name>IVehicle</name> <instance>default</instance> diff --git a/emulator/vhal_v2_0/interfaces/aidl/Android.bp b/emulator/vhal_v2_0/interfaces/aidl/Android.bp index b22d821..9d59cd2 100644 --- a/emulator/vhal_v2_0/interfaces/aidl/Android.bp +++ b/emulator/vhal_v2_0/interfaces/aidl/Android.bp @@ -14,7 +14,8 @@ aidl_interface { vendor_available: true, srcs: ["device/generic/car/emulator/*.aidl"], imports: [ - "android.hardware.automotive.vehicle", + "android.hardware.automotive.vehicle-V2", + "android.hardware.automotive.vehicle.property-V2", ], stability: "vintf", backend: { @@ -31,7 +32,10 @@ aidl_interface { versions_with_info: [ { version: "1", - imports: ["android.hardware.automotive.vehicle-V1"], + imports: [ + "android.hardware.automotive.vehicle-V2", + "android.hardware.automotive.vehicle.property-V2", + ], }, ], diff --git a/emulator_car64_arm64/BoardConfig.mk b/emulator_car64_arm64/BoardConfig.mk new file mode 100644 index 0000000..607c24f --- /dev/null +++ b/emulator_car64_arm64/BoardConfig.mk @@ -0,0 +1,25 @@ +# Copyright (C) 2022 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +BOARD_DO_NOT_STRIP_VENDOR_MODULES := true + +# Use emulator64_arm64 BoardConfig as base +include device/generic/goldfish/emulator64_arm64/BoardConfig.mk +include device/generic/car/emulator/usbpt/BoardConfig.mk + +# Override BOARD_SUPER_PARTITION_SIZE to inclease the mounted system partition. +BOARD_SUPER_PARTITION_SIZE := 5856296960 + +BOARD_EMULATOR_DYNAMIC_PARTITIONS_SIZE = 3489660928 diff --git a/emulator_car64_x86_64/BoardConfig.mk b/emulator_car64_x86_64/BoardConfig.mk index bfd00ce..a96b953 100644 --- a/emulator_car64_x86_64/BoardConfig.mk +++ b/emulator_car64_x86_64/BoardConfig.mk @@ -1,4 +1,4 @@ -# Copyright (C) 2022 The Android Open Source Project +# 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. @@ -13,6 +13,8 @@ # limitations under the License. # +BOARD_DO_NOT_STRIP_VENDOR_MODULES := true + # Use emulator64_x86_64_arm64 BoardConfig as base include device/generic/goldfish/emulator64_x86_64/BoardConfig.mk include device/generic/car/emulator/usbpt/BoardConfig.mk @@ -20,5 +22,5 @@ include device/generic/car/emulator/usbpt/BoardConfig.mk # Override BOARD_SUPER_PARTITION_SIZE to inclease the mounted system partition. BOARD_SUPER_PARTITION_SIZE := 5856296960 -BOARD_EMULATOR_DYNAMIC_PARTITIONS_SIZE = 3489660928 - +# 3.5G +BOARD_EMULATOR_DYNAMIC_PARTITIONS_SIZE = 3758096384 diff --git a/gsi_car_arm64.mk b/gsi_car_arm64.mk index 0977da4..e12ca5e 100644 --- a/gsi_car_arm64.mk +++ b/gsi_car_arm64.mk @@ -13,10 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -$(call inherit-product, device/generic/car/gsi_car_base.mk) -$(call inherit-product, device/generic/common/gsi_arm64.mk) +include device/generic/car/gsi_car_base.mk PRODUCT_NAME := gsi_car_arm64 PRODUCT_DEVICE := generic_arm64 -PRODUCT_BRAND := Android -PRODUCT_MODEL := Car GSI on arm64
\ No newline at end of file +PRODUCT_MODEL := Car GSI on arm64 diff --git a/gsi_car_base.mk b/gsi_car_base.mk index 3fdfa77..b107b31 100644 --- a/gsi_car_base.mk +++ b/gsi_car_base.mk @@ -13,160 +13,42 @@ # See the License for the specific language governing permissions and # limitations under the License. -PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed -PRODUCT_PACKAGES += android.frameworks.automotive.display@1.0-service - -# TODO(b/193056430): Improve this temp fix for "artifact path requirement" -# errors. -# TODO(b/194941497): SHIPSTOP - remove CarServiceModule -PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST += \ - root/init.bootstat.rc \ - root/init.car.rc \ - system/apex/com.android.car.framework.apex \ - system/app/Bluetooth/Bluetooth.apk \ - system/app/Bluetooth/lib/arm64/libbluetooth_jni.so \ - system/app/Bluetooth/lib/x86_64/libbluetooth_jni.so \ - system/app/CarFrameworkPackageStubs/CarFrameworkPackageStubs.apk \ - system/app/CarHTMLViewer/CarHTMLViewer.apk \ - system/app/CarLatinIME/CarLatinIME.apk \ - system/app/CarMapsPlaceholder/CarMapsPlaceholder.apk \ - system/app/CarPermissionControllerRRO/CarPermissionControllerRRO.apk \ - system/app/CarRotaryImeRRO/CarRotaryImeRRO.apk \ - system/app/HideCameraApps/HideCameraApps.apk \ - system/app/RotaryIME/RotaryIME.apk \ - system/app/RotaryPlayground/RotaryPlayground.apk \ - system/app/SampleCustomInputService/SampleCustomInputService.apk \ - system/app/SampleRearViewCamera/SampleRearViewCamera.apk \ - system/app/SystemUpdater/SystemUpdater.apk \ - system/bin/android.automotive.evs.manager@1.1 \ - system/bin/canhalconfigurator \ - system/bin/canhalctrl \ - system/bin/canhaldump \ - system/bin/canhalsend \ - system/bin/carbugreportd \ - system/bin/carpowerpolicyd \ - system/bin/carwatchdogd \ - system/bin/com.android.car.procfsinspector \ - system/bin/curl \ - system/bin/evsmanagerd \ - system/bin/vehicle_binding_util \ - system/etc/apns-conf.xml \ - system/etc/canbus_config.pb \ - system/etc/init/android.automotive.evs.manager@1.1.rc \ - system/etc/init/canhalconfigurator.rc \ - system/etc/init/carbugreportd.rc \ - system/etc/init/carpowerpolicyd.rc \ - system/etc/init/carwatchdogd.rc \ - system/etc/init/com.android.car.procfsinspector.rc \ - system/etc/init/evsmanagerd.rc \ - system/etc/init/init.bootstat.car.rc \ - system/etc/init/init.car.rc \ - system/etc/init/vehicle_binding_util.rc \ - system/etc/old-apns-conf.xml \ - system/etc/permissions/android.car.cluster.xml \ - system/etc/permissions/android.car.usb.handler.xml \ - system/etc/permissions/android.hardware.broadcastradio.xml \ - system/etc/permissions/android.hardware.type.automotive.xml \ - system/etc/permissions/car-frameworks-service.xml \ - system/etc/permissions/com.android.car.activityresolver.xml \ - system/etc/permissions/com.android.car.bugreport.xml \ - system/etc/permissions/com.android.car.cartelemetryapp.xml \ - system/etc/permissions/com.android.car.carlauncher.xml \ - system/etc/permissions/com.android.car.cluster.home.xml \ - system/etc/permissions/com.android.car.dialer.xml \ - system/etc/permissions/com.android.car.hvac.xml \ - system/etc/permissions/com.android.car.media.xml \ - system/etc/permissions/com.android.car.messenger.xml \ - system/etc/permissions/com.android.car.radio.xml \ - system/etc/permissions/com.android.car.rotary.xml \ - system/etc/permissions/com.android.car.settings.xml \ - system/etc/permissions/com.android.car.shell.xml \ - system/etc/permissions/com.android.car.xml \ - system/etc/permissions/com.google.android.car.adaslocation.xml \ - system/etc/permissions/com.google.android.car.defaultstoragemonitoringcompanionapp.xml \ - system/etc/permissions/com.google.android.car.garagemode.testapp.xml \ - system/etc/permissions/com.google.android.car.kitchensink.xml \ - system/etc/permissions/com.google.android.car.networking.preferenceupdater.xml \ - system/etc/permissions/com.google.android.car.networking.railway.xml \ - system/etc/sysconfig/preinstalled-packages-product-car-base.xml \ - system/etc/vintf/manifest/carpowerpolicyd.xml \ - system/etc/vintf/manifest/carwatchdogd.xml \ - system/etc/vintf/manifest/manifest_android.automotive.evs.manager@1.1.xml \ - system/etc/vintf/manifest/manifest_evsmanagerd.xml \ - system/framework/android.car.jar \ - system/framework/android.car.builtin.jar \ - system/framework/car-frameworks-service.jar \ - system/framework/car-frameworks-service-module.jar \ - system/lib/libsuspend.so \ - system/lib64/android.automotive.watchdog-V3-cpp.so \ - system/lib64/android.automotive.watchdog.internal-cpp.so \ - system/lib64/android.frameworks.automotive.display@1.0.so \ - system/lib64/android.frameworks.automotive.powerpolicy-V1-cpp.so \ - system/lib64/android.frameworks.automotive.powerpolicy-V1-ndk.so \ - system/lib64/android.frameworks.automotive.powerpolicy.internal-V1-cpp.so \ - system/lib64/android.frameworks.automotive.powerpolicy.internal-V1-ndk.so \ - system/lib64/android.hardware.automotive.can@1.0.so \ - system/lib64/android.hardware.automotive.evs@1.0.so \ - system/lib64/android.hardware.automotive.evs@1.1.so \ - system/lib64/android.hardware.automotive.evs-V1-ndk.so \ - system/lib64/android.hardware.automotive.vehicle@2.0.so \ - system/lib64/android.os.statsbootstrap_aidl-cpp.so \ - system/lib64/libbluetooth_jni.so \ - system/lib64/libstatsbootstrap.so \ - system/lib64/libstatslog_evs.so \ - system/lib64/libstatslog_evsmanagerd.so \ - system/lib64/libsuspend.so \ - system/lib64/libwatchdog_binder_mediator.so \ - system/lib64/libwatchdog_package_info_resolver.so \ - system/lib64/libwatchdog_perf_service.so \ - system/lib64/libwatchdog_process_service.so \ - system/media/bootanimation.zip \ - system/priv-app/BugReportApp/BugReportApp.apk \ - system/priv-app/CarActivityResolver/CarActivityResolver.apk \ - system/priv-app/CarDialerApp/CarDialerApp.apk \ - system/priv-app/CarHvacApp/CarHvacApp.apk \ - system/priv-app/CarLauncher/CarLauncher.apk \ - system/priv-app/CarManagedProvisioning/CarManagedProvisioning.apk \ - system/priv-app/CarMediaApp/CarMediaApp.apk \ - system/priv-app/CarMessengerApp/CarMessengerApp.apk \ - system/priv-app/CarRadioApp/CarRadioApp.apk \ - system/priv-app/CarRotaryController/CarRotaryController.apk \ - system/priv-app/CarService/CarService.apk \ - system/priv-app/CarService/lib/arm64/libcarservicejni.so \ - system/priv-app/CarService/lib/x86_64/libcarservicejni.so \ - system/priv-app/CarSettings/CarSettings.apk \ - system/priv-app/CarShell/CarShell.apk \ - system/priv-app/CarTelemetryApp/CarTelemetryApp.apk \ - system/priv-app/CarUsbHandler/CarUsbHandler.apk \ - system/priv-app/ClusterHomeSample/ClusterHomeSample.apk \ - system/priv-app/DefaultStorageMonitoringCompanionApp/DefaultStorageMonitoringCompanionApp.apk \ - system/priv-app/DirectRenderingCluster/DirectRenderingCluster.apk \ - system/priv-app/EmbeddedKitchenSinkApp/EmbeddedKitchenSinkApp.apk \ - system/priv-app/ExperimentalCarService/ExperimentalCarService.apk \ - system/priv-app/AdasLocationTestApp/AdasLocationTestApp.apk \ - system/priv-app/GarageModeTestApp/GarageModeTestApp.apk \ - system/priv-app/LocalMediaPlayer/LocalMediaPlayer.apk \ - system/priv-app/NetworkPreferenceApp/NetworkPreferenceApp.apk \ - system/priv-app/RailwayReferenceApp/RailwayReferenceApp.apk \ - system/lib64/libcarservicejni.so \ - system/bin/android.automotive.telemetryd@1.0 \ - system/etc/init/android.automotive.telemetryd@1.0.rc \ - system/etc/vintf/manifest/android.automotive.telemetryd@1.0.xml \ - system/lib64/android.automotive.telemetryd@1.0-impl.so \ - system/lib64/android.frameworks.automotive.telemetry-V1-cpp.so \ - system/lib64/android.automotive.telemetry.internal-ndk.so \ - system/lib64/android.frameworks.automotive.telemetry-V1-ndk.so \ - system/etc/automotive/watchdog/system_resource_overuse_configuration.xml \ - system/etc/automotive/watchdog/third_party_resource_overuse_configuration.xml \ - system/bin/android.frameworks.automotive.display@1.0-service \ - system/etc/init/android.frameworks.automotive.display@1.0-service.rc \ - system/etc/vintf/manifest/manifest_android.frameworks.automotive.display@1.0.xml \ - -PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST += %.odex %.vdex %.art - PRODUCT_PACKAGE_OVERLAYS := device/generic/car/common/overlay EMULATOR_VENDOR_NO_SENSORS := true PRODUCT_USE_DYNAMIC_PARTITION_SIZE := true DO_NOT_INCLUDE_BT_SEPOLICY := true -$(call inherit-product, device/generic/car/emulator/aosp_car_emulator.mk) EMULATOR_VENDOR_NO_SOUND := true + +# +# All components inherited here go to system image +# +$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) +$(call inherit-product, packages/services/Car/car_product/build/car_generic_system.mk) + +PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := strict + +# +# All components inherited here go to system_ext image +# +$(call inherit-product, packages/services/Car/car_product/build/car_system_ext.mk) + +# Install a copy of the debug policy to the system_ext partition, and allow +# init-second-stage to load debug policy from system_ext. +# This option is only meant to be set by compliance GSI targets. +PRODUCT_INSTALL_DEBUG_POLICY_TO_SYSTEM_EXT := true +PRODUCT_PACKAGES += system_ext_userdebug_plat_sepolicy.cil + +# pKVM is required to support nested virtualization for CF. Ideally we should +# move it out of /system. But it seems to be infeasible for now (b/207336449). +$(call inherit-product, packages/modules/Virtualization/apex/product_packages.mk) + +# +# All components inherited here go to product image +# +$(call inherit-product, packages/services/Car/car_product/build/car_product.mk) + +PRODUCT_BRAND := Android +# +# Special settings for GSI releasing +# +$(call inherit-product, $(SRC_TARGET_DIR)/product/gsi_release.mk) diff --git a/gsi_car_x86_64.mk b/gsi_car_x86_64.mk index 378fa5c..e4b5599 100644 --- a/gsi_car_x86_64.mk +++ b/gsi_car_x86_64.mk @@ -13,10 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -$(call inherit-product, device/generic/car/gsi_car_base.mk) -$(call inherit-product, device/generic/common/gsi_x86_64.mk) +include device/generic/car/gsi_car_base.mk PRODUCT_NAME := gsi_car_x86_64 PRODUCT_DEVICE := generic_x86_64 -PRODUCT_BRAND := Android -PRODUCT_MODEL := Car GSI on x86_64
\ No newline at end of file +PRODUCT_MODEL := Car GSI on x86_64 diff --git a/sdk_car_arm.mk b/sdk_car_arm.mk new file mode 100644 index 0000000..032dc05 --- /dev/null +++ b/sdk_car_arm.mk @@ -0,0 +1,25 @@ +# +# Copyright (C) 2021 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +PRODUCT_PACKAGE_OVERLAYS := device/generic/car/common/overlay + +$(call inherit-product, device/generic/car/emulator/aosp_car_emulator.mk) +$(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_phone_armv7.mk) + +EMULATOR_VENDOR_NO_SOUND := true +PRODUCT_NAME := sdk_car_arm +PRODUCT_DEVICE := emulator_arm +PRODUCT_BRAND := Android +PRODUCT_MODEL := Car on ARM emulator diff --git a/sdk_car_arm64.mk b/sdk_car_arm64.mk new file mode 100644 index 0000000..61aa930 --- /dev/null +++ b/sdk_car_arm64.mk @@ -0,0 +1,56 @@ +# +# Copyright (C) 2016 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +PRODUCT_PACKAGE_OVERLAYS := device/generic/car/common/overlay + +QEMU_USE_SYSTEM_EXT_PARTITIONS := true +PRODUCT_USE_DYNAMIC_PARTITIONS := true + +ifneq ($(EMULATOR_DYNAMIC_MULTIDISPLAY_CONFIG),true) +# Emulator configuration +PRODUCT_COPY_FILES += \ + device/generic/car/common/config.ini:config.ini +endif # EMULATOR_DYNAMIC_MULTIDISPLAY_CONFIG + +# +# All components inherited here go to system image +# +$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) +$(call inherit-product, packages/services/Car/car_product/build/car_generic_system.mk) + +PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := strict + +# +# All components inherited here go to system_ext image +# +$(call inherit-product, packages/services/Car/car_product/build/car_system_ext.mk) + +# +# All components inherited here go to product image +# +$(call inherit-product, device/generic/car/emulator/car_emulator_product.mk) + +# +# All components inherited here go to vendor image +# +$(call inherit-product, device/generic/car/emulator/car_emulator_vendor.mk) +$(call inherit-product-if-exists, device/generic/goldfish/arm64-vendor.mk) +$(call inherit-product, $(SRC_TARGET_DIR)/board/emulator_arm64/device.mk) + +EMULATOR_VENDOR_NO_SOUND := true +PRODUCT_NAME := sdk_car_arm64 +PRODUCT_DEVICE := emulator_arm64 +PRODUCT_BRAND := Android +PRODUCT_MODEL := Car on arm64 emulator diff --git a/sdk_car_md_arm64.mk b/sdk_car_md_arm64.mk new file mode 100644 index 0000000..a2131bd --- /dev/null +++ b/sdk_car_md_arm64.mk @@ -0,0 +1,26 @@ +# +# Copyright (C) 2023 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +$(call inherit-product, device/generic/car/common/car_md.mk) +$(call inherit-product, device/generic/car/sdk_car_arm64.mk) + +# TODO(b/266978709): Set it to true after cleaning up the system partition +# changes from this makefile +PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := false + +PRODUCT_NAME := sdk_car_md_arm64 +PRODUCT_DEVICE := emulator_car64_arm64 +PRODUCT_BRAND := Android +PRODUCT_MODEL := Car multi-display on arm64 emulator diff --git a/sdk_car_md_x86_64.mk b/sdk_car_md_x86_64.mk new file mode 100644 index 0000000..7db6934 --- /dev/null +++ b/sdk_car_md_x86_64.mk @@ -0,0 +1,26 @@ +# +# Copyright (C) 2022 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +$(call inherit-product, device/generic/car/common/car_md.mk) +$(call inherit-product, device/generic/car/sdk_car_x86_64.mk) + +# TODO(b/266978709): Set it to true after cleaning up the system partition +# changes from this makefile +PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := false + +PRODUCT_NAME := sdk_car_md_x86_64 +PRODUCT_DEVICE := emulator_car64_x86_64 +PRODUCT_BRAND := Android +PRODUCT_MODEL := Car multi-display on x86_64 emulator diff --git a/sdk_car_portrait_x86_64.mk b/sdk_car_portrait_x86_64.mk new file mode 100644 index 0000000..50d3b1b --- /dev/null +++ b/sdk_car_portrait_x86_64.mk @@ -0,0 +1,47 @@ +# +# Copyright (C) 2021 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Car UI Portrait Emulator Target + +# Exclude AAE Car System UI +DO_NOT_INCLUDE_AAE_CAR_SYSTEM_UI := true + +# Exclude Car UI Reference Design +DO_NOT_INCLUDE_CAR_UI_REFERENCE_DESIGN := true + +# Exclude Car Visual Overlay +DISABLE_CAR_PRODUCT_VISUAL_OVERLAY := true + +# Use the common Car Overlay +PRODUCT_PACKAGE_OVERLAYS := device/generic/car/common/overlay + +# Copy additional files +PRODUCT_COPY_FILES += \ + packages/services/Car/car_product/car_ui_portrait/car_ui_portrait.ini:config.ini \ + packages/services/Car/car_product/car_ui_portrait/bootanimation/bootanimation.zip:system/media/bootanimation.zip + +$(call inherit-product, device/generic/car/emulator/aosp_car_emulator.mk) +$(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_x86_64.mk) + +PRODUCT_NAME := sdk_car_portrait_x86_64 +PRODUCT_MODEL := CarUiPortrait on x86_64 emulator +PRODUCT_CHARACTERISTICS := automotive +PRODUCT_SDK_ADDON_NAME := sdk_car_portrait_x86_64 + +$(call inherit-product, packages/services/Car/car_product/car_ui_portrait/apps/car_ui_portrait_apps.mk) +$(call inherit-product, packages/services/Car/car_product/car_ui_portrait/rro/car_ui_portrait_rro.mk) + +# Use the default goldfish audio implementation +EMULATOR_VENDOR_NO_SOUND := true
\ No newline at end of file diff --git a/sdk_car_x86.mk b/sdk_car_x86.mk new file mode 100644 index 0000000..5fa54e8 --- /dev/null +++ b/sdk_car_x86.mk @@ -0,0 +1,25 @@ +# +# Copyright (C) 2016 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +PRODUCT_PACKAGE_OVERLAYS := device/generic/car/common/overlay + +$(call inherit-product, device/generic/car/emulator/aosp_car_emulator.mk) +$(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_x86.mk) + +EMULATOR_VENDOR_NO_SOUND := true +PRODUCT_NAME := sdk_car_x86 +PRODUCT_DEVICE := emulator_x86 +PRODUCT_BRAND := Android +PRODUCT_MODEL := Car on x86 emulator diff --git a/sdk_car_x86_64.mk b/sdk_car_x86_64.mk new file mode 100644 index 0000000..afe5c39 --- /dev/null +++ b/sdk_car_x86_64.mk @@ -0,0 +1,56 @@ +# +# Copyright (C) 2016 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +PRODUCT_PACKAGE_OVERLAYS := device/generic/car/common/overlay + +QEMU_USE_SYSTEM_EXT_PARTITIONS := true +PRODUCT_USE_DYNAMIC_PARTITIONS := true + +ifneq ($(EMULATOR_DYNAMIC_MULTIDISPLAY_CONFIG),true) +# Emulator configuration +PRODUCT_COPY_FILES += \ + device/generic/car/common/config.ini:config.ini +endif # EMULATOR_DYNAMIC_MULTIDISPLAY_CONFIG + +# +# All components inherited here go to system image +# +$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) +$(call inherit-product, packages/services/Car/car_product/build/car_generic_system.mk) + +PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := strict + +# +# All components inherited here go to system_ext image +# +$(call inherit-product, packages/services/Car/car_product/build/car_system_ext.mk) + +# +# All components inherited here go to product image +# +$(call inherit-product, device/generic/car/emulator/car_emulator_product.mk) + +# +# All components inherited here go to vendor image +# +$(call inherit-product, device/generic/car/emulator/car_emulator_vendor.mk) +$(call inherit-product-if-exists, device/generic/goldfish/x86_64-vendor.mk) +$(call inherit-product, $(SRC_TARGET_DIR)/board/emulator_x86_64/device.mk) + +EMULATOR_VENDOR_NO_SOUND := true +PRODUCT_NAME := sdk_car_x86_64 +PRODUCT_DEVICE := emulator_car_x86_64 +PRODUCT_BRAND := Android +PRODUCT_MODEL := Car on x86_64 emulator |