Merge "camera vts: Remove redundant capabilities fetch" into main
diff --git a/.gitignore b/.gitignore
index 1d74e21..6c7f477 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,4 @@
.vscode/
+
+# Vim temporary files
+**/*.swp
diff --git a/TEST_MAPPING b/TEST_MAPPING
index 25246d8..92cafbd 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -11,6 +11,9 @@
},
{
"name": "VtsHalTvInputV1_0TargetTest"
+ },
+ {
+ "name": "CtsStrictJavaPackagesTestCases"
}
],
"auto-presubmit": [
diff --git a/audio/aidl/TEST_MAPPING b/audio/aidl/TEST_MAPPING
index 81c99f7..b5fcd86 100644
--- a/audio/aidl/TEST_MAPPING
+++ b/audio/aidl/TEST_MAPPING
@@ -51,5 +51,33 @@
{
"name": "VtsHalNSTargetTest"
}
+ ],
+ "postsubmit": [
+ {
+ "name": "VtsHalSpatializerTargetTest"
+ },
+ {
+ "name": "audiorecord_tests"
+ },
+ {
+ "name": "audioeffect_tests"
+ },
+ {
+ "name": "audiorouting_tests"
+ },
+ {
+ "name": "trackplayerbase_tests"
+ },
+ {
+ "name": "audiosystem_tests"
+ },
+ {
+ "name": "CtsVirtualDevicesTestCases",
+ "options" : [
+ {
+ "include-filter": "android.virtualdevice.cts.VirtualAudioTest"
+ }
+ ]
+ }
]
}
diff --git a/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/IEffect.aidl b/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/IEffect.aidl
index 8c196e7..a1b00be 100644
--- a/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/IEffect.aidl
+++ b/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/IEffect.aidl
@@ -41,6 +41,7 @@
android.hardware.audio.effect.State getState();
void setParameter(in android.hardware.audio.effect.Parameter param);
android.hardware.audio.effect.Parameter getParameter(in android.hardware.audio.effect.Parameter.Id paramId);
+ android.hardware.audio.effect.IEffect.OpenEffectReturn reopen();
@FixedSize @VintfStability
parcelable Status {
int status;
diff --git a/audio/aidl/android/hardware/audio/core/IModule.aidl b/audio/aidl/android/hardware/audio/core/IModule.aidl
index 2d4d283..3c5f7f6 100644
--- a/audio/aidl/android/hardware/audio/core/IModule.aidl
+++ b/audio/aidl/android/hardware/audio/core/IModule.aidl
@@ -928,7 +928,10 @@
* using 'connectExternalDevice' method. 'disconnectExternalDevice' method will be called
* soon after this method with the same 'portId'.
*
- * @param portId The ID of the audio port that is about to disconnect
+ * Note: This method is called after the external device is disconnected. The system does
+ * not try to predict the disconnection event.
+ *
+ * @param portId The ID of the audio port corresponding to the disconnected device
* @throws EX_ILLEGAL_ARGUMENT In the following cases:
* - If the port can not be found by the ID.
* - If this is not a connected device port.
diff --git a/audio/aidl/android/hardware/audio/effect/IEffect.aidl b/audio/aidl/android/hardware/audio/effect/IEffect.aidl
index 6097f34..266adec 100644
--- a/audio/aidl/android/hardware/audio/effect/IEffect.aidl
+++ b/audio/aidl/android/hardware/audio/effect/IEffect.aidl
@@ -54,7 +54,16 @@
}
/**
- * Return data structure of IEffect.open() interface.
+ * Return data structure of the IEffect.open() and IEffect.reopen() method.
+ *
+ * Contains Fast Message Queues (FMQs) for effect processing status and input/output data.
+ * The status FMQ remains valid and unchanged after opening, while input/output data FMQs can be
+ * modified with changes in input/output AudioConfig. If reallocation of data FMQ is necessary,
+ * the effect instance must release the existing data FMQs to signal the need to the audio
+ * framework.
+ * When the audio framework encounters a valid status FMQ and invalid input/output data FMQs,
+ * it must invoke the IEffect.reopen() method to request the effect instance to reallocate
+ * the FMQ and return to the audio framework.
*/
@VintfStability
parcelable OpenEffectReturn {
@@ -97,7 +106,7 @@
* client responsibility to make sure all parameter/buffer is correct if client wants to reopen
* a closed instance.
*
- * Effect instance close interface should always succeed unless:
+ * Effect instance close method should always succeed unless:
* 1. The effect instance is not in a proper state to be closed, for example it's still in
* State::PROCESSING state.
* 2. There is system/hardware related failure when close.
@@ -154,8 +163,8 @@
/**
* Get a parameter from the effect instance with parameter ID.
*
- * This interface must return the current parameter of the effect instance, if no parameter
- * has been set by client yet, the default value must be returned.
+ * This method must return the current parameter of the effect instance, if no parameter has
+ * been set by client yet, the default value must be returned.
*
* Must be available for the effect instance after open().
*
@@ -165,4 +174,24 @@
* @throws EX_ILLEGAL_ARGUMENT if the effect instance receive unsupported parameter tag.
*/
Parameter getParameter(in Parameter.Id paramId);
+
+ /**
+ * Reopen the effect instance, keeping all previous parameters unchanged, and reallocate only
+ * the Fast Message Queues (FMQs) allocated during the open time as needed.
+ *
+ * When the audio framework encounters a valid status FMQ and invalid data FMQ(s), it calls
+ * this method to reopen the effect and request the latest data FMQ.
+ * Upon receiving this call, if the effect instance's data FMQ(s) is invalid, it must reallocate
+ * the necessary data FMQ(s) and return them to the audio framework. All previous parameters and
+ * states keep unchanged.
+ * Once the audio framework successfully completes the call, it must validate the returned FMQs,
+ * deprecate all old FMQs, and exclusively use the FMQs returned from this method.
+ *
+ * @return The reallocated data FMQ and the original status FMQ.
+ *
+ * @throws EX_ILLEGAL_STATE if the effect instance is not in a proper state to reallocate FMQ.
+ * This may occur if the effect instance has already been closed or if there is no need to
+ * update any data FMQ.
+ */
+ OpenEffectReturn reopen();
}
diff --git a/audio/aidl/android/hardware/audio/effect/Spatializer.aidl b/audio/aidl/android/hardware/audio/effect/Spatializer.aidl
index 6ebe0d5..71e3ffe 100644
--- a/audio/aidl/android/hardware/audio/effect/Spatializer.aidl
+++ b/audio/aidl/android/hardware/audio/effect/Spatializer.aidl
@@ -67,7 +67,8 @@
Spatialization.Mode spatializationMode;
/**
- * Head tracking sensor ID.
+ * Identifies the head tracking sensor using its unique sensor ID.
+ * The value corresponds to android.hardware.sensors.SensorInfo.sensorHandle.
*/
int headTrackingSensorId;
diff --git a/audio/aidl/android/hardware/audio/effect/state.gv b/audio/aidl/android/hardware/audio/effect/state.gv
index ce369ba..22c70c8 100644
--- a/audio/aidl/android/hardware/audio/effect/state.gv
+++ b/audio/aidl/android/hardware/audio/effect/state.gv
@@ -31,6 +31,8 @@
IDLE -> INIT[label = "IEffect.close()"];
INIT -> INIT[label = "IEffect.getState\nIEffect.getDescriptor"];
- IDLE -> IDLE[label = "IEffect.getParameter\nIEffect.setParameter\nIEffect.getDescriptor\nIEffect.command(RESET)"];
- PROCESSING -> PROCESSING[label = "IEffect.getParameter\nIEffect.setParameter\nIEffect.getDescriptor"];
+ IDLE -> IDLE[label = "IEffect.getParameter\nIEffect.setParameter\nIEffect.getDescriptor\nIEffect.command(RESET)\nIEffect.reopen"];
+ PROCESSING
+ -> PROCESSING
+ [label = "IEffect.getParameter\nIEffect.setParameter\nIEffect.getDescriptor\nIEffect.reopen"];
}
diff --git a/audio/aidl/default/Android.bp b/audio/aidl/default/Android.bp
index 7cd0545..bfa2783 100644
--- a/audio/aidl/default/Android.bp
+++ b/audio/aidl/default/Android.bp
@@ -204,6 +204,7 @@
vendor: true,
shared_libs: [
"libaudioaidlcommon",
+ "libaudioutils",
"libbase",
"libbinder_ndk",
"libcutils",
@@ -229,6 +230,7 @@
filegroup {
name: "effectCommonFile",
srcs: [
+ "EffectContext.cpp",
"EffectThread.cpp",
"EffectImpl.cpp",
],
diff --git a/audio/aidl/default/Configuration.cpp b/audio/aidl/default/Configuration.cpp
index baaa55f..2a8e58f 100644
--- a/audio/aidl/default/Configuration.cpp
+++ b/audio/aidl/default/Configuration.cpp
@@ -32,7 +32,6 @@
using aidl::android::media::audio::common::AudioFormatDescription;
using aidl::android::media::audio::common::AudioFormatType;
using aidl::android::media::audio::common::AudioGainConfig;
-using aidl::android::media::audio::common::AudioInputFlags;
using aidl::android::media::audio::common::AudioIoFlags;
using aidl::android::media::audio::common::AudioOutputFlags;
using aidl::android::media::audio::common::AudioPort;
@@ -322,25 +321,20 @@
//
// Mix ports:
// * "r_submix output", maximum 10 opened streams, maximum 10 active streams
-// - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
+// - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000
// * "r_submix input", maximum 10 opened streams, maximum 10 active streams
-// - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
-// * "r_submix output direct", DIRECT|IEC958_NONAUDIO, 1 max open, 1 max active
-// - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
-// * "r_submix input direct", DIRECT, 1 max open, 1 max active
-// - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
-
+// - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000
//
// Routes:
-// "r_submix output", "r_submix output direct" -> "Remote Submix Out"
-// "Remote Submix In" -> "r_submix input", "r_submix input direct"
+// "r_submix output" -> "Remote Submix Out"
+// "Remote Submix In" -> "r_submix input"
//
std::unique_ptr<Configuration> getRSubmixConfiguration() {
static const Configuration configuration = []() {
Configuration c;
const std::vector<AudioProfile> remoteSubmixPcmAudioProfiles{
createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO},
- {8000, 11025, 16000, 32000, 44100, 48000, 192000})};
+ {8000, 11025, 16000, 32000, 44100, 48000})};
// Device ports
@@ -365,41 +359,13 @@
rsubmixOutMix.profiles = remoteSubmixPcmAudioProfiles;
c.ports.push_back(rsubmixOutMix);
- // Adding a DIRECT flag to rsubmixInMix breaks the mixer paths, so we need separate
- // non direct and direct paths. It is added because for IEC61937 encapsulated over PCM, we
- // need the DIRECT and IEC958_NONAUDIO flags as AudioFlinger adds them.
- AudioPort rsubmixOutDirectMix =
- createPort(c.nextPortId++, "r_submix output direct",
- makeBitPositionFlagMask({
- AudioOutputFlags::DIRECT,
- AudioOutputFlags::IEC958_NONAUDIO}),
- false /* isInput */,
- createPortMixExt(1 /* maxOpenStreamCount */,
- 1 /* maxActiveStreamCount */));
- rsubmixOutDirectMix.profiles = remoteSubmixPcmAudioProfiles;
- c.ports.push_back(rsubmixOutDirectMix);
-
AudioPort rsubmixInMix =
createPort(c.nextPortId++, "r_submix input", 0, true, createPortMixExt(10, 10));
rsubmixInMix.profiles = remoteSubmixPcmAudioProfiles;
c.ports.push_back(rsubmixInMix);
- // Adding a DIRECT flag to rsubmixInMix breaks the capture paths, so we need separate
- // non direct and direct paths. It is added because for IEC61937 encapsulated over PCM, we
- // need the DIRECT flag for the capability so AudioFlinger can find a DIRECT input match.
- AudioPort rsubmixInDirectMix =
- createPort(c.nextPortId++, "r_submix input direct",
- makeBitPositionFlagMask({AudioInputFlags::DIRECT}),
- true /* isInput */,
- createPortMixExt(1 /* maxOpenStreamCount */,
- 1 /* maxActiveStreamCount */));
- rsubmixInDirectMix.profiles = remoteSubmixPcmAudioProfiles;
- c.ports.push_back(rsubmixInDirectMix);
-
- c.routes.push_back(createRoute(
- {rsubmixOutMix, rsubmixOutDirectMix}, rsubmixOutDevice));
+ c.routes.push_back(createRoute({rsubmixOutMix}, rsubmixOutDevice));
c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInMix));
- c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInDirectMix));
return c;
}();
diff --git a/audio/aidl/default/EffectContext.cpp b/audio/aidl/default/EffectContext.cpp
new file mode 100644
index 0000000..2e12918
--- /dev/null
+++ b/audio/aidl/default/EffectContext.cpp
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 <memory>
+#define LOG_TAG "AHAL_EffectContext"
+#include "effect-impl/EffectContext.h"
+#include "include/effect-impl/EffectTypes.h"
+
+using aidl::android::hardware::audio::common::getChannelCount;
+using aidl::android::hardware::audio::common::getFrameSizeInBytes;
+using aidl::android::hardware::audio::effect::IEffect;
+using aidl::android::media::audio::common::PcmType;
+using ::android::hardware::EventFlag;
+
+namespace aidl::android::hardware::audio::effect {
+
+EffectContext::EffectContext(size_t statusDepth, const Parameter::Common& common) {
+ LOG_ALWAYS_FATAL_IF(RetCode::SUCCESS != setCommon(common), "illegalCommonParameter");
+
+ // in/outBuffer size in float (FMQ data format defined for DataMQ)
+ size_t inBufferSizeInFloat = common.input.frameCount * mInputFrameSize / sizeof(float);
+ size_t outBufferSizeInFloat = common.output.frameCount * mOutputFrameSize / sizeof(float);
+
+ // only status FMQ use the EventFlag
+ mStatusMQ = std::make_shared<StatusMQ>(statusDepth, true /*configureEventFlagWord*/);
+ mInputMQ = std::make_shared<DataMQ>(inBufferSizeInFloat);
+ mOutputMQ = std::make_shared<DataMQ>(outBufferSizeInFloat);
+
+ if (!mStatusMQ->isValid() || !mInputMQ->isValid() || !mOutputMQ->isValid()) {
+ LOG(ERROR) << __func__ << " created invalid FMQ";
+ }
+
+ ::android::status_t status =
+ EventFlag::createEventFlag(mStatusMQ->getEventFlagWord(), &mEfGroup);
+ LOG_ALWAYS_FATAL_IF(status != ::android::OK || !mEfGroup, " create EventFlagGroup failed ");
+ mWorkBuffer.reserve(std::max(inBufferSizeInFloat, outBufferSizeInFloat));
+}
+
+// reset buffer status by abandon input data in FMQ
+void EffectContext::resetBuffer() {
+ auto buffer = static_cast<float*>(mWorkBuffer.data());
+ std::vector<IEffect::Status> status(mStatusMQ->availableToRead());
+ if (mInputMQ) {
+ mInputMQ->read(buffer, mInputMQ->availableToRead());
+ }
+}
+
+void EffectContext::dupeFmqWithReopen(IEffect::OpenEffectReturn* effectRet) {
+ if (!mInputMQ) {
+ mInputMQ = std::make_shared<DataMQ>(mCommon.input.frameCount * mInputFrameSize /
+ sizeof(float));
+ }
+ if (!mOutputMQ) {
+ mOutputMQ = std::make_shared<DataMQ>(mCommon.output.frameCount * mOutputFrameSize /
+ sizeof(float));
+ }
+ dupeFmq(effectRet);
+}
+
+void EffectContext::dupeFmq(IEffect::OpenEffectReturn* effectRet) {
+ if (effectRet) {
+ effectRet->statusMQ = mStatusMQ->dupeDesc();
+ effectRet->inputDataMQ = mInputMQ->dupeDesc();
+ effectRet->outputDataMQ = mOutputMQ->dupeDesc();
+ }
+}
+
+float* EffectContext::getWorkBuffer() {
+ return static_cast<float*>(mWorkBuffer.data());
+}
+
+std::shared_ptr<EffectContext::StatusMQ> EffectContext::getStatusFmq() const {
+ return mStatusMQ;
+}
+
+std::shared_ptr<EffectContext::DataMQ> EffectContext::getInputDataFmq() const {
+ return mInputMQ;
+}
+
+std::shared_ptr<EffectContext::DataMQ> EffectContext::getOutputDataFmq() const {
+ return mOutputMQ;
+}
+
+size_t EffectContext::getInputFrameSize() const {
+ return mInputFrameSize;
+}
+
+size_t EffectContext::getOutputFrameSize() const {
+ return mOutputFrameSize;
+}
+
+int EffectContext::getSessionId() const {
+ return mCommon.session;
+}
+
+int EffectContext::getIoHandle() const {
+ return mCommon.ioHandle;
+}
+
+RetCode EffectContext::setOutputDevice(
+ const std::vector<aidl::android::media::audio::common::AudioDeviceDescription>& device) {
+ mOutputDevice = device;
+ return RetCode::SUCCESS;
+}
+
+std::vector<aidl::android::media::audio::common::AudioDeviceDescription>
+EffectContext::getOutputDevice() {
+ return mOutputDevice;
+}
+
+RetCode EffectContext::setAudioMode(const aidl::android::media::audio::common::AudioMode& mode) {
+ mMode = mode;
+ return RetCode::SUCCESS;
+}
+aidl::android::media::audio::common::AudioMode EffectContext::getAudioMode() {
+ return mMode;
+}
+
+RetCode EffectContext::setAudioSource(
+ const aidl::android::media::audio::common::AudioSource& source) {
+ mSource = source;
+ return RetCode::SUCCESS;
+}
+
+aidl::android::media::audio::common::AudioSource EffectContext::getAudioSource() {
+ return mSource;
+}
+
+RetCode EffectContext::setVolumeStereo(const Parameter::VolumeStereo& volumeStereo) {
+ mVolumeStereo = volumeStereo;
+ return RetCode::SUCCESS;
+}
+
+Parameter::VolumeStereo EffectContext::getVolumeStereo() {
+ return mVolumeStereo;
+}
+
+RetCode EffectContext::setCommon(const Parameter::Common& common) {
+ LOG(VERBOSE) << __func__ << common.toString();
+ auto& input = common.input;
+ auto& output = common.output;
+
+ if (input.base.format.pcm != aidl::android::media::audio::common::PcmType::FLOAT_32_BIT ||
+ output.base.format.pcm != aidl::android::media::audio::common::PcmType::FLOAT_32_BIT) {
+ LOG(ERROR) << __func__ << " illegal IO, input "
+ << ::android::internal::ToString(input.base.format) << ", output "
+ << ::android::internal::ToString(output.base.format);
+ return RetCode::ERROR_ILLEGAL_PARAMETER;
+ }
+
+ if (auto ret = updateIOFrameSize(common); ret != RetCode::SUCCESS) {
+ return ret;
+ }
+
+ mInputChannelCount = getChannelCount(input.base.channelMask);
+ mOutputChannelCount = getChannelCount(output.base.channelMask);
+ if (mInputChannelCount == 0 || mOutputChannelCount == 0) {
+ LOG(ERROR) << __func__ << " illegal channel count input " << mInputChannelCount
+ << ", output " << mOutputChannelCount;
+ return RetCode::ERROR_ILLEGAL_PARAMETER;
+ }
+
+ mCommon = common;
+ return RetCode::SUCCESS;
+}
+
+Parameter::Common EffectContext::getCommon() {
+ LOG(VERBOSE) << __func__ << mCommon.toString();
+ return mCommon;
+}
+
+EventFlag* EffectContext::getStatusEventFlag() {
+ return mEfGroup;
+}
+
+RetCode EffectContext::updateIOFrameSize(const Parameter::Common& common) {
+ const auto iFrameSize = ::aidl::android::hardware::audio::common::getFrameSizeInBytes(
+ common.input.base.format, common.input.base.channelMask);
+ const auto oFrameSize = ::aidl::android::hardware::audio::common::getFrameSizeInBytes(
+ common.output.base.format, common.output.base.channelMask);
+
+ bool needUpdateMq = false;
+ if (mInputMQ &&
+ (mInputFrameSize != iFrameSize || mCommon.input.frameCount != common.input.frameCount)) {
+ mInputMQ.reset();
+ needUpdateMq = true;
+ }
+ if (mOutputMQ &&
+ (mOutputFrameSize != oFrameSize || mCommon.output.frameCount != common.output.frameCount)) {
+ mOutputMQ.reset();
+ needUpdateMq = true;
+ }
+ mInputFrameSize = iFrameSize;
+ mOutputFrameSize = oFrameSize;
+ if (needUpdateMq) {
+ return notifyDataMqUpdate();
+ }
+ return RetCode::SUCCESS;
+}
+
+RetCode EffectContext::notifyDataMqUpdate() {
+ if (!mEfGroup) {
+ LOG(ERROR) << __func__ << ": invalid EventFlag group";
+ return RetCode::ERROR_EVENT_FLAG_ERROR;
+ }
+
+ if (const auto ret = mEfGroup->wake(kEventFlagDataMqUpdate); ret != ::android::OK) {
+ LOG(ERROR) << __func__ << ": wake failure with ret " << ret;
+ return RetCode::ERROR_EVENT_FLAG_ERROR;
+ }
+ LOG(DEBUG) << __func__ << " : signal client for reopen";
+ return RetCode::SUCCESS;
+}
+} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/EffectImpl.cpp b/audio/aidl/default/EffectImpl.cpp
index c81c731..b76269a 100644
--- a/audio/aidl/default/EffectImpl.cpp
+++ b/audio/aidl/default/EffectImpl.cpp
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+#include <memory>
#define LOG_TAG "AHAL_EffectImpl"
#include "effect-impl/EffectImpl.h"
#include "effect-impl/EffectTypes.h"
@@ -22,6 +23,7 @@
using aidl::android::hardware::audio::effect::IEffect;
using aidl::android::hardware::audio::effect::State;
using aidl::android::media::audio::common::PcmType;
+using ::android::hardware::EventFlag;
extern "C" binder_exception_t destroyEffect(const std::shared_ptr<IEffect>& instanceSp) {
State state;
@@ -45,40 +47,62 @@
RETURN_IF(common.input.base.format.pcm != common.output.base.format.pcm ||
common.input.base.format.pcm != PcmType::FLOAT_32_BIT,
EX_ILLEGAL_ARGUMENT, "dataMustBe32BitsFloat");
+ std::lock_guard lg(mImplMutex);
RETURN_OK_IF(mState != State::INIT);
- auto context = createContext(common);
- RETURN_IF(!context, EX_NULL_POINTER, "createContextFailed");
+ mImplContext = createContext(common);
+ RETURN_IF(!mImplContext, EX_NULL_POINTER, "nullContext");
+ mEventFlag = mImplContext->getStatusEventFlag();
if (specific.has_value()) {
RETURN_IF_ASTATUS_NOT_OK(setParameterSpecific(specific.value()), "setSpecParamErr");
}
mState = State::IDLE;
- context->dupeFmq(ret);
- RETURN_IF(createThread(context, getEffectName()) != RetCode::SUCCESS, EX_UNSUPPORTED_OPERATION,
+ mImplContext->dupeFmq(ret);
+ RETURN_IF(createThread(getEffectName()) != RetCode::SUCCESS, EX_UNSUPPORTED_OPERATION,
"FailedToCreateWorker");
return ndk::ScopedAStatus::ok();
}
-ndk::ScopedAStatus EffectImpl::close() {
- RETURN_OK_IF(mState == State::INIT);
- RETURN_IF(mState == State::PROCESSING, EX_ILLEGAL_STATE, "closeAtProcessing");
+ndk::ScopedAStatus EffectImpl::reopen(OpenEffectReturn* ret) {
+ std::lock_guard lg(mImplMutex);
+ RETURN_IF(mState == State::INIT, EX_ILLEGAL_STATE, "alreadyClosed");
+ // TODO: b/302036943 add reopen implementation
+ RETURN_IF(!mImplContext, EX_NULL_POINTER, "nullContext");
+ mImplContext->dupeFmqWithReopen(ret);
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus EffectImpl::close() {
+ {
+ std::lock_guard lg(mImplMutex);
+ RETURN_OK_IF(mState == State::INIT);
+ RETURN_IF(mState == State::PROCESSING, EX_ILLEGAL_STATE, "closeAtProcessing");
+ mState = State::INIT;
+ }
+
+ RETURN_IF(notifyEventFlag(kEventFlagNotEmpty) != RetCode::SUCCESS, EX_ILLEGAL_STATE,
+ "notifyEventFlagFailed");
// stop the worker thread, ignore the return code
RETURN_IF(destroyThread() != RetCode::SUCCESS, EX_UNSUPPORTED_OPERATION,
"FailedToDestroyWorker");
- mState = State::INIT;
- RETURN_IF(releaseContext() != RetCode::SUCCESS, EX_UNSUPPORTED_OPERATION,
- "FailedToCreateWorker");
+
+ {
+ std::lock_guard lg(mImplMutex);
+ releaseContext();
+ mImplContext.reset();
+ }
LOG(DEBUG) << getEffectName() << __func__;
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus EffectImpl::setParameter(const Parameter& param) {
+ std::lock_guard lg(mImplMutex);
LOG(VERBOSE) << getEffectName() << __func__ << " with: " << param.toString();
- const auto tag = param.getTag();
+ const auto& tag = param.getTag();
switch (tag) {
case Parameter::common:
case Parameter::deviceDescription:
@@ -100,8 +124,8 @@
}
ndk::ScopedAStatus EffectImpl::getParameter(const Parameter::Id& id, Parameter* param) {
- auto tag = id.getTag();
- switch (tag) {
+ std::lock_guard lg(mImplMutex);
+ switch (id.getTag()) {
case Parameter::Id::commonTag: {
RETURN_IF_ASTATUS_NOT_OK(getParameterCommon(id.get<Parameter::Id::commonTag>(), param),
"CommonParamNotSupported");
@@ -121,30 +145,30 @@
}
ndk::ScopedAStatus EffectImpl::setParameterCommon(const Parameter& param) {
- auto context = getContext();
- RETURN_IF(!context, EX_NULL_POINTER, "nullContext");
+ RETURN_IF(!mImplContext, EX_NULL_POINTER, "nullContext");
- auto tag = param.getTag();
+ const auto& tag = param.getTag();
switch (tag) {
case Parameter::common:
- RETURN_IF(context->setCommon(param.get<Parameter::common>()) != RetCode::SUCCESS,
+ RETURN_IF(mImplContext->setCommon(param.get<Parameter::common>()) != RetCode::SUCCESS,
EX_ILLEGAL_ARGUMENT, "setCommFailed");
break;
case Parameter::deviceDescription:
- RETURN_IF(context->setOutputDevice(param.get<Parameter::deviceDescription>()) !=
+ RETURN_IF(mImplContext->setOutputDevice(param.get<Parameter::deviceDescription>()) !=
RetCode::SUCCESS,
EX_ILLEGAL_ARGUMENT, "setDeviceFailed");
break;
case Parameter::mode:
- RETURN_IF(context->setAudioMode(param.get<Parameter::mode>()) != RetCode::SUCCESS,
+ RETURN_IF(mImplContext->setAudioMode(param.get<Parameter::mode>()) != RetCode::SUCCESS,
EX_ILLEGAL_ARGUMENT, "setModeFailed");
break;
case Parameter::source:
- RETURN_IF(context->setAudioSource(param.get<Parameter::source>()) != RetCode::SUCCESS,
+ RETURN_IF(mImplContext->setAudioSource(param.get<Parameter::source>()) !=
+ RetCode::SUCCESS,
EX_ILLEGAL_ARGUMENT, "setSourceFailed");
break;
case Parameter::volumeStereo:
- RETURN_IF(context->setVolumeStereo(param.get<Parameter::volumeStereo>()) !=
+ RETURN_IF(mImplContext->setVolumeStereo(param.get<Parameter::volumeStereo>()) !=
RetCode::SUCCESS,
EX_ILLEGAL_ARGUMENT, "setVolumeStereoFailed");
break;
@@ -159,28 +183,27 @@
}
ndk::ScopedAStatus EffectImpl::getParameterCommon(const Parameter::Tag& tag, Parameter* param) {
- auto context = getContext();
- RETURN_IF(!context, EX_NULL_POINTER, "nullContext");
+ RETURN_IF(!mImplContext, EX_NULL_POINTER, "nullContext");
switch (tag) {
case Parameter::common: {
- param->set<Parameter::common>(context->getCommon());
+ param->set<Parameter::common>(mImplContext->getCommon());
break;
}
case Parameter::deviceDescription: {
- param->set<Parameter::deviceDescription>(context->getOutputDevice());
+ param->set<Parameter::deviceDescription>(mImplContext->getOutputDevice());
break;
}
case Parameter::mode: {
- param->set<Parameter::mode>(context->getAudioMode());
+ param->set<Parameter::mode>(mImplContext->getAudioMode());
break;
}
case Parameter::source: {
- param->set<Parameter::source>(context->getAudioSource());
+ param->set<Parameter::source>(mImplContext->getAudioSource());
break;
}
case Parameter::volumeStereo: {
- param->set<Parameter::volumeStereo>(context->getVolumeStereo());
+ param->set<Parameter::volumeStereo>(mImplContext->getVolumeStereo());
break;
}
default: {
@@ -192,30 +215,34 @@
return ndk::ScopedAStatus::ok();
}
-ndk::ScopedAStatus EffectImpl::getState(State* state) {
+ndk::ScopedAStatus EffectImpl::getState(State* state) NO_THREAD_SAFETY_ANALYSIS {
*state = mState;
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus EffectImpl::command(CommandId command) {
- RETURN_IF(mState == State::INIT, EX_ILLEGAL_STATE, "CommandStateError");
+ std::lock_guard lg(mImplMutex);
+ RETURN_IF(mState == State::INIT, EX_ILLEGAL_STATE, "instanceNotOpen");
LOG(DEBUG) << getEffectName() << __func__ << ": receive command: " << toString(command)
<< " at state " << toString(mState);
switch (command) {
case CommandId::START:
- RETURN_IF(mState == State::INIT, EX_ILLEGAL_STATE, "instanceNotOpen");
RETURN_OK_IF(mState == State::PROCESSING);
RETURN_IF_ASTATUS_NOT_OK(commandImpl(command), "commandImplFailed");
- startThread();
mState = State::PROCESSING;
+ RETURN_IF(notifyEventFlag(kEventFlagNotEmpty) != RetCode::SUCCESS, EX_ILLEGAL_STATE,
+ "notifyEventFlagFailed");
+ startThread();
break;
case CommandId::STOP:
case CommandId::RESET:
RETURN_OK_IF(mState == State::IDLE);
+ mState = State::IDLE;
+ RETURN_IF(notifyEventFlag(kEventFlagNotEmpty) != RetCode::SUCCESS, EX_ILLEGAL_STATE,
+ "notifyEventFlagFailed");
stopThread();
RETURN_IF_ASTATUS_NOT_OK(commandImpl(command), "commandImplFailed");
- mState = State::IDLE;
break;
default:
LOG(ERROR) << getEffectName() << __func__ << " instance still processing";
@@ -227,19 +254,41 @@
}
ndk::ScopedAStatus EffectImpl::commandImpl(CommandId command) {
- auto context = getContext();
- RETURN_IF(!context, EX_NULL_POINTER, "nullContext");
+ RETURN_IF(!mImplContext, EX_NULL_POINTER, "nullContext");
if (command == CommandId::RESET) {
- context->resetBuffer();
+ mImplContext->resetBuffer();
}
return ndk::ScopedAStatus::ok();
}
+std::shared_ptr<EffectContext> EffectImpl::createContext(const Parameter::Common& common) {
+ return std::make_shared<EffectContext>(1 /* statusMqDepth */, common);
+}
+
+RetCode EffectImpl::releaseContext() {
+ if (mImplContext) {
+ mImplContext.reset();
+ }
+ return RetCode::SUCCESS;
+}
+
void EffectImpl::cleanUp() {
command(CommandId::STOP);
close();
}
+RetCode EffectImpl::notifyEventFlag(uint32_t flag) {
+ if (!mEventFlag) {
+ LOG(ERROR) << getEffectName() << __func__ << ": StatusEventFlag invalid";
+ return RetCode::ERROR_EVENT_FLAG_ERROR;
+ }
+ if (const auto ret = mEventFlag->wake(flag); ret != ::android::OK) {
+ LOG(ERROR) << getEffectName() << __func__ << ": wake failure with ret " << ret;
+ return RetCode::ERROR_EVENT_FLAG_ERROR;
+ }
+ return RetCode::SUCCESS;
+}
+
IEffect::Status EffectImpl::status(binder_status_t status, size_t consumed, size_t produced) {
IEffect::Status ret;
ret.status = status;
@@ -248,6 +297,48 @@
return ret;
}
+void EffectImpl::process() {
+ /**
+ * wait for the EventFlag without lock, it's ok because the mEfGroup pointer will not change
+ * in the life cycle of workerThread (threadLoop).
+ */
+ uint32_t efState = 0;
+ if (!mEventFlag ||
+ ::android::OK != mEventFlag->wait(kEventFlagNotEmpty, &efState, 0 /* no timeout */,
+ true /* retry */) ||
+ !(efState & kEventFlagNotEmpty)) {
+ LOG(ERROR) << getEffectName() << __func__ << ": StatusEventFlag - " << mEventFlag
+ << " efState - " << std::hex << efState;
+ return;
+ }
+
+ {
+ std::lock_guard lg(mImplMutex);
+ if (mState != State::PROCESSING) {
+ LOG(DEBUG) << getEffectName() << " skip process in state: " << toString(mState);
+ return;
+ }
+ RETURN_VALUE_IF(!mImplContext, void(), "nullContext");
+ auto statusMQ = mImplContext->getStatusFmq();
+ auto inputMQ = mImplContext->getInputDataFmq();
+ auto outputMQ = mImplContext->getOutputDataFmq();
+ auto buffer = mImplContext->getWorkBuffer();
+ if (!inputMQ || !outputMQ) {
+ return;
+ }
+
+ auto processSamples = inputMQ->availableToRead();
+ if (processSamples) {
+ inputMQ->read(buffer, processSamples);
+ IEffect::Status status = effectProcessImpl(buffer, buffer, processSamples);
+ outputMQ->write(buffer, status.fmqProduced);
+ statusMQ->writeBlocking(&status, 1);
+ LOG(VERBOSE) << getEffectName() << __func__ << ": done processing, effect consumed "
+ << status.fmqConsumed << " produced " << status.fmqProduced;
+ }
+ }
+}
+
// A placeholder processing implementation to copy samples from input to output
IEffect::Status EffectImpl::effectProcessImpl(float* in, float* out, int samples) {
for (int i = 0; i < samples; i++) {
diff --git a/audio/aidl/default/EffectThread.cpp b/audio/aidl/default/EffectThread.cpp
index 47ba9f4..fdd4803 100644
--- a/audio/aidl/default/EffectThread.cpp
+++ b/audio/aidl/default/EffectThread.cpp
@@ -25,8 +25,6 @@
#include "effect-impl/EffectThread.h"
#include "effect-impl/EffectTypes.h"
-using ::android::hardware::EventFlag;
-
namespace aidl::android::hardware::audio::effect {
EffectThread::EffectThread() {
@@ -38,31 +36,18 @@
LOG(DEBUG) << __func__ << " done";
}
-RetCode EffectThread::createThread(std::shared_ptr<EffectContext> context, const std::string& name,
- int priority) {
+RetCode EffectThread::createThread(const std::string& name, int priority) {
if (mThread.joinable()) {
LOG(WARNING) << mName << __func__ << " thread already created, no-op";
return RetCode::SUCCESS;
}
+
mName = name;
mPriority = priority;
{
std::lock_guard lg(mThreadMutex);
mStop = true;
mExit = false;
- mThreadContext = std::move(context);
- auto statusMQ = mThreadContext->getStatusFmq();
- EventFlag* efGroup = nullptr;
- ::android::status_t status =
- EventFlag::createEventFlag(statusMQ->getEventFlagWord(), &efGroup);
- if (status != ::android::OK || !efGroup) {
- LOG(ERROR) << mName << __func__ << " create EventFlagGroup failed " << status
- << " efGroup " << efGroup;
- return RetCode::ERROR_THREAD;
- }
- mEfGroup.reset(efGroup);
- // kickoff and wait for commands (CommandId::START/STOP) or IEffect.close from client
- mEfGroup->wake(kEventFlagNotEmpty);
}
mThread = std::thread(&EffectThread::threadLoop, this);
@@ -75,16 +60,12 @@
std::lock_guard lg(mThreadMutex);
mStop = mExit = true;
}
- mCv.notify_one();
+ mCv.notify_one();
if (mThread.joinable()) {
mThread.join();
}
- {
- std::lock_guard lg(mThreadMutex);
- mThreadContext.reset();
- }
LOG(DEBUG) << mName << __func__;
return RetCode::SUCCESS;
}
@@ -96,7 +77,6 @@
mCv.notify_one();
}
- mEfGroup->wake(kEventFlagNotEmpty);
LOG(DEBUG) << mName << __func__;
return RetCode::SUCCESS;
}
@@ -108,7 +88,6 @@
mCv.notify_one();
}
- mEfGroup->wake(kEventFlagNotEmpty);
LOG(DEBUG) << mName << __func__;
return RetCode::SUCCESS;
}
@@ -117,13 +96,6 @@
pthread_setname_np(pthread_self(), mName.substr(0, kMaxTaskNameLen - 1).c_str());
setpriority(PRIO_PROCESS, 0, mPriority);
while (true) {
- /**
- * wait for the EventFlag without lock, it's ok because the mEfGroup pointer will not change
- * in the life cycle of workerThread (threadLoop).
- */
- uint32_t efState = 0;
- mEfGroup->wait(kEventFlagNotEmpty, &efState);
-
{
std::unique_lock l(mThreadMutex);
::android::base::ScopedLockAssertion lock_assertion(mThreadMutex);
@@ -132,27 +104,8 @@
LOG(INFO) << __func__ << " EXIT!";
return;
}
- process_l();
}
- }
-}
-
-void EffectThread::process_l() {
- RETURN_VALUE_IF(!mThreadContext, void(), "nullContext");
-
- auto statusMQ = mThreadContext->getStatusFmq();
- auto inputMQ = mThreadContext->getInputDataFmq();
- auto outputMQ = mThreadContext->getOutputDataFmq();
- auto buffer = mThreadContext->getWorkBuffer();
-
- auto processSamples = inputMQ->availableToRead();
- if (processSamples) {
- inputMQ->read(buffer, processSamples);
- IEffect::Status status = effectProcessImpl(buffer, buffer, processSamples);
- outputMQ->write(buffer, status.fmqProduced);
- statusMQ->writeBlocking(&status, 1);
- LOG(VERBOSE) << mName << __func__ << ": done processing, effect consumed "
- << status.fmqConsumed << " produced " << status.fmqProduced;
+ process();
}
}
diff --git a/audio/aidl/default/Module.cpp b/audio/aidl/default/Module.cpp
index d0e8745..94aa4dc 100644
--- a/audio/aidl/default/Module.cpp
+++ b/audio/aidl/default/Module.cpp
@@ -93,32 +93,6 @@
return std::all_of(profiles.begin(), profiles.end(), isDynamicProfile);
}
-// Note: does not assign an ID to the config.
-bool generateDefaultPortConfig(const AudioPort& port, AudioPortConfig* config) {
- const bool allowDynamicConfig = port.ext.getTag() == AudioPortExt::device;
- *config = {};
- config->portId = port.id;
- for (const auto& profile : port.profiles) {
- if (isDynamicProfile(profile)) continue;
- config->format = profile.format;
- config->channelMask = *profile.channelMasks.begin();
- config->sampleRate = Int{.value = *profile.sampleRates.begin()};
- config->flags = port.flags;
- config->ext = port.ext;
- return true;
- }
- if (allowDynamicConfig) {
- config->format = AudioFormatDescription{};
- config->channelMask = AudioChannelLayout{};
- config->sampleRate = Int{.value = 0};
- config->flags = port.flags;
- config->ext = port.ext;
- return true;
- }
- LOG(ERROR) << __func__ << ": port " << port.id << " only has dynamic profiles";
- return false;
-}
-
bool findAudioProfile(const AudioPort& port, const AudioFormatDescription& format,
AudioProfile* profile) {
if (auto profilesIt =
@@ -204,10 +178,11 @@
}
auto& configs = getConfig().portConfigs;
auto portConfigIt = findById<AudioPortConfig>(configs, in_portConfigId);
+ const int32_t nominalLatencyMs = getNominalLatencyMs(*portConfigIt);
// Since this is a private method, it is assumed that
// validity of the portConfigId has already been checked.
- const int32_t minimumStreamBufferSizeFrames = calculateBufferSizeFrames(
- getNominalLatencyMs(*portConfigIt), portConfigIt->sampleRate.value().value);
+ const int32_t minimumStreamBufferSizeFrames =
+ calculateBufferSizeFrames(nominalLatencyMs, portConfigIt->sampleRate.value().value);
if (in_bufferSizeFrames < minimumStreamBufferSizeFrames) {
LOG(ERROR) << __func__ << ": insufficient buffer size " << in_bufferSizeFrames
<< ", must be at least " << minimumStreamBufferSizeFrames;
@@ -246,7 +221,7 @@
std::make_unique<StreamContext::CommandMQ>(1, true /*configureEventFlagWord*/),
std::make_unique<StreamContext::ReplyMQ>(1, true /*configureEventFlagWord*/),
portConfigIt->format.value(), portConfigIt->channelMask.value(),
- portConfigIt->sampleRate.value().value, flags, getNominalLatencyMs(*portConfigIt),
+ portConfigIt->sampleRate.value().value, flags, nominalLatencyMs,
portConfigIt->ext.get<AudioPortExt::mix>().handle,
std::make_unique<StreamContext::DataMQ>(frameSize * in_bufferSizeFrames),
asyncCallback, outEventCallback, mSoundDose.getInstance(), params);
@@ -332,6 +307,29 @@
return ndk::ScopedAStatus::ok();
}
+bool Module::generateDefaultPortConfig(const AudioPort& port, AudioPortConfig* config) {
+ const bool allowDynamicConfig = port.ext.getTag() == AudioPortExt::device;
+ for (const auto& profile : port.profiles) {
+ if (isDynamicProfile(profile)) continue;
+ config->format = profile.format;
+ config->channelMask = *profile.channelMasks.begin();
+ config->sampleRate = Int{.value = *profile.sampleRates.begin()};
+ config->flags = port.flags;
+ config->ext = port.ext;
+ return true;
+ }
+ if (allowDynamicConfig) {
+ config->format = AudioFormatDescription{};
+ config->channelMask = AudioChannelLayout{};
+ config->sampleRate = Int{.value = 0};
+ config->flags = port.flags;
+ config->ext = port.ext;
+ return true;
+ }
+ LOG(ERROR) << __func__ << ": port " << port.id << " only has dynamic profiles";
+ return false;
+}
+
void Module::populateConnectedProfiles() {
Configuration& config = getConfig();
for (const AudioPort& port : config.ports) {
@@ -621,10 +619,11 @@
std::vector<AudioRoute*> routesToMixPorts = getAudioRoutesForAudioPortImpl(templateId);
std::set<int32_t> routableMixPortIds = getRoutableAudioPortIds(templateId, &routesToMixPorts);
+ const int32_t nextPortId = getConfig().nextPortId++;
if (!mDebug.simulateDeviceConnections) {
// Even if the device port has static profiles, the HAL module might need to update
// them, or abort the connection process.
- RETURN_STATUS_IF_ERROR(populateConnectedDevicePort(&connectedPort));
+ RETURN_STATUS_IF_ERROR(populateConnectedDevicePort(&connectedPort, nextPortId));
} else if (hasDynamicProfilesOnly(connectedPort.profiles)) {
auto& connectedProfiles = getConfig().connectedProfiles;
if (auto connectedProfilesIt = connectedProfiles.find(templateId);
@@ -648,7 +647,7 @@
}
}
- connectedPort.id = getConfig().nextPortId++;
+ connectedPort.id = nextPortId;
auto [connectedPortsIt, _] =
mConnectedDevicePorts.insert(std::pair(connectedPort.id, std::set<int32_t>()));
LOG(DEBUG) << __func__ << ": template port " << templateId << " external device connected, "
@@ -1039,6 +1038,18 @@
ndk::ScopedAStatus Module::setAudioPortConfig(const AudioPortConfig& in_requested,
AudioPortConfig* out_suggested, bool* _aidl_return) {
+ auto generate = [this](const AudioPort& port, AudioPortConfig* config) {
+ return generateDefaultPortConfig(port, config);
+ };
+ return setAudioPortConfigImpl(in_requested, generate, out_suggested, _aidl_return);
+}
+
+ndk::ScopedAStatus Module::setAudioPortConfigImpl(
+ const AudioPortConfig& in_requested,
+ const std::function<bool(const ::aidl::android::media::audio::common::AudioPort& port,
+ ::aidl::android::media::audio::common::AudioPortConfig* config)>&
+ fillPortConfig,
+ AudioPortConfig* out_suggested, bool* applied) {
LOG(DEBUG) << __func__ << ": requested " << in_requested.toString();
auto& configs = getConfig().portConfigs;
auto existing = configs.end();
@@ -1067,7 +1078,8 @@
*out_suggested = *existing;
} else {
AudioPortConfig newConfig;
- if (generateDefaultPortConfig(*portIt, &newConfig)) {
+ newConfig.portId = portIt->id;
+ if (fillPortConfig(*portIt, &newConfig)) {
*out_suggested = newConfig;
} else {
LOG(ERROR) << __func__ << ": unable generate a default config for port " << portId;
@@ -1172,17 +1184,17 @@
if (existing == configs.end() && requestedIsValid && requestedIsFullySpecified) {
out_suggested->id = getConfig().nextPortId++;
configs.push_back(*out_suggested);
- *_aidl_return = true;
+ *applied = true;
LOG(DEBUG) << __func__ << ": created new port config " << out_suggested->toString();
} else if (existing != configs.end() && requestedIsValid) {
*existing = *out_suggested;
- *_aidl_return = true;
+ *applied = true;
LOG(DEBUG) << __func__ << ": updated port config " << out_suggested->toString();
} else {
LOG(DEBUG) << __func__ << ": not applied; existing config ? " << (existing != configs.end())
<< "; requested is valid? " << requestedIsValid << ", fully specified? "
<< requestedIsFullySpecified;
- *_aidl_return = false;
+ *applied = false;
}
return ndk::ScopedAStatus::ok();
}
@@ -1534,7 +1546,7 @@
return mIsMmapSupported.value();
}
-ndk::ScopedAStatus Module::populateConnectedDevicePort(AudioPort* audioPort) {
+ndk::ScopedAStatus Module::populateConnectedDevicePort(AudioPort* audioPort, int32_t) {
if (audioPort->ext.getTag() != AudioPortExt::device) {
LOG(ERROR) << __func__ << ": not a device port: " << audioPort->toString();
return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
diff --git a/audio/aidl/default/SoundDose.cpp b/audio/aidl/default/SoundDose.cpp
index 1c9e081..6c3a067 100644
--- a/audio/aidl/default/SoundDose.cpp
+++ b/audio/aidl/default/SoundDose.cpp
@@ -119,7 +119,8 @@
void SoundDose::MelCallback::onNewMelValues(const std::vector<float>& mels, size_t offset,
size_t length,
audio_port_handle_t deviceId
- __attribute__((__unused__))) const {
+ __attribute__((__unused__)),
+ bool attenuated __attribute__((__unused__))) const {
mSoundDose.onNewMelValues(mels, offset, length, deviceId);
}
diff --git a/audio/aidl/default/Stream.cpp b/audio/aidl/default/Stream.cpp
index a805b87..cf0870e 100644
--- a/audio/aidl/default/Stream.cpp
+++ b/audio/aidl/default/Stream.cpp
@@ -180,17 +180,20 @@
StreamDescriptor::Reply reply{};
reply.status = STATUS_BAD_VALUE;
switch (command.getTag()) {
- case Tag::halReservedExit:
- if (const int32_t cookie = command.get<Tag::halReservedExit>();
- cookie == (mContext->getInternalCommandCookie() ^ getTid())) {
+ case Tag::halReservedExit: {
+ const int32_t cookie = command.get<Tag::halReservedExit>();
+ if (cookie == (mContext->getInternalCommandCookie() ^ getTid())) {
mDriver->shutdown();
setClosed();
- // This is an internal command, no need to reply.
- return Status::EXIT;
} else {
LOG(WARNING) << __func__ << ": EXIT command has a bad cookie: " << cookie;
}
- break;
+ if (cookie != 0) { // This is an internal command, no need to reply.
+ return Status::EXIT;
+ } else {
+ break;
+ }
+ }
case Tag::getStatus:
populateReply(&reply, mIsConnected);
break;
@@ -400,17 +403,20 @@
reply.status = STATUS_BAD_VALUE;
using Tag = StreamDescriptor::Command::Tag;
switch (command.getTag()) {
- case Tag::halReservedExit:
- if (const int32_t cookie = command.get<Tag::halReservedExit>();
- cookie == (mContext->getInternalCommandCookie() ^ getTid())) {
+ case Tag::halReservedExit: {
+ const int32_t cookie = command.get<Tag::halReservedExit>();
+ if (cookie == (mContext->getInternalCommandCookie() ^ getTid())) {
mDriver->shutdown();
setClosed();
- // This is an internal command, no need to reply.
- return Status::EXIT;
} else {
LOG(WARNING) << __func__ << ": EXIT command has a bad cookie: " << cookie;
}
- break;
+ if (cookie != 0) { // This is an internal command, no need to reply.
+ return Status::EXIT;
+ } else {
+ break;
+ }
+ }
case Tag::getStatus:
populateReply(&reply, mIsConnected);
break;
diff --git a/audio/aidl/default/acousticEchoCanceler/AcousticEchoCancelerSw.cpp b/audio/aidl/default/acousticEchoCanceler/AcousticEchoCancelerSw.cpp
index 5e18f1b..be0927c 100644
--- a/audio/aidl/default/acousticEchoCanceler/AcousticEchoCancelerSw.cpp
+++ b/audio/aidl/default/acousticEchoCanceler/AcousticEchoCancelerSw.cpp
@@ -168,10 +168,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> AcousticEchoCancelerSw::getContext() {
- return mContext;
-}
-
RetCode AcousticEchoCancelerSw::releaseContext() {
if (mContext) {
mContext.reset();
diff --git a/audio/aidl/default/acousticEchoCanceler/AcousticEchoCancelerSw.h b/audio/aidl/default/acousticEchoCanceler/AcousticEchoCancelerSw.h
index 73cf42b..95738f8 100644
--- a/audio/aidl/default/acousticEchoCanceler/AcousticEchoCancelerSw.h
+++ b/audio/aidl/default/acousticEchoCanceler/AcousticEchoCancelerSw.h
@@ -52,21 +52,23 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
std::string getEffectName() override { return kEffectName; };
IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
private:
static const std::vector<Range::AcousticEchoCancelerRange> kRanges;
- std::shared_ptr<AcousticEchoCancelerSwContext> mContext;
+ std::shared_ptr<AcousticEchoCancelerSwContext> mContext GUARDED_BY(mImplMutex);
ndk::ScopedAStatus getParameterAcousticEchoCanceler(const AcousticEchoCanceler::Tag& tag,
- Parameter::Specific* specific);
+ Parameter::Specific* specific)
+ REQUIRES(mImplMutex);
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/acousticEchoCanceler/Android.bp b/audio/aidl/default/acousticEchoCanceler/Android.bp
index bfb7212..35d4a56 100644
--- a/audio/aidl/default/acousticEchoCanceler/Android.bp
+++ b/audio/aidl/default/acousticEchoCanceler/Android.bp
@@ -27,8 +27,6 @@
name: "libaecsw",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"AcousticEchoCancelerSw.cpp",
diff --git a/audio/aidl/default/alsa/ModuleAlsa.cpp b/audio/aidl/default/alsa/ModuleAlsa.cpp
index 8512631..9a2cce7 100644
--- a/audio/aidl/default/alsa/ModuleAlsa.cpp
+++ b/audio/aidl/default/alsa/ModuleAlsa.cpp
@@ -34,7 +34,7 @@
namespace aidl::android::hardware::audio::core {
-ndk::ScopedAStatus ModuleAlsa::populateConnectedDevicePort(AudioPort* audioPort) {
+ndk::ScopedAStatus ModuleAlsa::populateConnectedDevicePort(AudioPort* audioPort, int32_t) {
auto deviceProfile = alsa::getDeviceProfile(*audioPort);
if (!deviceProfile.has_value()) {
return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
diff --git a/audio/aidl/default/audio_effects_config.xml b/audio/aidl/default/audio_effects_config.xml
index 6f0af21..827ff80 100644
--- a/audio/aidl/default/audio_effects_config.xml
+++ b/audio/aidl/default/audio_effects_config.xml
@@ -47,6 +47,7 @@
<library name="visualizer" path="libvisualizeraidl.so"/>
<library name="volumesw" path="libvolumesw.so"/>
<library name="extensioneffect" path="libextensioneffect.so"/>
+ <library name="spatializersw" path="libspatializersw.so"/>
</libraries>
<!-- list of effects to load.
@@ -98,6 +99,7 @@
<effect name="extension_effect" library="extensioneffect" uuid="fa81dd00-588b-11ed-9b6a-0242ac120002" type="fa81de0e-588b-11ed-9b6a-0242ac120002"/>
<effect name="acoustic_echo_canceler" library="pre_processing" uuid="bb392ec0-8d4d-11e0-a896-0002a5d5c51b"/>
<effect name="noise_suppression" library="pre_processing" uuid="c06c8400-8e06-11e0-9cb6-0002a5d5c51b"/>
+ <effect name="spatializer" library="spatializersw" uuid="fa81a880-588b-11ed-9b6a-0242ac120002"/>
</effects>
<preprocess>
diff --git a/audio/aidl/default/automaticGainControlV1/Android.bp b/audio/aidl/default/automaticGainControlV1/Android.bp
index 4ae8e63..05c2c54 100644
--- a/audio/aidl/default/automaticGainControlV1/Android.bp
+++ b/audio/aidl/default/automaticGainControlV1/Android.bp
@@ -27,8 +27,6 @@
name: "libagc1sw",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"AutomaticGainControlV1Sw.cpp",
diff --git a/audio/aidl/default/automaticGainControlV1/AutomaticGainControlV1Sw.cpp b/audio/aidl/default/automaticGainControlV1/AutomaticGainControlV1Sw.cpp
index ce10ae1..d865b7e 100644
--- a/audio/aidl/default/automaticGainControlV1/AutomaticGainControlV1Sw.cpp
+++ b/audio/aidl/default/automaticGainControlV1/AutomaticGainControlV1Sw.cpp
@@ -177,10 +177,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> AutomaticGainControlV1Sw::getContext() {
- return mContext;
-}
-
RetCode AutomaticGainControlV1Sw::releaseContext() {
if (mContext) {
mContext.reset();
diff --git a/audio/aidl/default/automaticGainControlV1/AutomaticGainControlV1Sw.h b/audio/aidl/default/automaticGainControlV1/AutomaticGainControlV1Sw.h
index 7d2a69f..76b91ae 100644
--- a/audio/aidl/default/automaticGainControlV1/AutomaticGainControlV1Sw.h
+++ b/audio/aidl/default/automaticGainControlV1/AutomaticGainControlV1Sw.h
@@ -53,21 +53,24 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
std::string getEffectName() override { return kEffectName; };
- IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
+ IEffect::Status effectProcessImpl(float* in, float* out, int samples)
+ REQUIRES(mImplMutex) override;
private:
static const std::vector<Range::AutomaticGainControlV1Range> kRanges;
- std::shared_ptr<AutomaticGainControlV1SwContext> mContext;
+ std::shared_ptr<AutomaticGainControlV1SwContext> mContext GUARDED_BY(mImplMutex);
ndk::ScopedAStatus getParameterAutomaticGainControlV1(const AutomaticGainControlV1::Tag& tag,
- Parameter::Specific* specific);
+ Parameter::Specific* specific)
+ REQUIRES(mImplMutex);
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/automaticGainControlV2/Android.bp b/audio/aidl/default/automaticGainControlV2/Android.bp
index 631cf58..dedc555 100644
--- a/audio/aidl/default/automaticGainControlV2/Android.bp
+++ b/audio/aidl/default/automaticGainControlV2/Android.bp
@@ -27,8 +27,6 @@
name: "libagc2sw",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"AutomaticGainControlV2Sw.cpp",
diff --git a/audio/aidl/default/automaticGainControlV2/AutomaticGainControlV2Sw.cpp b/audio/aidl/default/automaticGainControlV2/AutomaticGainControlV2Sw.cpp
index 1e336ac..3ff6e38 100644
--- a/audio/aidl/default/automaticGainControlV2/AutomaticGainControlV2Sw.cpp
+++ b/audio/aidl/default/automaticGainControlV2/AutomaticGainControlV2Sw.cpp
@@ -180,10 +180,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> AutomaticGainControlV2Sw::getContext() {
- return mContext;
-}
-
RetCode AutomaticGainControlV2Sw::releaseContext() {
if (mContext) {
mContext.reset();
diff --git a/audio/aidl/default/automaticGainControlV2/AutomaticGainControlV2Sw.h b/audio/aidl/default/automaticGainControlV2/AutomaticGainControlV2Sw.h
index 9aa60ea..863d470 100644
--- a/audio/aidl/default/automaticGainControlV2/AutomaticGainControlV2Sw.h
+++ b/audio/aidl/default/automaticGainControlV2/AutomaticGainControlV2Sw.h
@@ -59,21 +59,24 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
std::string getEffectName() override { return kEffectName; };
- IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
+ IEffect::Status effectProcessImpl(float* in, float* out, int samples)
+ REQUIRES(mImplMutex) override;
private:
static const std::vector<Range::AutomaticGainControlV2Range> kRanges;
- std::shared_ptr<AutomaticGainControlV2SwContext> mContext;
+ std::shared_ptr<AutomaticGainControlV2SwContext> mContext GUARDED_BY(mImplMutex);
ndk::ScopedAStatus getParameterAutomaticGainControlV2(const AutomaticGainControlV2::Tag& tag,
- Parameter::Specific* specific);
+ Parameter::Specific* specific)
+ REQUIRES(mImplMutex);
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/bassboost/Android.bp b/audio/aidl/default/bassboost/Android.bp
index 82b2f20..9f47770 100644
--- a/audio/aidl/default/bassboost/Android.bp
+++ b/audio/aidl/default/bassboost/Android.bp
@@ -27,8 +27,6 @@
name: "libbassboostsw",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"BassBoostSw.cpp",
diff --git a/audio/aidl/default/bassboost/BassBoostSw.cpp b/audio/aidl/default/bassboost/BassBoostSw.cpp
index 6072d89..60adc30 100644
--- a/audio/aidl/default/bassboost/BassBoostSw.cpp
+++ b/audio/aidl/default/bassboost/BassBoostSw.cpp
@@ -151,10 +151,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> BassBoostSw::getContext() {
- return mContext;
-}
-
RetCode BassBoostSw::releaseContext() {
if (mContext) {
mContext.reset();
diff --git a/audio/aidl/default/bassboost/BassBoostSw.h b/audio/aidl/default/bassboost/BassBoostSw.h
index 1132472..901e455 100644
--- a/audio/aidl/default/bassboost/BassBoostSw.h
+++ b/audio/aidl/default/bassboost/BassBoostSw.h
@@ -51,21 +51,23 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
std::string getEffectName() override { return kEffectName; };
- IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
+ IEffect::Status effectProcessImpl(float* in, float* out, int samples)
+ REQUIRES(mImplMutex) override;
private:
static const std::vector<Range::BassBoostRange> kRanges;
- std::shared_ptr<BassBoostSwContext> mContext;
+ std::shared_ptr<BassBoostSwContext> mContext GUARDED_BY(mImplMutex);
ndk::ScopedAStatus getParameterBassBoost(const BassBoost::Tag& tag,
- Parameter::Specific* specific);
+ Parameter::Specific* specific) REQUIRES(mImplMutex);
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/bluetooth/DevicePortProxy.cpp b/audio/aidl/default/bluetooth/DevicePortProxy.cpp
index 1be0875..d772c20 100644
--- a/audio/aidl/default/bluetooth/DevicePortProxy.cpp
+++ b/audio/aidl/default/bluetooth/DevicePortProxy.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#define LOG_TAG "AHAL_BluetoothPortProxy"
+#define LOG_TAG "AHAL_BluetoothAudioPort"
#include <android-base/logging.h>
#include <android-base/stringprintf.h>
@@ -254,12 +254,7 @@
return (mCookie != ::aidl::android::hardware::bluetooth::audio::kObserversCookieUndefined);
}
-bool BluetoothAudioPortAidl::getPreferredDataIntervalUs(size_t* interval_us) const {
- if (!interval_us) {
- LOG(ERROR) << __func__ << ": bad input arg";
- return false;
- }
-
+bool BluetoothAudioPortAidl::getPreferredDataIntervalUs(size_t& interval_us) const {
if (!inUse()) {
LOG(ERROR) << __func__ << ": BluetoothAudioPortAidl is not in use";
return false;
@@ -272,16 +267,11 @@
return false;
}
- *interval_us = hal_audio_cfg.get<AudioConfiguration::pcmConfig>().dataIntervalUs;
+ interval_us = hal_audio_cfg.get<AudioConfiguration::pcmConfig>().dataIntervalUs;
return true;
}
-bool BluetoothAudioPortAidl::loadAudioConfig(PcmConfiguration* audio_cfg) const {
- if (!audio_cfg) {
- LOG(ERROR) << __func__ << ": bad input arg";
- return false;
- }
-
+bool BluetoothAudioPortAidl::loadAudioConfig(PcmConfiguration& audio_cfg) {
if (!inUse()) {
LOG(ERROR) << __func__ << ": BluetoothAudioPortAidl is not in use";
return false;
@@ -293,15 +283,26 @@
LOG(ERROR) << __func__ << ": unsupported audio cfg tag";
return false;
}
- *audio_cfg = hal_audio_cfg.get<AudioConfiguration::pcmConfig>();
+ audio_cfg = hal_audio_cfg.get<AudioConfiguration::pcmConfig>();
LOG(VERBOSE) << __func__ << debugMessage() << ", state*=" << getState() << ", PcmConfig=["
- << audio_cfg->toString() << "]";
- if (audio_cfg->channelMode == ChannelMode::UNKNOWN) {
+ << audio_cfg.toString() << "]";
+ if (audio_cfg.channelMode == ChannelMode::UNKNOWN) {
return false;
}
return true;
}
+bool BluetoothAudioPortAidlOut::loadAudioConfig(PcmConfiguration& audio_cfg) {
+ if (!BluetoothAudioPortAidl::loadAudioConfig(audio_cfg)) return false;
+ // WAR to support Mono / 16 bits per sample as the Bluetooth stack requires
+ if (audio_cfg.channelMode == ChannelMode::MONO && audio_cfg.bitsPerSample == 16) {
+ mIsStereoToMono = true;
+ audio_cfg.channelMode = ChannelMode::STEREO;
+ LOG(INFO) << __func__ << ": force channels = to be AUDIO_CHANNEL_OUT_STEREO";
+ }
+ return true;
+}
+
bool BluetoothAudioPortAidl::standby() {
if (!inUse()) {
LOG(ERROR) << __func__ << ": BluetoothAudioPortAidl is not in use";
@@ -435,7 +436,7 @@
retval = condWaitState(BluetoothStreamState::SUSPENDING);
} else {
LOG(ERROR) << __func__ << debugMessage() << ", state=" << getState()
- << " Hal fails";
+ << " failure to suspend stream";
}
}
}
diff --git a/audio/aidl/default/bluetooth/ModuleBluetooth.cpp b/audio/aidl/default/bluetooth/ModuleBluetooth.cpp
index 8a1cbbf..9084b30 100644
--- a/audio/aidl/default/bluetooth/ModuleBluetooth.cpp
+++ b/audio/aidl/default/bluetooth/ModuleBluetooth.cpp
@@ -24,13 +24,25 @@
using aidl::android::hardware::audio::common::SinkMetadata;
using aidl::android::hardware::audio::common::SourceMetadata;
+using aidl::android::hardware::bluetooth::audio::ChannelMode;
+using aidl::android::hardware::bluetooth::audio::PcmConfiguration;
+using aidl::android::media::audio::common::AudioChannelLayout;
+using aidl::android::media::audio::common::AudioConfigBase;
using aidl::android::media::audio::common::AudioDeviceDescription;
using aidl::android::media::audio::common::AudioDeviceType;
+using aidl::android::media::audio::common::AudioFormatDescription;
+using aidl::android::media::audio::common::AudioFormatType;
+using aidl::android::media::audio::common::AudioIoFlags;
using aidl::android::media::audio::common::AudioOffloadInfo;
using aidl::android::media::audio::common::AudioPort;
+using aidl::android::media::audio::common::AudioPortConfig;
using aidl::android::media::audio::common::AudioPortExt;
+using aidl::android::media::audio::common::AudioProfile;
+using aidl::android::media::audio::common::Int;
using aidl::android::media::audio::common::MicrophoneInfo;
+using aidl::android::media::audio::common::PcmType;
using android::bluetooth::audio::aidl::BluetoothAudioPortAidl;
+using android::bluetooth::audio::aidl::BluetoothAudioPortAidlIn;
using android::bluetooth::audio::aidl::BluetoothAudioPortAidlOut;
// TODO(b/312265159) bluetooth audio should be in its own process
@@ -39,6 +51,35 @@
namespace aidl::android::hardware::audio::core {
+namespace {
+
+PcmType pcmTypeFromBitsPerSample(int8_t bitsPerSample) {
+ if (bitsPerSample == 8)
+ return PcmType::UINT_8_BIT;
+ else if (bitsPerSample == 16)
+ return PcmType::INT_16_BIT;
+ else if (bitsPerSample == 24)
+ return PcmType::INT_24_BIT;
+ else if (bitsPerSample == 32)
+ return PcmType::INT_32_BIT;
+ ALOGE("Unsupported bitsPerSample: %d", bitsPerSample);
+ return PcmType::DEFAULT;
+}
+
+AudioChannelLayout channelLayoutFromChannelMode(ChannelMode mode) {
+ if (mode == ChannelMode::MONO) {
+ return AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
+ AudioChannelLayout::LAYOUT_MONO);
+ } else if (mode == ChannelMode::STEREO || mode == ChannelMode::DUALMONO) {
+ return AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
+ AudioChannelLayout::LAYOUT_STEREO);
+ }
+ ALOGE("Unsupported channel mode: %s", toString(mode).c_str());
+ return AudioChannelLayout{};
+}
+
+} // namespace
+
ModuleBluetooth::ModuleBluetooth(std::unique_ptr<Module::Configuration>&& config)
: Module(Type::BLUETOOTH, std::move(config)) {
// TODO(b/312265159) bluetooth audio should be in its own process
@@ -95,66 +136,130 @@
return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
}
+ndk::ScopedAStatus ModuleBluetooth::setAudioPortConfig(const AudioPortConfig& in_requested,
+ AudioPortConfig* out_suggested,
+ bool* _aidl_return) {
+ auto fillConfig = [this](const AudioPort& port, AudioPortConfig* config) {
+ if (port.ext.getTag() == AudioPortExt::device) {
+ CachedProxy proxy;
+ auto status = findOrCreateProxy(port, proxy);
+ if (status.isOk()) {
+ const auto& pcmConfig = proxy.pcmConfig;
+ LOG(DEBUG) << "setAudioPortConfig: suggesting port config from "
+ << pcmConfig.toString();
+ const auto pcmType = pcmTypeFromBitsPerSample(pcmConfig.bitsPerSample);
+ const auto channelMask = channelLayoutFromChannelMode(pcmConfig.channelMode);
+ if (pcmType != PcmType::DEFAULT && channelMask != AudioChannelLayout{}) {
+ config->format =
+ AudioFormatDescription{.type = AudioFormatType::PCM, .pcm = pcmType};
+ config->channelMask = channelMask;
+ config->sampleRate = Int{.value = pcmConfig.sampleRateHz};
+ config->flags = port.flags;
+ config->ext = port.ext;
+ return true;
+ }
+ }
+ }
+ return generateDefaultPortConfig(port, config);
+ };
+ return Module::setAudioPortConfigImpl(in_requested, fillConfig, out_suggested, _aidl_return);
+}
+
+ndk::ScopedAStatus ModuleBluetooth::checkAudioPatchEndpointsMatch(
+ const std::vector<AudioPortConfig*>& sources, const std::vector<AudioPortConfig*>& sinks) {
+ // Both sources and sinks must be non-empty, this is guaranteed by 'setAudioPatch'.
+ const bool isInput = sources[0]->ext.getTag() == AudioPortExt::device;
+ const int32_t devicePortId = isInput ? sources[0]->portId : sinks[0]->portId;
+ const auto proxyIt = mProxies.find(devicePortId);
+ if (proxyIt == mProxies.end()) return ndk::ScopedAStatus::ok();
+ const auto& pcmConfig = proxyIt->second.pcmConfig;
+ const AudioPortConfig* mixPortConfig = isInput ? sinks[0] : sources[0];
+ if (!StreamBluetooth::checkConfigParams(
+ pcmConfig, AudioConfigBase{.sampleRate = mixPortConfig->sampleRate->value,
+ .channelMask = *(mixPortConfig->channelMask),
+ .format = *(mixPortConfig->format)})) {
+ return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+ }
+ if (int32_t handle = mixPortConfig->ext.get<AudioPortExt::mix>().handle; handle > 0) {
+ mConnections.insert(std::pair(handle, devicePortId));
+ }
+ return ndk::ScopedAStatus::ok();
+}
+
+void ModuleBluetooth::onExternalDeviceConnectionChanged(const AudioPort& audioPort,
+ bool connected) {
+ if (!connected) mProxies.erase(audioPort.id);
+}
+
ndk::ScopedAStatus ModuleBluetooth::createInputStream(
StreamContext&& context, const SinkMetadata& sinkMetadata,
const std::vector<MicrophoneInfo>& microphones, std::shared_ptr<StreamIn>* result) {
+ CachedProxy proxy;
+ RETURN_STATUS_IF_ERROR(fetchAndCheckProxy(context, proxy));
return createStreamInstance<StreamInBluetooth>(result, std::move(context), sinkMetadata,
- microphones, getBtProfileManagerHandles());
+ microphones, getBtProfileManagerHandles(),
+ proxy.ptr, proxy.pcmConfig);
}
ndk::ScopedAStatus ModuleBluetooth::createOutputStream(
StreamContext&& context, const SourceMetadata& sourceMetadata,
const std::optional<AudioOffloadInfo>& offloadInfo, std::shared_ptr<StreamOut>* result) {
+ CachedProxy proxy;
+ RETURN_STATUS_IF_ERROR(fetchAndCheckProxy(context, proxy));
return createStreamInstance<StreamOutBluetooth>(result, std::move(context), sourceMetadata,
- offloadInfo, getBtProfileManagerHandles());
+ offloadInfo, getBtProfileManagerHandles(),
+ proxy.ptr, proxy.pcmConfig);
}
-ndk::ScopedAStatus ModuleBluetooth::populateConnectedDevicePort(AudioPort* audioPort) {
+ndk::ScopedAStatus ModuleBluetooth::populateConnectedDevicePort(AudioPort* audioPort,
+ int32_t nextPortId) {
if (audioPort->ext.getTag() != AudioPortExt::device) {
LOG(ERROR) << __func__ << ": not a device port: " << audioPort->toString();
return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
}
+ if (!::aidl::android::hardware::bluetooth::audio::BluetoothAudioSession::IsAidlAvailable()) {
+ LOG(ERROR) << __func__ << ": IBluetoothAudioProviderFactory AIDL service not available";
+ return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
+ }
const auto& devicePort = audioPort->ext.get<AudioPortExt::device>();
const auto& description = devicePort.device.type;
- // Since the configuration of the BT module is static, there is nothing to populate here.
- // However, this method must return an error when the device can not be connected,
- // this is determined by the status of BT profiles.
+ // This method must return an error when the device can not be connected.
if (description.connection == AudioDeviceDescription::CONNECTION_BT_A2DP) {
bool isA2dpEnabled = false;
if (!!mBluetoothA2dp) {
RETURN_STATUS_IF_ERROR((*mBluetoothA2dp).isEnabled(&isA2dpEnabled));
}
LOG(DEBUG) << __func__ << ": isA2dpEnabled: " << isA2dpEnabled;
- return isA2dpEnabled ? ndk::ScopedAStatus::ok()
- : ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
+ if (!isA2dpEnabled) return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
} else if (description.connection == AudioDeviceDescription::CONNECTION_BT_LE) {
bool isLeEnabled = false;
if (!!mBluetoothLe) {
RETURN_STATUS_IF_ERROR((*mBluetoothLe).isEnabled(&isLeEnabled));
}
LOG(DEBUG) << __func__ << ": isLeEnabled: " << isLeEnabled;
- return isLeEnabled ? ndk::ScopedAStatus::ok()
- : ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
+ if (!isLeEnabled) return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
} else if (description.connection == AudioDeviceDescription::CONNECTION_WIRELESS &&
description.type == AudioDeviceType::OUT_HEARING_AID) {
- // Hearing aids can use a number of profiles, thus the only way to check
- // connectivity is to try to talk to the BT HAL.
- if (!::aidl::android::hardware::bluetooth::audio::BluetoothAudioSession::
- IsAidlAvailable()) {
- return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
- }
- std::shared_ptr<BluetoothAudioPortAidl> proxy = std::shared_ptr<BluetoothAudioPortAidl>(
- std::make_shared<BluetoothAudioPortAidlOut>());
- if (proxy->registerPort(description)) {
- LOG(DEBUG) << __func__ << ": registered hearing aid port";
- proxy->unregisterPort();
- return ndk::ScopedAStatus::ok();
- }
- LOG(DEBUG) << __func__ << ": failed to register hearing aid port";
- return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
+ // Hearing aids can use a number of profiles, no single switch exists.
+ } else {
+ LOG(ERROR) << __func__ << ": unsupported device type: " << audioPort->toString();
+ return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
}
- LOG(ERROR) << __func__ << ": unsupported device type: " << audioPort->toString();
- return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
+ CachedProxy proxy;
+ RETURN_STATUS_IF_ERROR(createProxy(*audioPort, nextPortId, proxy));
+ // Since the device is already connected and configured by the BT stack, provide
+ // the current configuration instead of all possible profiles.
+ const auto& pcmConfig = proxy.pcmConfig;
+ audioPort->profiles.clear();
+ audioPort->profiles.push_back(
+ AudioProfile{.format = AudioFormatDescription{.type = AudioFormatType::PCM,
+ .pcm = pcmTypeFromBitsPerSample(
+ pcmConfig.bitsPerSample)},
+ .channelMasks = std::vector<AudioChannelLayout>(
+ {channelLayoutFromChannelMode(pcmConfig.channelMode)}),
+ .sampleRates = std::vector<int>({pcmConfig.sampleRateHz})});
+ LOG(DEBUG) << __func__ << ": " << audioPort->toString();
+ return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus ModuleBluetooth::onMasterMuteChanged(bool) {
@@ -167,4 +272,77 @@
return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
}
+int32_t ModuleBluetooth::getNominalLatencyMs(const AudioPortConfig& portConfig) {
+ const auto connectionsIt = mConnections.find(portConfig.ext.get<AudioPortExt::mix>().handle);
+ if (connectionsIt != mConnections.end()) {
+ const auto proxyIt = mProxies.find(connectionsIt->second);
+ if (proxyIt != mProxies.end()) {
+ auto proxy = proxyIt->second.ptr;
+ size_t dataIntervalUs = 0;
+ if (!proxy->getPreferredDataIntervalUs(dataIntervalUs)) {
+ LOG(WARNING) << __func__ << ": could not fetch preferred data interval";
+ }
+ const bool isInput = portConfig.flags->getTag() == AudioIoFlags::input;
+ return isInput ? StreamInBluetooth::getNominalLatencyMs(dataIntervalUs)
+ : StreamOutBluetooth::getNominalLatencyMs(dataIntervalUs);
+ }
+ }
+ LOG(ERROR) << __func__ << ": no connection or proxy found for " << portConfig.toString();
+ return Module::getNominalLatencyMs(portConfig);
+}
+
+ndk::ScopedAStatus ModuleBluetooth::createProxy(const AudioPort& audioPort, int32_t instancePortId,
+ CachedProxy& proxy) {
+ const bool isInput = audioPort.flags.getTag() == AudioIoFlags::input;
+ proxy.ptr = isInput ? std::shared_ptr<BluetoothAudioPortAidl>(
+ std::make_shared<BluetoothAudioPortAidlIn>())
+ : std::shared_ptr<BluetoothAudioPortAidl>(
+ std::make_shared<BluetoothAudioPortAidlOut>());
+ const auto& devicePort = audioPort.ext.get<AudioPortExt::device>();
+ if (const auto device = devicePort.device.type; !proxy.ptr->registerPort(device)) {
+ LOG(ERROR) << __func__ << ": failed to register BT port for " << device.toString();
+ return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
+ }
+ if (!proxy.ptr->loadAudioConfig(proxy.pcmConfig)) {
+ LOG(ERROR) << __func__ << ": state=" << proxy.ptr->getState()
+ << ", failed to load audio config";
+ return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
+ }
+ mProxies.insert(std::pair(instancePortId, proxy));
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus ModuleBluetooth::fetchAndCheckProxy(const StreamContext& context,
+ CachedProxy& proxy) {
+ const auto connectionsIt = mConnections.find(context.getMixPortHandle());
+ if (connectionsIt != mConnections.end()) {
+ const auto proxyIt = mProxies.find(connectionsIt->second);
+ if (proxyIt != mProxies.end()) {
+ proxy = proxyIt->second;
+ mProxies.erase(proxyIt);
+ }
+ mConnections.erase(connectionsIt);
+ }
+ if (proxy.ptr != nullptr) {
+ if (!StreamBluetooth::checkConfigParams(
+ proxy.pcmConfig, AudioConfigBase{.sampleRate = context.getSampleRate(),
+ .channelMask = context.getChannelLayout(),
+ .format = context.getFormat()})) {
+ return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
+ }
+ }
+ // Not having a proxy is OK, it may happen in VTS tests when streams are opened on unconnected
+ // mix ports.
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus ModuleBluetooth::findOrCreateProxy(const AudioPort& audioPort,
+ CachedProxy& proxy) {
+ if (auto proxyIt = mProxies.find(audioPort.id); proxyIt != mProxies.end()) {
+ proxy = proxyIt->second;
+ return ndk::ScopedAStatus::ok();
+ }
+ return createProxy(audioPort, audioPort.id, proxy);
+}
+
} // namespace aidl::android::hardware::audio::core
diff --git a/audio/aidl/default/bluetooth/StreamBluetooth.cpp b/audio/aidl/default/bluetooth/StreamBluetooth.cpp
index 0cee7f4..a73af1b 100644
--- a/audio/aidl/default/bluetooth/StreamBluetooth.cpp
+++ b/audio/aidl/default/bluetooth/StreamBluetooth.cpp
@@ -14,8 +14,9 @@
* limitations under the License.
*/
-#define LOG_TAG "AHAL_StreamBluetooth"
+#include <algorithm>
+#define LOG_TAG "AHAL_StreamBluetooth"
#include <Utils.h>
#include <android-base/logging.h>
#include <audio_utils/clock.h>
@@ -31,6 +32,7 @@
using aidl::android::hardware::bluetooth::audio::PcmConfiguration;
using aidl::android::hardware::bluetooth::audio::PresentationPosition;
using aidl::android::media::audio::common::AudioChannelLayout;
+using aidl::android::media::audio::common::AudioConfigBase;
using aidl::android::media::audio::common::AudioDevice;
using aidl::android::media::audio::common::AudioDeviceAddress;
using aidl::android::media::audio::common::AudioFormatDescription;
@@ -48,51 +50,33 @@
constexpr int kBluetoothDefaultInputBufferMs = 20;
constexpr int kBluetoothDefaultOutputBufferMs = 10;
// constexpr int kBluetoothSpatializerOutputBufferMs = 10;
+constexpr int kBluetoothDefaultRemoteDelayMs = 200;
-// pcm configuration params are not really used by the module
StreamBluetooth::StreamBluetooth(StreamContext* context, const Metadata& metadata,
- ModuleBluetooth::BtProfileHandles&& btHandles)
+ ModuleBluetooth::BtProfileHandles&& btHandles,
+ const std::shared_ptr<BluetoothAudioPortAidl>& btDeviceProxy,
+ const PcmConfiguration& pcmConfig)
: StreamCommonImpl(context, metadata),
- mSampleRate(getContext().getSampleRate()),
- mChannelLayout(getContext().getChannelLayout()),
- mFormat(getContext().getFormat()),
mFrameSizeBytes(getContext().getFrameSize()),
mIsInput(isInput(metadata)),
mBluetoothA2dp(std::move(std::get<ModuleBluetooth::BtInterface::BTA2DP>(btHandles))),
- mBluetoothLe(std::move(std::get<ModuleBluetooth::BtInterface::BTLE>(btHandles))) {
- mPreferredDataIntervalUs =
- (mIsInput ? kBluetoothDefaultInputBufferMs : kBluetoothDefaultOutputBufferMs) * 1000;
- mPreferredFrameCount = frameCountFromDurationUs(mPreferredDataIntervalUs, mSampleRate);
- mIsInitialized = false;
- mIsReadyToClose = false;
-}
+ mBluetoothLe(std::move(std::get<ModuleBluetooth::BtInterface::BTLE>(btHandles))),
+ mPreferredDataIntervalUs(pcmConfig.dataIntervalUs != 0
+ ? pcmConfig.dataIntervalUs
+ : (mIsInput ? kBluetoothDefaultInputBufferMs
+ : kBluetoothDefaultOutputBufferMs) *
+ 1000),
+ mPreferredFrameCount(
+ frameCountFromDurationUs(mPreferredDataIntervalUs, pcmConfig.sampleRateHz)),
+ mBtDeviceProxy(btDeviceProxy) {}
::android::status_t StreamBluetooth::init() {
- return ::android::OK; // defering this till we get AudioDeviceDescription
-}
-
-const StreamCommonInterface::ConnectedDevices& StreamBluetooth::getConnectedDevices() const {
std::lock_guard guard(mLock);
- return StreamCommonImpl::getConnectedDevices();
-}
-
-ndk::ScopedAStatus StreamBluetooth::setConnectedDevices(
- const std::vector<AudioDevice>& connectedDevices) {
- if (mIsInput && connectedDevices.size() > 1) {
- LOG(ERROR) << __func__ << ": wrong device size(" << connectedDevices.size()
- << ") for input stream";
- return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+ if (mBtDeviceProxy == nullptr) {
+ // This is a normal situation in VTS tests.
+ LOG(INFO) << __func__ << ": no BT HAL proxy, stream is non-functional";
}
- for (const auto& connectedDevice : connectedDevices) {
- if (connectedDevice.address.getTag() != AudioDeviceAddress::mac) {
- LOG(ERROR) << __func__ << ": bad device address" << connectedDevice.address.toString();
- return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
- }
- }
- std::lock_guard guard(mLock);
- RETURN_STATUS_IF_ERROR(StreamCommonImpl::setConnectedDevices(connectedDevices));
- mIsInitialized = false; // updated connected device list, need initialization
- return ndk::ScopedAStatus::ok();
+ return ::android::OK;
}
::android::status_t StreamBluetooth::drain(StreamDescriptor::DrainMode) {
@@ -112,167 +96,111 @@
::android::status_t StreamBluetooth::transfer(void* buffer, size_t frameCount,
size_t* actualFrameCount, int32_t* latencyMs) {
std::lock_guard guard(mLock);
- if (!mIsInitialized || mIsReadyToClose) {
- // 'setConnectedDevices' has been called or stream is ready to close, so no transfers
+ if (mBtDeviceProxy == nullptr || mBtDeviceProxy->getState() == BluetoothStreamState::DISABLED) {
*actualFrameCount = 0;
*latencyMs = StreamDescriptor::LATENCY_UNKNOWN;
return ::android::OK;
}
*actualFrameCount = 0;
*latencyMs = 0;
- for (auto proxy : mBtDeviceProxies) {
- if (!proxy->start()) {
- LOG(ERROR) << __func__ << ": state = " << proxy->getState() << " failed to start ";
- return -EIO;
- }
- const size_t fc = std::min(frameCount, mPreferredFrameCount);
- const size_t bytesToTransfer = fc * mFrameSizeBytes;
- if (mIsInput) {
- const size_t totalRead = proxy->readData(buffer, bytesToTransfer);
- *actualFrameCount = std::max(*actualFrameCount, totalRead / mFrameSizeBytes);
- } else {
- const size_t totalWrite = proxy->writeData(buffer, bytesToTransfer);
- *actualFrameCount = std::max(*actualFrameCount, totalWrite / mFrameSizeBytes);
- }
- PresentationPosition presentation_position;
- if (!proxy->getPresentationPosition(presentation_position)) {
- LOG(ERROR) << __func__ << ": getPresentationPosition returned error ";
- return ::android::UNKNOWN_ERROR;
- }
- *latencyMs =
- std::max(*latencyMs, (int32_t)(presentation_position.remoteDeviceAudioDelayNanos /
- NANOS_PER_MILLISECOND));
+ if (!mBtDeviceProxy->start()) {
+ LOG(ERROR) << __func__ << ": state= " << mBtDeviceProxy->getState() << " failed to start";
+ return -EIO;
}
+ const size_t fc = std::min(frameCount, mPreferredFrameCount);
+ const size_t bytesToTransfer = fc * mFrameSizeBytes;
+ if (mIsInput) {
+ const size_t totalRead = mBtDeviceProxy->readData(buffer, bytesToTransfer);
+ *actualFrameCount = std::max(*actualFrameCount, totalRead / mFrameSizeBytes);
+ } else {
+ const size_t totalWrite = mBtDeviceProxy->writeData(buffer, bytesToTransfer);
+ *actualFrameCount = std::max(*actualFrameCount, totalWrite / mFrameSizeBytes);
+ }
+ PresentationPosition presentation_position;
+ if (!mBtDeviceProxy->getPresentationPosition(presentation_position)) {
+ presentation_position.remoteDeviceAudioDelayNanos =
+ kBluetoothDefaultRemoteDelayMs * NANOS_PER_MILLISECOND;
+ LOG(WARNING) << __func__ << ": getPresentationPosition failed, latency info is unavailable";
+ }
+ // TODO(b/317117580): incorporate logic from
+ // packages/modules/Bluetooth/system/audio_bluetooth_hw/stream_apis.cc
+ // out_calculate_feeding_delay_ms / in_calculate_starving_delay_ms
+ *latencyMs = std::max(*latencyMs, (int32_t)(presentation_position.remoteDeviceAudioDelayNanos /
+ NANOS_PER_MILLISECOND));
return ::android::OK;
}
-::android::status_t StreamBluetooth::initialize() {
- if (!::aidl::android::hardware::bluetooth::audio::BluetoothAudioSession::IsAidlAvailable()) {
- LOG(ERROR) << __func__ << ": IBluetoothAudioProviderFactory service not available";
- return ::android::UNKNOWN_ERROR;
- }
- if (StreamCommonImpl::getConnectedDevices().empty()) {
- LOG(ERROR) << __func__ << ", has no connected devices";
- return ::android::NO_INIT;
- }
- // unregister older proxies (if any)
- for (auto proxy : mBtDeviceProxies) {
- proxy->stop();
- proxy->unregisterPort();
- }
- mBtDeviceProxies.clear();
- for (auto it = StreamCommonImpl::getConnectedDevices().begin();
- it != StreamCommonImpl::getConnectedDevices().end(); ++it) {
- std::shared_ptr<BluetoothAudioPortAidl> proxy =
- mIsInput ? std::shared_ptr<BluetoothAudioPortAidl>(
- std::make_shared<BluetoothAudioPortAidlIn>())
- : std::shared_ptr<BluetoothAudioPortAidl>(
- std::make_shared<BluetoothAudioPortAidlOut>());
- if (proxy->registerPort(it->type)) {
- LOG(ERROR) << __func__ << ": cannot init HAL";
- return ::android::UNKNOWN_ERROR;
- }
- PcmConfiguration config;
- if (!proxy->loadAudioConfig(&config)) {
- LOG(ERROR) << __func__ << ": state=" << proxy->getState()
- << " failed to get audio config";
- return ::android::UNKNOWN_ERROR;
- }
- // TODO: Ensure minimum duration for spatialized output?
- // WAR to support Mono / 16 bits per sample as the Bluetooth stack required
- if (!mIsInput && config.channelMode == ChannelMode::MONO && config.bitsPerSample == 16) {
- proxy->forcePcmStereoToMono(true);
- config.channelMode = ChannelMode::STEREO;
- LOG(INFO) << __func__ << ": force channels = to be AUDIO_CHANNEL_OUT_STEREO";
- }
- if (!checkConfigParams(config)) {
- LOG(ERROR) << __func__ << " checkConfigParams failed";
- return ::android::UNKNOWN_ERROR;
- }
- mBtDeviceProxies.push_back(std::move(proxy));
- }
- mIsInitialized = true;
- return ::android::OK;
-}
-
-bool StreamBluetooth::checkConfigParams(
- ::aidl::android::hardware::bluetooth::audio::PcmConfiguration& config) {
- if ((int)mSampleRate != config.sampleRateHz) {
- LOG(ERROR) << __func__ << ": Sample Rate mismatch, stream val = " << mSampleRate
- << " hal val = " << config.sampleRateHz;
+// static
+bool StreamBluetooth::checkConfigParams(const PcmConfiguration& pcmConfig,
+ const AudioConfigBase& config) {
+ if ((int)config.sampleRate != pcmConfig.sampleRateHz) {
+ LOG(ERROR) << __func__ << ": sample rate mismatch, stream value=" << config.sampleRate
+ << ", BT HAL value=" << pcmConfig.sampleRateHz;
return false;
}
- auto channelCount = aidl::android::hardware::audio::common::getChannelCount(mChannelLayout);
- if ((config.channelMode == ChannelMode::MONO && channelCount != 1) ||
- (config.channelMode == ChannelMode::STEREO && channelCount != 2)) {
- LOG(ERROR) << __func__ << ": Channel count mismatch, stream val = " << channelCount
- << " hal val = " << toString(config.channelMode);
+ const auto channelCount =
+ aidl::android::hardware::audio::common::getChannelCount(config.channelMask);
+ if ((pcmConfig.channelMode == ChannelMode::MONO && channelCount != 1) ||
+ (pcmConfig.channelMode == ChannelMode::STEREO && channelCount != 2)) {
+ LOG(ERROR) << __func__ << ": Channel count mismatch, stream value=" << channelCount
+ << ", BT HAL value=" << toString(pcmConfig.channelMode);
return false;
}
- if (mFormat.type != AudioFormatType::PCM) {
- LOG(ERROR) << __func__ << ": unexpected format type "
- << aidl::android::media::audio::common::toString(mFormat.type);
+ if (config.format.type != AudioFormatType::PCM) {
+ LOG(ERROR) << __func__
+ << ": unexpected stream format type: " << toString(config.format.type);
return false;
}
- int8_t bps = aidl::android::hardware::audio::common::getPcmSampleSizeInBytes(mFormat.pcm) * 8;
- if (bps != config.bitsPerSample) {
- LOG(ERROR) << __func__ << ": bits per sample mismatch, stream val = " << bps
- << " hal val = " << config.bitsPerSample;
+ const int8_t bitsPerSample =
+ aidl::android::hardware::audio::common::getPcmSampleSizeInBytes(config.format.pcm) * 8;
+ if (bitsPerSample != pcmConfig.bitsPerSample) {
+ LOG(ERROR) << __func__ << ": bits per sample mismatch, stream value=" << bitsPerSample
+ << ", BT HAL value=" << pcmConfig.bitsPerSample;
return false;
}
- if (config.dataIntervalUs > 0) {
- mPreferredDataIntervalUs =
- std::min((int32_t)mPreferredDataIntervalUs, config.dataIntervalUs);
- mPreferredFrameCount = frameCountFromDurationUs(mPreferredDataIntervalUs, mSampleRate);
- }
return true;
}
ndk::ScopedAStatus StreamBluetooth::prepareToClose() {
std::lock_guard guard(mLock);
- mIsReadyToClose = true;
+ if (mBtDeviceProxy != nullptr) {
+ if (mBtDeviceProxy->getState() != BluetoothStreamState::DISABLED) {
+ mBtDeviceProxy->stop();
+ }
+ }
return ndk::ScopedAStatus::ok();
}
::android::status_t StreamBluetooth::standby() {
std::lock_guard guard(mLock);
- if (!mIsInitialized) {
- if (auto status = initialize(); status != ::android::OK) return status;
- }
- for (auto proxy : mBtDeviceProxies) {
- if (!proxy->suspend()) {
- LOG(ERROR) << __func__ << ": state = " << proxy->getState() << " failed to stand by ";
- return -EIO;
- }
- }
+ if (mBtDeviceProxy != nullptr) mBtDeviceProxy->suspend();
return ::android::OK;
}
::android::status_t StreamBluetooth::start() {
std::lock_guard guard(mLock);
- if (!mIsInitialized) return initialize();
+ if (mBtDeviceProxy != nullptr) mBtDeviceProxy->start();
return ::android::OK;
}
void StreamBluetooth::shutdown() {
std::lock_guard guard(mLock);
- for (auto proxy : mBtDeviceProxies) {
- proxy->stop();
- proxy->unregisterPort();
+ if (mBtDeviceProxy != nullptr) {
+ mBtDeviceProxy->stop();
+ mBtDeviceProxy = nullptr;
}
- mBtDeviceProxies.clear();
}
ndk::ScopedAStatus StreamBluetooth::updateMetadataCommon(const Metadata& metadata) {
std::lock_guard guard(mLock);
- if (!mIsInitialized) return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+ if (mBtDeviceProxy == nullptr) {
+ return ndk::ScopedAStatus::ok();
+ }
bool isOk = true;
if (isInput(metadata)) {
- isOk = mBtDeviceProxies[0]->updateSinkMetadata(std::get<SinkMetadata>(metadata));
+ isOk = mBtDeviceProxy->updateSinkMetadata(std::get<SinkMetadata>(metadata));
} else {
- for (auto proxy : mBtDeviceProxies) {
- if (!proxy->updateSourceMetadata(std::get<SourceMetadata>(metadata))) isOk = false;
- }
+ isOk = mBtDeviceProxy->updateSourceMetadata(std::get<SourceMetadata>(metadata));
}
return isOk ? ndk::ScopedAStatus::ok()
: ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
@@ -280,7 +208,6 @@
ndk::ScopedAStatus StreamBluetooth::bluetoothParametersUpdated() {
if (mIsInput) {
- LOG(WARNING) << __func__ << ": not handled";
return ndk::ScopedAStatus::ok();
}
auto applyParam = [](const std::shared_ptr<BluetoothAudioPortAidl>& proxy,
@@ -297,15 +224,10 @@
bool hasLeParam, enableLe;
auto btLe = mBluetoothLe.lock();
hasLeParam = btLe != nullptr && btLe->isEnabled(&enableLe).isOk();
- std::unique_lock lock(mLock);
- ::android::base::ScopedLockAssertion lock_assertion(mLock);
- if (!mIsInitialized) {
- LOG(WARNING) << __func__ << ": init not done";
- return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
- }
- for (auto proxy : mBtDeviceProxies) {
- if ((hasA2dpParam && proxy->isA2dp() && !applyParam(proxy, enableA2dp)) ||
- (hasLeParam && proxy->isLeAudio() && !applyParam(proxy, enableLe))) {
+ std::lock_guard guard(mLock);
+ if (mBtDeviceProxy != nullptr) {
+ if ((hasA2dpParam && mBtDeviceProxy->isA2dp() && !applyParam(mBtDeviceProxy, enableA2dp)) ||
+ (hasLeParam && mBtDeviceProxy->isLeAudio() && !applyParam(mBtDeviceProxy, enableLe))) {
LOG(DEBUG) << __func__ << ": applyParam failed";
return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
}
@@ -313,11 +235,20 @@
return ndk::ScopedAStatus::ok();
}
+// static
+int32_t StreamInBluetooth::getNominalLatencyMs(size_t dataIntervalUs) {
+ if (dataIntervalUs == 0) dataIntervalUs = kBluetoothDefaultInputBufferMs * 1000LL;
+ return dataIntervalUs / 1000LL;
+}
+
StreamInBluetooth::StreamInBluetooth(StreamContext&& context, const SinkMetadata& sinkMetadata,
const std::vector<MicrophoneInfo>& microphones,
- ModuleBluetooth::BtProfileHandles&& btProfileHandles)
+ ModuleBluetooth::BtProfileHandles&& btProfileHandles,
+ const std::shared_ptr<BluetoothAudioPortAidl>& btDeviceProxy,
+ const PcmConfiguration& pcmConfig)
: StreamIn(std::move(context), microphones),
- StreamBluetooth(&mContextInstance, sinkMetadata, std::move(btProfileHandles)) {}
+ StreamBluetooth(&mContextInstance, sinkMetadata, std::move(btProfileHandles), btDeviceProxy,
+ pcmConfig) {}
ndk::ScopedAStatus StreamInBluetooth::getActiveMicrophones(
std::vector<MicrophoneDynamicInfo>* _aidl_return __unused) {
@@ -325,11 +256,20 @@
return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
}
+// static
+int32_t StreamOutBluetooth::getNominalLatencyMs(size_t dataIntervalUs) {
+ if (dataIntervalUs == 0) dataIntervalUs = kBluetoothDefaultOutputBufferMs * 1000LL;
+ return dataIntervalUs / 1000LL;
+}
+
StreamOutBluetooth::StreamOutBluetooth(StreamContext&& context,
const SourceMetadata& sourceMetadata,
const std::optional<AudioOffloadInfo>& offloadInfo,
- ModuleBluetooth::BtProfileHandles&& btProfileHandles)
+ ModuleBluetooth::BtProfileHandles&& btProfileHandles,
+ const std::shared_ptr<BluetoothAudioPortAidl>& btDeviceProxy,
+ const PcmConfiguration& pcmConfig)
: StreamOut(std::move(context), offloadInfo),
- StreamBluetooth(&mContextInstance, sourceMetadata, std::move(btProfileHandles)) {}
+ StreamBluetooth(&mContextInstance, sourceMetadata, std::move(btProfileHandles), btDeviceProxy,
+ pcmConfig) {}
} // namespace aidl::android::hardware::audio::core
diff --git a/audio/aidl/default/downmix/Android.bp b/audio/aidl/default/downmix/Android.bp
index 6d15cdb..8657283 100644
--- a/audio/aidl/default/downmix/Android.bp
+++ b/audio/aidl/default/downmix/Android.bp
@@ -27,8 +27,6 @@
name: "libdownmixsw",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"DownmixSw.cpp",
diff --git a/audio/aidl/default/downmix/DownmixSw.cpp b/audio/aidl/default/downmix/DownmixSw.cpp
index ce5fe20..19ab2e8 100644
--- a/audio/aidl/default/downmix/DownmixSw.cpp
+++ b/audio/aidl/default/downmix/DownmixSw.cpp
@@ -144,10 +144,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> DownmixSw::getContext() {
- return mContext;
-}
-
RetCode DownmixSw::releaseContext() {
if (mContext) {
mContext.reset();
diff --git a/audio/aidl/default/downmix/DownmixSw.h b/audio/aidl/default/downmix/DownmixSw.h
index 3f8a09b..1a9f0f0 100644
--- a/audio/aidl/default/downmix/DownmixSw.h
+++ b/audio/aidl/default/downmix/DownmixSw.h
@@ -55,20 +55,23 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
std::string getEffectName() override { return kEffectName; };
- IEffect::Status effectProcessImpl(float* in, float* out, int sample) override;
+ IEffect::Status effectProcessImpl(float* in, float* out, int sample)
+ REQUIRES(mImplMutex) override;
private:
- std::shared_ptr<DownmixSwContext> mContext;
+ std::shared_ptr<DownmixSwContext> mContext GUARDED_BY(mImplMutex);
- ndk::ScopedAStatus getParameterDownmix(const Downmix::Tag& tag, Parameter::Specific* specific);
+ ndk::ScopedAStatus getParameterDownmix(const Downmix::Tag& tag, Parameter::Specific* specific)
+ REQUIRES(mImplMutex);
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/dynamicProcessing/Android.bp b/audio/aidl/default/dynamicProcessing/Android.bp
index 1c0312d..c0a648d 100644
--- a/audio/aidl/default/dynamicProcessing/Android.bp
+++ b/audio/aidl/default/dynamicProcessing/Android.bp
@@ -27,8 +27,6 @@
name: "libdynamicsprocessingsw",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"DynamicsProcessingSw.cpp",
diff --git a/audio/aidl/default/dynamicProcessing/DynamicsProcessingSw.cpp b/audio/aidl/default/dynamicProcessing/DynamicsProcessingSw.cpp
index e8f90b2..36face1 100644
--- a/audio/aidl/default/dynamicProcessing/DynamicsProcessingSw.cpp
+++ b/audio/aidl/default/dynamicProcessing/DynamicsProcessingSw.cpp
@@ -260,10 +260,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> DynamicsProcessingSw::getContext() {
- return mContext;
-}
-
RetCode DynamicsProcessingSw::releaseContext() {
if (mContext) {
mContext.reset();
@@ -282,6 +278,9 @@
}
RetCode DynamicsProcessingSwContext::setCommon(const Parameter::Common& common) {
+ if (auto ret = updateIOFrameSize(common); ret != RetCode::SUCCESS) {
+ return ret;
+ }
mCommon = common;
mChannelCount = ::aidl::android::hardware::audio::common::getChannelCount(
common.input.base.channelMask);
diff --git a/audio/aidl/default/dynamicProcessing/DynamicsProcessingSw.h b/audio/aidl/default/dynamicProcessing/DynamicsProcessingSw.h
index 641cf71..98edca0 100644
--- a/audio/aidl/default/dynamicProcessing/DynamicsProcessingSw.h
+++ b/audio/aidl/default/dynamicProcessing/DynamicsProcessingSw.h
@@ -113,15 +113,17 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
- IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
+ IEffect::Status effectProcessImpl(float* in, float* out, int samples)
+ REQUIRES(mImplMutex) override;
std::string getEffectName() override { return kEffectName; };
private:
@@ -130,9 +132,10 @@
static const Range::DynamicsProcessingRange kPreEqBandRange;
static const Range::DynamicsProcessingRange kPostEqBandRange;
static const std::vector<Range::DynamicsProcessingRange> kRanges;
- std::shared_ptr<DynamicsProcessingSwContext> mContext;
+ std::shared_ptr<DynamicsProcessingSwContext> mContext GUARDED_BY(mImplMutex);
ndk::ScopedAStatus getParameterDynamicsProcessing(const DynamicsProcessing::Tag& tag,
- Parameter::Specific* specific);
+ Parameter::Specific* specific)
+ REQUIRES(mImplMutex);
}; // DynamicsProcessingSw
diff --git a/audio/aidl/default/envReverb/Android.bp b/audio/aidl/default/envReverb/Android.bp
index dd4219a..2443c2a 100644
--- a/audio/aidl/default/envReverb/Android.bp
+++ b/audio/aidl/default/envReverb/Android.bp
@@ -27,8 +27,6 @@
name: "libenvreverbsw",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"EnvReverbSw.cpp",
diff --git a/audio/aidl/default/envReverb/EnvReverbSw.cpp b/audio/aidl/default/envReverb/EnvReverbSw.cpp
index 73975c6..7937a6a 100644
--- a/audio/aidl/default/envReverb/EnvReverbSw.cpp
+++ b/audio/aidl/default/envReverb/EnvReverbSw.cpp
@@ -267,10 +267,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> EnvReverbSw::getContext() {
- return mContext;
-}
-
RetCode EnvReverbSw::releaseContext() {
if (mContext) {
mContext.reset();
diff --git a/audio/aidl/default/envReverb/EnvReverbSw.h b/audio/aidl/default/envReverb/EnvReverbSw.h
index 5e31e2f..367462b 100644
--- a/audio/aidl/default/envReverb/EnvReverbSw.h
+++ b/audio/aidl/default/envReverb/EnvReverbSw.h
@@ -100,21 +100,23 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
std::string getEffectName() override { return kEffectName; }
private:
static const std::vector<Range::EnvironmentalReverbRange> kRanges;
- std::shared_ptr<EnvReverbSwContext> mContext;
+ std::shared_ptr<EnvReverbSwContext> mContext GUARDED_BY(mImplMutex);
ndk::ScopedAStatus getParameterEnvironmentalReverb(const EnvironmentalReverb::Tag& tag,
- Parameter::Specific* specific);
+ Parameter::Specific* specific)
+ REQUIRES(mImplMutex);
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/equalizer/Android.bp b/audio/aidl/default/equalizer/Android.bp
index 3610563..42708d1 100644
--- a/audio/aidl/default/equalizer/Android.bp
+++ b/audio/aidl/default/equalizer/Android.bp
@@ -27,8 +27,6 @@
name: "libequalizersw",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"EqualizerSw.cpp",
diff --git a/audio/aidl/default/equalizer/EqualizerSw.cpp b/audio/aidl/default/equalizer/EqualizerSw.cpp
index b2add31..640b3ba 100644
--- a/audio/aidl/default/equalizer/EqualizerSw.cpp
+++ b/audio/aidl/default/equalizer/EqualizerSw.cpp
@@ -198,10 +198,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> EqualizerSw::getContext() {
- return mContext;
-}
-
RetCode EqualizerSw::releaseContext() {
if (mContext) {
mContext.reset();
diff --git a/audio/aidl/default/equalizer/EqualizerSw.h b/audio/aidl/default/equalizer/EqualizerSw.h
index 56af3b5..caaa129 100644
--- a/audio/aidl/default/equalizer/EqualizerSw.h
+++ b/audio/aidl/default/equalizer/EqualizerSw.h
@@ -97,15 +97,17 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
- IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
+ IEffect::Status effectProcessImpl(float* in, float* out, int samples)
+ REQUIRES(mImplMutex) override;
std::string getEffectName() override { return kEffectName; }
private:
@@ -113,7 +115,7 @@
static const std::vector<Equalizer::Preset> kPresets;
static const std::vector<Range::EqualizerRange> kRanges;
ndk::ScopedAStatus getParameterEqualizer(const Equalizer::Tag& tag,
- Parameter::Specific* specific);
+ Parameter::Specific* specific) REQUIRES(mImplMutex);
std::shared_ptr<EqualizerSwContext> mContext;
};
diff --git a/audio/aidl/default/extension/Android.bp b/audio/aidl/default/extension/Android.bp
index 4e5d352..5fee479 100644
--- a/audio/aidl/default/extension/Android.bp
+++ b/audio/aidl/default/extension/Android.bp
@@ -27,8 +27,6 @@
name: "libextensioneffect",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"ExtensionEffect.cpp",
diff --git a/audio/aidl/default/extension/ExtensionEffect.cpp b/audio/aidl/default/extension/ExtensionEffect.cpp
index 4a4d71b6..11916c8 100644
--- a/audio/aidl/default/extension/ExtensionEffect.cpp
+++ b/audio/aidl/default/extension/ExtensionEffect.cpp
@@ -123,10 +123,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> ExtensionEffect::getContext() {
- return mContext;
-}
-
RetCode ExtensionEffect::releaseContext() {
if (mContext) {
mContext.reset();
diff --git a/audio/aidl/default/extension/ExtensionEffect.h b/audio/aidl/default/extension/ExtensionEffect.h
index e7a068b..b560860 100644
--- a/audio/aidl/default/extension/ExtensionEffect.h
+++ b/audio/aidl/default/extension/ExtensionEffect.h
@@ -54,18 +54,20 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
std::string getEffectName() override { return kEffectName; };
- IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
+ IEffect::Status effectProcessImpl(float* in, float* out, int samples)
+ REQUIRES(mImplMutex) override;
private:
- std::shared_ptr<ExtensionEffectContext> mContext;
+ std::shared_ptr<ExtensionEffectContext> mContext GUARDED_BY(mImplMutex);
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/hapticGenerator/Android.bp b/audio/aidl/default/hapticGenerator/Android.bp
index 0df9a94..8fb9a3d 100644
--- a/audio/aidl/default/hapticGenerator/Android.bp
+++ b/audio/aidl/default/hapticGenerator/Android.bp
@@ -27,8 +27,6 @@
name: "libhapticgeneratorsw",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"HapticGeneratorSw.cpp",
diff --git a/audio/aidl/default/hapticGenerator/HapticGeneratorSw.cpp b/audio/aidl/default/hapticGenerator/HapticGeneratorSw.cpp
index 27cdac8..7469ab9 100644
--- a/audio/aidl/default/hapticGenerator/HapticGeneratorSw.cpp
+++ b/audio/aidl/default/hapticGenerator/HapticGeneratorSw.cpp
@@ -158,10 +158,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> HapticGeneratorSw::getContext() {
- return mContext;
-}
-
RetCode HapticGeneratorSw::releaseContext() {
if (mContext) {
mContext.reset();
diff --git a/audio/aidl/default/hapticGenerator/HapticGeneratorSw.h b/audio/aidl/default/hapticGenerator/HapticGeneratorSw.h
index 3bbe41a..47f3848 100644
--- a/audio/aidl/default/hapticGenerator/HapticGeneratorSw.h
+++ b/audio/aidl/default/hapticGenerator/HapticGeneratorSw.h
@@ -67,21 +67,24 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
- IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
+ IEffect::Status effectProcessImpl(float* in, float* out, int samples)
+ REQUIRES(mImplMutex) override;
std::string getEffectName() override { return kEffectName; }
private:
- std::shared_ptr<HapticGeneratorSwContext> mContext;
+ std::shared_ptr<HapticGeneratorSwContext> mContext GUARDED_BY(mImplMutex);
ndk::ScopedAStatus getParameterHapticGenerator(const HapticGenerator::Tag& tag,
- Parameter::Specific* specific);
+ Parameter::Specific* specific)
+ REQUIRES(mImplMutex);
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/include/core-impl/DevicePortProxy.h b/audio/aidl/default/include/core-impl/DevicePortProxy.h
index 17a8cf3..ccb23bb 100644
--- a/audio/aidl/default/include/core-impl/DevicePortProxy.h
+++ b/audio/aidl/default/include/core-impl/DevicePortProxy.h
@@ -73,12 +73,7 @@
* Bluetooth stack
*/
virtual bool loadAudioConfig(
- ::aidl::android::hardware::bluetooth::audio::PcmConfiguration*) const = 0;
-
- /**
- * WAR to support Mono mode / 16 bits per sample
- */
- virtual void forcePcmStereoToMono(bool) = 0;
+ ::aidl::android::hardware::bluetooth::audio::PcmConfiguration&) = 0;
/**
* When the Audio framework / HAL wants to change the stream state, it invokes
@@ -145,7 +140,7 @@
virtual bool isLeAudio() const = 0;
- virtual bool getPreferredDataIntervalUs(size_t*) const = 0;
+ virtual bool getPreferredDataIntervalUs(size_t&) const = 0;
virtual size_t writeData(const void*, size_t) const { return 0; }
@@ -162,10 +157,8 @@
void unregisterPort() override;
- bool loadAudioConfig(::aidl::android::hardware::bluetooth::audio::PcmConfiguration* audio_cfg)
- const override;
-
- void forcePcmStereoToMono(bool force) override { mIsStereoToMono = force; }
+ bool loadAudioConfig(
+ ::aidl::android::hardware::bluetooth::audio::PcmConfiguration& audio_cfg) override;
bool standby() override;
bool start() override;
@@ -193,7 +186,7 @@
bool isLeAudio() const override;
- bool getPreferredDataIntervalUs(size_t* interval_us) const override;
+ bool getPreferredDataIntervalUs(size_t& interval_us) const override;
protected:
uint16_t mCookie;
@@ -228,6 +221,9 @@
class BluetoothAudioPortAidlOut : public BluetoothAudioPortAidl {
public:
+ bool loadAudioConfig(
+ ::aidl::android::hardware::bluetooth::audio::PcmConfiguration& audio_cfg) override;
+
// The audio data path to the Bluetooth stack (Software encoding)
size_t writeData(const void* buffer, size_t bytes) const override;
};
diff --git a/audio/aidl/default/include/core-impl/Module.h b/audio/aidl/default/include/core-impl/Module.h
index 572b597..ce71d70 100644
--- a/audio/aidl/default/include/core-impl/Module.h
+++ b/audio/aidl/default/include/core-impl/Module.h
@@ -16,6 +16,7 @@
#pragma once
+#include <functional>
#include <iostream>
#include <map>
#include <memory>
@@ -188,7 +189,7 @@
// If the module is unable to populate the connected device port correctly, the returned error
// code must correspond to the errors of `IModule.connectedExternalDevice` method.
virtual ndk::ScopedAStatus populateConnectedDevicePort(
- ::aidl::android::media::audio::common::AudioPort* audioPort);
+ ::aidl::android::media::audio::common::AudioPort* audioPort, int32_t nextPortId);
// If the module finds that the patch endpoints configurations are not matched, the returned
// error code must correspond to the errors of `IModule.setAudioPatch` method.
virtual ndk::ScopedAStatus checkAudioPatchEndpointsMatch(
@@ -210,6 +211,7 @@
const int32_t rawSizeFrames =
aidl::android::hardware::audio::common::frameCountFromDurationMs(latencyMs,
sampleRateHz);
+ if (latencyMs >= 5) return rawSizeFrames;
int32_t powerOf2 = 1;
while (powerOf2 < rawSizeFrames) powerOf2 <<= 1;
return powerOf2;
@@ -227,12 +229,16 @@
std::set<int32_t> findConnectedPortConfigIds(int32_t portConfigId);
ndk::ScopedAStatus findPortIdForNewStream(
int32_t in_portConfigId, ::aidl::android::media::audio::common::AudioPort** port);
+ // Note: does not assign an ID to the config.
+ bool generateDefaultPortConfig(const ::aidl::android::media::audio::common::AudioPort& port,
+ ::aidl::android::media::audio::common::AudioPortConfig* config);
std::vector<AudioRoute*> getAudioRoutesForAudioPortImpl(int32_t portId);
Configuration& getConfig();
const ConnectedDevicePorts& getConnectedDevicePorts() const { return mConnectedDevicePorts; }
bool getMasterMute() const { return mMasterMute; }
bool getMasterVolume() const { return mMasterVolume; }
bool getMicMute() const { return mMicMute; }
+ const ModuleDebug& getModuleDebug() const { return mDebug; }
const Patches& getPatches() const { return mPatches; }
std::set<int32_t> getRoutableAudioPortIds(int32_t portId,
std::vector<AudioRoute*>* routes = nullptr);
@@ -243,6 +249,12 @@
template <typename C>
std::set<int32_t> portIdsFromPortConfigIds(C portConfigIds);
void registerPatch(const AudioPatch& patch);
+ ndk::ScopedAStatus setAudioPortConfigImpl(
+ const ::aidl::android::media::audio::common::AudioPortConfig& in_requested,
+ const std::function<bool(const ::aidl::android::media::audio::common::AudioPort& port,
+ ::aidl::android::media::audio::common::AudioPortConfig*
+ config)>& fillPortConfig,
+ ::aidl::android::media::audio::common::AudioPortConfig* out_suggested, bool* applied);
ndk::ScopedAStatus updateStreamsConnectedState(const AudioPatch& oldPatch,
const AudioPatch& newPatch);
};
diff --git a/audio/aidl/default/include/core-impl/ModuleAlsa.h b/audio/aidl/default/include/core-impl/ModuleAlsa.h
index 2774fe5..3392b41 100644
--- a/audio/aidl/default/include/core-impl/ModuleAlsa.h
+++ b/audio/aidl/default/include/core-impl/ModuleAlsa.h
@@ -33,7 +33,8 @@
protected:
// Extension methods of 'Module'.
ndk::ScopedAStatus populateConnectedDevicePort(
- ::aidl::android::media::audio::common::AudioPort* audioPort) override;
+ ::aidl::android::media::audio::common::AudioPort* audioPort,
+ int32_t nextPortId) override;
};
} // namespace aidl::android::hardware::audio::core
diff --git a/audio/aidl/default/include/core-impl/ModuleBluetooth.h b/audio/aidl/default/include/core-impl/ModuleBluetooth.h
index 631b088..9451411 100644
--- a/audio/aidl/default/include/core-impl/ModuleBluetooth.h
+++ b/audio/aidl/default/include/core-impl/ModuleBluetooth.h
@@ -16,7 +16,10 @@
#pragma once
+#include <map>
+
#include "core-impl/Bluetooth.h"
+#include "core-impl/DevicePortProxy.h"
#include "core-impl/Module.h"
namespace aidl::android::hardware::audio::core {
@@ -31,6 +34,11 @@
ModuleBluetooth(std::unique_ptr<Configuration>&& config);
private:
+ struct CachedProxy {
+ std::shared_ptr<::android::bluetooth::audio::aidl::BluetoothAudioPortAidl> ptr;
+ ::aidl::android::hardware::bluetooth::audio::PcmConfiguration pcmConfig;
+ };
+
ChildInterface<BluetoothA2dp>& getBtA2dp();
ChildInterface<BluetoothLe>& getBtLe();
BtProfileHandles getBtProfileManagerHandles();
@@ -40,6 +48,17 @@
ndk::ScopedAStatus getMicMute(bool* _aidl_return) override;
ndk::ScopedAStatus setMicMute(bool in_mute) override;
+ ndk::ScopedAStatus setAudioPortConfig(
+ const ::aidl::android::media::audio::common::AudioPortConfig& in_requested,
+ ::aidl::android::media::audio::common::AudioPortConfig* out_suggested,
+ bool* _aidl_return) override;
+
+ ndk::ScopedAStatus checkAudioPatchEndpointsMatch(
+ const std::vector<::aidl::android::media::audio::common::AudioPortConfig*>& sources,
+ const std::vector<::aidl::android::media::audio::common::AudioPortConfig*>& sinks)
+ override;
+ void onExternalDeviceConnectionChanged(
+ const ::aidl::android::media::audio::common::AudioPort& audioPort, bool connected);
ndk::ScopedAStatus createInputStream(
StreamContext&& context,
const ::aidl::android::hardware::audio::common::SinkMetadata& sinkMetadata,
@@ -52,12 +71,24 @@
offloadInfo,
std::shared_ptr<StreamOut>* result) override;
ndk::ScopedAStatus populateConnectedDevicePort(
- ::aidl::android::media::audio::common::AudioPort* audioPort) override;
+ ::aidl::android::media::audio::common::AudioPort* audioPort,
+ int32_t nextPortId) override;
ndk::ScopedAStatus onMasterMuteChanged(bool mute) override;
ndk::ScopedAStatus onMasterVolumeChanged(float volume) override;
+ int32_t getNominalLatencyMs(
+ const ::aidl::android::media::audio::common::AudioPortConfig& portConfig) override;
+
+ ndk::ScopedAStatus createProxy(
+ const ::aidl::android::media::audio::common::AudioPort& audioPort,
+ int32_t instancePortId, CachedProxy& proxy);
+ ndk::ScopedAStatus fetchAndCheckProxy(const StreamContext& context, CachedProxy& proxy);
+ ndk::ScopedAStatus findOrCreateProxy(
+ const ::aidl::android::media::audio::common::AudioPort& audioPort, CachedProxy& proxy);
ChildInterface<BluetoothA2dp> mBluetoothA2dp;
ChildInterface<BluetoothLe> mBluetoothLe;
+ std::map<int32_t /*instantiated device port ID*/, CachedProxy> mProxies;
+ std::map<int32_t /*mix port handle*/, int32_t /*instantiated device port ID*/> mConnections;
};
} // namespace aidl::android::hardware::audio::core
diff --git a/audio/aidl/default/include/core-impl/ModuleRemoteSubmix.h b/audio/aidl/default/include/core-impl/ModuleRemoteSubmix.h
index 9f8acc9..9d8c027 100644
--- a/audio/aidl/default/include/core-impl/ModuleRemoteSubmix.h
+++ b/audio/aidl/default/include/core-impl/ModuleRemoteSubmix.h
@@ -29,6 +29,10 @@
// IModule interfaces
ndk::ScopedAStatus getMicMute(bool* _aidl_return) override;
ndk::ScopedAStatus setMicMute(bool in_mute) override;
+ ndk::ScopedAStatus setAudioPortConfig(
+ const ::aidl::android::media::audio::common::AudioPortConfig& in_requested,
+ ::aidl::android::media::audio::common::AudioPortConfig* out_suggested,
+ bool* _aidl_return) override;
// Module interfaces
ndk::ScopedAStatus createInputStream(
@@ -43,7 +47,8 @@
offloadInfo,
std::shared_ptr<StreamOut>* result) override;
ndk::ScopedAStatus populateConnectedDevicePort(
- ::aidl::android::media::audio::common::AudioPort* audioPort) override;
+ ::aidl::android::media::audio::common::AudioPort* audioPort,
+ int32_t nextPortId) override;
ndk::ScopedAStatus checkAudioPatchEndpointsMatch(
const std::vector<::aidl::android::media::audio::common::AudioPortConfig*>& sources,
const std::vector<::aidl::android::media::audio::common::AudioPortConfig*>& sinks)
@@ -52,7 +57,7 @@
ndk::ScopedAStatus onMasterVolumeChanged(float volume) override;
int32_t getNominalLatencyMs(
const ::aidl::android::media::audio::common::AudioPortConfig& portConfig) override;
- // TODO(b/307586684): Report proper minimum stream buffer size by overriding 'setAudioPatch'.
+ binder_status_t dump(int fd, const char** args, uint32_t numArgs) override;
};
} // namespace aidl::android::hardware::audio::core
diff --git a/audio/aidl/default/include/core-impl/ModuleUsb.h b/audio/aidl/default/include/core-impl/ModuleUsb.h
index 6ee8f8a..d9ac4f0 100644
--- a/audio/aidl/default/include/core-impl/ModuleUsb.h
+++ b/audio/aidl/default/include/core-impl/ModuleUsb.h
@@ -44,7 +44,8 @@
offloadInfo,
std::shared_ptr<StreamOut>* result) override;
ndk::ScopedAStatus populateConnectedDevicePort(
- ::aidl::android::media::audio::common::AudioPort* audioPort) override;
+ ::aidl::android::media::audio::common::AudioPort* audioPort,
+ int32_t nextPortId) override;
ndk::ScopedAStatus checkAudioPatchEndpointsMatch(
const std::vector<::aidl::android::media::audio::common::AudioPortConfig*>& sources,
const std::vector<::aidl::android::media::audio::common::AudioPortConfig*>& sinks)
diff --git a/audio/aidl/default/include/core-impl/SoundDose.h b/audio/aidl/default/include/core-impl/SoundDose.h
index 82c1077..f58e541 100644
--- a/audio/aidl/default/include/core-impl/SoundDose.h
+++ b/audio/aidl/default/include/core-impl/SoundDose.h
@@ -64,7 +64,7 @@
// ------------------------------------ MelCallback ----------------------------------------
void onNewMelValues(const std::vector<float>& mels, size_t offset, size_t length,
- audio_port_handle_t deviceId) const override;
+ audio_port_handle_t deviceId, bool attenuated) const override;
void onMomentaryExposure(float currentMel, audio_port_handle_t deviceId) const override;
SoundDose& mSoundDose; // must outlive MelCallback, not owning
diff --git a/audio/aidl/default/include/core-impl/Stream.h b/audio/aidl/default/include/core-impl/Stream.h
index aa9fb19..21e63f9 100644
--- a/audio/aidl/default/include/core-impl/Stream.h
+++ b/audio/aidl/default/include/core-impl/Stream.h
@@ -90,7 +90,7 @@
std::weak_ptr<sounddose::StreamDataProcessorInterface> streamDataProcessor,
DebugParameters debugParameters)
: mCommandMQ(std::move(commandMQ)),
- mInternalCommandCookie(std::rand()),
+ mInternalCommandCookie(std::rand() | 1 /* make sure it's not 0 */),
mReplyMQ(std::move(replyMQ)),
mFormat(format),
mChannelLayout(channelLayout),
diff --git a/audio/aidl/default/include/core-impl/StreamBluetooth.h b/audio/aidl/default/include/core-impl/StreamBluetooth.h
index 1258d38..35c3183 100644
--- a/audio/aidl/default/include/core-impl/StreamBluetooth.h
+++ b/audio/aidl/default/include/core-impl/StreamBluetooth.h
@@ -31,8 +31,16 @@
class StreamBluetooth : public StreamCommonImpl {
public:
- StreamBluetooth(StreamContext* context, const Metadata& metadata,
- ModuleBluetooth::BtProfileHandles&& btHandles);
+ static bool checkConfigParams(
+ const ::aidl::android::hardware::bluetooth::audio::PcmConfiguration& pcmConfig,
+ const ::aidl::android::media::audio::common::AudioConfigBase& config);
+
+ StreamBluetooth(
+ StreamContext* context, const Metadata& metadata,
+ ModuleBluetooth::BtProfileHandles&& btHandles,
+ const std::shared_ptr<::android::bluetooth::audio::aidl::BluetoothAudioPortAidl>&
+ btDeviceProxy,
+ const ::aidl::android::hardware::bluetooth::audio::PcmConfiguration& pcmConfig);
// Methods of 'DriverInterface'.
::android::status_t init() override;
::android::status_t drain(StreamDescriptor::DrainMode) override;
@@ -47,40 +55,35 @@
// Overridden methods of 'StreamCommonImpl', called on a Binder thread.
ndk::ScopedAStatus updateMetadataCommon(const Metadata& metadata) override;
ndk::ScopedAStatus prepareToClose() override;
- const ConnectedDevices& getConnectedDevices() const override;
- ndk::ScopedAStatus setConnectedDevices(const ConnectedDevices& devices) override;
ndk::ScopedAStatus bluetoothParametersUpdated() override;
private:
- // Audio Pcm Config
- const uint32_t mSampleRate;
- const ::aidl::android::media::audio::common::AudioChannelLayout mChannelLayout;
- const ::aidl::android::media::audio::common::AudioFormatDescription mFormat;
const size_t mFrameSizeBytes;
const bool mIsInput;
const std::weak_ptr<IBluetoothA2dp> mBluetoothA2dp;
const std::weak_ptr<IBluetoothLe> mBluetoothLe;
- size_t mPreferredDataIntervalUs;
- size_t mPreferredFrameCount;
-
+ const size_t mPreferredDataIntervalUs;
+ const size_t mPreferredFrameCount;
mutable std::mutex mLock;
- bool mIsInitialized GUARDED_BY(mLock);
- bool mIsReadyToClose GUARDED_BY(mLock);
- std::vector<std::shared_ptr<::android::bluetooth::audio::aidl::BluetoothAudioPortAidl>>
- mBtDeviceProxies GUARDED_BY(mLock);
-
- ::android::status_t initialize() REQUIRES(mLock);
- bool checkConfigParams(::aidl::android::hardware::bluetooth::audio::PcmConfiguration& config);
+ // The lock is also used to serialize calls to the proxy.
+ std::shared_ptr<::android::bluetooth::audio::aidl::BluetoothAudioPortAidl> mBtDeviceProxy
+ GUARDED_BY(mLock); // proxy may be null if the stream is not connected to a device
};
class StreamInBluetooth final : public StreamIn, public StreamBluetooth {
public:
friend class ndk::SharedRefBase;
+
+ static int32_t getNominalLatencyMs(size_t dataIntervalUs);
+
StreamInBluetooth(
StreamContext&& context,
const ::aidl::android::hardware::audio::common::SinkMetadata& sinkMetadata,
const std::vector<::aidl::android::media::audio::common::MicrophoneInfo>& microphones,
- ModuleBluetooth::BtProfileHandles&& btHandles);
+ ModuleBluetooth::BtProfileHandles&& btHandles,
+ const std::shared_ptr<::android::bluetooth::audio::aidl::BluetoothAudioPortAidl>&
+ btDeviceProxy,
+ const ::aidl::android::hardware::bluetooth::audio::PcmConfiguration& pcmConfig);
private:
void onClose(StreamDescriptor::State) override { defaultOnClose(); }
@@ -92,12 +95,18 @@
class StreamOutBluetooth final : public StreamOut, public StreamBluetooth {
public:
friend class ndk::SharedRefBase;
+
+ static int32_t getNominalLatencyMs(size_t dataIntervalUs);
+
StreamOutBluetooth(
StreamContext&& context,
const ::aidl::android::hardware::audio::common::SourceMetadata& sourceMetadata,
const std::optional<::aidl::android::media::audio::common::AudioOffloadInfo>&
offloadInfo,
- ModuleBluetooth::BtProfileHandles&& btHandles);
+ ModuleBluetooth::BtProfileHandles&& btHandles,
+ const std::shared_ptr<::android::bluetooth::audio::aidl::BluetoothAudioPortAidl>&
+ btDeviceProxy,
+ const ::aidl::android::hardware::bluetooth::audio::PcmConfiguration& pcmConfig);
private:
void onClose(StreamDescriptor::State) override { defaultOnClose(); }
diff --git a/audio/aidl/default/include/core-impl/StreamPrimary.h b/audio/aidl/default/include/core-impl/StreamPrimary.h
index 145c3c4..8d5c57d 100644
--- a/audio/aidl/default/include/core-impl/StreamPrimary.h
+++ b/audio/aidl/default/include/core-impl/StreamPrimary.h
@@ -36,7 +36,7 @@
std::vector<alsa::DeviceProfile> getDeviceProfiles() override;
const bool mIsAsynchronous;
- long mStartTimeNs = 0;
+ int64_t mStartTimeNs = 0;
long mFramesSinceStart = 0;
bool mSkipNextTransfer = false;
};
diff --git a/audio/aidl/default/include/core-impl/StreamRemoteSubmix.h b/audio/aidl/default/include/core-impl/StreamRemoteSubmix.h
index ee10abf..b2cdc28 100644
--- a/audio/aidl/default/include/core-impl/StreamRemoteSubmix.h
+++ b/audio/aidl/default/include/core-impl/StreamRemoteSubmix.h
@@ -16,7 +16,6 @@
#pragma once
-#include <mutex>
#include <vector>
#include "core-impl/Stream.h"
@@ -56,13 +55,6 @@
r_submix::AudioConfig mStreamConfig;
std::shared_ptr<r_submix::SubmixRoute> mCurrentRoute = nullptr;
- // Mutex lock to protect vector of submix routes, each of these submix routes have their mutex
- // locks and none of the mutex locks should be taken together.
- static std::mutex sSubmixRoutesLock;
- static std::map<::aidl::android::media::audio::common::AudioDeviceAddress,
- std::shared_ptr<r_submix::SubmixRoute>>
- sSubmixRoutes GUARDED_BY(sSubmixRoutesLock);
-
// limit for number of read error log entries to avoid spamming the logs
static constexpr int kMaxReadErrorLogs = 5;
// The duration of kMaxReadFailureAttempts * READ_ATTEMPT_SLEEP_MS must be strictly inferior
@@ -72,9 +64,10 @@
// 5ms between two read attempts when pipe is empty
static constexpr int kReadAttemptSleepUs = 5000;
- long mStartTimeNs = 0;
+ int64_t mStartTimeNs = 0;
long mFramesSinceStart = 0;
int mReadErrorCount = 0;
+ int mReadFailureCount = 0;
};
class StreamInRemoteSubmix final : public StreamIn, public StreamSwitcher {
diff --git a/audio/aidl/default/include/effect-impl/EffectContext.h b/audio/aidl/default/include/effect-impl/EffectContext.h
index 698e7a5..24f3b5d 100644
--- a/audio/aidl/default/include/effect-impl/EffectContext.h
+++ b/audio/aidl/default/include/effect-impl/EffectContext.h
@@ -21,6 +21,7 @@
#include <Utils.h>
#include <android-base/logging.h>
#include <fmq/AidlMessageQueue.h>
+#include <fmq/EventFlag.h>
#include <aidl/android/hardware/audio/effect/BnEffect.h>
#include "EffectTypes.h"
@@ -36,119 +37,73 @@
float, ::aidl::android::hardware::common::fmq::SynchronizedReadWrite>
DataMQ;
- EffectContext(size_t statusDepth, const Parameter::Common& common) {
- auto& input = common.input;
- auto& output = common.output;
-
- LOG_ALWAYS_FATAL_IF(
- input.base.format.pcm != aidl::android::media::audio::common::PcmType::FLOAT_32_BIT,
- "inputFormatNotFloat");
- LOG_ALWAYS_FATAL_IF(output.base.format.pcm !=
- aidl::android::media::audio::common::PcmType::FLOAT_32_BIT,
- "outputFormatNotFloat");
- mInputFrameSize = ::aidl::android::hardware::audio::common::getFrameSizeInBytes(
- input.base.format, input.base.channelMask);
- mOutputFrameSize = ::aidl::android::hardware::audio::common::getFrameSizeInBytes(
- output.base.format, output.base.channelMask);
- // in/outBuffer size in float (FMQ data format defined for DataMQ)
- size_t inBufferSizeInFloat = input.frameCount * mInputFrameSize / sizeof(float);
- size_t outBufferSizeInFloat = output.frameCount * mOutputFrameSize / sizeof(float);
-
- // only status FMQ use the EventFlag
- mStatusMQ = std::make_shared<StatusMQ>(statusDepth, true /*configureEventFlagWord*/);
- mInputMQ = std::make_shared<DataMQ>(inBufferSizeInFloat);
- mOutputMQ = std::make_shared<DataMQ>(outBufferSizeInFloat);
-
- if (!mStatusMQ->isValid() || !mInputMQ->isValid() || !mOutputMQ->isValid()) {
- LOG(ERROR) << __func__ << " created invalid FMQ";
+ EffectContext(size_t statusDepth, const Parameter::Common& common);
+ virtual ~EffectContext() {
+ if (mEfGroup) {
+ ::android::hardware::EventFlag::deleteEventFlag(&mEfGroup);
}
- mWorkBuffer.reserve(std::max(inBufferSizeInFloat, outBufferSizeInFloat));
- mCommon = common;
}
- virtual ~EffectContext() {}
- std::shared_ptr<StatusMQ> getStatusFmq() { return mStatusMQ; }
- std::shared_ptr<DataMQ> getInputDataFmq() { return mInputMQ; }
- std::shared_ptr<DataMQ> getOutputDataFmq() { return mOutputMQ; }
+ std::shared_ptr<StatusMQ> getStatusFmq() const;
+ std::shared_ptr<DataMQ> getInputDataFmq() const;
+ std::shared_ptr<DataMQ> getOutputDataFmq() const;
- float* getWorkBuffer() { return static_cast<float*>(mWorkBuffer.data()); }
+ float* getWorkBuffer();
// reset buffer status by abandon input data in FMQ
- void resetBuffer() {
- auto buffer = static_cast<float*>(mWorkBuffer.data());
- std::vector<IEffect::Status> status(mStatusMQ->availableToRead());
- mInputMQ->read(buffer, mInputMQ->availableToRead());
- }
+ void resetBuffer();
+ void dupeFmq(IEffect::OpenEffectReturn* effectRet);
+ size_t getInputFrameSize() const;
+ size_t getOutputFrameSize() const;
+ int getSessionId() const;
+ int getIoHandle() const;
- void dupeFmq(IEffect::OpenEffectReturn* effectRet) {
- if (effectRet) {
- effectRet->statusMQ = mStatusMQ->dupeDesc();
- effectRet->inputDataMQ = mInputMQ->dupeDesc();
- effectRet->outputDataMQ = mOutputMQ->dupeDesc();
- }
- }
- size_t getInputFrameSize() { return mInputFrameSize; }
- size_t getOutputFrameSize() { return mOutputFrameSize; }
- int getSessionId() { return mCommon.session; }
- int getIoHandle() { return mCommon.ioHandle; }
+ virtual void dupeFmqWithReopen(IEffect::OpenEffectReturn* effectRet);
virtual RetCode setOutputDevice(
- const std::vector<aidl::android::media::audio::common::AudioDeviceDescription>&
- device) {
- mOutputDevice = device;
- return RetCode::SUCCESS;
- }
+ const std::vector<aidl::android::media::audio::common::AudioDeviceDescription>& device);
virtual std::vector<aidl::android::media::audio::common::AudioDeviceDescription>
- getOutputDevice() {
- return mOutputDevice;
- }
+ getOutputDevice();
- virtual RetCode setAudioMode(const aidl::android::media::audio::common::AudioMode& mode) {
- mMode = mode;
- return RetCode::SUCCESS;
- }
- virtual aidl::android::media::audio::common::AudioMode getAudioMode() { return mMode; }
+ virtual RetCode setAudioMode(const aidl::android::media::audio::common::AudioMode& mode);
+ virtual aidl::android::media::audio::common::AudioMode getAudioMode();
- virtual RetCode setAudioSource(const aidl::android::media::audio::common::AudioSource& source) {
- mSource = source;
- return RetCode::SUCCESS;
- }
- virtual aidl::android::media::audio::common::AudioSource getAudioSource() { return mSource; }
+ virtual RetCode setAudioSource(const aidl::android::media::audio::common::AudioSource& source);
+ virtual aidl::android::media::audio::common::AudioSource getAudioSource();
- virtual RetCode setVolumeStereo(const Parameter::VolumeStereo& volumeStereo) {
- mVolumeStereo = volumeStereo;
- return RetCode::SUCCESS;
- }
- virtual Parameter::VolumeStereo getVolumeStereo() { return mVolumeStereo; }
+ virtual RetCode setVolumeStereo(const Parameter::VolumeStereo& volumeStereo);
+ virtual Parameter::VolumeStereo getVolumeStereo();
- virtual RetCode setCommon(const Parameter::Common& common) {
- mCommon = common;
- LOG(VERBOSE) << __func__ << mCommon.toString();
- return RetCode::SUCCESS;
- }
- virtual Parameter::Common getCommon() {
- LOG(VERBOSE) << __func__ << mCommon.toString();
- return mCommon;
- }
+ virtual RetCode setCommon(const Parameter::Common& common);
+ virtual Parameter::Common getCommon();
+
+ virtual ::android::hardware::EventFlag* getStatusEventFlag();
protected:
- // common parameters
size_t mInputFrameSize;
size_t mOutputFrameSize;
- Parameter::Common mCommon;
- std::vector<aidl::android::media::audio::common::AudioDeviceDescription> mOutputDevice;
- aidl::android::media::audio::common::AudioMode mMode;
- aidl::android::media::audio::common::AudioSource mSource;
- Parameter::VolumeStereo mVolumeStereo;
+ size_t mInputChannelCount;
+ size_t mOutputChannelCount;
+ Parameter::Common mCommon = {};
+ std::vector<aidl::android::media::audio::common::AudioDeviceDescription> mOutputDevice = {};
+ aidl::android::media::audio::common::AudioMode mMode =
+ aidl::android::media::audio::common::AudioMode::SYS_RESERVED_INVALID;
+ aidl::android::media::audio::common::AudioSource mSource =
+ aidl::android::media::audio::common::AudioSource::SYS_RESERVED_INVALID;
+ Parameter::VolumeStereo mVolumeStereo = {};
+ RetCode updateIOFrameSize(const Parameter::Common& common);
+ RetCode notifyDataMqUpdate();
private:
// fmq and buffers
std::shared_ptr<StatusMQ> mStatusMQ;
std::shared_ptr<DataMQ> mInputMQ;
std::shared_ptr<DataMQ> mOutputMQ;
- // TODO handle effect process input and output
+ // std::shared_ptr<IEffect::OpenEffectReturn> mRet;
// work buffer set by effect instances, the access and update are in same thread
std::vector<float> mWorkBuffer;
+
+ ::android::hardware::EventFlag* mEfGroup;
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/include/effect-impl/EffectImpl.h b/audio/aidl/default/include/effect-impl/EffectImpl.h
index e7d081f..21f6502 100644
--- a/audio/aidl/default/include/effect-impl/EffectImpl.h
+++ b/audio/aidl/default/include/effect-impl/EffectImpl.h
@@ -43,38 +43,60 @@
OpenEffectReturn* ret) override;
virtual ndk::ScopedAStatus close() override;
virtual ndk::ScopedAStatus command(CommandId id) override;
+ virtual ndk::ScopedAStatus reopen(OpenEffectReturn* ret) override;
virtual ndk::ScopedAStatus getState(State* state) override;
virtual ndk::ScopedAStatus setParameter(const Parameter& param) override;
virtual ndk::ScopedAStatus getParameter(const Parameter::Id& id, Parameter* param) override;
- virtual ndk::ScopedAStatus setParameterCommon(const Parameter& param);
- virtual ndk::ScopedAStatus getParameterCommon(const Parameter::Tag& tag, Parameter* param);
+ virtual ndk::ScopedAStatus setParameterCommon(const Parameter& param) REQUIRES(mImplMutex);
+ virtual ndk::ScopedAStatus getParameterCommon(const Parameter::Tag& tag, Parameter* param)
+ REQUIRES(mImplMutex);
/* Methods MUST be implemented by each effect instances */
virtual ndk::ScopedAStatus getDescriptor(Descriptor* desc) = 0;
- virtual ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) = 0;
+ virtual ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) = 0;
virtual ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) = 0;
+ Parameter::Specific* specific)
+ REQUIRES(mImplMutex) = 0;
virtual std::string getEffectName() = 0;
- virtual IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
+ virtual std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex);
+ virtual RetCode releaseContext() REQUIRES(mImplMutex) = 0;
/**
- * Effect context methods must be implemented by each effect.
- * Each effect can derive from EffectContext and define its own context, but must upcast to
- * EffectContext for EffectImpl to use.
+ * @brief effectProcessImpl is running in worker thread which created in EffectThread.
+ *
+ * EffectThread will make sure effectProcessImpl only be called after startThread() successful
+ * and before stopThread() successful.
+ *
+ * effectProcessImpl implementation must not call any EffectThread interface, otherwise it will
+ * cause deadlock.
+ *
+ * @param in address of input float buffer.
+ * @param out address of output float buffer.
+ * @param samples number of samples to process.
+ * @return IEffect::Status
*/
- virtual std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) = 0;
- virtual std::shared_ptr<EffectContext> getContext() = 0;
- virtual RetCode releaseContext() = 0;
+ virtual IEffect::Status effectProcessImpl(float* in, float* out, int samples) = 0;
+
+ /**
+ * process() get data from data MQs, and call effectProcessImpl() for effect data processing.
+ * Its important for the implementation to use mImplMutex for context synchronization.
+ */
+ void process() override;
protected:
- State mState = State::INIT;
+ State mState GUARDED_BY(mImplMutex) = State::INIT;
IEffect::Status status(binder_status_t status, size_t consumed, size_t produced);
void cleanUp();
+ std::mutex mImplMutex;
+ std::shared_ptr<EffectContext> mImplContext GUARDED_BY(mImplMutex);
+
/**
* Optional CommandId handling methods for effects to override.
* For CommandId::START, EffectImpl call commandImpl before starting the EffectThread
@@ -82,6 +104,9 @@
* For CommandId::STOP and CommandId::RESET, EffectImpl call commandImpl after stop the
* EffectThread processing.
*/
- virtual ndk::ScopedAStatus commandImpl(CommandId id);
+ virtual ndk::ScopedAStatus commandImpl(CommandId id) REQUIRES(mImplMutex);
+
+ RetCode notifyEventFlag(uint32_t flag);
+ ::android::hardware::EventFlag* mEventFlag;
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/include/effect-impl/EffectThread.h b/audio/aidl/default/include/effect-impl/EffectThread.h
index ae51ef7..3dbb0e6 100644
--- a/audio/aidl/default/include/effect-impl/EffectThread.h
+++ b/audio/aidl/default/include/effect-impl/EffectThread.h
@@ -36,8 +36,7 @@
virtual ~EffectThread();
// called by effect implementation.
- RetCode createThread(std::shared_ptr<EffectContext> context, const std::string& name,
- int priority = ANDROID_PRIORITY_URGENT_AUDIO);
+ RetCode createThread(const std::string& name, int priority = ANDROID_PRIORITY_URGENT_AUDIO);
RetCode destroyThread();
RetCode startThread();
RetCode stopThread();
@@ -46,32 +45,11 @@
void threadLoop();
/**
- * @brief effectProcessImpl is running in worker thread which created in EffectThread.
- *
- * Effect implementation should think about concurrency in the implementation if necessary.
- * Parameter setting usually implemented in context (derived from EffectContext), and some
- * parameter maybe used in the processing, then effect implementation should consider using a
- * mutex to protect these parameter.
- *
- * EffectThread will make sure effectProcessImpl only be called after startThread() successful
- * and before stopThread() successful.
- *
- * effectProcessImpl implementation must not call any EffectThread interface, otherwise it will
- * cause deadlock.
- *
- * @param in address of input float buffer.
- * @param out address of output float buffer.
- * @param samples number of samples to process.
- * @return IEffect::Status
- */
- virtual IEffect::Status effectProcessImpl(float* in, float* out, int samples) = 0;
-
- /**
* process() call effectProcessImpl() for effect data processing, it is necessary for the
* processing to be called under Effect thread mutex mThreadMutex, to avoid the effect state
* change before/during data processing, and keep the thread and effect state consistent.
*/
- virtual void process_l() REQUIRES(mThreadMutex);
+ virtual void process() = 0;
private:
static constexpr int kMaxTaskNameLen = 15;
@@ -80,16 +58,7 @@
std::condition_variable mCv;
bool mStop GUARDED_BY(mThreadMutex) = true;
bool mExit GUARDED_BY(mThreadMutex) = false;
- std::shared_ptr<EffectContext> mThreadContext GUARDED_BY(mThreadMutex);
- struct EventFlagDeleter {
- void operator()(::android::hardware::EventFlag* flag) const {
- if (flag) {
- ::android::hardware::EventFlag::deleteEventFlag(&flag);
- }
- }
- };
- std::unique_ptr<::android::hardware::EventFlag, EventFlagDeleter> mEfGroup;
std::thread mThread;
int mPriority;
std::string mName;
diff --git a/audio/aidl/default/include/effect-impl/EffectTypes.h b/audio/aidl/default/include/effect-impl/EffectTypes.h
index 4bda7be..9740d6e 100644
--- a/audio/aidl/default/include/effect-impl/EffectTypes.h
+++ b/audio/aidl/default/include/effect-impl/EffectTypes.h
@@ -46,7 +46,8 @@
ERROR_NULL_POINTER, /* NULL pointer */
ERROR_ALIGNMENT_ERROR, /* Memory alignment error */
ERROR_BLOCK_SIZE_EXCEED, /* Maximum block size exceeded */
- ERROR_EFFECT_LIB_ERROR
+ ERROR_EFFECT_LIB_ERROR, /* Effect implementation library error */
+ ERROR_EVENT_FLAG_ERROR /* Error with effect event flags */
};
static const int INVALID_AUDIO_SESSION_ID = -1;
@@ -67,6 +68,8 @@
return out << "ERROR_BLOCK_SIZE_EXCEED";
case RetCode::ERROR_EFFECT_LIB_ERROR:
return out << "ERROR_EFFECT_LIB_ERROR";
+ case RetCode::ERROR_EVENT_FLAG_ERROR:
+ return out << "ERROR_EVENT_FLAG_ERROR";
}
return out << "EnumError: " << code;
diff --git a/audio/aidl/default/loudnessEnhancer/Android.bp b/audio/aidl/default/loudnessEnhancer/Android.bp
index 89a72fe..cd44b50 100644
--- a/audio/aidl/default/loudnessEnhancer/Android.bp
+++ b/audio/aidl/default/loudnessEnhancer/Android.bp
@@ -27,8 +27,6 @@
name: "libloudnessenhancersw",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"LoudnessEnhancerSw.cpp",
diff --git a/audio/aidl/default/loudnessEnhancer/LoudnessEnhancerSw.cpp b/audio/aidl/default/loudnessEnhancer/LoudnessEnhancerSw.cpp
index 7954316..1e70716 100644
--- a/audio/aidl/default/loudnessEnhancer/LoudnessEnhancerSw.cpp
+++ b/audio/aidl/default/loudnessEnhancer/LoudnessEnhancerSw.cpp
@@ -147,10 +147,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> LoudnessEnhancerSw::getContext() {
- return mContext;
-}
-
RetCode LoudnessEnhancerSw::releaseContext() {
if (mContext) {
mContext.reset();
diff --git a/audio/aidl/default/loudnessEnhancer/LoudnessEnhancerSw.h b/audio/aidl/default/loudnessEnhancer/LoudnessEnhancerSw.h
index 25824f2..cf71a5f 100644
--- a/audio/aidl/default/loudnessEnhancer/LoudnessEnhancerSw.h
+++ b/audio/aidl/default/loudnessEnhancer/LoudnessEnhancerSw.h
@@ -54,20 +54,23 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
- IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
+ IEffect::Status effectProcessImpl(float* in, float* out, int samples)
+ REQUIRES(mImplMutex) override;
std::string getEffectName() override { return kEffectName; }
private:
- std::shared_ptr<LoudnessEnhancerSwContext> mContext;
+ std::shared_ptr<LoudnessEnhancerSwContext> mContext GUARDED_BY(mImplMutex);
ndk::ScopedAStatus getParameterLoudnessEnhancer(const LoudnessEnhancer::Tag& tag,
- Parameter::Specific* specific);
+ Parameter::Specific* specific)
+ REQUIRES(mImplMutex);
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/noiseSuppression/Android.bp b/audio/aidl/default/noiseSuppression/Android.bp
index dad3d49..f24ded6 100644
--- a/audio/aidl/default/noiseSuppression/Android.bp
+++ b/audio/aidl/default/noiseSuppression/Android.bp
@@ -27,8 +27,6 @@
name: "libnssw",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"NoiseSuppressionSw.cpp",
diff --git a/audio/aidl/default/noiseSuppression/NoiseSuppressionSw.cpp b/audio/aidl/default/noiseSuppression/NoiseSuppressionSw.cpp
index a3208df..d304416 100644
--- a/audio/aidl/default/noiseSuppression/NoiseSuppressionSw.cpp
+++ b/audio/aidl/default/noiseSuppression/NoiseSuppressionSw.cpp
@@ -155,10 +155,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> NoiseSuppressionSw::getContext() {
- return mContext;
-}
-
RetCode NoiseSuppressionSw::releaseContext() {
if (mContext) {
mContext.reset();
diff --git a/audio/aidl/default/noiseSuppression/NoiseSuppressionSw.h b/audio/aidl/default/noiseSuppression/NoiseSuppressionSw.h
index fc1e028..acef8ee 100644
--- a/audio/aidl/default/noiseSuppression/NoiseSuppressionSw.h
+++ b/audio/aidl/default/noiseSuppression/NoiseSuppressionSw.h
@@ -55,20 +55,23 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
std::string getEffectName() override { return kEffectName; };
- IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
+ IEffect::Status effectProcessImpl(float* in, float* out, int samples)
+ REQUIRES(mImplMutex) override;
private:
- std::shared_ptr<NoiseSuppressionSwContext> mContext;
+ std::shared_ptr<NoiseSuppressionSwContext> mContext GUARDED_BY(mImplMutex);
ndk::ScopedAStatus getParameterNoiseSuppression(const NoiseSuppression::Tag& tag,
- Parameter::Specific* specific);
+ Parameter::Specific* specific)
+ REQUIRES(mImplMutex);
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/presetReverb/Android.bp b/audio/aidl/default/presetReverb/Android.bp
index 18bdd17..d600141 100644
--- a/audio/aidl/default/presetReverb/Android.bp
+++ b/audio/aidl/default/presetReverb/Android.bp
@@ -27,8 +27,6 @@
name: "libpresetreverbsw",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"PresetReverbSw.cpp",
diff --git a/audio/aidl/default/presetReverb/PresetReverbSw.cpp b/audio/aidl/default/presetReverb/PresetReverbSw.cpp
index 3f02eb7..2ac2010 100644
--- a/audio/aidl/default/presetReverb/PresetReverbSw.cpp
+++ b/audio/aidl/default/presetReverb/PresetReverbSw.cpp
@@ -161,10 +161,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> PresetReverbSw::getContext() {
- return mContext;
-}
-
RetCode PresetReverbSw::releaseContext() {
if (mContext) {
mContext.reset();
diff --git a/audio/aidl/default/presetReverb/PresetReverbSw.h b/audio/aidl/default/presetReverb/PresetReverbSw.h
index 9ceee7c..61fc88c 100644
--- a/audio/aidl/default/presetReverb/PresetReverbSw.h
+++ b/audio/aidl/default/presetReverb/PresetReverbSw.h
@@ -56,21 +56,23 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
- IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
+ IEffect::Status effectProcessImpl(float* in, float* out, int samples)
+ REQUIRES(mImplMutex) override;
std::string getEffectName() override { return kEffectName; }
private:
- std::shared_ptr<PresetReverbSwContext> mContext;
+ std::shared_ptr<PresetReverbSwContext> mContext GUARDED_BY(mImplMutex);
ndk::ScopedAStatus getParameterPresetReverb(const PresetReverb::Tag& tag,
- Parameter::Specific* specific);
+ Parameter::Specific* specific) REQUIRES(mImplMutex);
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/r_submix/ModuleRemoteSubmix.cpp b/audio/aidl/default/r_submix/ModuleRemoteSubmix.cpp
index f3965ba..b44f37b 100644
--- a/audio/aidl/default/r_submix/ModuleRemoteSubmix.cpp
+++ b/audio/aidl/default/r_submix/ModuleRemoteSubmix.cpp
@@ -16,6 +16,7 @@
#define LOG_TAG "AHAL_ModuleRemoteSubmix"
+#include <stdio.h>
#include <vector>
#include <android-base/logging.h>
@@ -27,14 +28,36 @@
using aidl::android::hardware::audio::common::SinkMetadata;
using aidl::android::hardware::audio::common::SourceMetadata;
+using aidl::android::media::audio::common::AudioDeviceAddress;
using aidl::android::media::audio::common::AudioFormatType;
+using aidl::android::media::audio::common::AudioIoFlags;
using aidl::android::media::audio::common::AudioOffloadInfo;
using aidl::android::media::audio::common::AudioPort;
using aidl::android::media::audio::common::AudioPortConfig;
+using aidl::android::media::audio::common::AudioPortExt;
+using aidl::android::media::audio::common::AudioProfile;
+using aidl::android::media::audio::common::Int;
using aidl::android::media::audio::common::MicrophoneInfo;
namespace aidl::android::hardware::audio::core {
+namespace {
+
+std::optional<r_submix::AudioConfig> getRemoteEndConfig(const AudioPort& audioPort) {
+ const auto& deviceAddress = audioPort.ext.get<AudioPortExt::device>().device.address;
+ const bool isInput = audioPort.flags.getTag() == AudioIoFlags::input;
+ if (auto submixRoute = r_submix::SubmixRoute::findRoute(deviceAddress);
+ submixRoute != nullptr) {
+ if ((isInput && submixRoute->isStreamOutOpen()) ||
+ (!isInput && submixRoute->isStreamInOpen())) {
+ return submixRoute->getPipeConfig();
+ }
+ }
+ return {};
+}
+
+} // namespace
+
ndk::ScopedAStatus ModuleRemoteSubmix::getMicMute(bool* _aidl_return __unused) {
LOG(DEBUG) << __func__ << ": is not supported";
return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
@@ -45,13 +68,29 @@
return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
}
+ndk::ScopedAStatus ModuleRemoteSubmix::setAudioPortConfig(const AudioPortConfig& in_requested,
+ AudioPortConfig* out_suggested,
+ bool* _aidl_return) {
+ auto fillConfig = [this](const AudioPort& port, AudioPortConfig* config) {
+ if (port.ext.getTag() == AudioPortExt::device) {
+ if (auto pipeConfig = getRemoteEndConfig(port); pipeConfig.has_value()) {
+ LOG(DEBUG) << "setAudioPortConfig: suggesting port config from the remote end.";
+ config->format = pipeConfig->format;
+ config->channelMask = pipeConfig->channelLayout;
+ config->sampleRate = Int{.value = pipeConfig->sampleRate};
+ config->flags = port.flags;
+ config->ext = port.ext;
+ return true;
+ }
+ }
+ return generateDefaultPortConfig(port, config);
+ };
+ return Module::setAudioPortConfigImpl(in_requested, fillConfig, out_suggested, _aidl_return);
+}
+
ndk::ScopedAStatus ModuleRemoteSubmix::createInputStream(
StreamContext&& context, const SinkMetadata& sinkMetadata,
const std::vector<MicrophoneInfo>& microphones, std::shared_ptr<StreamIn>* result) {
- if (context.getFormat().type != AudioFormatType::PCM) {
- LOG(DEBUG) << __func__ << ": not supported for format " << context.getFormat().toString();
- return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
- }
return createStreamInstance<StreamInRemoteSubmix>(result, std::move(context), sinkMetadata,
microphones);
}
@@ -59,16 +98,27 @@
ndk::ScopedAStatus ModuleRemoteSubmix::createOutputStream(
StreamContext&& context, const SourceMetadata& sourceMetadata,
const std::optional<AudioOffloadInfo>& offloadInfo, std::shared_ptr<StreamOut>* result) {
- if (context.getFormat().type != AudioFormatType::PCM) {
- LOG(DEBUG) << __func__ << ": not supported for format " << context.getFormat().toString();
- return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
- }
return createStreamInstance<StreamOutRemoteSubmix>(result, std::move(context), sourceMetadata,
offloadInfo);
}
-ndk::ScopedAStatus ModuleRemoteSubmix::populateConnectedDevicePort(AudioPort* audioPort) {
- // Find the corresponding mix port and copy its profiles.
+ndk::ScopedAStatus ModuleRemoteSubmix::populateConnectedDevicePort(AudioPort* audioPort, int32_t) {
+ if (audioPort->ext.getTag() != AudioPortExt::device) {
+ LOG(ERROR) << __func__ << ": not a device port: " << audioPort->toString();
+ return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
+ }
+ // If there is already a pipe with a stream for the port address, provide its configuration as
+ // the only option. Otherwise, find the corresponding mix port and copy its profiles.
+ if (auto pipeConfig = getRemoteEndConfig(*audioPort); pipeConfig.has_value()) {
+ audioPort->profiles.clear();
+ audioPort->profiles.push_back(AudioProfile{
+ .format = pipeConfig->format,
+ .channelMasks = std::vector<AudioChannelLayout>({pipeConfig->channelLayout}),
+ .sampleRates = std::vector<int>({pipeConfig->sampleRate})});
+ LOG(DEBUG) << __func__ << ": populated from remote end as: " << audioPort->toString();
+ return ndk::ScopedAStatus::ok();
+ }
+
// At this moment, the port has the same ID as the template port, see connectExternalDevice.
std::vector<AudioRoute*> routes = getAudioRoutesForAudioPortImpl(audioPort->id);
if (routes.empty()) {
@@ -87,6 +137,7 @@
RETURN_STATUS_IF_ERROR(getAudioPort(route->sinkPortId, &mixPort));
}
audioPort->profiles = mixPort.profiles;
+ LOG(DEBUG) << __func__ << ": populated from the mix port as: " << audioPort->toString();
return ndk::ScopedAStatus::ok();
}
@@ -124,4 +175,9 @@
return kMinLatencyMs;
}
+binder_status_t ModuleRemoteSubmix::dump(int fd, const char** /*args*/, uint32_t /*numArgs*/) {
+ dprintf(fd, "\nSubmixRoutes:\n%s\n", r_submix::SubmixRoute::dumpRoutes().c_str());
+ return STATUS_OK;
+}
+
} // namespace aidl::android::hardware::audio::core
diff --git a/audio/aidl/default/r_submix/StreamRemoteSubmix.cpp b/audio/aidl/default/r_submix/StreamRemoteSubmix.cpp
index d238aa4..fa4135d 100644
--- a/audio/aidl/default/r_submix/StreamRemoteSubmix.cpp
+++ b/audio/aidl/default/r_submix/StreamRemoteSubmix.cpp
@@ -43,26 +43,10 @@
mStreamConfig.sampleRate = context->getSampleRate();
}
-std::mutex StreamRemoteSubmix::sSubmixRoutesLock;
-std::map<AudioDeviceAddress, std::shared_ptr<SubmixRoute>> StreamRemoteSubmix::sSubmixRoutes;
-
::android::status_t StreamRemoteSubmix::init() {
- {
- std::lock_guard guard(sSubmixRoutesLock);
- auto routeItr = sSubmixRoutes.find(mDeviceAddress);
- if (routeItr != sSubmixRoutes.end()) {
- mCurrentRoute = routeItr->second;
- }
- // If route is not available for this port, add it.
- if (mCurrentRoute == nullptr) {
- // Initialize the pipe.
- mCurrentRoute = std::make_shared<SubmixRoute>();
- if (::android::OK != mCurrentRoute->createPipe(mStreamConfig)) {
- LOG(ERROR) << __func__ << ": create pipe failed";
- return ::android::NO_INIT;
- }
- sSubmixRoutes.emplace(mDeviceAddress, mCurrentRoute);
- }
+ mCurrentRoute = SubmixRoute::findOrCreateRoute(mDeviceAddress, mStreamConfig);
+ if (mCurrentRoute == nullptr) {
+ return ::android::NO_INIT;
}
if (!mCurrentRoute->isStreamConfigValid(mIsInput, mStreamConfig)) {
LOG(ERROR) << __func__ << ": invalid stream config";
@@ -80,7 +64,6 @@
return ::android::NO_INIT;
}
}
-
mCurrentRoute->openStream(mIsInput);
return ::android::OK;
}
@@ -114,14 +97,7 @@
ndk::ScopedAStatus StreamRemoteSubmix::prepareToClose() {
if (!mIsInput) {
- std::shared_ptr<SubmixRoute> route = nullptr;
- {
- std::lock_guard guard(sSubmixRoutesLock);
- auto routeItr = sSubmixRoutes.find(mDeviceAddress);
- if (routeItr != sSubmixRoutes.end()) {
- route = routeItr->second;
- }
- }
+ std::shared_ptr<SubmixRoute> route = SubmixRoute::findRoute(mDeviceAddress);
if (route != nullptr) {
sp<MonoPipe> sink = route->getSink();
if (sink == nullptr) {
@@ -148,9 +124,7 @@
if (!mCurrentRoute->hasAtleastOneStreamOpen()) {
mCurrentRoute->releasePipe();
LOG(DEBUG) << __func__ << ": pipe destroyed";
-
- std::lock_guard guard(sSubmixRoutesLock);
- sSubmixRoutes.erase(mDeviceAddress);
+ SubmixRoute::removeRoute(mDeviceAddress);
}
mCurrentRoute.reset();
}
@@ -164,7 +138,7 @@
: outWrite(buffer, frameCount, actualFrameCount));
const long bufferDurationUs =
(*actualFrameCount) * MICROS_PER_SECOND / mContext.getSampleRate();
- const long totalDurationUs = (::android::uptimeNanos() - mStartTimeNs) / NANOS_PER_MICROSECOND;
+ const auto totalDurationUs = (::android::uptimeNanos() - mStartTimeNs) / NANOS_PER_MICROSECOND;
mFramesSinceStart += *actualFrameCount;
const long totalOffsetUs =
mFramesSinceStart * MICROS_PER_SECOND / mContext.getSampleRate() - totalDurationUs;
@@ -201,7 +175,7 @@
// Calculate the maximum size of the pipe buffer in frames for the specified stream.
size_t StreamRemoteSubmix::getStreamPipeSizeInFrames() {
- auto pipeConfig = mCurrentRoute->mPipeConfig;
+ auto pipeConfig = mCurrentRoute->getPipeConfig();
const size_t maxFrameSize = std::max(mStreamConfig.frameSize, pipeConfig.frameSize);
return (pipeConfig.frameCount * pipeConfig.frameSize) / maxFrameSize;
}
@@ -293,6 +267,7 @@
}
return ::android::OK;
}
+ mReadErrorCount = 0;
LOG(VERBOSE) << __func__ << ": " << mDeviceAddress.toString() << ", " << frameCount
<< " frames";
@@ -300,8 +275,8 @@
char* buff = (char*)buffer;
size_t actuallyRead = 0;
long remainingFrames = frameCount;
- const long deadlineTimeNs = ::android::uptimeNanos() +
- getDelayInUsForFrameCount(frameCount) * NANOS_PER_MICROSECOND;
+ const int64_t deadlineTimeNs = ::android::uptimeNanos() +
+ getDelayInUsForFrameCount(frameCount) * NANOS_PER_MICROSECOND;
while (remainingFrames > 0) {
ssize_t framesRead = source->read(buff, remainingFrames);
LOG(VERBOSE) << __func__ << ": frames read " << framesRead;
@@ -320,7 +295,12 @@
}
}
if (actuallyRead < frameCount) {
- LOG(WARNING) << __func__ << ": read " << actuallyRead << " vs. requested " << frameCount;
+ if (++mReadFailureCount < kMaxReadFailureAttempts) {
+ LOG(WARNING) << __func__ << ": read " << actuallyRead << " vs. requested " << frameCount
+ << " (not all errors will be logged)";
+ }
+ } else {
+ mReadFailureCount = 0;
}
mCurrentRoute->updateReadCounterFrames(*actualFrameCount);
return ::android::OK;
diff --git a/audio/aidl/default/r_submix/SubmixRoute.cpp b/audio/aidl/default/r_submix/SubmixRoute.cpp
index 235c9a3..325a012 100644
--- a/audio/aidl/default/r_submix/SubmixRoute.cpp
+++ b/audio/aidl/default/r_submix/SubmixRoute.cpp
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+#include <mutex>
+
#define LOG_TAG "AHAL_SubmixRoute"
#include <android-base/logging.h>
#include <media/AidlConversionCppNdk.h>
@@ -23,9 +25,65 @@
#include "SubmixRoute.h"
using aidl::android::hardware::audio::common::getChannelCount;
+using aidl::android::media::audio::common::AudioDeviceAddress;
namespace aidl::android::hardware::audio::core::r_submix {
+// static
+SubmixRoute::RoutesMonitor SubmixRoute::getRoutes(bool tryLock) {
+ static std::mutex submixRoutesLock;
+ static RoutesMap submixRoutes;
+ return !tryLock ? RoutesMonitor(submixRoutesLock, submixRoutes)
+ : RoutesMonitor(submixRoutesLock, submixRoutes, tryLock);
+}
+
+// static
+std::shared_ptr<SubmixRoute> SubmixRoute::findOrCreateRoute(const AudioDeviceAddress& deviceAddress,
+ const AudioConfig& pipeConfig) {
+ auto routes = getRoutes();
+ auto routeItr = routes->find(deviceAddress);
+ if (routeItr != routes->end()) {
+ return routeItr->second;
+ }
+ auto route = std::make_shared<SubmixRoute>();
+ if (::android::OK != route->createPipe(pipeConfig)) {
+ LOG(ERROR) << __func__ << ": create pipe failed";
+ return nullptr;
+ }
+ routes->emplace(deviceAddress, route);
+ return route;
+}
+
+// static
+std::shared_ptr<SubmixRoute> SubmixRoute::findRoute(const AudioDeviceAddress& deviceAddress) {
+ auto routes = getRoutes();
+ auto routeItr = routes->find(deviceAddress);
+ if (routeItr != routes->end()) {
+ return routeItr->second;
+ }
+ return nullptr;
+}
+
+// static
+void SubmixRoute::removeRoute(const AudioDeviceAddress& deviceAddress) {
+ getRoutes()->erase(deviceAddress);
+}
+
+// static
+std::string SubmixRoute::dumpRoutes() {
+ auto routes = getRoutes(true /*tryLock*/);
+ std::string result;
+ if (routes->empty()) result.append(" <Empty>");
+ for (const auto& r : *(routes.operator->())) {
+ result.append(" - ")
+ .append(r.first.toString())
+ .append(": ")
+ .append(r.second->dump())
+ .append("\n");
+ }
+ return result;
+}
+
// Verify a submix input or output stream can be opened.
bool SubmixRoute::isStreamConfigValid(bool isInput, const AudioConfig& streamConfig) {
// If the stream is already open, don't open it again.
@@ -44,6 +102,7 @@
// Compare this stream config with existing pipe config, returning false if they do *not*
// match, true otherwise.
bool SubmixRoute::isStreamConfigCompatible(const AudioConfig& streamConfig) {
+ std::lock_guard guard(mLock);
if (streamConfig.channelLayout != mPipeConfig.channelLayout) {
LOG(ERROR) << __func__ << ": channel count mismatch, stream channels = "
<< streamConfig.channelLayout.toString()
@@ -162,17 +221,14 @@
LOG(FATAL) << __func__ << ": Negotiation for the source failed, index = " << index;
return ::android::BAD_INDEX;
}
- LOG(VERBOSE) << __func__ << ": created pipe";
-
- mPipeConfig = streamConfig;
- mPipeConfig.frameCount = sink->maxFrames();
-
- LOG(VERBOSE) << __func__ << ": Pipe frame size : " << mPipeConfig.frameSize
- << ", pipe frames : " << mPipeConfig.frameCount;
+ LOG(VERBOSE) << __func__ << ": Pipe frame size : " << streamConfig.frameSize
+ << ", pipe frames : " << sink->maxFrames();
// Save references to the source and sink.
{
std::lock_guard guard(mLock);
+ mPipeConfig = streamConfig;
+ mPipeConfig.frameCount = sink->maxFrames();
mSink = std::move(sink);
mSource = std::move(source);
}
@@ -181,15 +237,15 @@
}
// Release references to the sink and source.
-void SubmixRoute::releasePipe() {
+AudioConfig SubmixRoute::releasePipe() {
std::lock_guard guard(mLock);
mSink.clear();
mSource.clear();
+ return mPipeConfig;
}
::android::status_t SubmixRoute::resetPipe() {
- releasePipe();
- return createPipe(mPipeConfig);
+ return createPipe(releasePipe());
}
void SubmixRoute::standby(bool isInput) {
@@ -220,4 +276,23 @@
}
}
+std::string SubmixRoute::dump() NO_THREAD_SAFETY_ANALYSIS {
+ const bool isLocked = mLock.try_lock();
+ std::string result = std::string(isLocked ? "" : "! ")
+ .append("Input ")
+ .append(mStreamInOpen ? "open" : "closed")
+ .append(mStreamInStandby ? ", standby" : ", active")
+ .append(", refcount: ")
+ .append(std::to_string(mInputRefCount))
+ .append(", framesRead: ")
+ .append(mSource ? std::to_string(mSource->framesRead()) : "<null>")
+ .append("; Output ")
+ .append(mStreamOutOpen ? "open" : "closed")
+ .append(mStreamOutStandby ? ", standby" : ", active")
+ .append(", framesWritten: ")
+ .append(mSink ? std::to_string(mSink->framesWritten()) : "<null>");
+ if (isLocked) mLock.unlock();
+ return result;
+}
+
} // namespace aidl::android::hardware::audio::core::r_submix
diff --git a/audio/aidl/default/r_submix/SubmixRoute.h b/audio/aidl/default/r_submix/SubmixRoute.h
index 252b1c9..5425f12 100644
--- a/audio/aidl/default/r_submix/SubmixRoute.h
+++ b/audio/aidl/default/r_submix/SubmixRoute.h
@@ -17,6 +17,7 @@
#pragma once
#include <mutex>
+#include <string>
#include <android-base/thread_annotations.h>
#include <audio_utils/clock.h>
@@ -25,6 +26,7 @@
#include <media/nbaio/MonoPipeReader.h>
#include <aidl/android/media/audio/common/AudioChannelLayout.h>
+#include <aidl/android/media/audio/common/AudioDeviceAddress.h>
#include <aidl/android/media/audio/common/AudioFormatDescription.h>
using aidl::android::media::audio::common::AudioChannelLayout;
@@ -60,7 +62,14 @@
class SubmixRoute {
public:
- AudioConfig mPipeConfig;
+ static std::shared_ptr<SubmixRoute> findOrCreateRoute(
+ const ::aidl::android::media::audio::common::AudioDeviceAddress& deviceAddress,
+ const AudioConfig& pipeConfig);
+ static std::shared_ptr<SubmixRoute> findRoute(
+ const ::aidl::android::media::audio::common::AudioDeviceAddress& deviceAddress);
+ static void removeRoute(
+ const ::aidl::android::media::audio::common::AudioDeviceAddress& deviceAddress);
+ static std::string dumpRoutes();
bool isStreamInOpen() {
std::lock_guard guard(mLock);
@@ -90,6 +99,10 @@
std::lock_guard guard(mLock);
return mSource;
}
+ AudioConfig getPipeConfig() {
+ std::lock_guard guard(mLock);
+ return mPipeConfig;
+ }
bool isStreamConfigValid(bool isInput, const AudioConfig& streamConfig);
void closeStream(bool isInput);
@@ -98,17 +111,35 @@
bool hasAtleastOneStreamOpen();
int notifyReadError();
void openStream(bool isInput);
- void releasePipe();
+ AudioConfig releasePipe();
::android::status_t resetPipe();
bool shouldBlockWrite();
void standby(bool isInput);
long updateReadCounterFrames(size_t frameCount);
+ std::string dump();
+
private:
+ using RoutesMap = std::map<::aidl::android::media::audio::common::AudioDeviceAddress,
+ std::shared_ptr<r_submix::SubmixRoute>>;
+ class RoutesMonitor {
+ public:
+ RoutesMonitor(std::mutex& mutex, RoutesMap& routes) : mLock(mutex), mRoutes(routes) {}
+ RoutesMonitor(std::mutex& mutex, RoutesMap& routes, bool /*tryLock*/)
+ : mLock(mutex, std::try_to_lock), mRoutes(routes) {}
+ RoutesMap* operator->() { return &mRoutes; }
+
+ private:
+ std::unique_lock<std::mutex> mLock;
+ RoutesMap& mRoutes;
+ };
+
+ static RoutesMonitor getRoutes(bool tryLock = false);
+
bool isStreamConfigCompatible(const AudioConfig& streamConfig);
std::mutex mLock;
-
+ AudioConfig mPipeConfig GUARDED_BY(mLock);
bool mStreamInOpen GUARDED_BY(mLock) = false;
int mInputRefCount GUARDED_BY(mLock) = 0;
bool mStreamInStandby GUARDED_BY(mLock) = true;
diff --git a/health/2.0/utils/libhealthstoragedefault/Android.bp b/audio/aidl/default/spatializer/Android.bp
similarity index 66%
rename from health/2.0/utils/libhealthstoragedefault/Android.bp
rename to audio/aidl/default/spatializer/Android.bp
index 3de8789..05ed365 100644
--- a/health/2.0/utils/libhealthstoragedefault/Android.bp
+++ b/audio/aidl/default/spatializer/Android.bp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -14,9 +14,6 @@
* limitations under the License.
*/
-// Default implementation for (passthrough) clients that statically links to
-// android.hardware.health@2.0-impl but do no query for storage related
-// information.
package {
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
@@ -26,13 +23,17 @@
default_applicable_licenses: ["hardware_interfaces_license"],
}
-cc_library_static {
- srcs: ["StorageHealthDefault.cpp"],
- name: "libhealthstoragedefault",
- vendor_available: true,
- recovery_available: true,
- cflags: ["-Werror"],
- shared_libs: [
- "android.hardware.health@2.0",
+cc_library_shared {
+ name: "libspatializersw",
+ defaults: [
+ "aidlaudioeffectservice_defaults",
+ ],
+ srcs: [
+ "SpatializerSw.cpp",
+ ":effectCommonFile",
+ ],
+ relative_install_path: "soundfx",
+ visibility: [
+ "//hardware/interfaces/audio/aidl/default",
],
}
diff --git a/audio/aidl/default/spatializer/SpatializerSw.cpp b/audio/aidl/default/spatializer/SpatializerSw.cpp
new file mode 100644
index 0000000..6d3c4bd
--- /dev/null
+++ b/audio/aidl/default/spatializer/SpatializerSw.cpp
@@ -0,0 +1,207 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "AHAL_SpatializerSw"
+
+#include "SpatializerSw.h"
+
+#include <android-base/logging.h>
+#include <system/audio_effects/effect_uuid.h>
+
+#include <optional>
+
+using aidl::android::hardware::audio::common::getChannelCount;
+using aidl::android::hardware::audio::effect::Descriptor;
+using aidl::android::hardware::audio::effect::getEffectImplUuidSpatializerSw;
+using aidl::android::hardware::audio::effect::getEffectTypeUuidSpatializer;
+using aidl::android::hardware::audio::effect::IEffect;
+using aidl::android::hardware::audio::effect::SpatializerSw;
+using aidl::android::hardware::audio::effect::State;
+using aidl::android::media::audio::common::AudioChannelLayout;
+using aidl::android::media::audio::common::AudioUuid;
+using aidl::android::media::audio::common::HeadTracking;
+using aidl::android::media::audio::common::Spatialization;
+
+extern "C" binder_exception_t createEffect(const AudioUuid* in_impl_uuid,
+ std::shared_ptr<IEffect>* instanceSpp) {
+ if (!in_impl_uuid || *in_impl_uuid != getEffectImplUuidSpatializerSw()) {
+ LOG(ERROR) << __func__ << "uuid not supported";
+ return EX_ILLEGAL_ARGUMENT;
+ }
+ if (!instanceSpp) {
+ LOG(ERROR) << __func__ << " invalid input parameter!";
+ return EX_ILLEGAL_ARGUMENT;
+ }
+
+ *instanceSpp = ndk::SharedRefBase::make<SpatializerSw>();
+ LOG(DEBUG) << __func__ << " instance " << instanceSpp->get() << " created";
+ return EX_NONE;
+}
+
+extern "C" binder_exception_t queryEffect(const AudioUuid* in_impl_uuid, Descriptor* _aidl_return) {
+ if (!in_impl_uuid || *in_impl_uuid != getEffectImplUuidSpatializerSw()) {
+ LOG(ERROR) << __func__ << "uuid not supported";
+ return EX_ILLEGAL_ARGUMENT;
+ }
+ *_aidl_return = SpatializerSw::kDescriptor;
+ return EX_NONE;
+}
+
+namespace aidl::android::hardware::audio::effect {
+
+const std::string SpatializerSw::kEffectName = "SpatializerSw";
+
+const std::vector<Range::SpatializerRange> SpatializerSw::kRanges = {
+ MAKE_RANGE(Spatializer, supportedChannelLayout, std::vector<AudioChannelLayout>{},
+ std::vector<AudioChannelLayout>{}),
+ MAKE_RANGE(Spatializer, spatializationLevel, Spatialization::Level::NONE,
+ Spatialization::Level::BED_PLUS_OBJECTS),
+ MAKE_RANGE(Spatializer, spatializationMode, Spatialization::Mode::BINAURAL,
+ Spatialization::Mode::TRANSAURAL),
+ MAKE_RANGE(Spatializer, headTrackingSensorId, std::numeric_limits<int>::min(),
+ std::numeric_limits<int>::max()),
+ MAKE_RANGE(Spatializer, headTrackingMode, HeadTracking::Mode::OTHER,
+ HeadTracking::Mode::RELATIVE_SCREEN),
+ MAKE_RANGE(Spatializer, headTrackingConnectionMode,
+ HeadTracking::ConnectionMode::FRAMEWORK_PROCESSED,
+ HeadTracking::ConnectionMode::DIRECT_TO_SENSOR_TUNNEL)};
+const Capability SpatializerSw::kCapability = {.range = {SpatializerSw::kRanges}};
+const Descriptor SpatializerSw::kDescriptor = {
+ .common = {.id = {.type = getEffectTypeUuidSpatializer(),
+ .uuid = getEffectImplUuidSpatializerSw()},
+ .flags = {.type = Flags::Type::INSERT,
+ .insert = Flags::Insert::FIRST,
+ .hwAcceleratorMode = Flags::HardwareAccelerator::NONE},
+ .name = SpatializerSw::kEffectName,
+ .implementor = "The Android Open Source Project"},
+ .capability = SpatializerSw::kCapability};
+
+ndk::ScopedAStatus SpatializerSw::getDescriptor(Descriptor* _aidl_return) {
+ LOG(DEBUG) << __func__ << kDescriptor.toString();
+ *_aidl_return = kDescriptor;
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus SpatializerSw::setParameterSpecific(const Parameter::Specific& specific) {
+ RETURN_IF(Parameter::Specific::spatializer != specific.getTag(), EX_ILLEGAL_ARGUMENT,
+ "EffectNotSupported");
+ RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");
+
+ auto& param = specific.get<Parameter::Specific::spatializer>();
+ RETURN_IF(!inRange(param, kRanges), EX_ILLEGAL_ARGUMENT, "outOfRange");
+
+ return mContext->setParam(param.getTag(), param);
+}
+
+ndk::ScopedAStatus SpatializerSw::getParameterSpecific(const Parameter::Id& id,
+ Parameter::Specific* specific) {
+ auto tag = id.getTag();
+ RETURN_IF(Parameter::Id::spatializerTag != tag, EX_ILLEGAL_ARGUMENT, "wrongIdTag");
+ auto spatializerId = id.get<Parameter::Id::spatializerTag>();
+ auto spatializerTag = spatializerId.getTag();
+ switch (spatializerTag) {
+ case Spatializer::Id::commonTag: {
+ auto specificTag = spatializerId.get<Spatializer::Id::commonTag>();
+ std::optional<Spatializer> param = mContext->getParam(specificTag);
+ if (!param.has_value()) {
+ return ndk::ScopedAStatus::fromExceptionCodeWithMessage(
+ EX_ILLEGAL_ARGUMENT, "SpatializerTagNotSupported");
+ }
+ specific->set<Parameter::Specific::spatializer>(param.value());
+ break;
+ }
+ default: {
+ LOG(ERROR) << __func__ << " unsupported tag: " << toString(tag);
+ return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+ "SpatializerTagNotSupported");
+ }
+ }
+ return ndk::ScopedAStatus::ok();
+}
+
+std::shared_ptr<EffectContext> SpatializerSw::createContext(const Parameter::Common& common) {
+ if (mContext) {
+ LOG(DEBUG) << __func__ << " context already exist";
+ } else {
+ mContext = std::make_shared<SpatializerSwContext>(1 /* statusFmqDepth */, common);
+ }
+ return mContext;
+}
+
+RetCode SpatializerSw::releaseContext() {
+ if (mContext) {
+ mContext.reset();
+ }
+ return RetCode::SUCCESS;
+}
+
+SpatializerSw::~SpatializerSw() {
+ cleanUp();
+ LOG(DEBUG) << __func__;
+}
+
+// Processing method running in EffectWorker thread.
+IEffect::Status SpatializerSw::effectProcessImpl(float* in, float* out, int samples) {
+ RETURN_VALUE_IF(!mContext, (IEffect::Status{EX_NULL_POINTER, 0, 0}), "nullContext");
+ return mContext->process(in, out, samples);
+}
+
+SpatializerSwContext::SpatializerSwContext(int statusDepth, const Parameter::Common& common)
+ : EffectContext(statusDepth, common) {
+ LOG(DEBUG) << __func__;
+}
+
+SpatializerSwContext::~SpatializerSwContext() {
+ LOG(DEBUG) << __func__;
+}
+
+template <typename TAG>
+std::optional<Spatializer> SpatializerSwContext::getParam(TAG tag) {
+ if (mParamsMap.find(tag) != mParamsMap.end()) {
+ return mParamsMap.at(tag);
+ }
+ return std::nullopt;
+}
+
+template <typename TAG>
+ndk::ScopedAStatus SpatializerSwContext::setParam(TAG tag, Spatializer spatializer) {
+ mParamsMap[tag] = spatializer;
+ return ndk::ScopedAStatus::ok();
+}
+
+IEffect::Status SpatializerSwContext::process(float* in, float* out, int samples) {
+ LOG(DEBUG) << __func__ << " in " << in << " out " << out << " samples " << samples;
+ IEffect::Status status = {EX_ILLEGAL_ARGUMENT, 0, 0};
+
+ const auto inputChannelCount = getChannelCount(mCommon.input.base.channelMask);
+ const auto outputChannelCount = getChannelCount(mCommon.output.base.channelMask);
+ if (outputChannelCount < 2 || inputChannelCount < outputChannelCount) {
+ LOG(ERROR) << __func__ << " invalid channel count, in: " << inputChannelCount
+ << " out: " << outputChannelCount;
+ return status;
+ }
+
+ int iFrames = samples / inputChannelCount;
+ for (int i = 0; i < iFrames; i++) {
+ std::memcpy(out, in, outputChannelCount);
+ in += inputChannelCount;
+ out += outputChannelCount;
+ }
+ return {STATUS_OK, static_cast<int32_t>(iFrames * inputChannelCount),
+ static_cast<int32_t>(iFrames * outputChannelCount)};
+}
+
+} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/spatializer/SpatializerSw.h b/audio/aidl/default/spatializer/SpatializerSw.h
new file mode 100644
index 0000000..b321e83
--- /dev/null
+++ b/audio/aidl/default/spatializer/SpatializerSw.h
@@ -0,0 +1,70 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include "effect-impl/EffectContext.h"
+#include "effect-impl/EffectImpl.h"
+
+#include <fmq/AidlMessageQueue.h>
+
+#include <unordered_map>
+#include <vector>
+
+namespace aidl::android::hardware::audio::effect {
+
+class SpatializerSwContext final : public EffectContext {
+ public:
+ SpatializerSwContext(int statusDepth, const Parameter::Common& common);
+ ~SpatializerSwContext();
+
+ template <typename TAG>
+ std::optional<Spatializer> getParam(TAG tag);
+ template <typename TAG>
+ ndk::ScopedAStatus setParam(TAG tag, Spatializer spatializer);
+
+ IEffect::Status process(float* in, float* out, int samples);
+
+ private:
+ std::unordered_map<Spatializer::Tag, Spatializer> mParamsMap;
+};
+
+class SpatializerSw final : public EffectImpl {
+ public:
+ static const std::string kEffectName;
+ static const Capability kCapability;
+ static const Descriptor kDescriptor;
+ ~SpatializerSw();
+
+ ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
+
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
+
+ std::string getEffectName() override { return kEffectName; };
+ IEffect::Status effectProcessImpl(float* in, float* out, int samples)
+ REQUIRES(mImplMutex) override;
+
+ private:
+ static const std::vector<Range::SpatializerRange> kRanges;
+ std::shared_ptr<SpatializerSwContext> mContext GUARDED_BY(mImplMutex) = nullptr;
+};
+} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/usb/ModuleUsb.cpp b/audio/aidl/default/usb/ModuleUsb.cpp
index f926e09..1d97bc4 100644
--- a/audio/aidl/default/usb/ModuleUsb.cpp
+++ b/audio/aidl/default/usb/ModuleUsb.cpp
@@ -87,12 +87,13 @@
offloadInfo);
}
-ndk::ScopedAStatus ModuleUsb::populateConnectedDevicePort(AudioPort* audioPort) {
+ndk::ScopedAStatus ModuleUsb::populateConnectedDevicePort(AudioPort* audioPort,
+ int32_t nextPortId) {
if (!isUsbDevicePort(*audioPort)) {
LOG(ERROR) << __func__ << ": port id " << audioPort->id << " is not a usb device port";
return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
}
- return ModuleAlsa::populateConnectedDevicePort(audioPort);
+ return ModuleAlsa::populateConnectedDevicePort(audioPort, nextPortId);
}
ndk::ScopedAStatus ModuleUsb::checkAudioPatchEndpointsMatch(
diff --git a/audio/aidl/default/virtualizer/Android.bp b/audio/aidl/default/virtualizer/Android.bp
index ed0199d..1c41bb5 100644
--- a/audio/aidl/default/virtualizer/Android.bp
+++ b/audio/aidl/default/virtualizer/Android.bp
@@ -27,8 +27,6 @@
name: "libvirtualizersw",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"VirtualizerSw.cpp",
diff --git a/audio/aidl/default/virtualizer/VirtualizerSw.cpp b/audio/aidl/default/virtualizer/VirtualizerSw.cpp
index 0e8435e..091b0b7 100644
--- a/audio/aidl/default/virtualizer/VirtualizerSw.cpp
+++ b/audio/aidl/default/virtualizer/VirtualizerSw.cpp
@@ -203,10 +203,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> VirtualizerSw::getContext() {
- return mContext;
-}
-
RetCode VirtualizerSw::releaseContext() {
if (mContext) {
mContext.reset();
diff --git a/audio/aidl/default/virtualizer/VirtualizerSw.h b/audio/aidl/default/virtualizer/VirtualizerSw.h
index 5e114d9..9287838 100644
--- a/audio/aidl/default/virtualizer/VirtualizerSw.h
+++ b/audio/aidl/default/virtualizer/VirtualizerSw.h
@@ -59,24 +59,25 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
std::string getEffectName() override { return kEffectName; }
private:
static const std::vector<Range::VirtualizerRange> kRanges;
- std::shared_ptr<VirtualizerSwContext> mContext;
+ std::shared_ptr<VirtualizerSwContext> mContext GUARDED_BY(mImplMutex);
ndk::ScopedAStatus getParameterVirtualizer(const Virtualizer::Tag& tag,
- Parameter::Specific* specific);
+ Parameter::Specific* specific) REQUIRES(mImplMutex);
ndk::ScopedAStatus getSpeakerAngles(const Virtualizer::SpeakerAnglesPayload payload,
- Parameter::Specific* specific);
+ Parameter::Specific* specific) REQUIRES(mImplMutex);
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/visualizer/Android.bp b/audio/aidl/default/visualizer/Android.bp
index 091daa2..68f7177 100644
--- a/audio/aidl/default/visualizer/Android.bp
+++ b/audio/aidl/default/visualizer/Android.bp
@@ -27,8 +27,6 @@
name: "libvisualizersw",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"VisualizerSw.cpp",
diff --git a/audio/aidl/default/visualizer/VisualizerSw.cpp b/audio/aidl/default/visualizer/VisualizerSw.cpp
index 285c102..54f7f1c 100644
--- a/audio/aidl/default/visualizer/VisualizerSw.cpp
+++ b/audio/aidl/default/visualizer/VisualizerSw.cpp
@@ -190,10 +190,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> VisualizerSw::getContext() {
- return mContext;
-}
-
RetCode VisualizerSw::releaseContext() {
if (mContext) {
mContext.reset();
diff --git a/audio/aidl/default/visualizer/VisualizerSw.h b/audio/aidl/default/visualizer/VisualizerSw.h
index 995774e..4b87b04 100644
--- a/audio/aidl/default/visualizer/VisualizerSw.h
+++ b/audio/aidl/default/visualizer/VisualizerSw.h
@@ -72,21 +72,23 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
- IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
+ IEffect::Status effectProcessImpl(float* in, float* out, int samples)
+ REQUIRES(mImplMutex) override;
std::string getEffectName() override { return kEffectName; }
private:
static const std::vector<Range::VisualizerRange> kRanges;
- std::shared_ptr<VisualizerSwContext> mContext;
+ std::shared_ptr<VisualizerSwContext> mContext GUARDED_BY(mImplMutex);
ndk::ScopedAStatus getParameterVisualizer(const Visualizer::Tag& tag,
- Parameter::Specific* specific);
+ Parameter::Specific* specific) REQUIRES(mImplMutex);
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/volume/Android.bp b/audio/aidl/default/volume/Android.bp
index 418bb8d..f1a051f 100644
--- a/audio/aidl/default/volume/Android.bp
+++ b/audio/aidl/default/volume/Android.bp
@@ -27,8 +27,6 @@
name: "libvolumesw",
defaults: [
"aidlaudioeffectservice_defaults",
- "latest_android_media_audio_common_types_ndk_shared",
- "latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"VolumeSw.cpp",
diff --git a/audio/aidl/default/volume/VolumeSw.cpp b/audio/aidl/default/volume/VolumeSw.cpp
index 8902584..dd019f6 100644
--- a/audio/aidl/default/volume/VolumeSw.cpp
+++ b/audio/aidl/default/volume/VolumeSw.cpp
@@ -160,10 +160,6 @@
return mContext;
}
-std::shared_ptr<EffectContext> VolumeSw::getContext() {
- return mContext;
-}
-
RetCode VolumeSw::releaseContext() {
if (mContext) {
mContext.reset();
diff --git a/audio/aidl/default/volume/VolumeSw.h b/audio/aidl/default/volume/VolumeSw.h
index 1432b2b..3fc0d97 100644
--- a/audio/aidl/default/volume/VolumeSw.h
+++ b/audio/aidl/default/volume/VolumeSw.h
@@ -57,21 +57,24 @@
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
- ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
- ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
- Parameter::Specific* specific) override;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) override;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) override;
- std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
- std::shared_ptr<EffectContext> getContext() override;
- RetCode releaseContext() override;
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) override;
+ RetCode releaseContext() REQUIRES(mImplMutex) override;
- IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
+ IEffect::Status effectProcessImpl(float* in, float* out, int samples)
+ REQUIRES(mImplMutex) override;
std::string getEffectName() override { return kEffectName; }
private:
static const std::vector<Range::VolumeRange> kRanges;
- std::shared_ptr<VolumeSwContext> mContext;
+ std::shared_ptr<VolumeSwContext> mContext GUARDED_BY(mImplMutex);
- ndk::ScopedAStatus getParameterVolume(const Volume::Tag& tag, Parameter::Specific* specific);
+ ndk::ScopedAStatus getParameterVolume(const Volume::Tag& tag, Parameter::Specific* specific)
+ REQUIRES(mImplMutex);
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/vts/Android.bp b/audio/aidl/vts/Android.bp
index 191f928..85319ec 100644
--- a/audio/aidl/vts/Android.bp
+++ b/audio/aidl/vts/Android.bp
@@ -36,16 +36,27 @@
"-Werror",
"-Wthread-safety",
],
+ test_config_template: "VtsHalAudioTargetTestTemplate.xml",
test_suites: [
"general-tests",
"vts",
],
srcs: [
- ":effectCommonFile",
"TestUtils.cpp",
],
}
+cc_defaults {
+ name: "VtsHalAudioEffectTargetTestDefaults",
+ defaults: [
+ "latest_android_hardware_audio_effect_ndk_static",
+ "VtsHalAudioTargetTestDefaults",
+ ],
+ srcs: [
+ ":effectCommonFile",
+ ],
+}
+
cc_test {
name: "VtsHalAudioCoreTargetTest",
defaults: [
@@ -61,30 +72,29 @@
"VtsHalAudioCoreConfigTargetTest.cpp",
"VtsHalAudioCoreModuleTargetTest.cpp",
],
- test_config: "VtsHalAudioCoreTargetTest.xml",
}
cc_test {
name: "VtsHalAudioEffectFactoryTargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalAudioEffectFactoryTargetTest.cpp"],
}
cc_test {
name: "VtsHalAudioEffectTargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalAudioEffectTargetTest.cpp"],
}
cc_test {
name: "VtsHalBassBoostTargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalBassBoostTargetTest.cpp"],
}
cc_test {
name: "VtsHalDownmixTargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalDownmixTargetTest.cpp"],
shared_libs: [
"libaudioutils",
@@ -93,79 +103,85 @@
cc_test {
name: "VtsHalDynamicsProcessingTargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
static_libs: ["libaudioaidlranges"],
srcs: ["VtsHalDynamicsProcessingTest.cpp"],
}
cc_test {
name: "VtsHalEnvironmentalReverbTargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalEnvironmentalReverbTargetTest.cpp"],
}
cc_test {
name: "VtsHalEqualizerTargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalEqualizerTargetTest.cpp"],
}
cc_test {
name: "VtsHalHapticGeneratorTargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalHapticGeneratorTargetTest.cpp"],
}
cc_test {
name: "VtsHalLoudnessEnhancerTargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalLoudnessEnhancerTargetTest.cpp"],
}
cc_test {
name: "VtsHalPresetReverbTargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalPresetReverbTargetTest.cpp"],
}
cc_test {
name: "VtsHalVirtualizerTargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalVirtualizerTargetTest.cpp"],
}
cc_test {
name: "VtsHalVisualizerTargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalVisualizerTargetTest.cpp"],
}
cc_test {
name: "VtsHalVolumeTargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalVolumeTargetTest.cpp"],
}
cc_test {
name: "VtsHalAECTargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalAECTargetTest.cpp"],
}
cc_test {
name: "VtsHalAGC1TargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalAGC1TargetTest.cpp"],
}
cc_test {
name: "VtsHalAGC2TargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalAGC2TargetTest.cpp"],
}
cc_test {
name: "VtsHalNSTargetTest",
- defaults: ["VtsHalAudioTargetTestDefaults"],
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
srcs: ["VtsHalNSTargetTest.cpp"],
}
+
+cc_test {
+ name: "VtsHalSpatializerTargetTest",
+ defaults: ["VtsHalAudioEffectTargetTestDefaults"],
+ srcs: ["VtsHalSpatializerTargetTest.cpp"],
+}
diff --git a/audio/aidl/vts/EffectFactoryHelper.h b/audio/aidl/vts/EffectFactoryHelper.h
index a2499fd..ca36655 100644
--- a/audio/aidl/vts/EffectFactoryHelper.h
+++ b/audio/aidl/vts/EffectFactoryHelper.h
@@ -21,6 +21,7 @@
#include <unordered_map>
#include <vector>
+#include <aidl/Vintf.h>
#include <android/binder_auto_utils.h>
#include "TestUtils.h"
diff --git a/audio/aidl/vts/EffectHelper.h b/audio/aidl/vts/EffectHelper.h
index d813554..9fa7f9f 100644
--- a/audio/aidl/vts/EffectHelper.h
+++ b/audio/aidl/vts/EffectHelper.h
@@ -21,6 +21,7 @@
#include <string>
#include <type_traits>
#include <unordered_map>
+#include <utility>
#include <vector>
#include <Utils.h>
@@ -42,6 +43,7 @@
using aidl::android::hardware::audio::effect::CommandId;
using aidl::android::hardware::audio::effect::Descriptor;
using aidl::android::hardware::audio::effect::IEffect;
+using aidl::android::hardware::audio::effect::kEventFlagDataMqUpdate;
using aidl::android::hardware::audio::effect::kEventFlagNotEmpty;
using aidl::android::hardware::audio::effect::Parameter;
using aidl::android::hardware::audio::effect::Range;
@@ -190,6 +192,16 @@
ASSERT_TRUE(dataMq->read(buffer.data(), expectFloats));
}
}
+ static void expectDataMqUpdateEventFlag(std::unique_ptr<StatusMQ>& statusMq) {
+ EventFlag* efGroup;
+ ASSERT_EQ(::android::OK,
+ EventFlag::createEventFlag(statusMq->getEventFlagWord(), &efGroup));
+ ASSERT_NE(nullptr, efGroup);
+ uint32_t efState = 0;
+ EXPECT_EQ(::android::OK, efGroup->wait(kEventFlagDataMqUpdate, &efState, 1'000'000 /*1ms*/,
+ true /* retry */));
+ EXPECT_TRUE(efState & kEventFlagDataMqUpdate);
+ }
static Parameter::Common createParamCommon(
int session = 0, int ioHandle = -1, int iSampleRate = 48000, int oSampleRate = 48000,
long iFrameCount = 0x100, long oFrameCount = 0x100,
@@ -263,12 +275,11 @@
return s;
}
- template <typename T, typename S, Range::Tag R, typename T::Tag tag, typename Functor>
+ template <typename T, typename S, Range::Tag R, typename T::Tag tag>
static std::set<S> getTestValueSet(
- std::vector<std::pair<std::shared_ptr<IFactory>, Descriptor>> kFactoryDescList,
- Functor functor) {
+ std::vector<std::pair<std::shared_ptr<IFactory>, Descriptor>> descList) {
std::set<S> result;
- for (const auto& [_, desc] : kFactoryDescList) {
+ for (const auto& [_, desc] : descList) {
if (desc.capability.range.getTag() == R) {
const auto& ranges = desc.capability.range.get<R>();
for (const auto& range : ranges) {
@@ -281,6 +292,14 @@
}
}
}
+ return result;
+ }
+
+ template <typename T, typename S, Range::Tag R, typename T::Tag tag, typename Functor>
+ static std::set<S> getTestValueSet(
+ std::vector<std::pair<std::shared_ptr<IFactory>, Descriptor>> descList,
+ Functor functor) {
+ auto result = getTestValueSet<T, S, R, tag>(descList);
return functor(result);
}
diff --git a/audio/aidl/vts/VtsHalAECTargetTest.cpp b/audio/aidl/vts/VtsHalAECTargetTest.cpp
index 39168b1..f972b84 100644
--- a/audio/aidl/vts/VtsHalAECTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalAECTargetTest.cpp
@@ -18,7 +18,6 @@
#include <string>
#include <unordered_set>
-#include <aidl/Vintf.h>
#define LOG_TAG "VtsHalAECParamTest"
#include <android-base/logging.h>
diff --git a/audio/aidl/vts/VtsHalAGC1TargetTest.cpp b/audio/aidl/vts/VtsHalAGC1TargetTest.cpp
index 6066025..75da589 100644
--- a/audio/aidl/vts/VtsHalAGC1TargetTest.cpp
+++ b/audio/aidl/vts/VtsHalAGC1TargetTest.cpp
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-#include <aidl/Vintf.h>
#define LOG_TAG "VtsHalAGC1ParamTest"
#include <android-base/logging.h>
diff --git a/audio/aidl/vts/VtsHalAGC2TargetTest.cpp b/audio/aidl/vts/VtsHalAGC2TargetTest.cpp
index 8793e4c..5f57a88 100644
--- a/audio/aidl/vts/VtsHalAGC2TargetTest.cpp
+++ b/audio/aidl/vts/VtsHalAGC2TargetTest.cpp
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-#include <aidl/Vintf.h>
#define LOG_TAG "VtsHalAGC2ParamTest"
#include <android-base/logging.h>
#include <android/binder_enums.h>
diff --git a/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp b/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp
index f91795b..7373073 100644
--- a/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp
@@ -4583,8 +4583,7 @@
static std::vector<std::string> getRemoteSubmixModuleInstance() {
auto instances = android::getAidlHalInstanceNames(IModule::descriptor);
for (auto instance : instances) {
- if (instance.find("r_submix") != std::string::npos)
- return (std::vector<std::string>{instance});
+ if (instance.ends_with("/r_submix")) return (std::vector<std::string>{instance});
}
return {};
}
@@ -4672,6 +4671,9 @@
// Turn off "debug" which enables connections simulation. Since devices of the remote
// submix module are virtual, there is no need for simulation.
ASSERT_NO_FATAL_FAILURE(SetUpImpl(GetParam(), false /*setUpDebug*/));
+ if (int32_t version; module->getInterfaceVersion(&version).isOk() && version < 2) {
+ GTEST_SKIP() << "V1 uses a deprecated remote submix device type encoding";
+ }
ASSERT_NO_FATAL_FAILURE(SetUpModuleConfig());
}
};
diff --git a/audio/aidl/vts/VtsHalAudioEffectTargetTest.cpp b/audio/aidl/vts/VtsHalAudioEffectTargetTest.cpp
index aaf9ad4..01cdd81 100644
--- a/audio/aidl/vts/VtsHalAudioEffectTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalAudioEffectTargetTest.cpp
@@ -16,13 +16,11 @@
#define LOG_TAG "VtsHalAudioEffectTargetTest"
-#include <chrono>
#include <memory>
#include <string>
#include <vector>
#include <aidl/Gtest.h>
-#include <aidl/Vintf.h>
#include <aidl/android/hardware/audio/effect/IEffect.h>
#include <aidl/android/hardware/audio/effect/IFactory.h>
#include <android-base/logging.h>
@@ -611,6 +609,49 @@
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
+// Verify Parameters kept after reset.
+TEST_P(AudioEffectTest, SetCommonParameterAndReopen) {
+ ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
+
+ Parameter::Common common = EffectHelper::createParamCommon(
+ 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
+ kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
+ IEffect::OpenEffectReturn ret;
+ ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
+ auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
+ ASSERT_TRUE(statusMQ->isValid());
+ auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
+ ASSERT_TRUE(inputMQ->isValid());
+ auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
+ ASSERT_TRUE(outputMQ->isValid());
+
+ Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
+ common.input.frameCount++;
+ ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
+ ASSERT_TRUE(statusMQ->isValid());
+ expectDataMqUpdateEventFlag(statusMQ);
+ EXPECT_IS_OK(mEffect->reopen(&ret));
+ inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
+ outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
+ ASSERT_TRUE(statusMQ->isValid());
+ ASSERT_TRUE(inputMQ->isValid());
+ ASSERT_TRUE(outputMQ->isValid());
+
+ common.output.frameCount++;
+ ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
+ ASSERT_TRUE(statusMQ->isValid());
+ expectDataMqUpdateEventFlag(statusMQ);
+ EXPECT_IS_OK(mEffect->reopen(&ret));
+ inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
+ outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
+ ASSERT_TRUE(statusMQ->isValid());
+ ASSERT_TRUE(inputMQ->isValid());
+ ASSERT_TRUE(outputMQ->isValid());
+
+ ASSERT_NO_FATAL_FAILURE(close(mEffect));
+ ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
+}
+
/// Data processing test
// Send data to effects and expect it to be consumed by checking statusMQ.
// Effects exposing bypass flags or operating in offload mode will be skipped.
@@ -686,6 +727,59 @@
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
+// Send data to effects and expect it to be consumed after effect reopen (IO AudioConfig change).
+// Effects exposing bypass flags or operating in offload mode will be skipped.
+TEST_P(AudioEffectDataPathTest, ConsumeDataAfterReopen) {
+ ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
+
+ Parameter::Common common = EffectHelper::createParamCommon(
+ 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
+ kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
+ IEffect::OpenEffectReturn ret;
+ ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
+ auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
+ ASSERT_TRUE(statusMQ->isValid());
+ auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
+ ASSERT_TRUE(inputMQ->isValid());
+ auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
+ ASSERT_TRUE(outputMQ->isValid());
+
+ std::vector<float> buffer;
+ ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
+ ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
+ EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
+ EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
+ EXPECT_NO_FATAL_FAILURE(
+ EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
+
+ // set a new common parameter with different IO frameCount, reopen
+ Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
+ common.input.frameCount += 4;
+ common.output.frameCount += 4;
+ ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
+ ASSERT_TRUE(statusMQ->isValid());
+ expectDataMqUpdateEventFlag(statusMQ);
+ EXPECT_IS_OK(mEffect->reopen(&ret));
+ inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
+ outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
+ ASSERT_TRUE(statusMQ->isValid());
+ ASSERT_TRUE(inputMQ->isValid());
+ ASSERT_TRUE(outputMQ->isValid());
+
+ // verify data consume again
+ EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
+ EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
+ EXPECT_NO_FATAL_FAILURE(
+ EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
+
+ ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
+ ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
+ EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
+
+ ASSERT_NO_FATAL_FAILURE(close(mEffect));
+ ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
+}
+
// Send data to IDLE effects and expect it to be consumed after effect start.
// Effects exposing bypass flags or operating in offload mode will be skipped.
TEST_P(AudioEffectDataPathTest, SendDataAtIdleAndConsumeDataInProcessing) {
diff --git a/audio/aidl/vts/VtsHalAudioCoreTargetTest.xml b/audio/aidl/vts/VtsHalAudioTargetTestTemplate.xml
similarity index 86%
rename from audio/aidl/vts/VtsHalAudioCoreTargetTest.xml
rename to audio/aidl/vts/VtsHalAudioTargetTestTemplate.xml
index 9d3adc1..c92e852 100644
--- a/audio/aidl/vts/VtsHalAudioCoreTargetTest.xml
+++ b/audio/aidl/vts/VtsHalAudioTargetTestTemplate.xml
@@ -13,7 +13,7 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<configuration description="Runs VtsHalAudioCoreTargetTest.">
+<configuration description="Runs {MODULE}.">
<option name="test-suite-tag" value="apct" />
<option name="test-suite-tag" value="apct-native" />
@@ -27,12 +27,12 @@
<target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
<option name="cleanup" value="true" />
- <option name="push" value="VtsHalAudioCoreTargetTest->/data/local/tmp/VtsHalAudioCoreTargetTest" />
+ <option name="push" value="{MODULE}->/data/local/tmp/{MODULE}" />
</target_preparer>
<test class="com.android.tradefed.testtype.GTest" >
<option name="native-test-device-path" value="/data/local/tmp" />
- <option name="module-name" value="VtsHalAudioCoreTargetTest" />
+ <option name="module-name" value="{MODULE}" />
<option name="native-test-timeout" value="10m" />
</test>
</configuration>
diff --git a/audio/aidl/vts/VtsHalBassBoostTargetTest.cpp b/audio/aidl/vts/VtsHalBassBoostTargetTest.cpp
index 2d9a233..135940d 100644
--- a/audio/aidl/vts/VtsHalBassBoostTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalBassBoostTargetTest.cpp
@@ -14,9 +14,6 @@
* limitations under the License.
*/
-#include <limits.h>
-
-#include <aidl/Vintf.h>
#define LOG_TAG "VtsHalBassBoostTest"
#include <android-base/logging.h>
diff --git a/audio/aidl/vts/VtsHalDownmixTargetTest.cpp b/audio/aidl/vts/VtsHalDownmixTargetTest.cpp
index d7db567..360bf26 100644
--- a/audio/aidl/vts/VtsHalDownmixTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalDownmixTargetTest.cpp
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-#include <aidl/Vintf.h>
#define LOG_TAG "VtsHalDownmixTargetTest"
#include <android-base/logging.h>
@@ -33,6 +32,9 @@
using android::audio_utils::channels::ChannelMix;
using android::hardware::audio::common::testing::detail::TestExecutionTracer;
+// minimal HAL interface version to run downmix data path test
+constexpr int32_t kMinDataTestHalVersion = 2;
+
// Testing for enum values
static const std::vector<Downmix::Type> kTypeValues = {ndk::enum_range<Downmix::Type>().begin(),
ndk::enum_range<Downmix::Type>().end()};
@@ -136,7 +138,6 @@
void setDataTestParams(int32_t layoutType) {
mInputBuffer.resize(kBufferSize);
- mOutputBuffer.resize(kBufferSize);
// Get the number of channels used
mInputChannelCount = getChannelCount(
@@ -144,6 +145,7 @@
// In case of downmix, output is always configured to stereo layout.
mOutputBufferSize = (mInputBuffer.size() / mInputChannelCount) * kOutputChannelCount;
+ mOutputBuffer.resize(mOutputBufferSize);
}
// Generate mInputBuffer values between -kMaxDownmixSample to kMaxDownmixSample
@@ -229,6 +231,10 @@
void SetUp() override {
SetUpDownmix(mInputChannelLayout);
+ if (int32_t version;
+ mEffect->getInterfaceVersion(&version).isOk() && version < kMinDataTestHalVersion) {
+ GTEST_SKIP() << "Skipping the data test for version: " << version << "\n";
+ }
if (!isLayoutValid(mInputChannelLayout)) {
GTEST_SKIP() << "Layout not supported \n";
}
@@ -256,13 +262,13 @@
for (size_t i = 0, j = position; i < mOutputBufferSize;
i += kOutputChannelCount, j += mInputChannelCount) {
// Validate Left channel has no audio
- ASSERT_EQ(mOutputBuffer[i], 0);
+ ASSERT_EQ(mOutputBuffer[i], 0) << " at " << i;
// Validate Right channel has audio
if (mInputBuffer[j] != 0) {
- ASSERT_NE(mOutputBuffer[i + 1], 0);
+ ASSERT_NE(mOutputBuffer[i + 1], 0) << " at " << i;
} else {
// No change in output when input is 0
- ASSERT_EQ(mOutputBuffer[i + 1], mInputBuffer[j]);
+ ASSERT_EQ(mOutputBuffer[i + 1], mInputBuffer[j]) << " at " << i;
}
}
}
@@ -376,6 +382,10 @@
void SetUp() override {
SetUpDownmix(mInputChannelLayout);
+ if (int32_t version;
+ mEffect->getInterfaceVersion(&version).isOk() && version < kMinDataTestHalVersion) {
+ GTEST_SKIP() << "Skipping the data test for version: " << version << "\n";
+ }
if (!isLayoutValid(mInputChannelLayout)) {
GTEST_SKIP() << "Layout not supported \n";
}
@@ -392,9 +402,6 @@
ASSERT_EQ(mOutputBuffer[j], mInputBuffer[i]);
ASSERT_EQ(mOutputBuffer[j + 1], mInputBuffer[i + 1]);
}
- for (size_t i = mOutputBufferSize; i < kBufferSize; i++) {
- ASSERT_EQ(mOutputBuffer[i], mInputBuffer[i]);
- }
}
int32_t mInputChannelLayout;
@@ -419,7 +426,7 @@
[](const testing::TestParamInfo<DownmixParamTest::ParamType>& info) {
auto descriptor = std::get<PARAM_INSTANCE_NAME>(info.param).second;
std::string type = std::to_string(static_cast<int>(std::get<PARAM_TYPE>(info.param)));
- std::string name = getPrefix(descriptor) + "_type" + type;
+ std::string name = getPrefix(descriptor) + "_type_" + type;
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
@@ -435,7 +442,7 @@
[](const testing::TestParamInfo<DownmixFoldDataTest::ParamType>& info) {
auto descriptor = std::get<FOLD_INSTANCE_NAME>(info.param).second;
std::string layout = std::to_string(std::get<FOLD_INPUT_LAYOUT>(info.param));
- std::string name = getPrefix(descriptor) + "_fold" + "_layout" + layout;
+ std::string name = getPrefix(descriptor) + "_fold_layout_" + layout;
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
@@ -452,7 +459,7 @@
auto descriptor = std::get<STRIP_INSTANCE_NAME>(info.param).second;
std::string layout =
std::to_string(static_cast<int>(std::get<STRIP_INPUT_LAYOUT>(info.param)));
- std::string name = getPrefix(descriptor) + "_strip" + "_layout" + layout;
+ std::string name = getPrefix(descriptor) + "_strip_layout_" + layout;
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
diff --git a/audio/aidl/vts/VtsHalDynamicsProcessingTest.cpp b/audio/aidl/vts/VtsHalDynamicsProcessingTest.cpp
index 2650f49..3f7a76d 100644
--- a/audio/aidl/vts/VtsHalDynamicsProcessingTest.cpp
+++ b/audio/aidl/vts/VtsHalDynamicsProcessingTest.cpp
@@ -18,7 +18,6 @@
#include <string>
#include <unordered_set>
-#include <aidl/Vintf.h>
#define LOG_TAG "VtsHalDynamicsProcessingTest"
#include <android-base/logging.h>
diff --git a/audio/aidl/vts/VtsHalEnvironmentalReverbTargetTest.cpp b/audio/aidl/vts/VtsHalEnvironmentalReverbTargetTest.cpp
index 474b361..765c377 100644
--- a/audio/aidl/vts/VtsHalEnvironmentalReverbTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalEnvironmentalReverbTargetTest.cpp
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-#include <aidl/Vintf.h>
#define LOG_TAG "VtsHalEnvironmentalReverbTest"
#include <android-base/logging.h>
diff --git a/audio/aidl/vts/VtsHalEqualizerTargetTest.cpp b/audio/aidl/vts/VtsHalEqualizerTargetTest.cpp
index 09396d1..76838cef 100644
--- a/audio/aidl/vts/VtsHalEqualizerTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalEqualizerTargetTest.cpp
@@ -15,15 +15,10 @@
*/
#include <algorithm>
-#include <limits>
-#include <map>
-#include <memory>
-#include <optional>
#include <string>
#include <vector>
#include <aidl/Gtest.h>
-#include <aidl/Vintf.h>
#include <aidl/android/hardware/audio/effect/IEffect.h>
#include <aidl/android/hardware/audio/effect/IFactory.h>
#define LOG_TAG "VtsHalEqualizerTest"
diff --git a/audio/aidl/vts/VtsHalHapticGeneratorTargetTest.cpp b/audio/aidl/vts/VtsHalHapticGeneratorTargetTest.cpp
index 5a32398..d312111 100644
--- a/audio/aidl/vts/VtsHalHapticGeneratorTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalHapticGeneratorTargetTest.cpp
@@ -18,7 +18,6 @@
#include <utility>
#include <vector>
-#include <aidl/Vintf.h>
#define LOG_TAG "VtsHalHapticGeneratorTargetTest"
#include <android-base/logging.h>
#include <android/binder_enums.h>
diff --git a/audio/aidl/vts/VtsHalLoudnessEnhancerTargetTest.cpp b/audio/aidl/vts/VtsHalLoudnessEnhancerTargetTest.cpp
index 925f9ec..7f0091f 100644
--- a/audio/aidl/vts/VtsHalLoudnessEnhancerTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalLoudnessEnhancerTargetTest.cpp
@@ -16,7 +16,6 @@
#include <string>
-#include <aidl/Vintf.h>
#define LOG_TAG "VtsHalLoudnessEnhancerTest"
#include <android-base/logging.h>
diff --git a/audio/aidl/vts/VtsHalNSTargetTest.cpp b/audio/aidl/vts/VtsHalNSTargetTest.cpp
index 12d56b0..5c13512 100644
--- a/audio/aidl/vts/VtsHalNSTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalNSTargetTest.cpp
@@ -16,7 +16,6 @@
#include <unordered_set>
-#include <aidl/Vintf.h>
#include <aidl/android/hardware/audio/effect/NoiseSuppression.h>
#define LOG_TAG "VtsHalNSParamTest"
#include <android-base/logging.h>
diff --git a/audio/aidl/vts/VtsHalPresetReverbTargetTest.cpp b/audio/aidl/vts/VtsHalPresetReverbTargetTest.cpp
index 57eda09..1453495 100644
--- a/audio/aidl/vts/VtsHalPresetReverbTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalPresetReverbTargetTest.cpp
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-#include <aidl/Vintf.h>
#define LOG_TAG "VtsHalPresetReverbTargetTest"
#include <android-base/logging.h>
#include <android/binder_enums.h>
diff --git a/audio/aidl/vts/VtsHalSpatializerTargetTest.cpp b/audio/aidl/vts/VtsHalSpatializerTargetTest.cpp
new file mode 100644
index 0000000..f0b51b9
--- /dev/null
+++ b/audio/aidl/vts/VtsHalSpatializerTargetTest.cpp
@@ -0,0 +1,187 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "VtsHalSpatializerTest"
+#include <android-base/logging.h>
+
+#include "EffectHelper.h"
+
+using namespace android;
+
+using aidl::android::hardware::audio::effect::Descriptor;
+using aidl::android::hardware::audio::effect::getEffectTypeUuidSpatializer;
+using aidl::android::hardware::audio::effect::IEffect;
+using aidl::android::hardware::audio::effect::IFactory;
+using aidl::android::hardware::audio::effect::Parameter;
+using aidl::android::hardware::audio::effect::Range;
+using aidl::android::hardware::audio::effect::Spatializer;
+using aidl::android::media::audio::common::HeadTracking;
+using aidl::android::media::audio::common::Spatialization;
+using android::hardware::audio::common::testing::detail::TestExecutionTracer;
+using ::android::internal::ToString;
+
+enum ParamName {
+ PARAM_INSTANCE_NAME,
+ PARAM_SPATIALIZATION_LEVEL,
+ PARAM_SPATIALIZATION_MODE,
+ PARAM_HEADTRACK_SENSORID,
+ PARAM_HEADTRACK_MODE,
+ PARAM_HEADTRACK_CONNECTION_MODE
+};
+
+using SpatializerParamTestParam =
+ std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, Spatialization::Level,
+ Spatialization::Mode, int /* sensor ID */, HeadTracking::Mode,
+ HeadTracking::ConnectionMode>;
+
+class SpatializerParamTest : public ::testing::TestWithParam<SpatializerParamTestParam>,
+ public EffectHelper {
+ public:
+ SpatializerParamTest()
+ : mSpatializerParams([&]() {
+ Spatialization::Level level = std::get<PARAM_SPATIALIZATION_LEVEL>(GetParam());
+ Spatialization::Mode mode = std::get<PARAM_SPATIALIZATION_MODE>(GetParam());
+ int sensorId = std::get<PARAM_HEADTRACK_SENSORID>(GetParam());
+ HeadTracking::Mode htMode = std::get<PARAM_HEADTRACK_MODE>(GetParam());
+ HeadTracking::ConnectionMode htConnectMode =
+ std::get<PARAM_HEADTRACK_CONNECTION_MODE>(GetParam());
+ std::map<Spatializer::Tag, Spatializer> params;
+ params[Spatializer::spatializationLevel] =
+ Spatializer::make<Spatializer::spatializationLevel>(level);
+ params[Spatializer::spatializationMode] =
+ Spatializer::make<Spatializer::spatializationMode>(mode);
+ params[Spatializer::headTrackingSensorId] =
+ Spatializer::make<Spatializer::headTrackingSensorId>(sensorId);
+ params[Spatializer::headTrackingMode] =
+ Spatializer::make<Spatializer::headTrackingMode>(htMode);
+ params[Spatializer::headTrackingConnectionMode] =
+ Spatializer::make<Spatializer::headTrackingConnectionMode>(htConnectMode);
+ return params;
+ }()) {
+ std::tie(mFactory, mDescriptor) = std::get<PARAM_INSTANCE_NAME>(GetParam());
+ }
+
+ void SetUp() override {
+ ASSERT_NE(nullptr, mFactory);
+ ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
+
+ Parameter::Specific specific = getDefaultParamSpecific();
+ Parameter::Common common = EffectHelper::createParamCommon(
+ 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
+ kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
+ IEffect::OpenEffectReturn ret;
+ ASSERT_NO_FATAL_FAILURE(open(mEffect, common, specific, &ret, EX_NONE));
+ ASSERT_NE(nullptr, mEffect);
+ }
+
+ void TearDown() override {
+ ASSERT_NO_FATAL_FAILURE(close(mEffect));
+ ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
+ }
+
+ Parameter::Specific getDefaultParamSpecific() {
+ Spatializer spatializer = Spatializer::make<Spatializer::headTrackingSensorId>(0);
+ Parameter::Specific specific =
+ Parameter::Specific::make<Parameter::Specific::spatializer>(spatializer);
+ return specific;
+ }
+
+ static const long kInputFrameCount = 0x100, kOutputFrameCount = 0x100;
+ std::shared_ptr<IFactory> mFactory;
+ std::shared_ptr<IEffect> mEffect;
+ Descriptor mDescriptor;
+ const std::map<Spatializer::Tag, Spatializer> mSpatializerParams;
+};
+
+TEST_P(SpatializerParamTest, SetAndGetParam) {
+ for (const auto& it : mSpatializerParams) {
+ auto& tag = it.first;
+ auto& spatializer = it.second;
+
+ // validate parameter
+ Descriptor desc;
+ ASSERT_STATUS(EX_NONE, mEffect->getDescriptor(&desc));
+ const bool valid = isParameterValid<Spatializer, Range::spatializer>(it.second, desc);
+ const binder_exception_t expected = valid ? EX_NONE : EX_ILLEGAL_ARGUMENT;
+
+ // set parameter
+ Parameter expectParam;
+ Parameter::Specific specific;
+ specific.set<Parameter::Specific::spatializer>(spatializer);
+ expectParam.set<Parameter::specific>(specific);
+ EXPECT_STATUS(expected, mEffect->setParameter(expectParam)) << expectParam.toString();
+
+ // only get if parameter in range and set success
+ if (expected == EX_NONE) {
+ Parameter getParam;
+ Parameter::Id id;
+ Spatializer::Id spatializerId;
+ spatializerId.set<Spatializer::Id::commonTag>(tag);
+ id.set<Parameter::Id::spatializerTag>(spatializerId);
+ // if set success, then get should match
+ EXPECT_STATUS(expected, mEffect->getParameter(id, &getParam));
+ EXPECT_EQ(expectParam, getParam);
+ }
+ }
+}
+
+std::vector<std::pair<std::shared_ptr<IFactory>, Descriptor>> kDescPair;
+INSTANTIATE_TEST_SUITE_P(
+ SpatializerTest, SpatializerParamTest,
+ ::testing::Combine(
+ testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
+ IFactory::descriptor, getEffectTypeUuidSpatializer())),
+ testing::ValuesIn(EffectHelper::getTestValueSet<
+ Spatializer, Spatialization::Level, Range::spatializer,
+ Spatializer::spatializationLevel>(kDescPair)),
+ testing::ValuesIn(EffectHelper::getTestValueSet<
+ Spatializer, Spatialization::Mode, Range::spatializer,
+ Spatializer::spatializationMode>(kDescPair)),
+ testing::ValuesIn(
+ EffectHelper::getTestValueSet<Spatializer, int, Range::spatializer,
+ Spatializer::headTrackingSensorId>(
+ kDescPair, EffectHelper::expandTestValueBasic<int>)),
+ testing::ValuesIn(EffectHelper::getTestValueSet<
+ Spatializer, HeadTracking::Mode, Range::spatializer,
+ Spatializer::headTrackingMode>(kDescPair)),
+ testing::ValuesIn(EffectHelper::getTestValueSet<
+ Spatializer, HeadTracking::ConnectionMode, Range::spatializer,
+ Spatializer::headTrackingConnectionMode>(kDescPair))),
+ [](const testing::TestParamInfo<SpatializerParamTest::ParamType>& info) {
+ auto descriptor = std::get<PARAM_INSTANCE_NAME>(info.param).second;
+ std::string level = ToString(std::get<PARAM_SPATIALIZATION_LEVEL>(info.param));
+ std::string mode = ToString(std::get<PARAM_SPATIALIZATION_MODE>(info.param));
+ std::string sensorId = ToString(std::get<PARAM_HEADTRACK_SENSORID>(info.param));
+ std::string htMode = ToString(std::get<PARAM_HEADTRACK_MODE>(info.param));
+ std::string htConnectMode =
+ ToString(std::get<PARAM_HEADTRACK_CONNECTION_MODE>(info.param));
+ std::string name = getPrefix(descriptor) + "_sensorID_" + level + "_mode_" + mode +
+ "_sensorID_" + sensorId + "_HTMode_" + htMode +
+ "_HTConnectionMode_" + htConnectMode;
+ std::replace_if(
+ name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
+ return name;
+ });
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SpatializerParamTest);
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ ::testing::UnitTest::GetInstance()->listeners().Append(new TestExecutionTracer());
+ ABinderProcess_setThreadPoolMaxThreadCount(1);
+ ABinderProcess_startThreadPool();
+ return RUN_ALL_TESTS();
+}
diff --git a/audio/aidl/vts/VtsHalVirtualizerTargetTest.cpp b/audio/aidl/vts/VtsHalVirtualizerTargetTest.cpp
index 3e39d3a..0c24f90 100644
--- a/audio/aidl/vts/VtsHalVirtualizerTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalVirtualizerTargetTest.cpp
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-#include <aidl/Vintf.h>
#define LOG_TAG "VtsHalVirtualizerTest"
#include <android-base/logging.h>
diff --git a/audio/aidl/vts/VtsHalVisualizerTargetTest.cpp b/audio/aidl/vts/VtsHalVisualizerTargetTest.cpp
index 1b8352b..db83715 100644
--- a/audio/aidl/vts/VtsHalVisualizerTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalVisualizerTargetTest.cpp
@@ -16,7 +16,6 @@
#include <unordered_set>
-#include <aidl/Vintf.h>
#define LOG_TAG "VtsHalVisualizerTest"
#include <android-base/logging.h>
#include <android/binder_enums.h>
diff --git a/audio/aidl/vts/VtsHalVolumeTargetTest.cpp b/audio/aidl/vts/VtsHalVolumeTargetTest.cpp
index 257100b..aa2c05f 100644
--- a/audio/aidl/vts/VtsHalVolumeTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalVolumeTargetTest.cpp
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-#include <aidl/Vintf.h>
#define LOG_TAG "VtsHalVolumeTest"
#include <android-base/logging.h>
diff --git a/automotive/audiocontrol/aidl/default/Android.bp b/automotive/audiocontrol/aidl/default/Android.bp
index 435c2d6..a48d228 100644
--- a/automotive/audiocontrol/aidl/default/Android.bp
+++ b/automotive/audiocontrol/aidl/default/Android.bp
@@ -27,11 +27,13 @@
init_rc: ["audiocontrol-default.rc"],
vintf_fragments: ["audiocontrol-default.xml"],
vendor: true,
+ defaults: [
+ "latest_android_hardware_audio_common_ndk_shared",
+ "latest_android_hardware_automotive_audiocontrol_ndk_shared",
+ ],
shared_libs: [
"android.hardware.audio.common@7.0-enums",
- "android.hardware.audio.common-V1-ndk",
"android.frameworks.automotive.powerpolicy-V2-ndk",
- "android.hardware.automotive.audiocontrol-V3-ndk",
"libbase",
"libbinder_ndk",
"libcutils",
diff --git a/automotive/audiocontrol/aidl/default/AudioControl.cpp b/automotive/audiocontrol/aidl/default/AudioControl.cpp
index cf7307d..7e7e145 100644
--- a/automotive/audiocontrol/aidl/default/AudioControl.cpp
+++ b/automotive/audiocontrol/aidl/default/AudioControl.cpp
@@ -244,15 +244,15 @@
template <typename aidl_type>
static inline std::string toString(const std::vector<aidl_type>& in_values) {
return std::accumulate(std::begin(in_values), std::end(in_values), std::string{},
- [](std::string& ls, const aidl_type& rs) {
- return ls += (ls.empty() ? "" : ",") + rs.toString();
+ [](const std::string& ls, const aidl_type& rs) {
+ return ls + (ls.empty() ? "" : ",") + rs.toString();
});
}
template <typename aidl_enum_type>
static inline std::string toEnumString(const std::vector<aidl_enum_type>& in_values) {
return std::accumulate(std::begin(in_values), std::end(in_values), std::string{},
- [](std::string& ls, const aidl_enum_type& rs) {
- return ls += (ls.empty() ? "" : ",") + toString(rs);
+ [](const std::string& ls, const aidl_enum_type& rs) {
+ return ls + (ls.empty() ? "" : ",") + toString(rs);
});
}
diff --git a/automotive/can/1.0/default/CanSocket.h b/automotive/can/1.0/default/CanSocket.h
index fd956b5..f3e8e60 100644
--- a/automotive/can/1.0/default/CanSocket.h
+++ b/automotive/can/1.0/default/CanSocket.h
@@ -22,6 +22,7 @@
#include <atomic>
#include <chrono>
+#include <functional>
#include <thread>
namespace android::hardware::automotive::can::V1_0::implementation {
diff --git a/automotive/can/1.0/default/libnetdevice/ifreqs.h b/automotive/can/1.0/default/libnetdevice/ifreqs.h
index d8d6fe0..aa7030b 100644
--- a/automotive/can/1.0/default/libnetdevice/ifreqs.h
+++ b/automotive/can/1.0/default/libnetdevice/ifreqs.h
@@ -18,6 +18,7 @@
#include <net/if.h>
+#include <atomic>
#include <string>
namespace android::netdevice::ifreqs {
diff --git a/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp b/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp
index fe749f6..413b4b1 100644
--- a/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp
+++ b/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp
@@ -27,6 +27,8 @@
#include <linux/rtnetlink.h>
#include <net/if.h>
+#include <algorithm>
+#include <iterator>
#include <sstream>
namespace android::netdevice {
diff --git a/automotive/can/1.0/default/libnl++/common.cpp b/automotive/can/1.0/default/libnl++/common.cpp
index 23c2d94..1287bb5 100644
--- a/automotive/can/1.0/default/libnl++/common.cpp
+++ b/automotive/can/1.0/default/libnl++/common.cpp
@@ -20,6 +20,8 @@
#include <net/if.h>
+#include <algorithm>
+
namespace android::nl {
unsigned int nametoindex(const std::string& ifname) {
diff --git a/automotive/evs/aidl/vts/VtsHalEvsTargetTest.cpp b/automotive/evs/aidl/vts/VtsHalEvsTargetTest.cpp
index 3419b3c..477de31 100644
--- a/automotive/evs/aidl/vts/VtsHalEvsTargetTest.cpp
+++ b/automotive/evs/aidl/vts/VtsHalEvsTargetTest.cpp
@@ -1399,6 +1399,12 @@
// Test each reported camera
for (auto&& cam : mCameraInfo) {
+ bool isLogicalCam = false;
+ if (getPhysicalCameraIds(cam.id, isLogicalCam); isLogicalCam) {
+ LOG(INFO) << "Skip a logical device, " << cam.id;
+ continue;
+ }
+
// Request available display IDs
uint8_t targetDisplayId = 0;
std::vector<uint8_t> displayIds;
@@ -1973,6 +1979,13 @@
// Test each reported camera
for (auto&& cam : mCameraInfo) {
+ bool isLogicalCam = false;
+ getPhysicalCameraIds(cam.id, isLogicalCam);
+ if (isLogicalCam) {
+ LOG(INFO) << "Skip a logical device, " << cam.id;
+ continue;
+ }
+
// Read a target resolution from the metadata
Stream targetCfg = getFirstStreamConfiguration(
reinterpret_cast<camera_metadata_t*>(cam.metadata.data()));
@@ -2014,9 +2027,6 @@
}
}
- bool isLogicalCam = false;
- getPhysicalCameraIds(cam.id, isLogicalCam);
-
std::shared_ptr<IEvsCamera> pCam;
ASSERT_TRUE(mEnumerator->openCamera(cam.id, targetCfg, &pCam).isOk());
EXPECT_NE(pCam, nullptr);
@@ -2027,11 +2037,6 @@
// Request to import buffers
int delta = 0;
auto status = pCam->importExternalBuffers(buffers, &delta);
- if (isLogicalCam) {
- ASSERT_FALSE(status.isOk());
- continue;
- }
-
ASSERT_TRUE(status.isOk());
EXPECT_GE(delta, kBuffersToHold);
diff --git a/automotive/remoteaccess/aidl_api/android.hardware.automotive.remoteaccess/current/android/hardware/automotive/remoteaccess/IRemoteAccess.aidl b/automotive/remoteaccess/aidl_api/android.hardware.automotive.remoteaccess/current/android/hardware/automotive/remoteaccess/IRemoteAccess.aidl
index e6f4808..5c5917b 100644
--- a/automotive/remoteaccess/aidl_api/android.hardware.automotive.remoteaccess/current/android/hardware/automotive/remoteaccess/IRemoteAccess.aidl
+++ b/automotive/remoteaccess/aidl_api/android.hardware.automotive.remoteaccess/current/android/hardware/automotive/remoteaccess/IRemoteAccess.aidl
@@ -46,5 +46,5 @@
void unscheduleTask(String clientId, String scheduleId);
void unscheduleAllTasks(String clientId);
boolean isTaskScheduled(String clientId, String scheduleId);
- List<android.hardware.automotive.remoteaccess.ScheduleInfo> getAllScheduledTasks(String clientId);
+ List<android.hardware.automotive.remoteaccess.ScheduleInfo> getAllPendingScheduledTasks(String clientId);
}
diff --git a/automotive/remoteaccess/aidl_api/android.hardware.automotive.remoteaccess/current/android/hardware/automotive/remoteaccess/ScheduleInfo.aidl b/automotive/remoteaccess/aidl_api/android.hardware.automotive.remoteaccess/current/android/hardware/automotive/remoteaccess/ScheduleInfo.aidl
index a5d81cf..ec8733a 100644
--- a/automotive/remoteaccess/aidl_api/android.hardware.automotive.remoteaccess/current/android/hardware/automotive/remoteaccess/ScheduleInfo.aidl
+++ b/automotive/remoteaccess/aidl_api/android.hardware.automotive.remoteaccess/current/android/hardware/automotive/remoteaccess/ScheduleInfo.aidl
@@ -41,4 +41,5 @@
int count;
long startTimeInEpochSeconds;
long periodicInSeconds;
+ const int MAX_TASK_DATA_SIZE_IN_BYTES = 10240;
}
diff --git a/automotive/remoteaccess/android/hardware/automotive/remoteaccess/IRemoteAccess.aidl b/automotive/remoteaccess/android/hardware/automotive/remoteaccess/IRemoteAccess.aidl
index 9863ed7..f0468c4 100644
--- a/automotive/remoteaccess/android/hardware/automotive/remoteaccess/IRemoteAccess.aidl
+++ b/automotive/remoteaccess/android/hardware/automotive/remoteaccess/IRemoteAccess.aidl
@@ -167,6 +167,9 @@
* {@code scheduleId} for this client exists.
*
* <p>Must return {@code EX_ILLEGAL_ARGUMENT} if the task type is not supported.
+ *
+ * <p>Must return {@code EX_ILLEGLA_ARGUMENT} if the scheduleInfo is not valid (e.g. count is
+ * a negative number).
*/
void scheduleTask(in ScheduleInfo scheduleInfo);
@@ -201,5 +204,5 @@
*
* <p>The finished scheduled tasks will not be included.
*/
- List<ScheduleInfo> getAllScheduledTasks(String clientId);
+ List<ScheduleInfo> getAllPendingScheduledTasks(String clientId);
}
diff --git a/automotive/remoteaccess/android/hardware/automotive/remoteaccess/ScheduleInfo.aidl b/automotive/remoteaccess/android/hardware/automotive/remoteaccess/ScheduleInfo.aidl
index 40fba6f..4f2537c 100644
--- a/automotive/remoteaccess/android/hardware/automotive/remoteaccess/ScheduleInfo.aidl
+++ b/automotive/remoteaccess/android/hardware/automotive/remoteaccess/ScheduleInfo.aidl
@@ -21,6 +21,7 @@
@VintfStability
@JavaDerive(equals=true, toString=true)
parcelable ScheduleInfo {
+ const int MAX_TASK_DATA_SIZE_IN_BYTES = 10240;
/**
* The ID used to identify the client this schedule is for. This must be one of the
* preconfigured remote access serverless client ID defined in car service resource
@@ -41,6 +42,8 @@
* executed. It is not interpreted/parsed by the Android system.
*
* <p>This is only used for {@code TaskType.CUSTOM}.
+ *
+ * <p>The data size must be less than {@link MAX_TASK_DATA_SIZE_IN_BYTES}.
*/
byte[] taskData;
/**
diff --git a/automotive/remoteaccess/hal/default/Android.bp b/automotive/remoteaccess/hal/default/Android.bp
index 97ed2c1..be6a425 100644
--- a/automotive/remoteaccess/hal/default/Android.bp
+++ b/automotive/remoteaccess/hal/default/Android.bp
@@ -53,7 +53,9 @@
vintf_fragments: ["remoteaccess-default-service.xml"],
init_rc: ["remoteaccess-default-service.rc"],
cflags: [
- "-DGRPC_SERVICE_ADDRESS=\"10.0.2.2:50051\"",
+ // Uncomment this if running on emulator and connecting to a local grpc server
+ // running on host 127.0.0.1:50051 (TestWakeupClientServerHost)
+ // "-DGRPC_SERVICE_ADDRESS=\"10.0.2.2:50051\"",
],
}
diff --git a/automotive/remoteaccess/hal/default/fuzzer/fuzzer.cpp b/automotive/remoteaccess/hal/default/fuzzer/fuzzer.cpp
index 9224ebc..7707ee6 100644
--- a/automotive/remoteaccess/hal/default/fuzzer/fuzzer.cpp
+++ b/automotive/remoteaccess/hal/default/fuzzer/fuzzer.cpp
@@ -75,8 +75,9 @@
return Status::OK;
}
- Status GetAllScheduledTasks(ClientContext* context, const GetAllScheduledTasksRequest& request,
- GetAllScheduledTasksResponse* response) {
+ Status GetAllPendingScheduledTasks(ClientContext* context,
+ const GetAllPendingScheduledTasksRequest& request,
+ GetAllPendingScheduledTasksResponse* response) {
return Status::OK;
}
@@ -165,17 +166,19 @@
return nullptr;
}
- ClientAsyncResponseReaderInterface<GetAllScheduledTasksResponse>* AsyncGetAllScheduledTasksRaw(
+ ClientAsyncResponseReaderInterface<GetAllPendingScheduledTasksResponse>*
+ AsyncGetAllPendingScheduledTasksRaw(
[[maybe_unused]] ClientContext* context,
- [[maybe_unused]] const GetAllScheduledTasksRequest& request,
+ [[maybe_unused]] const GetAllPendingScheduledTasksRequest& request,
[[maybe_unused]] CompletionQueue* cq) {
return nullptr;
}
- ClientAsyncResponseReaderInterface<GetAllScheduledTasksResponse>*
- PrepareAsyncGetAllScheduledTasksRaw([[maybe_unused]] ClientContext* context,
- [[maybe_unused]] const GetAllScheduledTasksRequest& request,
- [[maybe_unused]] CompletionQueue* c) {
+ ClientAsyncResponseReaderInterface<GetAllPendingScheduledTasksResponse>*
+ PrepareAsyncGetAllPendingScheduledTasksRaw(
+ [[maybe_unused]] ClientContext* context,
+ [[maybe_unused]] const GetAllPendingScheduledTasksRequest& request,
+ [[maybe_unused]] CompletionQueue* c) {
return nullptr;
}
};
diff --git a/automotive/remoteaccess/hal/default/include/RemoteAccessService.h b/automotive/remoteaccess/hal/default/include/RemoteAccessService.h
index 23b4ebe..8716e48 100644
--- a/automotive/remoteaccess/hal/default/include/RemoteAccessService.h
+++ b/automotive/remoteaccess/hal/default/include/RemoteAccessService.h
@@ -96,7 +96,7 @@
ndk::ScopedAStatus isTaskScheduled(const std::string& clientId, const std::string& scheduleId,
bool* out) override;
- ndk::ScopedAStatus getAllScheduledTasks(
+ ndk::ScopedAStatus getAllPendingScheduledTasks(
const std::string& clientId,
std::vector<aidl::android::hardware::automotive::remoteaccess::ScheduleInfo>* out)
override;
@@ -111,6 +111,8 @@
WakeupClient::StubInterface* mGrpcStub;
std::thread mThread;
+ // Whether the GRPC server exists. Only checked and set during init.
+ bool mGrpcServerExist = false;
std::mutex mLock;
std::condition_variable mCv;
std::shared_ptr<aidl::android::hardware::automotive::remoteaccess::IRemoteTaskCallback>
@@ -121,7 +123,7 @@
// A mutex to make sure startTaskLoop does not overlap with stopTaskLoop.
std::mutex mStartStopTaskLoopLock;
bool mTaskLoopRunning GUARDED_BY(mStartStopTaskLoopLock) = false;
- bool mGrpcConnected GUARDED_BY(mLock) = false;
+ bool mGrpcReadChannelOpen GUARDED_BY(mLock) = false;
std::unordered_map<std::string, size_t> mClientIdToTaskCount GUARDED_BY(mLock);
// Default wait time before retry connecting to remote access client is 10s.
@@ -143,9 +145,10 @@
void debugInjectTask(int fd, std::string_view clientId, std::string_view taskData);
void debugInjectTaskNextReboot(int fd, std::string_view clientId, std::string_view taskData,
const char* latencyInSecStr);
- void updateGrpcConnected(bool connected);
+ void updateGrpcReadChannelOpen(bool grpcReadChannelOpen);
android::base::Result<void> deliverRemoteTaskThroughCallback(const std::string& clientId,
std::string_view taskData);
+ bool isTaskScheduleSupported();
};
} // namespace remoteaccess
diff --git a/automotive/remoteaccess/hal/default/proto/wakeup_client.proto b/automotive/remoteaccess/hal/default/proto/wakeup_client.proto
index e061016..14ba0a5 100644
--- a/automotive/remoteaccess/hal/default/proto/wakeup_client.proto
+++ b/automotive/remoteaccess/hal/default/proto/wakeup_client.proto
@@ -99,7 +99,8 @@
*
* <p>The finished scheduled tasks will not be included.
*/
- rpc GetAllScheduledTasks(GetAllScheduledTasksRequest) returns (GetAllScheduledTasksResponse) {}
+ rpc GetAllPendingScheduledTasks(GetAllPendingScheduledTasksRequest)
+ returns (GetAllPendingScheduledTasksResponse) {}
}
message GetRemoteTasksRequest {}
@@ -154,10 +155,10 @@
bool isTaskScheduled = 1;
}
-message GetAllScheduledTasksRequest {
+message GetAllPendingScheduledTasksRequest {
string clientId = 1;
}
-message GetAllScheduledTasksResponse {
+message GetAllPendingScheduledTasksResponse {
repeated GrpcScheduleInfo allScheduledTasks = 1;
}
diff --git a/automotive/remoteaccess/hal/default/src/RemoteAccessImpl.cpp b/automotive/remoteaccess/hal/default/src/RemoteAccessImpl.cpp
index d4ba864..28c5cd5 100644
--- a/automotive/remoteaccess/hal/default/src/RemoteAccessImpl.cpp
+++ b/automotive/remoteaccess/hal/default/src/RemoteAccessImpl.cpp
@@ -30,10 +30,9 @@
constexpr char SERVICE_NAME[] = "android.hardware.automotive.remoteaccess.IRemoteAccess/default";
int main(int /* argc */, char* /* argv */[]) {
-#ifndef GRPC_SERVICE_ADDRESS
- LOG(ERROR) << "GRPC_SERVICE_ADDRESS is not defined, exiting";
- exit(1);
-#endif
+ android::hardware::automotive::remoteaccess::WakeupClient::StubInterface* grpcStub = nullptr;
+
+#ifdef GRPC_SERVICE_ADDRESS
LOG(INFO) << "Registering RemoteAccessService as service, server: " << GRPC_SERVICE_ADDRESS
<< "...";
grpc::ChannelArguments grpcargs = {};
@@ -47,11 +46,18 @@
android::netdevice::waitFor({GRPC_SERVICE_IFNAME},
android::netdevice::WaitCondition::PRESENT_AND_UP);
LOG(INFO) << "Waiting for interface: " << GRPC_SERVICE_IFNAME << " done";
-#endif
+#endif // #ifdef GRPC_SERVICE_IFNAME
auto channel = grpc::CreateChannel(GRPC_SERVICE_ADDRESS, grpc::InsecureChannelCredentials());
auto clientStub = android::hardware::automotive::remoteaccess::WakeupClient::NewStub(channel);
+
+ grpcStub = clientStub.get();
+
+#else
+ LOG(INFO) << "GRPC_SERVICE_ADDRESS is not defined, work in fake mode";
+#endif // #ifdef GRPC_SERVICE_ADDRESS
+
auto service = ndk::SharedRefBase::make<
- android::hardware::automotive::remoteaccess::RemoteAccessService>(clientStub.get());
+ android::hardware::automotive::remoteaccess::RemoteAccessService>(grpcStub);
binder_exception_t err = AServiceManager_addService(service->asBinder().get(), SERVICE_NAME);
if (err != EX_NONE) {
diff --git a/automotive/remoteaccess/hal/default/src/RemoteAccessService.cpp b/automotive/remoteaccess/hal/default/src/RemoteAccessService.cpp
index 5521134..dbd5bed 100644
--- a/automotive/remoteaccess/hal/default/src/RemoteAccessService.cpp
+++ b/automotive/remoteaccess/hal/default/src/RemoteAccessService.cpp
@@ -103,6 +103,10 @@
RemoteAccessService::RemoteAccessService(WakeupClient::StubInterface* grpcStub)
: mGrpcStub(grpcStub) {
+ if (mGrpcStub != nullptr) {
+ mGrpcServerExist = true;
+ }
+
std::ifstream debugTaskFile;
debugTaskFile.open(DEBUG_TASK_FILE, std::ios::in);
if (!debugTaskFile.is_open()) {
@@ -177,9 +181,9 @@
mTaskLoopRunning = false;
}
-void RemoteAccessService::updateGrpcConnected(bool connected) {
+void RemoteAccessService::updateGrpcReadChannelOpen(bool grpcReadChannelOpen) {
std::lock_guard<std::mutex> lockGuard(mLock);
- mGrpcConnected = connected;
+ mGrpcReadChannelOpen = grpcReadChannelOpen;
}
Result<void> RemoteAccessService::deliverRemoteTaskThroughCallback(const std::string& clientId,
@@ -213,7 +217,7 @@
mGetRemoteTasksContext.reset(new ClientContext());
reader = mGrpcStub->GetRemoteTasks(mGetRemoteTasksContext.get(), request);
}
- updateGrpcConnected(true);
+ updateGrpcReadChannelOpen(true);
GetRemoteTasksResponse response;
while (reader->Read(&response)) {
ALOGI("Receiving one task from remote task client");
@@ -225,7 +229,7 @@
continue;
}
}
- updateGrpcConnected(false);
+ updateGrpcReadChannelOpen(false);
Status status = reader->Finish();
mGetRemoteTasksContext.reset();
@@ -298,6 +302,11 @@
}
ScopedAStatus RemoteAccessService::notifyApStateChange(const ApState& newState) {
+ if (!mGrpcServerExist) {
+ ALOGW("GRPC server does not exist, do nothing");
+ return ScopedAStatus::ok();
+ }
+
ClientContext context;
NotifyWakeupRequiredRequest request = {};
request.set_iswakeuprequired(newState.isWakeupRequired);
@@ -315,22 +324,61 @@
return ScopedAStatus::ok();
}
+bool RemoteAccessService::isTaskScheduleSupported() {
+ if (!mGrpcServerExist) {
+ ALOGW("GRPC server does not exist, task scheduling not supported");
+ return false;
+ }
+
+ return true;
+}
+
ScopedAStatus RemoteAccessService::isTaskScheduleSupported(bool* out) {
- *out = true;
+ *out = isTaskScheduleSupported();
return ScopedAStatus::ok();
}
ndk::ScopedAStatus RemoteAccessService::getSupportedTaskTypesForScheduling(
std::vector<TaskType>* out) {
+ out->clear();
+ if (!isTaskScheduleSupported()) {
+ ALOGW("Task scheduleing is not supported, return empty task types");
+ return ScopedAStatus::ok();
+ }
+
// TODO(b/316233421): support ENTER_GARAGE_MODE type.
out->push_back(TaskType::CUSTOM);
return ScopedAStatus::ok();
}
ScopedAStatus RemoteAccessService::scheduleTask(const ScheduleInfo& scheduleInfo) {
+ if (!isTaskScheduleSupported()) {
+ ALOGW("Task scheduleing is not supported, return exception");
+ return ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+ "task scheduling is not supported");
+ }
+
ClientContext context;
ScheduleTaskRequest request = {};
ScheduleTaskResponse response = {};
+
+ if (scheduleInfo.count < 0) {
+ return ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+ "count must be >= 0");
+ }
+ if (scheduleInfo.startTimeInEpochSeconds < 0) {
+ return ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+ "startTimeInEpochSeconds must be >= 0");
+ }
+ if (scheduleInfo.periodicInSeconds < 0) {
+ return ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+ "periodicInSeconds must be >= 0");
+ }
+ if (scheduleInfo.taskData.size() > scheduleInfo.MAX_TASK_DATA_SIZE_IN_BYTES) {
+ return ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+ "task data too big");
+ }
+
request.mutable_scheduleinfo()->set_clientid(scheduleInfo.clientId);
request.mutable_scheduleinfo()->set_scheduleid(scheduleInfo.scheduleId);
request.mutable_scheduleinfo()->set_data(scheduleInfo.taskData.data(),
@@ -348,7 +396,8 @@
case ErrorCode::OK:
return ScopedAStatus::ok();
case ErrorCode::INVALID_ARG:
- return ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
+ return ScopedAStatus::fromExceptionCodeWithMessage(
+ EX_ILLEGAL_ARGUMENT, "received invalid_arg from grpc server");
default:
// Should not happen.
return ScopedAStatus::fromServiceSpecificErrorWithMessage(
@@ -360,6 +409,11 @@
ScopedAStatus RemoteAccessService::unscheduleTask(const std::string& clientId,
const std::string& scheduleId) {
+ if (!isTaskScheduleSupported()) {
+ ALOGW("Task scheduleing is not supported, do nothing");
+ return ScopedAStatus::ok();
+ }
+
ClientContext context;
UnscheduleTaskRequest request = {};
UnscheduleTaskResponse response = {};
@@ -373,6 +427,11 @@
}
ScopedAStatus RemoteAccessService::unscheduleAllTasks(const std::string& clientId) {
+ if (!isTaskScheduleSupported()) {
+ ALOGW("Task scheduleing is not supported, do nothing");
+ return ScopedAStatus::ok();
+ }
+
ClientContext context;
UnscheduleAllTasksRequest request = {};
UnscheduleAllTasksResponse response = {};
@@ -386,6 +445,12 @@
ScopedAStatus RemoteAccessService::isTaskScheduled(const std::string& clientId,
const std::string& scheduleId, bool* out) {
+ if (!isTaskScheduleSupported()) {
+ ALOGW("Task scheduleing is not supported, return false");
+ *out = false;
+ return ScopedAStatus::ok();
+ }
+
ClientContext context;
IsTaskScheduledRequest request = {};
IsTaskScheduledResponse response = {};
@@ -399,13 +464,19 @@
return ScopedAStatus::ok();
}
-ScopedAStatus RemoteAccessService::getAllScheduledTasks(const std::string& clientId,
- std::vector<ScheduleInfo>* out) {
+ScopedAStatus RemoteAccessService::getAllPendingScheduledTasks(const std::string& clientId,
+ std::vector<ScheduleInfo>* out) {
+ if (!isTaskScheduleSupported()) {
+ ALOGW("Task scheduleing is not supported, return empty array");
+ out->clear();
+ return ScopedAStatus::ok();
+ }
+
ClientContext context;
- GetAllScheduledTasksRequest request = {};
- GetAllScheduledTasksResponse response = {};
+ GetAllPendingScheduledTasksRequest request = {};
+ GetAllPendingScheduledTasksResponse response = {};
request.set_clientid(clientId);
- Status status = mGrpcStub->GetAllScheduledTasks(&context, request, &response);
+ Status status = mGrpcStub->GetAllPendingScheduledTasks(&context, request, &response);
if (!status.ok()) {
return rpcStatusToScopedAStatus(status, "Failed to call isTaskScheduled");
}
@@ -541,9 +612,11 @@
dprintf(fd,
"\nRemoteAccess HAL status \n"
"Remote task callback registered: %s\n"
- "Task receiving GRPC connection established: %s\n"
+ "GRPC server exist: %s\n"
+ "GRPC read channel for receiving tasks open: %s\n"
"Received task count by clientId: \n%s\n",
- boolToString(mRemoteTaskCallback.get()).c_str(), boolToString(mGrpcConnected).c_str(),
+ boolToString(mRemoteTaskCallback.get()).c_str(), boolToString(mGrpcServerExist).c_str(),
+ boolToString(mGrpcReadChannelOpen).c_str(),
clientIdToTaskCountToStringLocked().c_str());
}
diff --git a/automotive/remoteaccess/hal/default/test/RemoteAccessServiceUnitTest.cpp b/automotive/remoteaccess/hal/default/test/RemoteAccessServiceUnitTest.cpp
index 4af0003..7992a50 100644
--- a/automotive/remoteaccess/hal/default/test/RemoteAccessServiceUnitTest.cpp
+++ b/automotive/remoteaccess/hal/default/test/RemoteAccessServiceUnitTest.cpp
@@ -95,9 +95,9 @@
MOCK_METHOD(Status, IsTaskScheduled,
(ClientContext * context, const IsTaskScheduledRequest& request,
IsTaskScheduledResponse* response));
- MOCK_METHOD(Status, GetAllScheduledTasks,
- (ClientContext * context, const GetAllScheduledTasksRequest& request,
- GetAllScheduledTasksResponse* response));
+ MOCK_METHOD(Status, GetAllPendingScheduledTasks,
+ (ClientContext * context, const GetAllPendingScheduledTasksRequest& request,
+ GetAllPendingScheduledTasksResponse* response));
// Async methods which we do not care.
MOCK_METHOD(ClientAsyncReaderInterface<GetRemoteTasksResponse>*, AsyncGetRemoteTasksRaw,
(ClientContext * context, const GetRemoteTasksRequest& request, CompletionQueue* cq,
@@ -141,13 +141,13 @@
PrepareAsyncIsTaskScheduledRaw,
(ClientContext * context, const IsTaskScheduledRequest& request,
CompletionQueue* cq));
- MOCK_METHOD(ClientAsyncResponseReaderInterface<GetAllScheduledTasksResponse>*,
- AsyncGetAllScheduledTasksRaw,
- (ClientContext * context, const GetAllScheduledTasksRequest& request,
+ MOCK_METHOD(ClientAsyncResponseReaderInterface<GetAllPendingScheduledTasksResponse>*,
+ AsyncGetAllPendingScheduledTasksRaw,
+ (ClientContext * context, const GetAllPendingScheduledTasksRequest& request,
CompletionQueue* cq));
- MOCK_METHOD(ClientAsyncResponseReaderInterface<GetAllScheduledTasksResponse>*,
- PrepareAsyncGetAllScheduledTasksRaw,
- (ClientContext * context, const GetAllScheduledTasksRequest& request,
+ MOCK_METHOD(ClientAsyncResponseReaderInterface<GetAllPendingScheduledTasksResponse>*,
+ PrepareAsyncGetAllPendingScheduledTasksRaw,
+ (ClientContext * context, const GetAllPendingScheduledTasksRequest& request,
CompletionQueue* cq));
};
@@ -473,7 +473,71 @@
EXPECT_EQ(grpcRequest.scheduleinfo().periodicinseconds(), kTestPeriodicInSeconds);
}
-TEST_F(RemoteAccessServiceUnitTest, TestScheduleTask_InvalidArg) {
+TEST_F(RemoteAccessServiceUnitTest, TestScheduleTask_InvalidCount) {
+ ScheduleInfo scheduleInfo = {
+ .clientId = kTestClientId,
+ .scheduleId = kTestScheduleId,
+ .taskData = kTestData,
+ .count = -1,
+ .startTimeInEpochSeconds = kTestStartTimeInEpochSeconds,
+ .periodicInSeconds = kTestPeriodicInSeconds,
+ };
+
+ ScopedAStatus status = getService()->scheduleTask(scheduleInfo);
+
+ ASSERT_FALSE(status.isOk());
+ ASSERT_EQ(status.getExceptionCode(), EX_ILLEGAL_ARGUMENT);
+}
+
+TEST_F(RemoteAccessServiceUnitTest, TestScheduleTask_InvalidStartTimeInEpochSeconds) {
+ ScheduleInfo scheduleInfo = {
+ .clientId = kTestClientId,
+ .scheduleId = kTestScheduleId,
+ .taskData = kTestData,
+ .count = kTestCount,
+ .startTimeInEpochSeconds = -1,
+ .periodicInSeconds = kTestPeriodicInSeconds,
+ };
+
+ ScopedAStatus status = getService()->scheduleTask(scheduleInfo);
+
+ ASSERT_FALSE(status.isOk());
+ ASSERT_EQ(status.getExceptionCode(), EX_ILLEGAL_ARGUMENT);
+}
+
+TEST_F(RemoteAccessServiceUnitTest, TestScheduleTask_InvalidPeriodicInSeconds) {
+ ScheduleInfo scheduleInfo = {
+ .clientId = kTestClientId,
+ .scheduleId = kTestScheduleId,
+ .taskData = kTestData,
+ .count = kTestCount,
+ .startTimeInEpochSeconds = kTestStartTimeInEpochSeconds,
+ .periodicInSeconds = -1,
+ };
+
+ ScopedAStatus status = getService()->scheduleTask(scheduleInfo);
+
+ ASSERT_FALSE(status.isOk());
+ ASSERT_EQ(status.getExceptionCode(), EX_ILLEGAL_ARGUMENT);
+}
+
+TEST_F(RemoteAccessServiceUnitTest, TestScheduleTask_TaskDataTooLarge) {
+ ScheduleInfo scheduleInfo = {
+ .clientId = kTestClientId,
+ .scheduleId = kTestScheduleId,
+ .taskData = std::vector<uint8_t>(ScheduleInfo::MAX_TASK_DATA_SIZE_IN_BYTES + 1),
+ .count = kTestCount,
+ .startTimeInEpochSeconds = kTestStartTimeInEpochSeconds,
+ .periodicInSeconds = kTestPeriodicInSeconds,
+ };
+
+ ScopedAStatus status = getService()->scheduleTask(scheduleInfo);
+
+ ASSERT_FALSE(status.isOk());
+ ASSERT_EQ(status.getExceptionCode(), EX_ILLEGAL_ARGUMENT);
+}
+
+TEST_F(RemoteAccessServiceUnitTest, TestScheduleTask_InvalidArgFromGrpcServer) {
EXPECT_CALL(*getGrpcWakeupClientStub(), ScheduleTask)
.WillOnce([]([[maybe_unused]] ClientContext* context,
[[maybe_unused]] const ScheduleTaskRequest& request,
@@ -573,13 +637,13 @@
EXPECT_EQ(grpcRequest.scheduleid(), kTestScheduleId);
}
-TEST_F(RemoteAccessServiceUnitTest, testGetAllScheduledTasks) {
+TEST_F(RemoteAccessServiceUnitTest, testGetAllPendingScheduledTasks) {
std::vector<ScheduleInfo> result;
- GetAllScheduledTasksRequest grpcRequest = {};
- EXPECT_CALL(*getGrpcWakeupClientStub(), GetAllScheduledTasks)
+ GetAllPendingScheduledTasksRequest grpcRequest = {};
+ EXPECT_CALL(*getGrpcWakeupClientStub(), GetAllPendingScheduledTasks)
.WillOnce([&grpcRequest]([[maybe_unused]] ClientContext* context,
- const GetAllScheduledTasksRequest& request,
- GetAllScheduledTasksResponse* response) {
+ const GetAllPendingScheduledTasksRequest& request,
+ GetAllPendingScheduledTasksResponse* response) {
grpcRequest = request;
GrpcScheduleInfo* newInfo = response->add_allscheduledtasks();
newInfo->set_clientid(kTestClientId);
@@ -591,7 +655,7 @@
return Status();
});
- ScopedAStatus status = getService()->getAllScheduledTasks(kTestClientId, &result);
+ ScopedAStatus status = getService()->getAllPendingScheduledTasks(kTestClientId, &result);
ASSERT_TRUE(status.isOk());
EXPECT_EQ(grpcRequest.clientid(), kTestClientId);
diff --git a/automotive/remoteaccess/test_grpc_server/impl/include/TestWakeupClientServiceImpl.h b/automotive/remoteaccess/test_grpc_server/impl/include/TestWakeupClientServiceImpl.h
index 2aab904..41cc5d0 100644
--- a/automotive/remoteaccess/test_grpc_server/impl/include/TestWakeupClientServiceImpl.h
+++ b/automotive/remoteaccess/test_grpc_server/impl/include/TestWakeupClientServiceImpl.h
@@ -78,6 +78,7 @@
void waitForTask();
void stopWait();
bool isEmpty();
+ bool isStopped();
private:
friend class TaskTimeoutMessageHandler;
@@ -87,7 +88,7 @@
GUARDED_BY(mLock);
// A variable to notify mTasks is not empty.
std::condition_variable mTasksNotEmptyCv;
- std::atomic<bool> mStopped;
+ std::atomic<bool> mStopped = false;
android::sp<Looper> mLooper;
android::sp<TaskTimeoutMessageHandler> mTaskTimeoutMessageHandler;
std::atomic<int> mTaskIdCounter = 0;
@@ -138,9 +139,9 @@
const IsTaskScheduledRequest* request,
IsTaskScheduledResponse* response) override;
- grpc::Status GetAllScheduledTasks(grpc::ServerContext* context,
- const GetAllScheduledTasksRequest* request,
- GetAllScheduledTasksResponse* response) override;
+ grpc::Status GetAllPendingScheduledTasks(
+ grpc::ServerContext* context, const GetAllPendingScheduledTasksRequest* request,
+ GetAllPendingScheduledTasksResponse* response) override;
/**
* Starts generating fake tasks for the specific client repeatedly.
@@ -214,7 +215,7 @@
std::atomic<bool> mRemoteTaskConnectionAlive = false;
std::mutex mLock;
bool mGeneratingFakeTask GUARDED_BY(mLock);
- std::atomic<bool> mServerStopped;
+ std::atomic<bool> mServerStopped = false;
std::unordered_map<std::string, std::unordered_map<std::string, ScheduleInfo>>
mInfoByScheduleIdByClientId GUARDED_BY(mLock);
diff --git a/automotive/remoteaccess/test_grpc_server/impl/src/TestWakeupClientServiceImpl.cpp b/automotive/remoteaccess/test_grpc_server/impl/src/TestWakeupClientServiceImpl.cpp
index 1db991c..eed3495 100644
--- a/automotive/remoteaccess/test_grpc_server/impl/src/TestWakeupClientServiceImpl.cpp
+++ b/automotive/remoteaccess/test_grpc_server/impl/src/TestWakeupClientServiceImpl.cpp
@@ -105,6 +105,10 @@
});
}
+bool TaskQueue::isStopped() {
+ return mStopped;
+}
+
void TaskQueue::stopWait() {
mStopped = true;
{
@@ -241,7 +245,7 @@
while (true) {
mTaskQueue->waitForTask();
- if (mServerStopped) {
+ if (mTaskQueue->isStopped()) {
// Server stopped, exit the loop.
printf("Server stopped exit loop\n");
break;
@@ -250,11 +254,13 @@
while (true) {
auto maybeTask = mTaskQueue->maybePopOne();
if (!maybeTask.has_value()) {
+ printf("no task left\n");
// No task left, loop again and wait for another task(s).
break;
}
// Loop through all the task in the queue but obtain lock for each element so we don't
// hold lock while writing the response.
+ printf("Sending one remote task\n");
const GetRemoteTasksResponse& response = maybeTask.value();
if (!writer->Write(response)) {
// Broken stream, maybe the client is shutting down.
@@ -469,11 +475,11 @@
return Status::OK;
}
-Status TestWakeupClientServiceImpl::GetAllScheduledTasks(ServerContext* context,
- const GetAllScheduledTasksRequest* request,
- GetAllScheduledTasksResponse* response) {
+Status TestWakeupClientServiceImpl::GetAllPendingScheduledTasks(
+ ServerContext* context, const GetAllPendingScheduledTasksRequest* request,
+ GetAllPendingScheduledTasksResponse* response) {
const std::string& clientId = request->clientid();
- printf("GetAllScheduledTasks called with client Id: %s\n", clientId.c_str());
+ printf("GetAllPendingScheduledTasks called with client Id: %s\n", clientId.c_str());
response->clear_allscheduledtasks();
{
std::unique_lock lk(mLock);
diff --git a/automotive/remoteaccess/test_grpc_server/impl/test/TestWakeupClientServiceImplUnitTest.cpp b/automotive/remoteaccess/test_grpc_server/impl/test/TestWakeupClientServiceImplUnitTest.cpp
index 960020d..63458ae 100644
--- a/automotive/remoteaccess/test_grpc_server/impl/test/TestWakeupClientServiceImplUnitTest.cpp
+++ b/automotive/remoteaccess/test_grpc_server/impl/test/TestWakeupClientServiceImplUnitTest.cpp
@@ -280,7 +280,7 @@
EXPECT_EQ(getRemoteTaskResponses().size(), 0);
}
-TEST_F(TestWakeupClientServiceImplUnitTest, TestGetAllScheduledTasks) {
+TEST_F(TestWakeupClientServiceImplUnitTest, TestGetAllPendingScheduledTasks) {
std::string scheduleId1 = "scheduleId1";
std::string scheduleId2 = "scheduleId2";
int64_t time1 = getNow();
@@ -296,19 +296,19 @@
ASSERT_TRUE(status.ok());
ClientContext context;
- GetAllScheduledTasksRequest request;
- GetAllScheduledTasksResponse response;
+ GetAllPendingScheduledTasksRequest request;
+ GetAllPendingScheduledTasksResponse response;
request.set_clientid("invalid client Id");
- status = getStub()->GetAllScheduledTasks(&context, request, &response);
+ status = getStub()->GetAllPendingScheduledTasks(&context, request, &response);
ASSERT_TRUE(status.ok());
EXPECT_EQ(response.allscheduledtasks_size(), 0);
ClientContext context2;
- GetAllScheduledTasksRequest request2;
- GetAllScheduledTasksResponse response2;
+ GetAllPendingScheduledTasksRequest request2;
+ GetAllPendingScheduledTasksResponse response2;
request2.set_clientid(kTestClientId);
- status = getStub()->GetAllScheduledTasks(&context2, request2, &response2);
+ status = getStub()->GetAllPendingScheduledTasks(&context2, request2, &response2);
ASSERT_TRUE(status.ok());
ASSERT_EQ(response2.allscheduledtasks_size(), 2);
diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.cpp
index b56a190..82e357f 100644
--- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.cpp
+++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.cpp
@@ -494,7 +494,11 @@
}
for (int areaId : areaIds) {
- auto v = pool.obtain(*mPropStore->refreshTimestamp(property, areaId));
+ auto refreshedProp = mPropStore->refreshTimestamp(property, areaId);
+ VehiclePropValuePtr v = nullptr;
+ if (refreshedProp != nullptr) {
+ v = pool.obtain(*refreshedProp);
+ }
if (v.get()) {
events.push_back(std::move(v));
}
diff --git a/automotive/vehicle/aidl/Android.bp b/automotive/vehicle/aidl/Android.bp
index 3be0f28..5ca1fc8 100644
--- a/automotive/vehicle/aidl/Android.bp
+++ b/automotive/vehicle/aidl/Android.bp
@@ -41,6 +41,9 @@
"com.android.car.framework",
],
},
+ rust: {
+ enabled: true,
+ },
},
versions_with_info: [
{
diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SubscribeOptions.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SubscribeOptions.aidl
index 69f6190..14469b5 100644
--- a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SubscribeOptions.aidl
+++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SubscribeOptions.aidl
@@ -45,8 +45,8 @@
*
* This value indicates the resolution at which continuous property updates should be sent to
* the platform. For example, if resolution is 0.01, the subscribed property value should be
- * rounded to two decimal places. If the incoming resolution value is not an integer multiple of
- * 10, VHAL should return a StatusCode::INVALID_ARG.
+ * rounded to two decimal places. If the incoming resolution value is not an integer power of
+ * 10 (i.e. 10^-2, 10^-1, 10^2, etc.), VHAL should return a StatusCode::INVALID_ARG.
*/
float resolution = 0.0f;
diff --git a/automotive/vehicle/aidl/emu_metadata/android.hardware.automotive.vehicle-types-meta.json b/automotive/vehicle/aidl/emu_metadata/android.hardware.automotive.vehicle-types-meta.json
index e312a3a..6d856a8 100644
--- a/automotive/vehicle/aidl/emu_metadata/android.hardware.automotive.vehicle-types-meta.json
+++ b/automotive/vehicle/aidl/emu_metadata/android.hardware.automotive.vehicle-types-meta.json
@@ -1,34 +1,22 @@
[
{
- "name": "VehicleApPowerStateReqIndex",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleOilLevel",
"values": [
{
- "name": "STATE",
+ "name": "CRITICALLY_LOW",
"value": 0
},
{
- "name": "ADDITIONAL",
- "value": 1
- }
- ]
- },
- {
- "name": "EvChargeState",
- "values": [
- {
- "name": "UNKNOWN",
- "value": 0
- },
- {
- "name": "CHARGING",
+ "name": "LOW",
"value": 1
},
{
- "name": "FULLY_CHARGED",
+ "name": "NORMAL",
"value": 2
},
{
- "name": "NOT_CHARGING",
+ "name": "HIGH",
"value": 3
},
{
@@ -38,220 +26,123 @@
]
},
{
- "name": "TrailerState",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "LocationCharacterization",
"values": [
{
- "name": "UNKNOWN",
- "value": 0
- },
- {
- "name": "NOT_PRESENT",
+ "name": "PRIOR_LOCATIONS",
"value": 1
},
{
- "name": "PRESENT",
+ "name": "GYROSCOPE_FUSION",
"value": 2
},
{
- "name": "ERROR",
- "value": 3
- }
- ]
- },
- {
- "name": "ProcessTerminationReason",
- "values": [
- {
- "name": "NOT_RESPONDING",
- "value": 1
- },
- {
- "name": "IO_OVERUSE",
- "value": 2
- },
- {
- "name": "MEMORY_OVERUSE",
- "value": 3
- }
- ]
- },
- {
- "name": "VehicleApPowerStateConfigFlag",
- "values": [
- {
- "name": "ENABLE_DEEP_SLEEP_FLAG",
- "value": 1
- },
- {
- "name": "CONFIG_SUPPORT_TIMER_POWER_ON_FLAG",
- "value": 2
- },
- {
- "name": "ENABLE_HIBERNATION_FLAG",
- "value": 3
- }
- ]
- },
- {
- "name": "Obd2FuelType",
- "values": [
- {
- "name": "NOT_AVAILABLE",
- "value": 0
- },
- {
- "name": "GASOLINE",
- "value": 1
- },
- {
- "name": "METHANOL",
- "value": 2
- },
- {
- "name": "ETHANOL",
- "value": 3
- },
- {
- "name": "DIESEL",
+ "name": "ACCELEROMETER_FUSION",
"value": 4
},
{
- "name": "LPG",
- "value": 5
- },
- {
- "name": "CNG",
- "value": 6
- },
- {
- "name": "PROPANE",
- "value": 7
- },
- {
- "name": "ELECTRIC",
+ "name": "COMPASS_FUSION",
"value": 8
},
{
- "name": "BIFUEL_RUNNING_GASOLINE",
- "value": 9
- },
- {
- "name": "BIFUEL_RUNNING_METHANOL",
- "value": 10
- },
- {
- "name": "BIFUEL_RUNNING_ETHANOL",
- "value": 11
- },
- {
- "name": "BIFUEL_RUNNING_LPG",
- "value": 12
- },
- {
- "name": "BIFUEL_RUNNING_CNG",
- "value": 13
- },
- {
- "name": "BIFUEL_RUNNING_PROPANE",
- "value": 14
- },
- {
- "name": "BIFUEL_RUNNING_ELECTRIC",
- "value": 15
- },
- {
- "name": "BIFUEL_RUNNING_ELECTRIC_AND_COMBUSTION",
+ "name": "WHEEL_SPEED_FUSION",
"value": 16
},
{
- "name": "HYBRID_GASOLINE",
- "value": 17
+ "name": "STEERING_ANGLE_FUSION",
+ "value": 32
},
{
- "name": "HYBRID_ETHANOL",
- "value": 18
+ "name": "CAR_SPEED_FUSION",
+ "value": 64
},
{
- "name": "HYBRID_DIESEL",
- "value": 19
+ "name": "DEAD_RECKONED",
+ "value": 128
},
{
- "name": "HYBRID_ELECTRIC",
- "value": 20
- },
- {
- "name": "HYBRID_RUNNING_ELECTRIC_AND_COMBUSTION",
- "value": 21
- },
- {
- "name": "HYBRID_REGENERATIVE",
- "value": 22
- },
- {
- "name": "BIFUEL_RUNNING_DIESEL",
- "value": 23
+ "name": "RAW_GNSS_ONLY",
+ "value": 256
}
]
},
{
- "name": "VmsSubscriptionsStateIntegerValuesIndex",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleDisplay",
"values": [
{
- "name": "MESSAGE_TYPE",
+ "name": "MAIN",
"value": 0
},
{
- "name": "SEQUENCE_NUMBER",
+ "name": "INSTRUMENT_CLUSTER",
"value": 1
},
{
- "name": "NUMBER_OF_LAYERS",
+ "name": "HUD",
"value": 2
},
{
- "name": "NUMBER_OF_ASSOCIATED_LAYERS",
+ "name": "INPUT",
"value": 3
},
{
- "name": "SUBSCRIPTIONS_START",
+ "name": "AUXILIARY",
"value": 4
}
]
},
{
- "name": "VehicleArea",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "CruiseControlState",
"values": [
{
- "name": "GLOBAL",
- "value": 16777216
+ "name": "OTHER",
+ "value": 0
},
{
- "name": "WINDOW",
- "value": 50331648
+ "name": "ENABLED",
+ "value": 1
},
{
- "name": "MIRROR",
- "value": 67108864
+ "name": "ACTIVATED",
+ "value": 2
},
{
- "name": "SEAT",
- "value": 83886080
+ "name": "USER_OVERRIDE",
+ "value": 3
},
{
- "name": "DOOR",
- "value": 100663296
+ "name": "SUSPENDED",
+ "value": 4
},
{
- "name": "WHEEL",
- "value": 117440512
- },
- {
- "name": "MASK",
- "value": 251658240
+ "name": "FORCED_DEACTIVATION_WARNING",
+ "value": 5
}
]
},
{
+ "package": "android.hardware.automotive.vehicle",
+ "name": "HandsOnDetectionWarning",
+ "values": [
+ {
+ "name": "OTHER",
+ "value": 0
+ },
+ {
+ "name": "NO_WARNING",
+ "value": 1
+ },
+ {
+ "name": "WARNING",
+ "value": 2
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
"name": "VehicleAreaWindow",
"values": [
{
@@ -297,27 +188,99 @@
]
},
{
- "name": "ElectronicTollCollectionCardStatus",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VmsAvailabilityStateIntegerValuesIndex",
"values": [
{
- "name": "UNKNOWN",
+ "name": "MESSAGE_TYPE",
"value": 0
},
{
- "name": "ELECTRONIC_TOLL_COLLECTION_CARD_VALID",
+ "name": "SEQUENCE_NUMBER",
"value": 1
},
{
- "name": "ELECTRONIC_TOLL_COLLECTION_CARD_INVALID",
+ "name": "NUMBER_OF_ASSOCIATED_LAYERS",
"value": 2
},
{
- "name": "ELECTRONIC_TOLL_COLLECTION_CARD_NOT_INSERTED",
+ "name": "LAYERS_START",
"value": 3
}
]
},
{
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleLightSwitch",
+ "values": [
+ {
+ "name": "OFF",
+ "value": 0
+ },
+ {
+ "name": "ON",
+ "value": 1
+ },
+ {
+ "name": "DAYTIME_RUNNING",
+ "value": 2
+ },
+ {
+ "name": "AUTOMATIC",
+ "value": 256
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "Obd2IgnitionMonitorKind",
+ "values": [
+ {
+ "name": "SPARK",
+ "value": 0
+ },
+ {
+ "name": "COMPRESSION",
+ "value": 1
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleHwMotionButtonStateFlag",
+ "values": [
+ {
+ "name": "BUTTON_PRIMARY",
+ "value": 1
+ },
+ {
+ "name": "BUTTON_SECONDARY",
+ "value": 2
+ },
+ {
+ "name": "BUTTON_TERTIARY",
+ "value": 4
+ },
+ {
+ "name": "BUTTON_BACK",
+ "value": 8
+ },
+ {
+ "name": "BUTTON_FORWARD",
+ "value": 16
+ },
+ {
+ "name": "BUTTON_STYLUS_PRIMARY",
+ "value": 32
+ },
+ {
+ "name": "BUTTON_STYLUS_SECONDARY",
+ "value": 64
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
"name": "VehiclePropertyType",
"values": [
{
@@ -367,1694 +330,7 @@
]
},
{
- "name": "StatusCode",
- "values": [
- {
- "name": "OK",
- "value": 0
- },
- {
- "name": "TRY_AGAIN",
- "value": 1
- },
- {
- "name": "INVALID_ARG",
- "value": 2
- },
- {
- "name": "NOT_AVAILABLE",
- "value": 3
- },
- {
- "name": "ACCESS_DENIED",
- "value": 4
- },
- {
- "name": "INTERNAL_ERROR",
- "value": 5
- }
- ]
- },
- {
- "name": "CreateUserStatus",
- "values": [
- {
- "name": "SUCCESS",
- "value": 1
- },
- {
- "name": "FAILURE",
- "value": 2
- }
- ]
- },
- {
- "name": "ElectronicTollCollectionCardType",
- "values": [
- {
- "name": "UNKNOWN",
- "value": 0
- },
- {
- "name": "JP_ELECTRONIC_TOLL_COLLECTION_CARD",
- "value": 1
- },
- {
- "name": "JP_ELECTRONIC_TOLL_COLLECTION_CARD_V2",
- "value": 2
- }
- ]
- },
- {
- "name": "VehicleAreaMirror",
- "values": [
- {
- "name": "DRIVER_LEFT",
- "value": 1
- },
- {
- "name": "DRIVER_RIGHT",
- "value": 2
- },
- {
- "name": "DRIVER_CENTER",
- "value": 4
- }
- ]
- },
- {
- "name": "InitialUserInfoResponseAction",
- "values": [
- {
- "name": "DEFAULT",
- "value": 0
- },
- {
- "name": "SWITCH",
- "value": 1
- },
- {
- "name": "CREATE",
- "value": 2
- }
- ]
- },
- {
- "name": "VehicleHvacFanDirection",
- "values": [
- {
- "name": "UNKNOWN",
- "value": 0
- },
- {
- "name": "FACE",
- "value": 1
- },
- {
- "name": "FLOOR",
- "value": 2
- },
- {
- "name": "FACE_AND_FLOOR",
- "value": 3
- },
- {
- "name": "DEFROST",
- "value": 4
- },
- {
- "name": "DEFROST_AND_FLOOR",
- "value": 6
- }
- ]
- },
- {
- "name": "Obd2SecondaryAirStatus",
- "values": [
- {
- "name": "UPSTREAM",
- "value": 1
- },
- {
- "name": "DOWNSTREAM_OF_CATALYCIC_CONVERTER",
- "value": 2
- },
- {
- "name": "FROM_OUTSIDE_OR_OFF",
- "value": 4
- },
- {
- "name": "PUMP_ON_FOR_DIAGNOSTICS",
- "value": 8
- }
- ]
- },
- {
- "name": "VmsStartSessionMessageIntegerValuesIndex",
- "values": [
- {
- "name": "MESSAGE_TYPE",
- "value": 0
- },
- {
- "name": "SERVICE_ID",
- "value": 1
- },
- {
- "name": "CLIENT_ID",
- "value": 2
- }
- ]
- },
- {
- "name": "VehicleOilLevel",
- "values": [
- {
- "name": "CRITICALLY_LOW",
- "value": 0
- },
- {
- "name": "LOW",
- "value": 1
- },
- {
- "name": "NORMAL",
- "value": 2
- },
- {
- "name": "HIGH",
- "value": 3
- },
- {
- "name": "ERROR",
- "value": 4
- }
- ]
- },
- {
- "name": "VehicleUnit",
- "values": [
- {
- "name": "SHOULD_NOT_USE",
- "value": 0
- },
- {
- "name": "METER_PER_SEC",
- "value": 1
- },
- {
- "name": "RPM",
- "value": 2
- },
- {
- "name": "HERTZ",
- "value": 3
- },
- {
- "name": "PERCENTILE",
- "value": 16
- },
- {
- "name": "MILLIMETER",
- "value": 32
- },
- {
- "name": "METER",
- "value": 33
- },
- {
- "name": "KILOMETER",
- "value": 35
- },
- {
- "name": "MILE",
- "value": 36
- },
- {
- "name": "CELSIUS",
- "value": 48
- },
- {
- "name": "FAHRENHEIT",
- "value": 49
- },
- {
- "name": "KELVIN",
- "value": 50
- },
- {
- "name": "MILLILITER",
- "value": 64
- },
- {
- "name": "LITER",
- "value": 65
- },
- {
- "name": "GALLON",
- "value": 66
- },
- {
- "name": "US_GALLON",
- "value": 66
- },
- {
- "name": "IMPERIAL_GALLON",
- "value": 67
- },
- {
- "name": "NANO_SECS",
- "value": 80
- },
- {
- "name": "SECS",
- "value": 83
- },
- {
- "name": "YEAR",
- "value": 89
- },
- {
- "name": "WATT_HOUR",
- "value": 96
- },
- {
- "name": "MILLIAMPERE",
- "value": 97
- },
- {
- "name": "MILLIVOLT",
- "value": 98
- },
- {
- "name": "MILLIWATTS",
- "value": 99
- },
- {
- "name": "AMPERE_HOURS",
- "value": 100
- },
- {
- "name": "KILOWATT_HOUR",
- "value": 101
- },
- {
- "name": "AMPERE",
- "value": 102
- },
- {
- "name": "KILOPASCAL",
- "value": 112
- },
- {
- "name": "PSI",
- "value": 113
- },
- {
- "name": "BAR",
- "value": 114
- },
- {
- "name": "DEGREES",
- "value": 128
- },
- {
- "name": "MILES_PER_HOUR",
- "value": 144
- },
- {
- "name": "KILOMETERS_PER_HOUR",
- "value": 145
- }
- ]
- },
- {
- "name": "VehicleAreaWheel",
- "values": [
- {
- "name": "UNKNOWN",
- "value": 0
- },
- {
- "name": "LEFT_FRONT",
- "value": 1
- },
- {
- "name": "RIGHT_FRONT",
- "value": 2
- },
- {
- "name": "LEFT_REAR",
- "value": 4
- },
- {
- "name": "RIGHT_REAR",
- "value": 8
- }
- ]
- },
- {
- "name": "EvsServiceState",
- "values": [
- {
- "name": "OFF",
- "value": 0
- },
- {
- "name": "ON",
- "value": 1
- }
- ]
- },
- {
- "name": "EvsServiceRequestIndex",
- "values": [
- {
- "name": "TYPE",
- "value": 0
- },
- {
- "name": "STATE",
- "value": 1
- }
- ]
- },
- {
- "name": "VehicleSeatOccupancyState",
- "values": [
- {
- "name": "UNKNOWN",
- "value": 0
- },
- {
- "name": "VACANT",
- "value": 1
- },
- {
- "name": "OCCUPIED",
- "value": 2
- }
- ]
- },
- {
- "name": "VehicleProperty",
- "values": [
- {
- "name": "Undefined property.",
- "value": 0
- },
- {
- "name": "VIN of vehicle",
- "value": 286261504,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Manufacturer of vehicle",
- "value": 286261505,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Model of vehicle",
- "value": 286261506,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Model year of vehicle.",
- "value": 289407235,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:YEAR"
- },
- {
- "name": "Fuel capacity of the vehicle in milliliters",
- "value": 291504388,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:MILLILITER"
- },
- {
- "name": "List of fuels the vehicle may use",
- "value": 289472773,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "FuelType"
- },
- {
- "name": "INFO_EV_BATTERY_CAPACITY",
- "value": 291504390,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:WH"
- },
- {
- "name": "List of connectors this EV may use",
- "value": 289472775,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "data_enum": "EvConnectorType",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Fuel door location",
- "value": 289407240,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "data_enum": "PortLocationType",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "EV port location",
- "value": 289407241,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "PortLocationType"
- },
- {
- "name": "INFO_DRIVER_SEAT",
- "value": 356516106,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "data_enum": "VehicleAreaSeat",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Exterior dimensions of vehicle.",
- "value": 289472779,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:MILLIMETER"
- },
- {
- "name": "Multiple EV port locations",
- "value": 289472780,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "PortLocationType"
- },
- {
- "name": "Current odometer value of the vehicle",
- "value": 291504644,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:KILOMETER"
- },
- {
- "name": "Speed of the vehicle",
- "value": 291504647,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:METER_PER_SEC"
- },
- {
- "name": "Speed of the vehicle for displays",
- "value": 291504648,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:METER_PER_SEC"
- },
- {
- "name": "Front bicycle model steering angle for vehicle",
- "value": 291504649,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:DEGREES"
- },
- {
- "name": "Rear bicycle model steering angle for vehicle",
- "value": 291504656,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:DEGREES"
- },
- {
- "name": "Temperature of engine coolant",
- "value": 291504897,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:CELSIUS"
- },
- {
- "name": "Engine oil level",
- "value": 289407747,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "VehicleOilLevel"
- },
- {
- "name": "Temperature of engine oil",
- "value": 291504900,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:CELSIUS"
- },
- {
- "name": "Engine rpm",
- "value": 291504901,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:RPM"
- },
- {
- "name": "Reports wheel ticks",
- "value": 290521862,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "FUEL_LEVEL",
- "value": 291504903,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:MILLILITER"
- },
- {
- "name": "Fuel door open",
- "value": 287310600,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "EV_BATTERY_LEVEL",
- "value": 291504905,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:WH"
- },
- {
- "name": "EV charge port open",
- "value": 287310602,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "EV charge port connected",
- "value": 287310603,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "EV instantaneous charge rate in milliwatts",
- "value": 291504908,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:MW"
- },
- {
- "name": "Range remaining",
- "value": 291504904,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "unit": "VehicleUnit:METER"
- },
- {
- "name": "Tire pressure",
- "value": 392168201,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:KILOPASCAL"
- },
- {
- "name": "Critically low tire pressure",
- "value": 392168202,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:KILOPASCAL"
- },
- {
- "name": "Currently selected gear",
- "value": 289408000,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "VehicleGear"
- },
- {
- "name": "CURRENT_GEAR",
- "value": 289408001,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "VehicleGear"
- },
- {
- "name": "Parking brake state.",
- "value": 287310850,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "PARKING_BRAKE_AUTO_APPLY",
- "value": 287310851,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Warning for fuel low level.",
- "value": 287310853,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Night mode",
- "value": 287310855,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "State of the vehicles turn signals",
- "value": 289408008,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "VehicleTurnSignal"
- },
- {
- "name": "Represents ignition state",
- "value": 289408009,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "VehicleIgnitionState"
- },
- {
- "name": "ABS is active",
- "value": 287310858,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Traction Control is active",
- "value": 287310859,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "HVAC_FAN_SPEED",
- "value": 356517120
- },
- {
- "name": "Fan direction setting",
- "value": 356517121,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "data_enum": "VehicleHvacFanDirection"
- },
- {
- "name": "HVAC current temperature.",
- "value": 358614274,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:CELSIUS"
- },
- {
- "name": "HVAC_TEMPERATURE_SET",
- "value": 358614275,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "unit": "VehicleUnit:CELSIUS"
- },
- {
- "name": "HVAC_DEFROSTER",
- "value": 320865540,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "HVAC_AC_ON",
- "value": 354419973,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "config_flags": "Supported"
- },
- {
- "name": "HVAC_MAX_AC_ON",
- "value": 354419974,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "HVAC_MAX_DEFROST_ON",
- "value": 354419975,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "HVAC_RECIRC_ON",
- "value": 354419976,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Enable temperature coupling between areas.",
- "value": 354419977,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "HVAC_AUTO_ON",
- "value": 354419978,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "HVAC_SEAT_TEMPERATURE",
- "value": 356517131,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Side Mirror Heat",
- "value": 339739916,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "HVAC_STEERING_WHEEL_HEAT",
- "value": 289408269,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Temperature units for display",
- "value": 289408270,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "data_enum": "VehicleUnit"
- },
- {
- "name": "Actual fan speed",
- "value": 356517135,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "HVAC_POWER_ON",
- "value": 354419984,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Fan Positions Available",
- "value": 356582673,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "VehicleHvacFanDirection"
- },
- {
- "name": "HVAC_AUTO_RECIRC_ON",
- "value": 354419986,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Seat ventilation",
- "value": 356517139,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "HVAC_ELECTRIC_DEFROSTER_ON",
- "value": 320865556,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Suggested values for setting HVAC temperature.",
- "value": 291570965,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Distance units for display",
- "value": 289408512,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "data_enum": "VehicleUnit"
- },
- {
- "name": "Fuel volume units for display",
- "value": 289408513,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "data_enum": "VehicleUnit"
- },
- {
- "name": "Tire pressure units for display",
- "value": 289408514,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "data_enum": "VehicleUnit"
- },
- {
- "name": "EV battery units for display",
- "value": 289408515,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "data_enum": "VehicleUnit"
- },
- {
- "name": "Fuel consumption units for display",
- "value": 287311364,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Speed units for display",
- "value": 289408517,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "ANDROID_EPOCH_TIME",
- "value": 290457094,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:WRITE_ONLY",
- "unit": "VehicleUnit:MILLI_SECS"
- },
- {
- "name": "External encryption binding seed.",
- "value": 292554247,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Outside temperature",
- "value": 291505923,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:CELSIUS"
- },
- {
- "name": "Property to control power state of application processor",
- "value": 289475072,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Property to report power state of application processor",
- "value": 289475073,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "AP_POWER_BOOTUP_REASON",
- "value": 289409538,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "DISPLAY_BRIGHTNESS",
- "value": 289409539,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "HW_KEY_INPUT",
- "value": 289475088,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "config_flags": ""
- },
- {
- "name": "HW_ROTARY_INPUT",
- "value": 289475104,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "data_enum": "RotaryInputType",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Defines a custom OEM partner input event.",
- "value": 289475120,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "data_enum": "CustomInputType",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "DOOR_POS",
- "value": 373295872,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Door move",
- "value": 373295873,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Door lock",
- "value": 371198722,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Mirror Z Position",
- "value": 339741504,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Mirror Z Move",
- "value": 339741505,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Mirror Y Position",
- "value": 339741506,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Mirror Y Move",
- "value": 339741507,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Mirror Lock",
- "value": 287312708,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Mirror Fold",
- "value": 287312709,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Seat memory select",
- "value": 356518784,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:WRITE"
- },
- {
- "name": "Seat memory set",
- "value": 356518785,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:WRITE"
- },
- {
- "name": "Seatbelt buckled",
- "value": 354421634,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Seatbelt height position",
- "value": 356518787,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Seatbelt height move",
- "value": 356518788,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "SEAT_FORE_AFT_POS",
- "value": 356518789,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "SEAT_FORE_AFT_MOVE",
- "value": 356518790,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Seat backrest angle 1 position",
- "value": 356518791,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Seat backrest angle 1 move",
- "value": 356518792,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Seat backrest angle 2 position",
- "value": 356518793,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Seat backrest angle 2 move",
- "value": 356518794,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Seat height position",
- "value": 356518795,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Seat height move",
- "value": 356518796,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Seat depth position",
- "value": 356518797,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Seat depth move",
- "value": 356518798,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Seat tilt position",
- "value": 356518799,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Seat tilt move",
- "value": 356518800,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "SEAT_LUMBAR_FORE_AFT_POS",
- "value": 356518801,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "SEAT_LUMBAR_FORE_AFT_MOVE",
- "value": 356518802,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Lumbar side support position",
- "value": 356518803,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Lumbar side support move",
- "value": 356518804,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Headrest height position",
- "value": 289409941,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Headrest height move",
- "value": 356518806,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Headrest angle position",
- "value": 356518807,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Headrest angle move",
- "value": 356518808,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "SEAT_HEADREST_FORE_AFT_POS",
- "value": 356518809,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "SEAT_HEADREST_FORE_AFT_MOVE",
- "value": 356518810,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Seat Occupancy",
- "value": 356518832,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "VehicleSeatOccupancyState"
- },
- {
- "name": "Window Position",
- "value": 322964416,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Window Move",
- "value": 322964417,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Window Lock",
- "value": 320867268,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "VEHICLE_MAP_SERVICE",
- "value": 299895808,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "OBD2 Live Sensor Data",
- "value": 299896064,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "OBD2 Freeze Frame Sensor Data",
- "value": 299896065,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "OBD2 Freeze Frame Information",
- "value": 299896066,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "OBD2 Freeze Frame Clear",
- "value": 299896067,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:WRITE"
- },
- {
- "name": "Headlights State",
- "value": 289410560,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "VehicleLightState"
- },
- {
- "name": "High beam lights state",
- "value": 289410561,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "VehicleLightState"
- },
- {
- "name": "Fog light state",
- "value": 289410562,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "VehicleLightState"
- },
- {
- "name": "Hazard light status",
- "value": 289410563,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "VehicleLightState"
- },
- {
- "name": "Headlight switch",
- "value": 289410576,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "data_enum": "VehicleLightSwitch"
- },
- {
- "name": "High beam light switch",
- "value": 289410577,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "data_enum": "VehicleLightSwitch"
- },
- {
- "name": "Fog light switch",
- "value": 289410578,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "data_enum": "VehicleLightSwitch"
- },
- {
- "name": "Hazard light switch",
- "value": 289410579,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "data_enum": "VehicleLightSwitch"
- },
- {
- "name": "Cabin lights",
- "value": 289410817,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "VehicleLightState"
- },
- {
- "name": "Cabin lights switch",
- "value": 289410818,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "data_enum": "VehicleLightSwitch"
- },
- {
- "name": "Reading lights",
- "value": 356519683,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "VehicleLightState"
- },
- {
- "name": "Reading lights switch",
- "value": 356519684,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "data_enum": "VehicleLightSwitch"
- },
- {
- "name": "Support customize permissions for vendor properties",
- "value": 287313669,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Allow disabling optional featurs from vhal.",
- "value": 286265094,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Defines the initial Android user to be used during initialization.",
- "value": 299896583,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Defines a request to switch the foreground Android user.",
- "value": 299896584,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Called by the Android System after an Android user was created.",
- "value": 299896585,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Called by the Android System after an Android user was removed.",
- "value": 299896586,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:WRITE"
- },
- {
- "name": "USER_IDENTIFICATION_ASSOCIATION",
- "value": 299896587,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "EVS_SERVICE_REQUEST",
- "value": 289476368,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Defines a request to apply power policy.",
- "value": 286265121,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "POWER_POLICY_GROUP_REQ",
- "value": 286265122,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Notifies the current power policy to VHAL layer.",
- "value": 286265123,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "WATCHDOG_ALIVE",
- "value": 290459441,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:WRITE"
- },
- {
- "name": "Defines a process terminated by car watchdog and the reason of termination.",
- "value": 299896626,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:WRITE"
- },
- {
- "name": "Defines an event that VHAL signals to car watchdog as a heartbeat.",
- "value": 290459443,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Starts the ClusterUI in cluster display.",
- "value": 289410868,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Changes the state of the cluster display.",
- "value": 289476405,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ"
- },
- {
- "name": "Reports the current display state and ClusterUI state.",
- "value": 299896630,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:WRITE"
- },
- {
- "name": "Requests to change the cluster display state to show some ClusterUI.",
- "value": 289410871,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:WRITE"
- },
- {
- "name": "Informs the current navigation state.",
- "value": 292556600,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:WRITE"
- },
- {
- "name": "Electronic Toll Collection card type.",
- "value": 289410873,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "ElectronicTollCollectionCardType"
- },
- {
- "name": "Electronic Toll Collection card status.",
- "value": 289410874,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "ElectronicTollCollectionCardStatus"
- },
- {
- "name": "Front fog lights state",
- "value": 289410875,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "VehicleLightState"
- },
- {
- "name": "Front fog lights switch",
- "value": 289410876,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "data_enum": "VehicleLightSwitch"
- },
- {
- "name": "Rear fog lights state",
- "value": 289410877,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "VehicleLightState"
- },
- {
- "name": "Rear fog lights switch",
- "value": 289410878,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "data_enum": "VehicleLightSwitch"
- },
- {
- "name": "Indicates the maximum current draw threshold for charging set by the user",
- "value": 291508031,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE",
- "unit": "VehicleUnit:AMPERE"
- },
- {
- "name": "Indicates the maximum charge percent threshold set by the user",
- "value": 291508032,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Charging state of the car",
- "value": 289410881,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "EvChargeState"
- },
- {
- "name": "Start or stop charging the EV battery",
- "value": 287313730,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ_WRITE"
- },
- {
- "name": "Estimated charge time remaining in seconds",
- "value": 289410883,
- "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:SECS"
- },
- {
- "name": "EV_REGENERATIVE_BRAKING_STATE",
- "value": 289410884,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "EvRegenerativeBrakingState"
- },
- {
- "name": "Indicates if there is a trailer present or not.",
- "value": 289410885,
- "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
- "access": "VehiclePropertyAccess:READ",
- "data_enum": "TrailerState"
- },
- {
- "name": "VEHICLE_CURB_WEIGHT",
- "value": 289410886,
- "change_mode": "VehiclePropertyChangeMode:STATIC",
- "access": "VehiclePropertyAccess:READ",
- "unit": "VehicleUnit:KILOGRAM"
- }
- ]
- },
- {
- "name": "EvsServiceType",
- "values": [
- {
- "name": "REARVIEW",
- "value": 0
- },
- {
- "name": "SURROUNDVIEW",
- "value": 1
- }
- ]
- },
- {
- "name": "VehiclePropertyChangeMode",
- "values": [
- {
- "name": "STATIC",
- "value": 0
- },
- {
- "name": "ON_CHANGE",
- "value": 1
- },
- {
- "name": "CONTINUOUS",
- "value": 2
- }
- ]
- },
- {
- "name": "Obd2CompressionIgnitionMonitors",
- "values": []
- },
- {
- "name": "VehicleLightState",
- "values": [
- {
- "name": "OFF",
- "value": 0
- },
- {
- "name": "ON",
- "value": 1
- },
- {
- "name": "DAYTIME_RUNNING",
- "value": 2
- }
- ]
- },
- {
- "name": "SwitchUserMessageType",
- "values": [
- {
- "name": "UNKNOWN",
- "value": 0
- },
- {
- "name": "LEGACY_ANDROID_SWITCH",
- "value": 1
- },
- {
- "name": "ANDROID_SWITCH",
- "value": 2
- },
- {
- "name": "VEHICLE_RESPONSE",
- "value": 3
- },
- {
- "name": "VEHICLE_REQUEST",
- "value": 4
- },
- {
- "name": "ANDROID_POST_SWITCH",
- "value": 5
- }
- ]
- },
- {
- "name": "PortLocationType",
- "values": [
- {
- "name": "UNKNOWN",
- "value": 0
- },
- {
- "name": "FRONT_LEFT",
- "value": 1
- },
- {
- "name": "FRONT_RIGHT",
- "value": 2
- },
- {
- "name": "REAR_RIGHT",
- "value": 3
- },
- {
- "name": "REAR_LEFT",
- "value": 4
- },
- {
- "name": "FRONT",
- "value": 5
- },
- {
- "name": "REAR",
- "value": 6
- }
- ]
- },
- {
- "name": "VehiclePropertyStatus",
- "values": [
- {
- "name": "AVAILABLE",
- "value": 0
- },
- {
- "name": "UNAVAILABLE",
- "value": 1
- },
- {
- "name": "ERROR",
- "value": 2
- }
- ]
- },
- {
- "name": "VehicleDisplay",
- "values": [
- {
- "name": "MAIN",
- "value": 0
- },
- {
- "name": "INSTRUMENT_CLUSTER",
- "value": 1
- }
- ]
- },
- {
- "name": "SwitchUserStatus",
- "values": [
- {
- "name": "SUCCESS",
- "value": 1
- },
- {
- "name": "FAILURE",
- "value": 2
- }
- ]
- },
- {
- "name": "InitialUserInfoRequestType",
- "values": [
- {
- "name": "UNKNOWN",
- "value": 0
- },
- {
- "name": "FIRST_BOOT",
- "value": 1
- },
- {
- "name": "FIRST_BOOT_AFTER_OTA",
- "value": 2
- },
- {
- "name": "COLD_BOOT",
- "value": 3
- },
- {
- "name": "RESUME",
- "value": 4
- }
- ]
- },
- {
- "name": "UserIdentificationAssociationSetValue",
- "values": [
- {
- "name": "INVALID",
- "value": 0
- },
- {
- "name": "ASSOCIATE_CURRENT_USER",
- "value": 1
- },
- {
- "name": "DISASSOCIATE_CURRENT_USER",
- "value": 2
- },
- {
- "name": "DISASSOCIATE_ALL_USERS",
- "value": 3
- }
- ]
- },
- {
+ "package": "android.hardware.automotive.vehicle",
"name": "VehicleAreaDoor",
"values": [
{
@@ -2092,250 +368,477 @@
]
},
{
- "name": "VehicleLightSwitch",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleApPowerBootupReason",
"values": [
{
- "name": "OFF",
+ "name": "USER_POWER_ON",
"value": 0
},
{
- "name": "ON",
+ "name": "SYSTEM_USER_DETECTION",
"value": 1
},
{
- "name": "DAYTIME_RUNNING",
+ "name": "SYSTEM_REMOTE_ACCESS",
"value": 2
- },
- {
- "name": "AUTOMATIC",
- "value": 256
}
]
},
{
- "name": "VehicleGear",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "EmergencyLaneKeepAssistState",
"values": [
{
- "name": "GEAR_UNKNOWN",
+ "name": "OTHER",
"value": 0
},
{
- "name": "GEAR_NEUTRAL",
+ "name": "ENABLED",
"value": 1
},
{
- "name": "GEAR_REVERSE",
+ "name": "WARNING_LEFT",
"value": 2
},
{
- "name": "GEAR_PARK",
- "value": 4
- },
- {
- "name": "GEAR_DRIVE",
- "value": 8
- },
- {
- "name": "GEAR_1",
- "value": 16
- },
- {
- "name": "GEAR_2",
- "value": 32
- },
- {
- "name": "GEAR_3",
- "value": 64
- },
- {
- "name": "GEAR_4",
- "value": 128
- },
- {
- "name": "GEAR_5",
- "value": 256
- },
- {
- "name": "GEAR_6",
- "value": 512
- },
- {
- "name": "GEAR_7",
- "value": 1024
- },
- {
- "name": "GEAR_8",
- "value": 2048
- },
- {
- "name": "GEAR_9",
- "value": 4096
- }
- ]
- },
- {
- "name": "Obd2IgnitionMonitorKind",
- "values": [
- {
- "name": "SPARK",
- "value": 0
- },
- {
- "name": "COMPRESSION",
- "value": 1
- }
- ]
- },
- {
- "name": "CustomInputType",
- "values": [
- {
- "name": "CUSTOM_EVENT_F1",
- "value": 1001
- },
- {
- "name": "CUSTOM_EVENT_F2",
- "value": 1002
- },
- {
- "name": "CUSTOM_EVENT_F3",
- "value": 1003
- },
- {
- "name": "CUSTOM_EVENT_F4",
- "value": 1004
- },
- {
- "name": "CUSTOM_EVENT_F5",
- "value": 1005
- },
- {
- "name": "CUSTOM_EVENT_F6",
- "value": 1006
- },
- {
- "name": "CUSTOM_EVENT_F7",
- "value": 1007
- },
- {
- "name": "CUSTOM_EVENT_F8",
- "value": 1008
- },
- {
- "name": "CUSTOM_EVENT_F9",
- "value": 1009
- },
- {
- "name": "CUSTOM_EVENT_F10",
- "value": 1010
- }
- ]
- },
- {
- "name": "VehicleApPowerStateReport",
- "values": [
- {
- "name": "WAIT_FOR_VHAL",
- "value": 1
- },
- {
- "name": "DEEP_SLEEP_ENTRY",
- "value": 2
- },
- {
- "name": "DEEP_SLEEP_EXIT",
+ "name": "WARNING_RIGHT",
"value": 3
},
{
- "name": "SHUTDOWN_POSTPONE",
+ "name": "ACTIVATED_STEER_LEFT",
"value": 4
},
{
- "name": "SHUTDOWN_START",
+ "name": "ACTIVATED_STEER_RIGHT",
"value": 5
},
{
- "name": "ON",
+ "name": "USER_OVERRIDE",
"value": 6
- },
- {
- "name": "SHUTDOWN_PREPARE",
- "value": 7
- },
- {
- "name": "SHUTDOWN_CANCELLED",
- "value": 8
- },
- {
- "name": "HIBERNATION_ENTRY",
- "value": 9
- },
- {
- "name": "HIBERNATION_EXIT",
- "value": 10
}
]
},
{
- "name": "VmsMessageWithLayerIntegerValuesIndex",
- "values": [
- {
- "name": "MESSAGE_TYPE",
- "value": 0
- },
- {
- "name": "LAYER_TYPE",
- "value": 1
- },
- {
- "name": "LAYER_SUBTYPE",
- "value": 2
- },
- {
- "name": "LAYER_VERSION",
- "value": 3
- }
- ]
- },
- {
- "name": "EvRegenerativeBrakingState",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "EvConnectorType",
"values": [
{
"name": "UNKNOWN",
"value": 0
},
{
- "name": "DISABLED",
+ "name": "IEC_TYPE_1_AC",
"value": 1
},
{
- "name": "PARTIALLY_ENABLED",
+ "name": "IEC_TYPE_2_AC",
"value": 2
},
{
- "name": "FULLY_ENABLED",
+ "name": "IEC_TYPE_3_AC",
"value": 3
+ },
+ {
+ "name": "IEC_TYPE_4_DC",
+ "value": 4
+ },
+ {
+ "name": "IEC_TYPE_1_CCS_DC",
+ "value": 5
+ },
+ {
+ "name": "IEC_TYPE_2_CCS_DC",
+ "value": 6
+ },
+ {
+ "name": "TESLA_ROADSTER",
+ "value": 7
+ },
+ {
+ "name": "TESLA_HPWC",
+ "value": 8
+ },
+ {
+ "name": "TESLA_SUPERCHARGER",
+ "value": 9
+ },
+ {
+ "name": "GBT_AC",
+ "value": 10
+ },
+ {
+ "name": "GBT_DC",
+ "value": 11
+ },
+ {
+ "name": "OTHER",
+ "value": 101
}
]
},
{
- "name": "VehiclePropertyGroup",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "UserIdentificationAssociationType",
"values": [
{
- "name": "SYSTEM",
- "value": 268435456
+ "name": "INVALID",
+ "value": 0
},
{
- "name": "VENDOR",
- "value": 536870912
+ "name": "KEY_FOB",
+ "value": 1
},
{
- "name": "MASK",
- "value": 4026531840
+ "name": "CUSTOM_1",
+ "value": 101
+ },
+ {
+ "name": "CUSTOM_2",
+ "value": 102
+ },
+ {
+ "name": "CUSTOM_3",
+ "value": 103
+ },
+ {
+ "name": "CUSTOM_4",
+ "value": 104
}
]
},
{
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleHvacFanDirection",
+ "values": [
+ {
+ "name": "UNKNOWN",
+ "value": 0
+ },
+ {
+ "name": "FACE",
+ "value": 1
+ },
+ {
+ "name": "FLOOR",
+ "value": 2
+ },
+ {
+ "name": "FACE_AND_FLOOR",
+ "value": 3
+ },
+ {
+ "name": "DEFROST",
+ "value": 4
+ },
+ {
+ "name": "DEFROST_AND_FLOOR",
+ "value": 6
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleAreaWheel",
+ "values": [
+ {
+ "name": "UNKNOWN",
+ "value": 0
+ },
+ {
+ "name": "LEFT_FRONT",
+ "value": 1
+ },
+ {
+ "name": "RIGHT_FRONT",
+ "value": 2
+ },
+ {
+ "name": "LEFT_REAR",
+ "value": 4
+ },
+ {
+ "name": "RIGHT_REAR",
+ "value": 8
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "InitialUserInfoRequestType",
+ "values": [
+ {
+ "name": "UNKNOWN",
+ "value": 0
+ },
+ {
+ "name": "FIRST_BOOT",
+ "value": 1
+ },
+ {
+ "name": "FIRST_BOOT_AFTER_OTA",
+ "value": 2
+ },
+ {
+ "name": "COLD_BOOT",
+ "value": 3
+ },
+ {
+ "name": "RESUME",
+ "value": 4
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "HandsOnDetectionDriverState",
+ "values": [
+ {
+ "name": "OTHER",
+ "value": 0
+ },
+ {
+ "name": "HANDS_ON",
+ "value": 1
+ },
+ {
+ "name": "HANDS_OFF",
+ "value": 2
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "CruiseControlCommand",
+ "values": [
+ {
+ "name": "ACTIVATE",
+ "value": 1
+ },
+ {
+ "name": "SUSPEND",
+ "value": 2
+ },
+ {
+ "name": "INCREASE_TARGET_SPEED",
+ "value": 3
+ },
+ {
+ "name": "DECREASE_TARGET_SPEED",
+ "value": 4
+ },
+ {
+ "name": "INCREASE_TARGET_TIME_GAP",
+ "value": 5
+ },
+ {
+ "name": "DECREASE_TARGET_TIME_GAP",
+ "value": 6
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "WindshieldWipersSwitch",
+ "values": [
+ {
+ "name": "OTHER",
+ "value": 0
+ },
+ {
+ "name": "OFF",
+ "value": 1
+ },
+ {
+ "name": "MIST",
+ "value": 2
+ },
+ {
+ "name": "INTERMITTENT_LEVEL_1",
+ "value": 3
+ },
+ {
+ "name": "INTERMITTENT_LEVEL_2",
+ "value": 4
+ },
+ {
+ "name": "INTERMITTENT_LEVEL_3",
+ "value": 5
+ },
+ {
+ "name": "INTERMITTENT_LEVEL_4",
+ "value": 6
+ },
+ {
+ "name": "INTERMITTENT_LEVEL_5",
+ "value": 7
+ },
+ {
+ "name": "CONTINUOUS_LEVEL_1",
+ "value": 8
+ },
+ {
+ "name": "CONTINUOUS_LEVEL_2",
+ "value": 9
+ },
+ {
+ "name": "CONTINUOUS_LEVEL_3",
+ "value": 10
+ },
+ {
+ "name": "CONTINUOUS_LEVEL_4",
+ "value": 11
+ },
+ {
+ "name": "CONTINUOUS_LEVEL_5",
+ "value": 12
+ },
+ {
+ "name": "AUTO",
+ "value": 13
+ },
+ {
+ "name": "SERVICE",
+ "value": 14
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleHwMotionToolType",
+ "values": [
+ {
+ "name": "TOOL_TYPE_UNKNOWN",
+ "value": 0
+ },
+ {
+ "name": "TOOL_TYPE_FINGER",
+ "value": 1
+ },
+ {
+ "name": "TOOL_TYPE_STYLUS",
+ "value": 2
+ },
+ {
+ "name": "TOOL_TYPE_MOUSE",
+ "value": 3
+ },
+ {
+ "name": "TOOL_TYPE_ERASER",
+ "value": 4
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "SwitchUserStatus",
+ "values": [
+ {
+ "name": "SUCCESS",
+ "value": 1
+ },
+ {
+ "name": "FAILURE",
+ "value": 2
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "EvsServiceType",
+ "values": [
+ {
+ "name": "REARVIEW",
+ "value": 0
+ },
+ {
+ "name": "SURROUNDVIEW",
+ "value": 1
+ },
+ {
+ "name": "FRONTVIEW",
+ "value": 2
+ },
+ {
+ "name": "LEFTVIEW",
+ "value": 3
+ },
+ {
+ "name": "RIGHTVIEW",
+ "value": 4
+ },
+ {
+ "name": "DRIVERVIEW",
+ "value": 5
+ },
+ {
+ "name": "FRONTPASSENGERSVIEW",
+ "value": 6
+ },
+ {
+ "name": "REARPASSENGERSVIEW",
+ "value": 7
+ },
+ {
+ "name": "USER_DEFINED",
+ "value": 1000
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "UserIdentificationAssociationValue",
+ "values": [
+ {
+ "name": "UNKNOWN",
+ "value": 1
+ },
+ {
+ "name": "ASSOCIATED_CURRENT_USER",
+ "value": 2
+ },
+ {
+ "name": "ASSOCIATED_ANOTHER_USER",
+ "value": 3
+ },
+ {
+ "name": "NOT_ASSOCIATED_ANY_USER",
+ "value": 4
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "ErrorState",
+ "values": [
+ {
+ "name": "OTHER_ERROR_STATE",
+ "value": -1
+ },
+ {
+ "name": "NOT_AVAILABLE_DISABLED",
+ "value": -2
+ },
+ {
+ "name": "NOT_AVAILABLE_SPEED_LOW",
+ "value": -3
+ },
+ {
+ "name": "NOT_AVAILABLE_SPEED_HIGH",
+ "value": -4
+ },
+ {
+ "name": "NOT_AVAILABLE_POOR_VISIBILITY",
+ "value": -5
+ },
+ {
+ "name": "NOT_AVAILABLE_SAFETY",
+ "value": -6
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
"name": "VehicleIgnitionState",
"values": [
{
@@ -2365,173 +868,302 @@
]
},
{
- "name": "VehicleHwKeyInputAction",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleAreaSeat",
"values": [
{
- "name": "ACTION_DOWN",
- "value": 0
- },
- {
- "name": "ACTION_UP",
- "value": 1
- }
- ]
- },
- {
- "name": "DiagnosticIntegerSensorIndex",
- "values": [
- {
- "name": "FUEL_SYSTEM_STATUS",
- "value": 0
- },
- {
- "name": "MALFUNCTION_INDICATOR_LIGHT_ON",
+ "name": "ROW_1_LEFT",
"value": 1
},
{
- "name": "IGNITION_MONITORS_SUPPORTED",
+ "name": "ROW_1_CENTER",
"value": 2
},
{
- "name": "IGNITION_SPECIFIC_MONITORS",
- "value": 3
- },
- {
- "name": "INTAKE_AIR_TEMPERATURE",
+ "name": "ROW_1_RIGHT",
"value": 4
},
{
- "name": "COMMANDED_SECONDARY_AIR_STATUS",
- "value": 5
- },
- {
- "name": "NUM_OXYGEN_SENSORS_PRESENT",
- "value": 6
- },
- {
- "name": "RUNTIME_SINCE_ENGINE_START",
- "value": 7
- },
- {
- "name": "DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON",
- "value": 8
- },
- {
- "name": "WARMUPS_SINCE_CODES_CLEARED",
- "value": 9
- },
- {
- "name": "DISTANCE_TRAVELED_SINCE_CODES_CLEARED",
- "value": 10
- },
- {
- "name": "ABSOLUTE_BAROMETRIC_PRESSURE",
- "value": 11
- },
- {
- "name": "CONTROL_MODULE_VOLTAGE",
- "value": 12
- },
- {
- "name": "AMBIENT_AIR_TEMPERATURE",
- "value": 13
- },
- {
- "name": "TIME_WITH_MALFUNCTION_LIGHT_ON",
- "value": 14
- },
- {
- "name": "TIME_SINCE_TROUBLE_CODES_CLEARED",
- "value": 15
- },
- {
- "name": "MAX_FUEL_AIR_EQUIVALENCE_RATIO",
+ "name": "ROW_2_LEFT",
"value": 16
},
{
- "name": "MAX_OXYGEN_SENSOR_VOLTAGE",
- "value": 17
+ "name": "ROW_2_CENTER",
+ "value": 32
},
{
- "name": "MAX_OXYGEN_SENSOR_CURRENT",
- "value": 18
+ "name": "ROW_2_RIGHT",
+ "value": 64
},
{
- "name": "MAX_INTAKE_MANIFOLD_ABSOLUTE_PRESSURE",
- "value": 19
+ "name": "ROW_3_LEFT",
+ "value": 256
},
{
- "name": "MAX_AIR_FLOW_RATE_FROM_MASS_AIR_FLOW_SENSOR",
- "value": 20
+ "name": "ROW_3_CENTER",
+ "value": 512
},
{
- "name": "FUEL_TYPE",
- "value": 21
- },
- {
- "name": "FUEL_RAIL_ABSOLUTE_PRESSURE",
- "value": 22
- },
- {
- "name": "ENGINE_OIL_TEMPERATURE",
- "value": 23
- },
- {
- "name": "DRIVER_DEMAND_PERCENT_TORQUE",
- "value": 24
- },
- {
- "name": "ENGINE_ACTUAL_PERCENT_TORQUE",
- "value": 25
- },
- {
- "name": "ENGINE_REFERENCE_PERCENT_TORQUE",
- "value": 26
- },
- {
- "name": "ENGINE_PERCENT_TORQUE_DATA_IDLE",
- "value": 27
- },
- {
- "name": "ENGINE_PERCENT_TORQUE_DATA_POINT1",
- "value": 28
- },
- {
- "name": "ENGINE_PERCENT_TORQUE_DATA_POINT2",
- "value": 29
- },
- {
- "name": "ENGINE_PERCENT_TORQUE_DATA_POINT3",
- "value": 30
- },
- {
- "name": "ENGINE_PERCENT_TORQUE_DATA_POINT4",
- "value": 31
+ "name": "ROW_3_RIGHT",
+ "value": 1024
}
]
},
{
- "name": "UserIdentificationAssociationValue",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "EvsServiceRequestIndex",
"values": [
{
- "name": "UNKNOWN",
+ "name": "TYPE",
+ "value": 0
+ },
+ {
+ "name": "STATE",
+ "value": 1
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "LaneDepartureWarningState",
+ "values": [
+ {
+ "name": "OTHER",
+ "value": 0
+ },
+ {
+ "name": "NO_WARNING",
"value": 1
},
{
- "name": "ASSOCIATED_CURRENT_USER",
+ "name": "WARNING_LEFT",
"value": 2
},
{
- "name": "ASSOCIATED_ANOTHER_USER",
+ "name": "WARNING_RIGHT",
"value": 3
- },
- {
- "name": "NOT_ASSOCIATED_ANY_USER",
- "value": 4
}
]
},
{
+ "package": "android.hardware.automotive.vehicle",
+ "name": "Obd2SparkIgnitionMonitors",
+ "values": []
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "CreateUserStatus",
+ "values": [
+ {
+ "name": "SUCCESS",
+ "value": 1
+ },
+ {
+ "name": "FAILURE",
+ "value": 2
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehiclePropertyGroup",
+ "values": [
+ {
+ "name": "SYSTEM",
+ "value": 268435456
+ },
+ {
+ "name": "VENDOR",
+ "value": 536870912
+ },
+ {
+ "name": "MASK",
+ "value": 4026531840
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleVendorPermission",
+ "values": [
+ {
+ "name": "PERMISSION_DEFAULT",
+ "value": 0
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_WINDOW",
+ "value": 1
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_WINDOW",
+ "value": 2
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_DOOR",
+ "value": 3
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_DOOR",
+ "value": 4
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_SEAT",
+ "value": 5
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_SEAT",
+ "value": 6
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_MIRROR",
+ "value": 7
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_MIRROR",
+ "value": 8
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_INFO",
+ "value": 9
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_INFO",
+ "value": 10
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_ENGINE",
+ "value": 11
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_ENGINE",
+ "value": 12
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_HVAC",
+ "value": 13
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_HVAC",
+ "value": 14
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_LIGHT",
+ "value": 15
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_LIGHT",
+ "value": 16
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_1",
+ "value": 65536
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_1",
+ "value": 69632
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_2",
+ "value": 131072
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_2",
+ "value": 135168
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_3",
+ "value": 196608
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_3",
+ "value": 200704
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_4",
+ "value": 262144
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_4",
+ "value": 266240
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_5",
+ "value": 327680
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_5",
+ "value": 331776
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_6",
+ "value": 393216
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_6",
+ "value": 397312
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_7",
+ "value": 458752
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_7",
+ "value": 462848
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_8",
+ "value": 524288
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_8",
+ "value": 528384
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_9",
+ "value": 589824
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_9",
+ "value": 593920
+ },
+ {
+ "name": "PERMISSION_SET_VENDOR_CATEGORY_10",
+ "value": 655360
+ },
+ {
+ "name": "PERMISSION_GET_VENDOR_CATEGORY_10",
+ "value": 659456
+ },
+ {
+ "name": "PERMISSION_NOT_ACCESSIBLE",
+ "value": 4026531840
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VmsOfferingMessageIntegerValuesIndex",
+ "values": [
+ {
+ "name": "MESSAGE_TYPE",
+ "value": 0
+ },
+ {
+ "name": "PUBLISHER_ID",
+ "value": 1
+ },
+ {
+ "name": "NUMBER_OF_OFFERS",
+ "value": 2
+ },
+ {
+ "name": "OFFERING_START",
+ "value": 3
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
"name": "VmsBaseMessageIntegerValuesIndex",
"values": [
{
@@ -2541,6 +1173,473 @@
]
},
{
+ "package": "android.hardware.automotive.vehicle",
+ "name": "Obd2CompressionIgnitionMonitors",
+ "values": []
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "LaneKeepAssistState",
+ "values": [
+ {
+ "name": "OTHER",
+ "value": 0
+ },
+ {
+ "name": "ENABLED",
+ "value": 1
+ },
+ {
+ "name": "ACTIVATED_STEER_LEFT",
+ "value": 2
+ },
+ {
+ "name": "ACTIVATED_STEER_RIGHT",
+ "value": 3
+ },
+ {
+ "name": "USER_OVERRIDE",
+ "value": 4
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleHwMotionInputAction",
+ "values": [
+ {
+ "name": "ACTION_DOWN",
+ "value": 0
+ },
+ {
+ "name": "ACTION_UP",
+ "value": 1
+ },
+ {
+ "name": "ACTION_MOVE",
+ "value": 2
+ },
+ {
+ "name": "ACTION_CANCEL",
+ "value": 3
+ },
+ {
+ "name": "ACTION_OUTSIDE",
+ "value": 4
+ },
+ {
+ "name": "ACTION_POINTER_DOWN",
+ "value": 5
+ },
+ {
+ "name": "ACTION_POINTER_UP",
+ "value": 6
+ },
+ {
+ "name": "ACTION_HOVER_MOVE",
+ "value": 7
+ },
+ {
+ "name": "ACTION_SCROLL",
+ "value": 8
+ },
+ {
+ "name": "ACTION_HOVER_ENTER",
+ "value": 9
+ },
+ {
+ "name": "ACTION_HOVER_EXIT",
+ "value": 10
+ },
+ {
+ "name": "ACTION_BUTTON_PRESS",
+ "value": 11
+ },
+ {
+ "name": "ACTION_BUTTON_RELEASE",
+ "value": 12
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleApPowerStateConfigFlag",
+ "values": [
+ {
+ "name": "ENABLE_DEEP_SLEEP_FLAG",
+ "value": 1
+ },
+ {
+ "name": "CONFIG_SUPPORT_TIMER_POWER_ON_FLAG",
+ "value": 2
+ },
+ {
+ "name": "ENABLE_HIBERNATION_FLAG",
+ "value": 4
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "Obd2SecondaryAirStatus",
+ "values": [
+ {
+ "name": "UPSTREAM",
+ "value": 1
+ },
+ {
+ "name": "DOWNSTREAM_OF_CATALYCIC_CONVERTER",
+ "value": 2
+ },
+ {
+ "name": "FROM_OUTSIDE_OR_OFF",
+ "value": 4
+ },
+ {
+ "name": "PUMP_ON_FOR_DIAGNOSTICS",
+ "value": 8
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VmsPublisherInformationIntegerValuesIndex",
+ "values": [
+ {
+ "name": "MESSAGE_TYPE",
+ "value": 0
+ },
+ {
+ "name": "PUBLISHER_ID",
+ "value": 1
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleApPowerStateReq",
+ "values": [
+ {
+ "name": "ON",
+ "value": 0
+ },
+ {
+ "name": "SHUTDOWN_PREPARE",
+ "value": 1
+ },
+ {
+ "name": "CANCEL_SHUTDOWN",
+ "value": 2
+ },
+ {
+ "name": "FINISHED",
+ "value": 3
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "WindshieldWipersState",
+ "values": [
+ {
+ "name": "OTHER",
+ "value": 0
+ },
+ {
+ "name": "OFF",
+ "value": 1
+ },
+ {
+ "name": "ON",
+ "value": 2
+ },
+ {
+ "name": "SERVICE",
+ "value": 3
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "LaneCenteringAssistState",
+ "values": [
+ {
+ "name": "OTHER",
+ "value": 0
+ },
+ {
+ "name": "ENABLED",
+ "value": 1
+ },
+ {
+ "name": "ACTIVATION_REQUESTED",
+ "value": 2
+ },
+ {
+ "name": "ACTIVATED",
+ "value": 3
+ },
+ {
+ "name": "USER_OVERRIDE",
+ "value": 4
+ },
+ {
+ "name": "FORCED_DEACTIVATION_WARNING",
+ "value": 5
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "UserIdentificationAssociationSetValue",
+ "values": [
+ {
+ "name": "INVALID",
+ "value": 0
+ },
+ {
+ "name": "ASSOCIATE_CURRENT_USER",
+ "value": 1
+ },
+ {
+ "name": "DISASSOCIATE_CURRENT_USER",
+ "value": 2
+ },
+ {
+ "name": "DISASSOCIATE_ALL_USERS",
+ "value": 3
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "Obd2CommonIgnitionMonitors",
+ "values": []
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleHwMotionInputSource",
+ "values": [
+ {
+ "name": "SOURCE_UNKNOWN",
+ "value": 0
+ },
+ {
+ "name": "SOURCE_KEYBOARD",
+ "value": 1
+ },
+ {
+ "name": "SOURCE_DPAD",
+ "value": 2
+ },
+ {
+ "name": "SOURCE_GAMEPAD",
+ "value": 3
+ },
+ {
+ "name": "SOURCE_TOUCHSCREEN",
+ "value": 4
+ },
+ {
+ "name": "SOURCE_MOUSE",
+ "value": 5
+ },
+ {
+ "name": "SOURCE_STYLUS",
+ "value": 6
+ },
+ {
+ "name": "SOURCE_BLUETOOTH_STYLUS",
+ "value": 7
+ },
+ {
+ "name": "SOURCE_TRACKBALL",
+ "value": 8
+ },
+ {
+ "name": "SOURCE_MOUSE_RELATIVE",
+ "value": 9
+ },
+ {
+ "name": "SOURCE_TOUCHPAD",
+ "value": 10
+ },
+ {
+ "name": "SOURCE_TOUCH_NAVIGATION",
+ "value": 11
+ },
+ {
+ "name": "SOURCE_ROTARY_ENCODER",
+ "value": 12
+ },
+ {
+ "name": "SOURCE_JOYSTICK",
+ "value": 13
+ },
+ {
+ "name": "SOURCE_HDMI",
+ "value": 14
+ },
+ {
+ "name": "SOURCE_SENSOR",
+ "value": 15
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "ForwardCollisionWarningState",
+ "values": [
+ {
+ "name": "OTHER",
+ "value": 0
+ },
+ {
+ "name": "NO_WARNING",
+ "value": 1
+ },
+ {
+ "name": "WARNING",
+ "value": 2
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleArea",
+ "values": [
+ {
+ "name": "GLOBAL",
+ "value": 16777216
+ },
+ {
+ "name": "WINDOW",
+ "value": 50331648
+ },
+ {
+ "name": "MIRROR",
+ "value": 67108864
+ },
+ {
+ "name": "SEAT",
+ "value": 83886080
+ },
+ {
+ "name": "DOOR",
+ "value": 100663296
+ },
+ {
+ "name": "WHEEL",
+ "value": 117440512
+ },
+ {
+ "name": "MASK",
+ "value": 251658240
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "PortLocationType",
+ "values": [
+ {
+ "name": "UNKNOWN",
+ "value": 0
+ },
+ {
+ "name": "FRONT_LEFT",
+ "value": 1
+ },
+ {
+ "name": "FRONT_RIGHT",
+ "value": 2
+ },
+ {
+ "name": "REAR_RIGHT",
+ "value": 3
+ },
+ {
+ "name": "REAR_LEFT",
+ "value": 4
+ },
+ {
+ "name": "FRONT",
+ "value": 5
+ },
+ {
+ "name": "REAR",
+ "value": 6
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "InitialUserInfoResponseAction",
+ "values": [
+ {
+ "name": "DEFAULT",
+ "value": 0
+ },
+ {
+ "name": "SWITCH",
+ "value": 1
+ },
+ {
+ "name": "CREATE",
+ "value": 2
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VmsSubscriptionsStateIntegerValuesIndex",
+ "values": [
+ {
+ "name": "MESSAGE_TYPE",
+ "value": 0
+ },
+ {
+ "name": "SEQUENCE_NUMBER",
+ "value": 1
+ },
+ {
+ "name": "NUMBER_OF_LAYERS",
+ "value": 2
+ },
+ {
+ "name": "NUMBER_OF_ASSOCIATED_LAYERS",
+ "value": 3
+ },
+ {
+ "name": "SUBSCRIPTIONS_START",
+ "value": 4
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "CruiseControlType",
+ "values": [
+ {
+ "name": "OTHER",
+ "value": 0
+ },
+ {
+ "name": "STANDARD",
+ "value": 1
+ },
+ {
+ "name": "ADAPTIVE",
+ "value": 2
+ },
+ {
+ "name": "PREDICTIVE",
+ "value": 3
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
"name": "DiagnosticFloatSensorIndex",
"values": [
{
@@ -2830,7 +1929,40 @@
]
},
{
- "name": "VmsMessageWithLayerAndPublisherIdIntegerValuesIndex",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "GsrComplianceRequirementType",
+ "values": [
+ {
+ "name": "GSR_COMPLIANCE_NOT_REQUIRED",
+ "value": 0
+ },
+ {
+ "name": "GSR_COMPLIANCE_REQUIRED_V1",
+ "value": 1
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleLightState",
+ "values": [
+ {
+ "name": "OFF",
+ "value": 0
+ },
+ {
+ "name": "ON",
+ "value": 1
+ },
+ {
+ "name": "DAYTIME_RUNNING",
+ "value": 2
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VmsMessageWithLayerIntegerValuesIndex",
"values": [
{
"name": "MESSAGE_TYPE",
@@ -2847,92 +1979,61 @@
{
"name": "LAYER_VERSION",
"value": 3
- },
- {
- "name": "PUBLISHER_ID",
- "value": 4
}
]
},
{
- "name": "FuelType",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "EvRegenerativeBrakingState",
"values": [
{
- "name": "FUEL_TYPE_UNKNOWN",
+ "name": "UNKNOWN",
"value": 0
},
{
- "name": "FUEL_TYPE_UNLEADED",
+ "name": "DISABLED",
"value": 1
},
{
- "name": "FUEL_TYPE_LEADED",
+ "name": "PARTIALLY_ENABLED",
"value": 2
},
{
- "name": "FUEL_TYPE_DIESEL_1",
- "value": 3
- },
- {
- "name": "FUEL_TYPE_DIESEL_2",
- "value": 4
- },
- {
- "name": "FUEL_TYPE_BIODIESEL",
- "value": 5
- },
- {
- "name": "FUEL_TYPE_E85",
- "value": 6
- },
- {
- "name": "FUEL_TYPE_LPG",
- "value": 7
- },
- {
- "name": "FUEL_TYPE_CNG",
- "value": 8
- },
- {
- "name": "FUEL_TYPE_LNG",
- "value": 9
- },
- {
- "name": "FUEL_TYPE_ELECTRIC",
- "value": 10
- },
- {
- "name": "FUEL_TYPE_HYDROGEN",
- "value": 11
- },
- {
- "name": "FUEL_TYPE_OTHER",
- "value": 12
- }
- ]
- },
- {
- "name": "VehicleApPowerStateReq",
- "values": [
- {
- "name": "ON",
- "value": 0
- },
- {
- "name": "SHUTDOWN_PREPARE",
- "value": 1
- },
- {
- "name": "CANCEL_SHUTDOWN",
- "value": 2
- },
- {
- "name": "FINISHED",
+ "name": "FULLY_ENABLED",
"value": 3
}
]
},
{
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleApPowerStateReqIndex",
+ "values": [
+ {
+ "name": "STATE",
+ "value": 0
+ },
+ {
+ "name": "ADDITIONAL",
+ "value": 1
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "RotaryInputType",
+ "values": [
+ {
+ "name": "ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION",
+ "value": 0
+ },
+ {
+ "name": "ROTARY_INPUT_TYPE_AUDIO_VOLUME",
+ "value": 1
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
"name": "VmsMessageType",
"values": [
{
@@ -3006,96 +2107,417 @@
]
},
{
- "name": "Obd2CommonIgnitionMonitors",
- "values": []
- },
- {
- "name": "UserIdentificationAssociationType",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "FuelType",
"values": [
{
- "name": "INVALID",
+ "name": "FUEL_TYPE_UNKNOWN",
"value": 0
},
{
- "name": "KEY_FOB",
+ "name": "FUEL_TYPE_UNLEADED",
"value": 1
},
{
- "name": "CUSTOM_1",
- "value": 101
+ "name": "FUEL_TYPE_LEADED",
+ "value": 2
},
{
- "name": "CUSTOM_2",
- "value": 102
+ "name": "FUEL_TYPE_DIESEL_1",
+ "value": 3
},
{
- "name": "CUSTOM_3",
- "value": 103
+ "name": "FUEL_TYPE_DIESEL_2",
+ "value": 4
},
{
- "name": "CUSTOM_4",
- "value": 104
+ "name": "FUEL_TYPE_BIODIESEL",
+ "value": 5
+ },
+ {
+ "name": "FUEL_TYPE_E85",
+ "value": 6
+ },
+ {
+ "name": "FUEL_TYPE_LPG",
+ "value": 7
+ },
+ {
+ "name": "FUEL_TYPE_CNG",
+ "value": 8
+ },
+ {
+ "name": "FUEL_TYPE_LNG",
+ "value": 9
+ },
+ {
+ "name": "FUEL_TYPE_ELECTRIC",
+ "value": 10
+ },
+ {
+ "name": "FUEL_TYPE_HYDROGEN",
+ "value": 11
+ },
+ {
+ "name": "FUEL_TYPE_OTHER",
+ "value": 12
}
]
},
{
- "name": "EvConnectorType",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleSeatOccupancyState",
"values": [
{
"name": "UNKNOWN",
"value": 0
},
{
- "name": "IEC_TYPE_1_AC",
+ "name": "VACANT",
"value": 1
},
{
- "name": "IEC_TYPE_2_AC",
+ "name": "OCCUPIED",
"value": 2
- },
- {
- "name": "IEC_TYPE_3_AC",
- "value": 3
- },
- {
- "name": "IEC_TYPE_4_DC",
- "value": 4
- },
- {
- "name": "IEC_TYPE_1_CCS_DC",
- "value": 5
- },
- {
- "name": "IEC_TYPE_2_CCS_DC",
- "value": 6
- },
- {
- "name": "TESLA_ROADSTER",
- "value": 7
- },
- {
- "name": "TESLA_HPWC",
- "value": 8
- },
- {
- "name": "TESLA_SUPERCHARGER",
- "value": 9
- },
- {
- "name": "GBT_AC",
- "value": 10
- },
- {
- "name": "GBT_DC",
- "value": 11
- },
- {
- "name": "OTHER",
- "value": 101
}
]
},
{
+ "package": "android.hardware.automotive.vehicle",
+ "name": "EvStoppingMode",
+ "values": [
+ {
+ "name": "OTHER",
+ "value": 0
+ },
+ {
+ "name": "CREEP",
+ "value": 1
+ },
+ {
+ "name": "ROLL",
+ "value": 2
+ },
+ {
+ "name": "HOLD",
+ "value": 3
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "AutomaticEmergencyBrakingState",
+ "values": [
+ {
+ "name": "OTHER",
+ "value": 0
+ },
+ {
+ "name": "ENABLED",
+ "value": 1
+ },
+ {
+ "name": "ACTIVATED",
+ "value": 2
+ },
+ {
+ "name": "USER_OVERRIDE",
+ "value": 3
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleApPowerStateReport",
+ "values": [
+ {
+ "name": "WAIT_FOR_VHAL",
+ "value": 1
+ },
+ {
+ "name": "DEEP_SLEEP_ENTRY",
+ "value": 2
+ },
+ {
+ "name": "DEEP_SLEEP_EXIT",
+ "value": 3
+ },
+ {
+ "name": "SHUTDOWN_POSTPONE",
+ "value": 4
+ },
+ {
+ "name": "SHUTDOWN_START",
+ "value": 5
+ },
+ {
+ "name": "ON",
+ "value": 6
+ },
+ {
+ "name": "SHUTDOWN_PREPARE",
+ "value": 7
+ },
+ {
+ "name": "SHUTDOWN_CANCELLED",
+ "value": 8
+ },
+ {
+ "name": "HIBERNATION_ENTRY",
+ "value": 9
+ },
+ {
+ "name": "HIBERNATION_EXIT",
+ "value": 10
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "SwitchUserMessageType",
+ "values": [
+ {
+ "name": "UNKNOWN",
+ "value": 0
+ },
+ {
+ "name": "LEGACY_ANDROID_SWITCH",
+ "value": 1
+ },
+ {
+ "name": "ANDROID_SWITCH",
+ "value": 2
+ },
+ {
+ "name": "VEHICLE_RESPONSE",
+ "value": 3
+ },
+ {
+ "name": "VEHICLE_REQUEST",
+ "value": 4
+ },
+ {
+ "name": "ANDROID_POST_SWITCH",
+ "value": 5
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleAreaMirror",
+ "values": [
+ {
+ "name": "DRIVER_LEFT",
+ "value": 1
+ },
+ {
+ "name": "DRIVER_RIGHT",
+ "value": 2
+ },
+ {
+ "name": "DRIVER_CENTER",
+ "value": 4
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "TrailerState",
+ "values": [
+ {
+ "name": "UNKNOWN",
+ "value": 0
+ },
+ {
+ "name": "NOT_PRESENT",
+ "value": 1
+ },
+ {
+ "name": "PRESENT",
+ "value": 2
+ },
+ {
+ "name": "ERROR",
+ "value": 3
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "EvsServiceState",
+ "values": [
+ {
+ "name": "OFF",
+ "value": 0
+ },
+ {
+ "name": "ON",
+ "value": 1
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleHwKeyInputAction",
+ "values": [
+ {
+ "name": "ACTION_DOWN",
+ "value": 0
+ },
+ {
+ "name": "ACTION_UP",
+ "value": 1
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "BlindSpotWarningState",
+ "values": [
+ {
+ "name": "OTHER",
+ "value": 0
+ },
+ {
+ "name": "NO_WARNING",
+ "value": 1
+ },
+ {
+ "name": "WARNING",
+ "value": 2
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleGear",
+ "values": [
+ {
+ "name": "GEAR_UNKNOWN",
+ "value": 0
+ },
+ {
+ "name": "GEAR_NEUTRAL",
+ "value": 1
+ },
+ {
+ "name": "GEAR_REVERSE",
+ "value": 2
+ },
+ {
+ "name": "GEAR_PARK",
+ "value": 4
+ },
+ {
+ "name": "GEAR_DRIVE",
+ "value": 8
+ },
+ {
+ "name": "GEAR_1",
+ "value": 16
+ },
+ {
+ "name": "GEAR_2",
+ "value": 32
+ },
+ {
+ "name": "GEAR_3",
+ "value": 64
+ },
+ {
+ "name": "GEAR_4",
+ "value": 128
+ },
+ {
+ "name": "GEAR_5",
+ "value": 256
+ },
+ {
+ "name": "GEAR_6",
+ "value": 512
+ },
+ {
+ "name": "GEAR_7",
+ "value": 1024
+ },
+ {
+ "name": "GEAR_8",
+ "value": 2048
+ },
+ {
+ "name": "GEAR_9",
+ "value": 4096
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VmsStartSessionMessageIntegerValuesIndex",
+ "values": [
+ {
+ "name": "MESSAGE_TYPE",
+ "value": 0
+ },
+ {
+ "name": "SERVICE_ID",
+ "value": 1
+ },
+ {
+ "name": "CLIENT_ID",
+ "value": 2
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "Obd2FuelSystemStatus",
+ "values": [
+ {
+ "name": "OPEN_INSUFFICIENT_ENGINE_TEMPERATURE",
+ "value": 1
+ },
+ {
+ "name": "CLOSED_LOOP",
+ "value": 2
+ },
+ {
+ "name": "OPEN_ENGINE_LOAD_OR_DECELERATION",
+ "value": 4
+ },
+ {
+ "name": "OPEN_SYSTEM_FAILURE",
+ "value": 8
+ },
+ {
+ "name": "CLOSED_LOOP_BUT_FEEDBACK_FAULT",
+ "value": 16
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "ElectronicTollCollectionCardStatus",
+ "values": [
+ {
+ "name": "UNKNOWN",
+ "value": 0
+ },
+ {
+ "name": "ELECTRONIC_TOLL_COLLECTION_CARD_VALID",
+ "value": 1
+ },
+ {
+ "name": "ELECTRONIC_TOLL_COLLECTION_CARD_INVALID",
+ "value": 2
+ },
+ {
+ "name": "ELECTRONIC_TOLL_COLLECTION_CARD_NOT_INSERTED",
+ "value": 3
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
"name": "VehicleApPowerStateShutdownParam",
"values": [
{
@@ -3125,271 +2547,53 @@
]
},
{
- "name": "VmsOfferingMessageIntegerValuesIndex",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "CustomInputType",
"values": [
{
- "name": "MESSAGE_TYPE",
- "value": 0
+ "name": "CUSTOM_EVENT_F1",
+ "value": 1001
},
{
- "name": "PUBLISHER_ID",
- "value": 1
+ "name": "CUSTOM_EVENT_F2",
+ "value": 1002
},
{
- "name": "NUMBER_OF_OFFERS",
- "value": 2
+ "name": "CUSTOM_EVENT_F3",
+ "value": 1003
},
{
- "name": "OFFERING_START",
- "value": 3
+ "name": "CUSTOM_EVENT_F4",
+ "value": 1004
+ },
+ {
+ "name": "CUSTOM_EVENT_F5",
+ "value": 1005
+ },
+ {
+ "name": "CUSTOM_EVENT_F6",
+ "value": 1006
+ },
+ {
+ "name": "CUSTOM_EVENT_F7",
+ "value": 1007
+ },
+ {
+ "name": "CUSTOM_EVENT_F8",
+ "value": 1008
+ },
+ {
+ "name": "CUSTOM_EVENT_F9",
+ "value": 1009
+ },
+ {
+ "name": "CUSTOM_EVENT_F10",
+ "value": 1010
}
]
},
{
- "name": "VehicleAreaSeat",
- "values": [
- {
- "name": "ROW_1_LEFT",
- "value": 1
- },
- {
- "name": "ROW_1_CENTER",
- "value": 2
- },
- {
- "name": "ROW_1_RIGHT",
- "value": 4
- },
- {
- "name": "ROW_2_LEFT",
- "value": 16
- },
- {
- "name": "ROW_2_CENTER",
- "value": 32
- },
- {
- "name": "ROW_2_RIGHT",
- "value": 64
- },
- {
- "name": "ROW_3_LEFT",
- "value": 256
- },
- {
- "name": "ROW_3_CENTER",
- "value": 512
- },
- {
- "name": "ROW_3_RIGHT",
- "value": 1024
- }
- ]
- },
- {
- "name": "VehicleVendorPermission",
- "values": [
- {
- "name": "PERMISSION_DEFAULT",
- "value": 0
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_WINDOW",
- "value": 1
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_WINDOW",
- "value": 2
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_DOOR",
- "value": 3
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_DOOR",
- "value": 4
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_SEAT",
- "value": 5
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_SEAT",
- "value": 6
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_MIRROR",
- "value": 7
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_MIRROR",
- "value": 8
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_INFO",
- "value": 9
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_INFO",
- "value": 10
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_ENGINE",
- "value": 11
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_ENGINE",
- "value": 12
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_HVAC",
- "value": 13
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_HVAC",
- "value": 14
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_LIGHT",
- "value": 15
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_LIGHT",
- "value": 16
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_1",
- "value": 65536
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_1",
- "value": 69632
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_2",
- "value": 131072
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_2",
- "value": 135168
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_3",
- "value": 196608
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_3",
- "value": 200704
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_4",
- "value": 262144
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_4",
- "value": 266240
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_5",
- "value": 327680
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_5",
- "value": 331776
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_6",
- "value": 393216
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_6",
- "value": 397312
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_7",
- "value": 458752
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_7",
- "value": 462848
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_8",
- "value": 524288
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_8",
- "value": 528384
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_9",
- "value": 589824
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_9",
- "value": 593920
- },
- {
- "name": "PERMISSION_SET_VENDOR_CATEGORY_10",
- "value": 655360
- },
- {
- "name": "PERMISSION_GET_VENDOR_CATEGORY_10",
- "value": 659456
- },
- {
- "name": "PERMISSION_NOT_ACCESSIBLE",
- "value": 4026531840
- }
- ]
- },
- {
- "name": "VehiclePropertyAccess",
- "values": [
- {
- "name": "NONE",
- "value": 0
- },
- {
- "name": "READ",
- "value": 1
- },
- {
- "name": "WRITE",
- "value": 2
- },
- {
- "name": "READ_WRITE",
- "value": 3
- }
- ]
- },
- {
- "name": "VmsAvailabilityStateIntegerValuesIndex",
- "values": [
- {
- "name": "MESSAGE_TYPE",
- "value": 0
- },
- {
- "name": "SEQUENCE_NUMBER",
- "value": 1
- },
- {
- "name": "NUMBER_OF_ASSOCIATED_LAYERS",
- "value": 2
- },
- {
- "name": "LAYERS_START",
- "value": 3
- }
- ]
- },
- {
- "name": "Obd2SparkIgnitionMonitors",
- "values": []
- },
- {
+ "package": "android.hardware.automotive.vehicle",
"name": "VehicleTurnSignal",
"values": [
{
@@ -3407,53 +2611,1992 @@
]
},
{
- "name": "VmsPublisherInformationIntegerValuesIndex",
+ "package": "android.hardware.automotive.vehicle",
+ "name": "ElectronicTollCollectionCardType",
+ "values": [
+ {
+ "name": "UNKNOWN",
+ "value": 0
+ },
+ {
+ "name": "JP_ELECTRONIC_TOLL_COLLECTION_CARD",
+ "value": 1
+ },
+ {
+ "name": "JP_ELECTRONIC_TOLL_COLLECTION_CARD_V2",
+ "value": 2
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleProperty",
+ "values": [
+ {
+ "name": "Undefined property.",
+ "value": 0
+ },
+ {
+ "name": "VIN of vehicle",
+ "value": 286261504,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Manufacturer of vehicle",
+ "value": 286261505,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Model of vehicle",
+ "value": 286261506,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Model year of vehicle.",
+ "value": 289407235,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:YEAR"
+ },
+ {
+ "name": "Fuel capacity of the vehicle in milliliters",
+ "value": 291504388,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:MILLILITER"
+ },
+ {
+ "name": "List of fuels the vehicle may use.",
+ "value": 289472773,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "FuelType"
+ },
+ {
+ "name": "Nominal battery capacity for EV or hybrid vehicle",
+ "value": 291504390,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:WH"
+ },
+ {
+ "name": "List of connectors this EV may use",
+ "value": 289472775,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "data_enum": "EvConnectorType",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Fuel door location",
+ "value": 289407240,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "data_enum": "PortLocationType",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "EV port location",
+ "value": 289407241,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "PortLocationType"
+ },
+ {
+ "name": "INFO_DRIVER_SEAT",
+ "value": 356516106,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "data_enum": "VehicleAreaSeat",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Exterior dimensions of vehicle.",
+ "value": 289472779,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:MILLIMETER"
+ },
+ {
+ "name": "Multiple EV port locations",
+ "value": 289472780,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "PortLocationType"
+ },
+ {
+ "name": "Current odometer value of the vehicle",
+ "value": 291504644,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:KILOMETER"
+ },
+ {
+ "name": "Speed of the vehicle",
+ "value": 291504647,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:METER_PER_SEC"
+ },
+ {
+ "name": "Speed of the vehicle for displays",
+ "value": 291504648,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:METER_PER_SEC"
+ },
+ {
+ "name": "Front bicycle model steering angle for vehicle",
+ "value": 291504649,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:DEGREES"
+ },
+ {
+ "name": "Rear bicycle model steering angle for vehicle",
+ "value": 291504656,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:DEGREES"
+ },
+ {
+ "name": "Temperature of engine coolant",
+ "value": 291504897,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:CELSIUS"
+ },
+ {
+ "name": "Engine oil level",
+ "value": 289407747,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleOilLevel"
+ },
+ {
+ "name": "Temperature of engine oil",
+ "value": 291504900,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:CELSIUS"
+ },
+ {
+ "name": "Engine rpm",
+ "value": 291504901,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:RPM"
+ },
+ {
+ "name": "Reports wheel ticks",
+ "value": 290521862,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "FUEL_LEVEL",
+ "value": 291504903,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:MILLILITER"
+ },
+ {
+ "name": "Fuel door open",
+ "value": 287310600,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Battery level for EV or hybrid vehicle",
+ "value": 291504905,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:WH"
+ },
+ {
+ "name": "Current battery capacity for EV or hybrid vehicle",
+ "value": 291504909,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:WH"
+ },
+ {
+ "name": "EV charge port open",
+ "value": 287310602,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "EV charge port connected",
+ "value": 287310603,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "EV instantaneous charge rate in milliwatts",
+ "value": 291504908,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:MW"
+ },
+ {
+ "name": "Range remaining",
+ "value": 291504904,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "unit": "VehicleUnit:METER"
+ },
+ {
+ "name": "Tire pressure",
+ "value": 392168201,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:KILOPASCAL"
+ },
+ {
+ "name": "Critically low tire pressure",
+ "value": 392168202,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:KILOPASCAL"
+ },
+ {
+ "name": "Represents feature for engine idle automatic stop.",
+ "value": 287310624,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Currently selected gear",
+ "value": 289408000,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleGear"
+ },
+ {
+ "name": "CURRENT_GEAR",
+ "value": 289408001,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleGear"
+ },
+ {
+ "name": "Parking brake state.",
+ "value": 287310850,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "PARKING_BRAKE_AUTO_APPLY",
+ "value": 287310851,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Regenerative braking level of a electronic vehicle",
+ "value": 289408012,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Warning for fuel low level.",
+ "value": 287310853,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Night mode",
+ "value": 287310855,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "State of the vehicles turn signals",
+ "value": 289408008,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleTurnSignal"
+ },
+ {
+ "name": "Represents ignition state",
+ "value": 289408009,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleIgnitionState"
+ },
+ {
+ "name": "ABS is active",
+ "value": 287310858,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Traction Control is active",
+ "value": 287310859,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Represents property for the current stopping mode of the vehicle.",
+ "value": 289408013,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "EvStoppingMode"
+ },
+ {
+ "name": "HVAC Properties",
+ "value": 356517120,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Fan direction setting",
+ "value": 356517121,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleHvacFanDirection"
+ },
+ {
+ "name": "HVAC current temperature.",
+ "value": 358614274,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:CELSIUS"
+ },
+ {
+ "name": "HVAC_TEMPERATURE_SET",
+ "value": 358614275,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "unit": "VehicleUnit:CELSIUS"
+ },
+ {
+ "name": "HVAC_DEFROSTER",
+ "value": 320865540,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "HVAC_AC_ON",
+ "value": 354419973,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "config_flags": "Supported"
+ },
+ {
+ "name": "HVAC_MAX_AC_ON",
+ "value": 354419974,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "HVAC_MAX_DEFROST_ON",
+ "value": 354419975,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "HVAC_RECIRC_ON",
+ "value": 354419976,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Enable temperature coupling between areas.",
+ "value": 354419977,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "HVAC_AUTO_ON",
+ "value": 354419978,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "HVAC_SEAT_TEMPERATURE",
+ "value": 356517131,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Side Mirror Heat",
+ "value": 339739916,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "HVAC_STEERING_WHEEL_HEAT",
+ "value": 289408269,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Temperature units for display",
+ "value": 289408270,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleUnit"
+ },
+ {
+ "name": "Actual fan speed",
+ "value": 356517135,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "HVAC_POWER_ON",
+ "value": 354419984,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Fan Positions Available",
+ "value": 356582673,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleHvacFanDirection"
+ },
+ {
+ "name": "HVAC_AUTO_RECIRC_ON",
+ "value": 354419986,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Seat ventilation",
+ "value": 356517139,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "HVAC_ELECTRIC_DEFROSTER_ON",
+ "value": 320865556,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Suggested values for setting HVAC temperature.",
+ "value": 291570965,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Distance units for display",
+ "value": 289408512,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleUnit"
+ },
+ {
+ "name": "Fuel volume units for display",
+ "value": 289408513,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleUnit"
+ },
+ {
+ "name": "Tire pressure units for display",
+ "value": 289408514,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleUnit"
+ },
+ {
+ "name": "EV battery units for display",
+ "value": 289408515,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleUnit"
+ },
+ {
+ "name": "Fuel consumption units for display",
+ "value": 287311364,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Speed units for display",
+ "value": 289408517,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "ANDROID_EPOCH_TIME",
+ "value": 290457094,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:WRITE",
+ "unit": "VehicleUnit:MILLI_SECS"
+ },
+ {
+ "name": "External encryption binding seed.",
+ "value": 292554247,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Outside temperature",
+ "value": 291505923,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:CELSIUS"
+ },
+ {
+ "name": "Property to control power state of application processor",
+ "value": 289475072,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Property to report power state of application processor",
+ "value": 289475073,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "AP_POWER_BOOTUP_REASON",
+ "value": 289409538,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Property to represent brightness of the display.",
+ "value": 289409539,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Property to represent brightness of the displays which are controlled separately.",
+ "value": 289475076,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "HW_KEY_INPUT",
+ "value": 289475088,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "config_flags": ""
+ },
+ {
+ "name": "HW_KEY_INPUT_V2",
+ "value": 367004177,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "config_flags": ""
+ },
+ {
+ "name": "HW_MOTION_INPUT",
+ "value": 367004178,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "config_flags": ""
+ },
+ {
+ "name": "HW_ROTARY_INPUT",
+ "value": 289475104,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "data_enum": "RotaryInputType",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Defines a custom OEM partner input event.",
+ "value": 289475120,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "data_enum": "CustomInputType",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "DOOR_POS",
+ "value": 373295872,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Door move",
+ "value": 373295873,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Door lock",
+ "value": 371198722,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Door child lock feature enabled",
+ "value": 371198723,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Mirror Z Position",
+ "value": 339741504,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Mirror Z Move",
+ "value": 339741505,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Mirror Y Position",
+ "value": 339741506,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Mirror Y Move",
+ "value": 339741507,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Mirror Lock",
+ "value": 287312708,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Mirror Fold",
+ "value": 287312709,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Represents property for Mirror Auto Fold feature.",
+ "value": 337644358,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Represents property for Mirror Auto Tilt feature.",
+ "value": 337644359,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Seat memory select",
+ "value": 356518784,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:WRITE"
+ },
+ {
+ "name": "Seat memory set",
+ "value": 356518785,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:WRITE"
+ },
+ {
+ "name": "Seatbelt buckled",
+ "value": 354421634,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Seatbelt height position",
+ "value": 356518787,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Seatbelt height move",
+ "value": 356518788,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "SEAT_FORE_AFT_POS",
+ "value": 356518789,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "SEAT_FORE_AFT_MOVE",
+ "value": 356518790,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Seat backrest angle 1 position",
+ "value": 356518791,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Seat backrest angle 1 move",
+ "value": 356518792,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Seat backrest angle 2 position",
+ "value": 356518793,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Seat backrest angle 2 move",
+ "value": 356518794,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Seat height position",
+ "value": 356518795,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Seat height move",
+ "value": 356518796,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Seat depth position",
+ "value": 356518797,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Seat depth move",
+ "value": 356518798,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Seat tilt position",
+ "value": 356518799,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Seat tilt move",
+ "value": 356518800,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "SEAT_LUMBAR_FORE_AFT_POS",
+ "value": 356518801,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "SEAT_LUMBAR_FORE_AFT_MOVE",
+ "value": 356518802,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Lumbar side support position",
+ "value": 356518803,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Lumbar side support move",
+ "value": 356518804,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "SEAT_HEADREST_HEIGHT_POS",
+ "value": 289409941,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Headrest height position",
+ "value": 356518820,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Headrest height move",
+ "value": 356518806,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Headrest angle position",
+ "value": 356518807,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Headrest angle move",
+ "value": 356518808,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "SEAT_HEADREST_FORE_AFT_POS",
+ "value": 356518809,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "SEAT_HEADREST_FORE_AFT_MOVE",
+ "value": 356518810,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Represents property for the seat footwell lights state.",
+ "value": 356518811,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleLightState"
+ },
+ {
+ "name": "Represents property for the seat footwell lights switch.",
+ "value": 356518812,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleLightSwitch"
+ },
+ {
+ "name": "Represents property for Seat easy access feature.",
+ "value": 354421661,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "SEAT_AIRBAG_ENABLED",
+ "value": 354421662,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "SEAT_CUSHION_SIDE_SUPPORT_POS",
+ "value": 356518815,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Represents property for movement direction and speed of seat cushion side support.",
+ "value": 356518816,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "SEAT_LUMBAR_VERTICAL_POS",
+ "value": 356518817,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Represents property for vertical movement direction and speed of seat lumbar support.",
+ "value": 356518818,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "SEAT_WALK_IN_POS",
+ "value": 356518819,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Seat Occupancy",
+ "value": 356518832,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleSeatOccupancyState"
+ },
+ {
+ "name": "Window Position",
+ "value": 322964416,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Window Move",
+ "value": 322964417,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Window Lock",
+ "value": 320867268,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "WINDSHIELD_WIPERS_PERIOD",
+ "value": 322964421,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:MILLI_SECS"
+ },
+ {
+ "name": "Windshield wipers state.",
+ "value": 322964422,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "WindshieldWipersState"
+ },
+ {
+ "name": "Windshield wipers switch.",
+ "value": 322964423,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "WindshieldWipersSwitch"
+ },
+ {
+ "name": "Steering wheel depth position",
+ "value": 289410016,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Steering wheel depth movement",
+ "value": 289410017,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Steering wheel height position",
+ "value": 289410018,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Steering wheel height movement",
+ "value": 289410019,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Steering wheel theft lock feature enabled",
+ "value": 287312868,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Steering wheel locked",
+ "value": 287312869,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Steering wheel easy access feature enabled",
+ "value": 287312870,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Property that represents the current position of the glove box door.",
+ "value": 356518896,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Lock or unlock the glove box.",
+ "value": 354421745,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "VEHICLE_MAP_SERVICE",
+ "value": 299895808,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Characterization of inputs used for computing location.",
+ "value": 289410064,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "OBD2 Live Sensor Data",
+ "value": 299896064,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "OBD2 Freeze Frame Sensor Data",
+ "value": 299896065,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "OBD2 Freeze Frame Information",
+ "value": 299896066,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "OBD2 Freeze Frame Clear",
+ "value": 299896067,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:WRITE"
+ },
+ {
+ "name": "Headlights State",
+ "value": 289410560,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleLightState"
+ },
+ {
+ "name": "High beam lights state",
+ "value": 289410561,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleLightState"
+ },
+ {
+ "name": "Fog light state",
+ "value": 289410562,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleLightState"
+ },
+ {
+ "name": "Hazard light status",
+ "value": 289410563,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleLightState"
+ },
+ {
+ "name": "Headlight switch",
+ "value": 289410576,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleLightSwitch"
+ },
+ {
+ "name": "High beam light switch",
+ "value": 289410577,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleLightSwitch"
+ },
+ {
+ "name": "Fog light switch",
+ "value": 289410578,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleLightSwitch"
+ },
+ {
+ "name": "Hazard light switch",
+ "value": 289410579,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleLightSwitch"
+ },
+ {
+ "name": "Cabin lights",
+ "value": 289410817,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleLightState"
+ },
+ {
+ "name": "Cabin lights switch",
+ "value": 289410818,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleLightSwitch"
+ },
+ {
+ "name": "Reading lights",
+ "value": 356519683,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleLightState"
+ },
+ {
+ "name": "Reading lights switch",
+ "value": 356519684,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleLightSwitch"
+ },
+ {
+ "name": "Steering wheel lights state",
+ "value": 289410828,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleLightState"
+ },
+ {
+ "name": "Steering wheel lights switch",
+ "value": 289410829,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleLightSwitch"
+ },
+ {
+ "name": "Support customize permissions for vendor properties",
+ "value": 287313669,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Allow disabling optional featurs from vhal.",
+ "value": 286265094,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Defines the initial Android user to be used during initialization.",
+ "value": 299896583,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Defines a request to switch the foreground Android user.",
+ "value": 299896584,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Called by the Android System after an Android user was created.",
+ "value": 299896585,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Called by the Android System after an Android user was removed.",
+ "value": 299896586,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:WRITE"
+ },
+ {
+ "name": "USER_IDENTIFICATION_ASSOCIATION",
+ "value": 299896587,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "EVS_SERVICE_REQUEST",
+ "value": 289476368,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Defines a request to apply power policy.",
+ "value": 286265121,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "POWER_POLICY_GROUP_REQ",
+ "value": 286265122,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Notifies the current power policy to VHAL layer.",
+ "value": 286265123,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "WATCHDOG_ALIVE",
+ "value": 290459441,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:WRITE"
+ },
+ {
+ "name": "Defines a process terminated by car watchdog and the reason of termination.",
+ "value": 299896626,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:WRITE"
+ },
+ {
+ "name": "Defines an event that VHAL signals to car watchdog as a heartbeat.",
+ "value": 290459443,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Starts the ClusterUI in cluster display.",
+ "value": 289410868,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Changes the state of the cluster display.",
+ "value": 289476405,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Reports the current display state and ClusterUI state.",
+ "value": 299896630,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:WRITE"
+ },
+ {
+ "name": "Requests to change the cluster display state to show some ClusterUI.",
+ "value": 289410871,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:WRITE"
+ },
+ {
+ "name": "Informs the current navigation state.",
+ "value": 292556600,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:WRITE"
+ },
+ {
+ "name": "Electronic Toll Collection card type.",
+ "value": 289410873,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "ElectronicTollCollectionCardType"
+ },
+ {
+ "name": "Electronic Toll Collection card status.",
+ "value": 289410874,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "ElectronicTollCollectionCardStatus"
+ },
+ {
+ "name": "Front fog lights state",
+ "value": 289410875,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleLightState"
+ },
+ {
+ "name": "Front fog lights switch",
+ "value": 289410876,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleLightSwitch"
+ },
+ {
+ "name": "Rear fog lights state",
+ "value": 289410877,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "VehicleLightState"
+ },
+ {
+ "name": "Rear fog lights switch",
+ "value": 289410878,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "VehicleLightSwitch"
+ },
+ {
+ "name": "Indicates the maximum current draw threshold for charging set by the user",
+ "value": 291508031,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "unit": "VehicleUnit:AMPERE"
+ },
+ {
+ "name": "Indicates the maximum charge percent threshold set by the user",
+ "value": 291508032,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Charging state of the car",
+ "value": 289410881,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "EvChargeState"
+ },
+ {
+ "name": "Start or stop charging the EV battery",
+ "value": 287313730,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Estimated charge time remaining in seconds",
+ "value": 289410883,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:SECS"
+ },
+ {
+ "name": "EV_REGENERATIVE_BRAKING_STATE",
+ "value": 289410884,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "EvRegenerativeBrakingState"
+ },
+ {
+ "name": "Indicates if there is a trailer present or not.",
+ "value": 289410885,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "TrailerState"
+ },
+ {
+ "name": "VEHICLE_CURB_WEIGHT",
+ "value": 289410886,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:KILOGRAM"
+ },
+ {
+ "name": "GENERAL_SAFETY_REGULATION_COMPLIANCE_REQUIREMENT",
+ "value": 289410887,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "GsrComplianceRequirementType"
+ },
+ {
+ "name": "SUPPORTED_PROPERTY_IDS",
+ "value": 289476424,
+ "change_mode": "VehiclePropertyChangeMode:STATIC",
+ "access": "VehiclePropertyAccess:READ"
+ },
+ {
+ "name": "Request the head unit to be shutdown.",
+ "value": 289410889,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:WRITE",
+ "data_enum": "VehicleApPowerStateShutdownParam"
+ },
+ {
+ "name": "Whether the vehicle is currently in use.",
+ "value": 287313738,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "Start of ADAS Properties",
+ "value": 287313920,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "AUTOMATIC_EMERGENCY_BRAKING_STATE",
+ "value": 289411073,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "ErrorState"
+ },
+ {
+ "name": "FORWARD_COLLISION_WARNING_ENABLED",
+ "value": 287313922,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "FORWARD_COLLISION_WARNING_STATE",
+ "value": 289411075,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "ErrorState"
+ },
+ {
+ "name": "BLIND_SPOT_WARNING_ENABLED",
+ "value": 287313924,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "BLIND_SPOT_WARNING_STATE",
+ "value": 339742725,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "ErrorState"
+ },
+ {
+ "name": "LANE_DEPARTURE_WARNING_ENABLED",
+ "value": 287313926,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "LANE_DEPARTURE_WARNING_STATE",
+ "value": 289411079,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "ErrorState"
+ },
+ {
+ "name": "LANE_KEEP_ASSIST_ENABLED",
+ "value": 287313928,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "LANE_KEEP_ASSIST_STATE",
+ "value": 289411081,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "ErrorState"
+ },
+ {
+ "name": "LANE_CENTERING_ASSIST_ENABLED",
+ "value": 287313930,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "LANE_CENTERING_ASSIST_COMMAND",
+ "value": 289411083,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:WRITE",
+ "data_enum": "LaneCenteringAssistCommand"
+ },
+ {
+ "name": "LANE_CENTERING_ASSIST_STATE",
+ "value": 289411084,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "ErrorState"
+ },
+ {
+ "name": "EMERGENCY_LANE_KEEP_ASSIST_ENABLED",
+ "value": 287313933
+ },
+ {
+ "name": "EMERGENCY_LANE_KEEP_ASSIST_STATE",
+ "value": 289411086,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "ErrorState"
+ },
+ {
+ "name": "CRUISE_CONTROL_ENABLED",
+ "value": 287313935,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "CRUISE_CONTROL_TYPE",
+ "value": 289411088,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "data_enum": "ErrorState"
+ },
+ {
+ "name": "CRUISE_CONTROL_STATE",
+ "value": 289411089,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "ErrorState"
+ },
+ {
+ "name": "CRUISE_CONTROL_COMMAND",
+ "value": 289411090,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:WRITE",
+ "data_enum": "CruiseControlCommand"
+ },
+ {
+ "name": "CRUISE_CONTROL_TARGET_SPEED",
+ "value": 291508243,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:METER_PER_SEC"
+ },
+ {
+ "name": "ADAPTIVE_CRUISE_CONTROL_TARGET_TIME_GAP",
+ "value": 289411092,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE",
+ "unit": "VehicleUnit:MILLI_SECS"
+ },
+ {
+ "name": "ADAPTIVE_CRUISE_CONTROL_LEAD_VEHICLE_MEASURED_DISTANCE",
+ "value": 289411093,
+ "change_mode": "VehiclePropertyChangeMode:CONTINUOUS",
+ "access": "VehiclePropertyAccess:READ",
+ "unit": "VehicleUnit:MILLIMETER"
+ },
+ {
+ "name": "HANDS_ON_DETECTION_ENABLED",
+ "value": 287313942,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ_WRITE"
+ },
+ {
+ "name": "HANDS_ON_DETECTION_DRIVER_STATE",
+ "value": 289411095,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "ErrorState"
+ },
+ {
+ "name": "HANDS_ON_DETECTION_WARNING",
+ "value": 289411096,
+ "change_mode": "VehiclePropertyChangeMode:ON_CHANGE",
+ "access": "VehiclePropertyAccess:READ",
+ "data_enum": "ErrorState"
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "DiagnosticIntegerSensorIndex",
+ "values": [
+ {
+ "name": "FUEL_SYSTEM_STATUS",
+ "value": 0
+ },
+ {
+ "name": "MALFUNCTION_INDICATOR_LIGHT_ON",
+ "value": 1
+ },
+ {
+ "name": "IGNITION_MONITORS_SUPPORTED",
+ "value": 2
+ },
+ {
+ "name": "IGNITION_SPECIFIC_MONITORS",
+ "value": 3
+ },
+ {
+ "name": "INTAKE_AIR_TEMPERATURE",
+ "value": 4
+ },
+ {
+ "name": "COMMANDED_SECONDARY_AIR_STATUS",
+ "value": 5
+ },
+ {
+ "name": "NUM_OXYGEN_SENSORS_PRESENT",
+ "value": 6
+ },
+ {
+ "name": "RUNTIME_SINCE_ENGINE_START",
+ "value": 7
+ },
+ {
+ "name": "DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON",
+ "value": 8
+ },
+ {
+ "name": "WARMUPS_SINCE_CODES_CLEARED",
+ "value": 9
+ },
+ {
+ "name": "DISTANCE_TRAVELED_SINCE_CODES_CLEARED",
+ "value": 10
+ },
+ {
+ "name": "ABSOLUTE_BAROMETRIC_PRESSURE",
+ "value": 11
+ },
+ {
+ "name": "CONTROL_MODULE_VOLTAGE",
+ "value": 12
+ },
+ {
+ "name": "AMBIENT_AIR_TEMPERATURE",
+ "value": 13
+ },
+ {
+ "name": "TIME_WITH_MALFUNCTION_LIGHT_ON",
+ "value": 14
+ },
+ {
+ "name": "TIME_SINCE_TROUBLE_CODES_CLEARED",
+ "value": 15
+ },
+ {
+ "name": "MAX_FUEL_AIR_EQUIVALENCE_RATIO",
+ "value": 16
+ },
+ {
+ "name": "MAX_OXYGEN_SENSOR_VOLTAGE",
+ "value": 17
+ },
+ {
+ "name": "MAX_OXYGEN_SENSOR_CURRENT",
+ "value": 18
+ },
+ {
+ "name": "MAX_INTAKE_MANIFOLD_ABSOLUTE_PRESSURE",
+ "value": 19
+ },
+ {
+ "name": "MAX_AIR_FLOW_RATE_FROM_MASS_AIR_FLOW_SENSOR",
+ "value": 20
+ },
+ {
+ "name": "FUEL_TYPE",
+ "value": 21
+ },
+ {
+ "name": "FUEL_RAIL_ABSOLUTE_PRESSURE",
+ "value": 22
+ },
+ {
+ "name": "ENGINE_OIL_TEMPERATURE",
+ "value": 23
+ },
+ {
+ "name": "DRIVER_DEMAND_PERCENT_TORQUE",
+ "value": 24
+ },
+ {
+ "name": "ENGINE_ACTUAL_PERCENT_TORQUE",
+ "value": 25
+ },
+ {
+ "name": "ENGINE_REFERENCE_PERCENT_TORQUE",
+ "value": 26
+ },
+ {
+ "name": "ENGINE_PERCENT_TORQUE_DATA_IDLE",
+ "value": 27
+ },
+ {
+ "name": "ENGINE_PERCENT_TORQUE_DATA_POINT1",
+ "value": 28
+ },
+ {
+ "name": "ENGINE_PERCENT_TORQUE_DATA_POINT2",
+ "value": 29
+ },
+ {
+ "name": "ENGINE_PERCENT_TORQUE_DATA_POINT3",
+ "value": 30
+ },
+ {
+ "name": "ENGINE_PERCENT_TORQUE_DATA_POINT4",
+ "value": 31
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VehicleUnit",
+ "values": [
+ {
+ "name": "SHOULD_NOT_USE",
+ "value": 0
+ },
+ {
+ "name": "METER_PER_SEC",
+ "value": 1
+ },
+ {
+ "name": "RPM",
+ "value": 2
+ },
+ {
+ "name": "HERTZ",
+ "value": 3
+ },
+ {
+ "name": "PERCENTILE",
+ "value": 16
+ },
+ {
+ "name": "MILLIMETER",
+ "value": 32
+ },
+ {
+ "name": "METER",
+ "value": 33
+ },
+ {
+ "name": "KILOMETER",
+ "value": 35
+ },
+ {
+ "name": "MILE",
+ "value": 36
+ },
+ {
+ "name": "CELSIUS",
+ "value": 48
+ },
+ {
+ "name": "FAHRENHEIT",
+ "value": 49
+ },
+ {
+ "name": "KELVIN",
+ "value": 50
+ },
+ {
+ "name": "MILLILITER",
+ "value": 64
+ },
+ {
+ "name": "LITER",
+ "value": 65
+ },
+ {
+ "name": "GALLON",
+ "value": 66
+ },
+ {
+ "name": "US_GALLON",
+ "value": 66
+ },
+ {
+ "name": "IMPERIAL_GALLON",
+ "value": 67
+ },
+ {
+ "name": "NANO_SECS",
+ "value": 80
+ },
+ {
+ "name": "MILLI_SECS",
+ "value": 81
+ },
+ {
+ "name": "SECS",
+ "value": 83
+ },
+ {
+ "name": "YEAR",
+ "value": 89
+ },
+ {
+ "name": "WATT_HOUR",
+ "value": 96
+ },
+ {
+ "name": "MILLIAMPERE",
+ "value": 97
+ },
+ {
+ "name": "MILLIVOLT",
+ "value": 98
+ },
+ {
+ "name": "MILLIWATTS",
+ "value": 99
+ },
+ {
+ "name": "AMPERE_HOURS",
+ "value": 100
+ },
+ {
+ "name": "KILOWATT_HOUR",
+ "value": 101
+ },
+ {
+ "name": "AMPERE",
+ "value": 102
+ },
+ {
+ "name": "KILOPASCAL",
+ "value": 112
+ },
+ {
+ "name": "PSI",
+ "value": 113
+ },
+ {
+ "name": "BAR",
+ "value": 114
+ },
+ {
+ "name": "DEGREES",
+ "value": 128
+ },
+ {
+ "name": "MILES_PER_HOUR",
+ "value": 144
+ },
+ {
+ "name": "KILOMETERS_PER_HOUR",
+ "value": 145
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "LaneCenteringAssistCommand",
+ "values": [
+ {
+ "name": "ACTIVATE",
+ "value": 1
+ },
+ {
+ "name": "DEACTIVATE",
+ "value": 2
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "Obd2FuelType",
+ "values": [
+ {
+ "name": "NOT_AVAILABLE",
+ "value": 0
+ },
+ {
+ "name": "GASOLINE",
+ "value": 1
+ },
+ {
+ "name": "METHANOL",
+ "value": 2
+ },
+ {
+ "name": "ETHANOL",
+ "value": 3
+ },
+ {
+ "name": "DIESEL",
+ "value": 4
+ },
+ {
+ "name": "LPG",
+ "value": 5
+ },
+ {
+ "name": "CNG",
+ "value": 6
+ },
+ {
+ "name": "PROPANE",
+ "value": 7
+ },
+ {
+ "name": "ELECTRIC",
+ "value": 8
+ },
+ {
+ "name": "BIFUEL_RUNNING_GASOLINE",
+ "value": 9
+ },
+ {
+ "name": "BIFUEL_RUNNING_METHANOL",
+ "value": 10
+ },
+ {
+ "name": "BIFUEL_RUNNING_ETHANOL",
+ "value": 11
+ },
+ {
+ "name": "BIFUEL_RUNNING_LPG",
+ "value": 12
+ },
+ {
+ "name": "BIFUEL_RUNNING_CNG",
+ "value": 13
+ },
+ {
+ "name": "BIFUEL_RUNNING_PROPANE",
+ "value": 14
+ },
+ {
+ "name": "BIFUEL_RUNNING_ELECTRIC",
+ "value": 15
+ },
+ {
+ "name": "BIFUEL_RUNNING_ELECTRIC_AND_COMBUSTION",
+ "value": 16
+ },
+ {
+ "name": "HYBRID_GASOLINE",
+ "value": 17
+ },
+ {
+ "name": "HYBRID_ETHANOL",
+ "value": 18
+ },
+ {
+ "name": "HYBRID_DIESEL",
+ "value": 19
+ },
+ {
+ "name": "HYBRID_ELECTRIC",
+ "value": 20
+ },
+ {
+ "name": "HYBRID_RUNNING_ELECTRIC_AND_COMBUSTION",
+ "value": 21
+ },
+ {
+ "name": "HYBRID_REGENERATIVE",
+ "value": 22
+ },
+ {
+ "name": "BIFUEL_RUNNING_DIESEL",
+ "value": 23
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "ProcessTerminationReason",
+ "values": [
+ {
+ "name": "NOT_RESPONDING",
+ "value": 1
+ },
+ {
+ "name": "IO_OVERUSE",
+ "value": 2
+ },
+ {
+ "name": "MEMORY_OVERUSE",
+ "value": 3
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "VmsMessageWithLayerAndPublisherIdIntegerValuesIndex",
"values": [
{
"name": "MESSAGE_TYPE",
"value": 0
},
{
- "name": "PUBLISHER_ID",
- "value": 1
- }
- ]
- },
- {
- "name": "RotaryInputType",
- "values": [
- {
- "name": "ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION",
- "value": 0
- },
- {
- "name": "ROTARY_INPUT_TYPE_AUDIO_VOLUME",
- "value": 1
- }
- ]
- },
- {
- "name": "Obd2FuelSystemStatus",
- "values": [
- {
- "name": "OPEN_INSUFFICIENT_ENGINE_TEMPERATURE",
+ "name": "LAYER_TYPE",
"value": 1
},
{
- "name": "CLOSED_LOOP",
+ "name": "LAYER_SUBTYPE",
"value": 2
},
{
- "name": "OPEN_ENGINE_LOAD_OR_DECELERATION",
+ "name": "LAYER_VERSION",
+ "value": 3
+ },
+ {
+ "name": "PUBLISHER_ID",
"value": 4
+ }
+ ]
+ },
+ {
+ "package": "android.hardware.automotive.vehicle",
+ "name": "EvChargeState",
+ "values": [
+ {
+ "name": "UNKNOWN",
+ "value": 0
},
{
- "name": "OPEN_SYSTEM_FAILURE",
- "value": 8
+ "name": "CHARGING",
+ "value": 1
},
{
- "name": "CLOSED_LOOP_BUT_FEEDBACK_FAULT",
- "value": 16
+ "name": "FULLY_CHARGED",
+ "value": 2
+ },
+ {
+ "name": "NOT_CHARGING",
+ "value": 3
+ },
+ {
+ "name": "ERROR",
+ "value": 4
}
]
}
diff --git a/automotive/vehicle/aidl/emu_metadata/generate_emulator_metadata.py b/automotive/vehicle/aidl/emu_metadata/generate_emulator_metadata.py
index b2eb172..5706571 100755
--- a/automotive/vehicle/aidl/emu_metadata/generate_emulator_metadata.py
+++ b/automotive/vehicle/aidl/emu_metadata/generate_emulator_metadata.py
@@ -19,23 +19,56 @@
from pathlib import Path
+RE_PACKAGE = re.compile(r"\npackage\s([\.a-z0-9]*);")
+RE_IMPORT = re.compile(r"\nimport\s([\.a-zA-Z0-9]*);")
RE_ENUM = re.compile(r"\s*enum\s+(\w*) {\n(.*)}", re.MULTILINE | re.DOTALL)
-RE_COMMENT = re.compile(r"(?:(?:\/\*\*)((?:.|\n)*?)(?:\*\/))?(?:\n|^)\s*(\w*)(?:\s+=\s*)?((?:[a-zA-Z0-9]|\s|\+|)*),", re.DOTALL)
+RE_COMMENT = re.compile(r"(?:(?:\/\*\*)((?:.|\n)*?)(?:\*\/))?(?:\n|^)\s*(\w*)(?:\s+=\s*)?((?:[\.\-a-zA-Z0-9]|\s|\+|)*),",
+ re.DOTALL)
RE_BLOCK_COMMENT_TITLE = re.compile("^(?:\s|\*)*((?:\w|\s|\.)*)\n(?:\s|\*)*(?:\n|$)")
-RE_BLOCK_COMMENT_ANNOTATION = re.compile("^(?:\s|\*)*@(\w*)\s+((?:\w|:)*)", re.MULTILINE)
-RE_HEX_NUMBER = re.compile("([0-9A-Fa-fxX]+)")
+RE_BLOCK_COMMENT_ANNOTATION = re.compile("^(?:\s|\*)*@(\w*)\s+((?:[\w:\.])*)", re.MULTILINE)
+RE_HEX_NUMBER = re.compile("([\.\-0-9A-Za-z]+)")
class JEnum:
- def __init__(self, name):
+ def __init__(self, package, name):
+ self.package = package
self.name = name
self.values = []
+class Enum:
+ def __init__(self, package, name, text, imports):
+ self.text = text
+ self.parsed = False
+ self.imports = imports
+ self.jenum = JEnum(package, name)
-class Converter:
- # Only addition is supported for now, but that covers all existing properties except
- # OBD diagnostics, which use bitwise shifts
- def calculateValue(self, expression, default_value):
+ def parse(self, enums):
+ if self.parsed:
+ return
+ for dep in self.imports:
+ enums[dep].parse(enums)
+ print("Parsing " + self.jenum.name)
+ matches = RE_COMMENT.findall(self.text)
+ defaultValue = 0
+ for match in matches:
+ value = dict()
+ value['name'] = match[1]
+ value['value'] = self.calculateValue(match[2], defaultValue, enums)
+ defaultValue = value['value'] + 1
+ if self.jenum.name == "VehicleProperty":
+ block_comment = match[0]
+ self.parseBlockComment(value, block_comment)
+ self.jenum.values.append(value)
+ self.parsed = True
+ self.text = None
+
+ def get_value(self, value_name):
+ for value in self.jenum.values:
+ if value['name'] == value_name:
+ return value['value']
+ raise Exception("Cannot decode value: " + self.jenum.package + " : " + value_name)
+
+ def calculateValue(self, expression, default_value, enums):
numbers = RE_HEX_NUMBER.findall(expression)
if len(numbers) == 0:
return default_value
@@ -44,7 +77,13 @@
if numbers[0].lower().startswith("0x"):
base = 16
for number in numbers:
- result += int(number, base)
+ if '.' in number:
+ package, val_name = number.split('.')
+ for dep in self.imports:
+ if package in dep:
+ result += enums[dep].get_value(val_name)
+ else:
+ result += int(number, base)
return result
def parseBlockComment(self, value, blockComment):
@@ -54,30 +93,22 @@
break
annots_res = RE_BLOCK_COMMENT_ANNOTATION.findall(blockComment)
for annot in annots_res:
- value[annot[0]] = annot[1]
+ value[annot[0]] = annot[1].replace(".", ":")
- def parseEnumContents(self, enum: JEnum, enumValue):
- matches = RE_COMMENT.findall(enumValue)
- defaultValue = 0
- for match in matches:
- value = dict()
- value['name'] = match[1]
- value['value'] = self.calculateValue(match[2], defaultValue)
- defaultValue = value['value'] + 1
- if enum.name == "VehicleProperty":
- block_comment = match[0]
- self.parseBlockComment(value, block_comment)
- enum.values.append(value)
-
+class Converter:
+ # Only addition is supported for now, but that covers all existing properties except
+ # OBD diagnostics, which use bitwise shifts
def convert(self, input):
text = Path(input).read_text()
matches = RE_ENUM.findall(text)
- jenums = []
+ package = RE_PACKAGE.findall(text)[0]
+ imports = RE_IMPORT.findall(text)
+ enums = []
for match in matches:
- enum = JEnum(match[0])
- self.parseEnumContents(enum, match[1])
- jenums.append(enum)
- return jenums
+ enum = Enum(package, match[0], match[1], imports)
+ enums.append(enum)
+ return enums
+
def main():
if (len(sys.argv) != 3):
@@ -85,10 +116,18 @@
sys.exit(1)
aidl_path = sys.argv[1]
out_path = sys.argv[2]
- result = []
+ enums_dict = dict()
for file in os.listdir(aidl_path):
- result.extend(Converter().convert(os.path.join(aidl_path, file)))
- json_result = json.dumps(result, default=vars, indent=2)
+ enums = Converter().convert(os.path.join(aidl_path, file))
+ for enum in enums:
+ enums_dict[enum.jenum.package + "." + enum.jenum.name] = enum
+
+ result = []
+ for enum_name, enum in enums_dict.items():
+ enum.parse(enums_dict)
+ result.append(enum.jenum.__dict__)
+
+ json_result = json.dumps(result, default=None, indent=2)
with open(out_path, 'w') as f:
f.write(json_result)
diff --git a/automotive/vehicle/aidl/generated_lib/cpp/AccessForVehicleProperty.h b/automotive/vehicle/aidl/generated_lib/cpp/AccessForVehicleProperty.h
index a8effcb..15056e2 100644
--- a/automotive/vehicle/aidl/generated_lib/cpp/AccessForVehicleProperty.h
+++ b/automotive/vehicle/aidl/generated_lib/cpp/AccessForVehicleProperty.h
@@ -22,8 +22,7 @@
// clang-format off
-#ifndef android_hardware_automotive_vehicle_aidl_generated_lib_AccessForVehicleProperty_H_
-#define android_hardware_automotive_vehicle_aidl_generated_lib_AccessForVehicleProperty_H_
+#pragma once
#include <aidl/android/hardware/automotive/vehicle/VehicleProperty.h>
#include <aidl/android/hardware/automotive/vehicle/VehiclePropertyAccess.h>
@@ -309,5 +308,3 @@
} // namespace hardware
} // namespace android
} // aidl
-
-#endif // android_hardware_automotive_vehicle_aidl_generated_lib_AccessForVehicleProperty_H_
diff --git a/automotive/vehicle/aidl/generated_lib/cpp/ChangeModeForVehicleProperty.h b/automotive/vehicle/aidl/generated_lib/cpp/ChangeModeForVehicleProperty.h
index 3321c20..d3f97e3 100644
--- a/automotive/vehicle/aidl/generated_lib/cpp/ChangeModeForVehicleProperty.h
+++ b/automotive/vehicle/aidl/generated_lib/cpp/ChangeModeForVehicleProperty.h
@@ -22,8 +22,7 @@
// clang-format off
-#ifndef android_hardware_automotive_vehicle_aidl_generated_lib_ChangeModeForVehicleProperty_H_
-#define android_hardware_automotive_vehicle_aidl_generated_lib_ChangeModeForVehicleProperty_H_
+#pragma once
#include <aidl/android/hardware/automotive/vehicle/VehicleProperty.h>
#include <aidl/android/hardware/automotive/vehicle/VehiclePropertyChangeMode.h>
@@ -309,5 +308,3 @@
} // namespace hardware
} // namespace android
} // aidl
-
-#endif // android_hardware_automotive_vehicle_aidl_generated_lib_ChangeModeForVehicleProperty_H_
diff --git a/automotive/vehicle/aidl/generated_lib/cpp/VersionForVehicleProperty.h b/automotive/vehicle/aidl/generated_lib/cpp/VersionForVehicleProperty.h
new file mode 100644
index 0000000..70c914d
--- /dev/null
+++ b/automotive/vehicle/aidl/generated_lib/cpp/VersionForVehicleProperty.h
@@ -0,0 +1,309 @@
+/*
+ * 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.
+ */
+
+/**
+ * DO NOT EDIT MANUALLY!!!
+ *
+ * Generated by tools/generate_annotation_enums.py.
+ */
+
+// clang-format off
+
+#pragma once
+
+#include <aidl/android/hardware/automotive/vehicle/VehicleProperty.h>
+
+#include <unordered_map>
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace automotive {
+namespace vehicle {
+
+std::unordered_map<VehicleProperty, int32_t> VersionForVehicleProperty = {
+ {VehicleProperty::INFO_VIN, 2},
+ {VehicleProperty::INFO_MAKE, 2},
+ {VehicleProperty::INFO_MODEL, 2},
+ {VehicleProperty::INFO_MODEL_YEAR, 2},
+ {VehicleProperty::INFO_FUEL_CAPACITY, 2},
+ {VehicleProperty::INFO_FUEL_TYPE, 2},
+ {VehicleProperty::INFO_EV_BATTERY_CAPACITY, 2},
+ {VehicleProperty::INFO_EV_CONNECTOR_TYPE, 2},
+ {VehicleProperty::INFO_FUEL_DOOR_LOCATION, 2},
+ {VehicleProperty::INFO_EV_PORT_LOCATION, 2},
+ {VehicleProperty::INFO_DRIVER_SEAT, 2},
+ {VehicleProperty::INFO_EXTERIOR_DIMENSIONS, 2},
+ {VehicleProperty::INFO_MULTI_EV_PORT_LOCATIONS, 2},
+ {VehicleProperty::PERF_ODOMETER, 2},
+ {VehicleProperty::PERF_VEHICLE_SPEED, 2},
+ {VehicleProperty::PERF_VEHICLE_SPEED_DISPLAY, 2},
+ {VehicleProperty::PERF_STEERING_ANGLE, 2},
+ {VehicleProperty::PERF_REAR_STEERING_ANGLE, 2},
+ {VehicleProperty::ENGINE_COOLANT_TEMP, 2},
+ {VehicleProperty::ENGINE_OIL_LEVEL, 2},
+ {VehicleProperty::ENGINE_OIL_TEMP, 2},
+ {VehicleProperty::ENGINE_RPM, 2},
+ {VehicleProperty::WHEEL_TICK, 2},
+ {VehicleProperty::FUEL_LEVEL, 2},
+ {VehicleProperty::FUEL_DOOR_OPEN, 2},
+ {VehicleProperty::EV_BATTERY_LEVEL, 2},
+ {VehicleProperty::EV_CURRENT_BATTERY_CAPACITY, 2},
+ {VehicleProperty::EV_CHARGE_PORT_OPEN, 2},
+ {VehicleProperty::EV_CHARGE_PORT_CONNECTED, 2},
+ {VehicleProperty::EV_BATTERY_INSTANTANEOUS_CHARGE_RATE, 2},
+ {VehicleProperty::RANGE_REMAINING, 2},
+ {VehicleProperty::EV_BATTERY_AVERAGE_TEMPERATURE, 3},
+ {VehicleProperty::TIRE_PRESSURE, 2},
+ {VehicleProperty::CRITICALLY_LOW_TIRE_PRESSURE, 2},
+ {VehicleProperty::ENGINE_IDLE_AUTO_STOP_ENABLED, 2},
+ {VehicleProperty::IMPACT_DETECTED, 3},
+ {VehicleProperty::GEAR_SELECTION, 2},
+ {VehicleProperty::CURRENT_GEAR, 2},
+ {VehicleProperty::PARKING_BRAKE_ON, 2},
+ {VehicleProperty::PARKING_BRAKE_AUTO_APPLY, 2},
+ {VehicleProperty::EV_BRAKE_REGENERATION_LEVEL, 2},
+ {VehicleProperty::FUEL_LEVEL_LOW, 2},
+ {VehicleProperty::NIGHT_MODE, 2},
+ {VehicleProperty::TURN_SIGNAL_STATE, 2},
+ {VehicleProperty::IGNITION_STATE, 2},
+ {VehicleProperty::ABS_ACTIVE, 2},
+ {VehicleProperty::TRACTION_CONTROL_ACTIVE, 2},
+ {VehicleProperty::EV_STOPPING_MODE, 2},
+ {VehicleProperty::ELECTRONIC_STABILITY_CONTROL_ENABLED, 3},
+ {VehicleProperty::ELECTRONIC_STABILITY_CONTROL_STATE, 2},
+ {VehicleProperty::HVAC_FAN_SPEED, 2},
+ {VehicleProperty::HVAC_FAN_DIRECTION, 2},
+ {VehicleProperty::HVAC_TEMPERATURE_CURRENT, 2},
+ {VehicleProperty::HVAC_TEMPERATURE_SET, 2},
+ {VehicleProperty::HVAC_DEFROSTER, 2},
+ {VehicleProperty::HVAC_AC_ON, 2},
+ {VehicleProperty::HVAC_MAX_AC_ON, 2},
+ {VehicleProperty::HVAC_MAX_DEFROST_ON, 2},
+ {VehicleProperty::HVAC_RECIRC_ON, 2},
+ {VehicleProperty::HVAC_DUAL_ON, 2},
+ {VehicleProperty::HVAC_AUTO_ON, 2},
+ {VehicleProperty::HVAC_SEAT_TEMPERATURE, 2},
+ {VehicleProperty::HVAC_SIDE_MIRROR_HEAT, 2},
+ {VehicleProperty::HVAC_STEERING_WHEEL_HEAT, 2},
+ {VehicleProperty::HVAC_TEMPERATURE_DISPLAY_UNITS, 2},
+ {VehicleProperty::HVAC_ACTUAL_FAN_SPEED_RPM, 2},
+ {VehicleProperty::HVAC_POWER_ON, 2},
+ {VehicleProperty::HVAC_FAN_DIRECTION_AVAILABLE, 2},
+ {VehicleProperty::HVAC_AUTO_RECIRC_ON, 2},
+ {VehicleProperty::HVAC_SEAT_VENTILATION, 2},
+ {VehicleProperty::HVAC_ELECTRIC_DEFROSTER_ON, 2},
+ {VehicleProperty::HVAC_TEMPERATURE_VALUE_SUGGESTION, 2},
+ {VehicleProperty::DISTANCE_DISPLAY_UNITS, 2},
+ {VehicleProperty::FUEL_VOLUME_DISPLAY_UNITS, 2},
+ {VehicleProperty::TIRE_PRESSURE_DISPLAY_UNITS, 2},
+ {VehicleProperty::EV_BATTERY_DISPLAY_UNITS, 2},
+ {VehicleProperty::FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME, 2},
+ {VehicleProperty::VEHICLE_SPEED_DISPLAY_UNITS, 2},
+ {VehicleProperty::EXTERNAL_CAR_TIME, 2},
+ {VehicleProperty::ANDROID_EPOCH_TIME, 2},
+ {VehicleProperty::STORAGE_ENCRYPTION_BINDING_SEED, 2},
+ {VehicleProperty::ENV_OUTSIDE_TEMPERATURE, 2},
+ {VehicleProperty::AP_POWER_STATE_REQ, 2},
+ {VehicleProperty::AP_POWER_STATE_REPORT, 2},
+ {VehicleProperty::AP_POWER_BOOTUP_REASON, 2},
+ {VehicleProperty::DISPLAY_BRIGHTNESS, 2},
+ {VehicleProperty::PER_DISPLAY_BRIGHTNESS, 2},
+ {VehicleProperty::VALET_MODE_ENABLED, 3},
+ {VehicleProperty::HEAD_UP_DISPLAY_ENABLED, 3},
+ {VehicleProperty::HW_KEY_INPUT, 2},
+ {VehicleProperty::HW_KEY_INPUT_V2, 2},
+ {VehicleProperty::HW_MOTION_INPUT, 2},
+ {VehicleProperty::HW_ROTARY_INPUT, 2},
+ {VehicleProperty::HW_CUSTOM_INPUT, 2},
+ {VehicleProperty::DOOR_POS, 2},
+ {VehicleProperty::DOOR_MOVE, 2},
+ {VehicleProperty::DOOR_LOCK, 2},
+ {VehicleProperty::DOOR_CHILD_LOCK_ENABLED, 2},
+ {VehicleProperty::MIRROR_Z_POS, 2},
+ {VehicleProperty::MIRROR_Z_MOVE, 2},
+ {VehicleProperty::MIRROR_Y_POS, 2},
+ {VehicleProperty::MIRROR_Y_MOVE, 2},
+ {VehicleProperty::MIRROR_LOCK, 2},
+ {VehicleProperty::MIRROR_FOLD, 2},
+ {VehicleProperty::MIRROR_AUTO_FOLD_ENABLED, 2},
+ {VehicleProperty::MIRROR_AUTO_TILT_ENABLED, 2},
+ {VehicleProperty::SEAT_MEMORY_SELECT, 2},
+ {VehicleProperty::SEAT_MEMORY_SET, 2},
+ {VehicleProperty::SEAT_BELT_BUCKLED, 2},
+ {VehicleProperty::SEAT_BELT_HEIGHT_POS, 2},
+ {VehicleProperty::SEAT_BELT_HEIGHT_MOVE, 2},
+ {VehicleProperty::SEAT_FORE_AFT_POS, 2},
+ {VehicleProperty::SEAT_FORE_AFT_MOVE, 2},
+ {VehicleProperty::SEAT_BACKREST_ANGLE_1_POS, 2},
+ {VehicleProperty::SEAT_BACKREST_ANGLE_1_MOVE, 2},
+ {VehicleProperty::SEAT_BACKREST_ANGLE_2_POS, 2},
+ {VehicleProperty::SEAT_BACKREST_ANGLE_2_MOVE, 2},
+ {VehicleProperty::SEAT_HEIGHT_POS, 2},
+ {VehicleProperty::SEAT_HEIGHT_MOVE, 2},
+ {VehicleProperty::SEAT_DEPTH_POS, 2},
+ {VehicleProperty::SEAT_DEPTH_MOVE, 2},
+ {VehicleProperty::SEAT_TILT_POS, 2},
+ {VehicleProperty::SEAT_TILT_MOVE, 2},
+ {VehicleProperty::SEAT_LUMBAR_FORE_AFT_POS, 2},
+ {VehicleProperty::SEAT_LUMBAR_FORE_AFT_MOVE, 2},
+ {VehicleProperty::SEAT_LUMBAR_SIDE_SUPPORT_POS, 2},
+ {VehicleProperty::SEAT_LUMBAR_SIDE_SUPPORT_MOVE, 2},
+ {VehicleProperty::SEAT_HEADREST_HEIGHT_POS, 2},
+ {VehicleProperty::SEAT_HEADREST_HEIGHT_POS_V2, 2},
+ {VehicleProperty::SEAT_HEADREST_HEIGHT_MOVE, 2},
+ {VehicleProperty::SEAT_HEADREST_ANGLE_POS, 2},
+ {VehicleProperty::SEAT_HEADREST_ANGLE_MOVE, 2},
+ {VehicleProperty::SEAT_HEADREST_FORE_AFT_POS, 2},
+ {VehicleProperty::SEAT_HEADREST_FORE_AFT_MOVE, 2},
+ {VehicleProperty::SEAT_FOOTWELL_LIGHTS_STATE, 2},
+ {VehicleProperty::SEAT_FOOTWELL_LIGHTS_SWITCH, 2},
+ {VehicleProperty::SEAT_EASY_ACCESS_ENABLED, 2},
+ {VehicleProperty::SEAT_AIRBAG_ENABLED, 3},
+ {VehicleProperty::SEAT_AIRBAGS_DEPLOYED, 2},
+ {VehicleProperty::SEAT_CUSHION_SIDE_SUPPORT_POS, 2},
+ {VehicleProperty::SEAT_CUSHION_SIDE_SUPPORT_MOVE, 2},
+ {VehicleProperty::SEAT_LUMBAR_VERTICAL_POS, 2},
+ {VehicleProperty::SEAT_LUMBAR_VERTICAL_MOVE, 2},
+ {VehicleProperty::SEAT_WALK_IN_POS, 2},
+ {VehicleProperty::SEAT_BELT_PRETENSIONER_DEPLOYED, 3},
+ {VehicleProperty::SEAT_OCCUPANCY, 2},
+ {VehicleProperty::WINDOW_POS, 2},
+ {VehicleProperty::WINDOW_MOVE, 2},
+ {VehicleProperty::WINDOW_LOCK, 2},
+ {VehicleProperty::WINDSHIELD_WIPERS_PERIOD, 2},
+ {VehicleProperty::WINDSHIELD_WIPERS_STATE, 2},
+ {VehicleProperty::WINDSHIELD_WIPERS_SWITCH, 2},
+ {VehicleProperty::STEERING_WHEEL_DEPTH_POS, 2},
+ {VehicleProperty::STEERING_WHEEL_DEPTH_MOVE, 2},
+ {VehicleProperty::STEERING_WHEEL_HEIGHT_POS, 2},
+ {VehicleProperty::STEERING_WHEEL_HEIGHT_MOVE, 2},
+ {VehicleProperty::STEERING_WHEEL_THEFT_LOCK_ENABLED, 2},
+ {VehicleProperty::STEERING_WHEEL_LOCKED, 2},
+ {VehicleProperty::STEERING_WHEEL_EASY_ACCESS_ENABLED, 2},
+ {VehicleProperty::GLOVE_BOX_DOOR_POS, 2},
+ {VehicleProperty::GLOVE_BOX_LOCKED, 2},
+ {VehicleProperty::VEHICLE_MAP_SERVICE, 2},
+ {VehicleProperty::LOCATION_CHARACTERIZATION, 2},
+ {VehicleProperty::ULTRASONICS_SENSOR_POSITION, 3},
+ {VehicleProperty::ULTRASONICS_SENSOR_ORIENTATION, 3},
+ {VehicleProperty::ULTRASONICS_SENSOR_FIELD_OF_VIEW, 3},
+ {VehicleProperty::ULTRASONICS_SENSOR_DETECTION_RANGE, 3},
+ {VehicleProperty::ULTRASONICS_SENSOR_SUPPORTED_RANGES, 3},
+ {VehicleProperty::ULTRASONICS_SENSOR_MEASURED_DISTANCE, 3},
+ {VehicleProperty::OBD2_LIVE_FRAME, 2},
+ {VehicleProperty::OBD2_FREEZE_FRAME, 2},
+ {VehicleProperty::OBD2_FREEZE_FRAME_INFO, 2},
+ {VehicleProperty::OBD2_FREEZE_FRAME_CLEAR, 2},
+ {VehicleProperty::HEADLIGHTS_STATE, 2},
+ {VehicleProperty::HIGH_BEAM_LIGHTS_STATE, 2},
+ {VehicleProperty::FOG_LIGHTS_STATE, 2},
+ {VehicleProperty::HAZARD_LIGHTS_STATE, 2},
+ {VehicleProperty::HEADLIGHTS_SWITCH, 2},
+ {VehicleProperty::HIGH_BEAM_LIGHTS_SWITCH, 2},
+ {VehicleProperty::FOG_LIGHTS_SWITCH, 2},
+ {VehicleProperty::HAZARD_LIGHTS_SWITCH, 2},
+ {VehicleProperty::CABIN_LIGHTS_STATE, 2},
+ {VehicleProperty::CABIN_LIGHTS_SWITCH, 2},
+ {VehicleProperty::READING_LIGHTS_STATE, 2},
+ {VehicleProperty::READING_LIGHTS_SWITCH, 2},
+ {VehicleProperty::STEERING_WHEEL_LIGHTS_STATE, 2},
+ {VehicleProperty::STEERING_WHEEL_LIGHTS_SWITCH, 2},
+ {VehicleProperty::SUPPORT_CUSTOMIZE_VENDOR_PERMISSION, 2},
+ {VehicleProperty::DISABLED_OPTIONAL_FEATURES, 2},
+ {VehicleProperty::INITIAL_USER_INFO, 2},
+ {VehicleProperty::SWITCH_USER, 2},
+ {VehicleProperty::CREATE_USER, 2},
+ {VehicleProperty::REMOVE_USER, 2},
+ {VehicleProperty::USER_IDENTIFICATION_ASSOCIATION, 2},
+ {VehicleProperty::EVS_SERVICE_REQUEST, 2},
+ {VehicleProperty::POWER_POLICY_REQ, 2},
+ {VehicleProperty::POWER_POLICY_GROUP_REQ, 2},
+ {VehicleProperty::CURRENT_POWER_POLICY, 2},
+ {VehicleProperty::WATCHDOG_ALIVE, 2},
+ {VehicleProperty::WATCHDOG_TERMINATED_PROCESS, 2},
+ {VehicleProperty::VHAL_HEARTBEAT, 2},
+ {VehicleProperty::CLUSTER_SWITCH_UI, 2},
+ {VehicleProperty::CLUSTER_DISPLAY_STATE, 2},
+ {VehicleProperty::CLUSTER_REPORT_STATE, 2},
+ {VehicleProperty::CLUSTER_REQUEST_DISPLAY, 2},
+ {VehicleProperty::CLUSTER_NAVIGATION_STATE, 2},
+ {VehicleProperty::ELECTRONIC_TOLL_COLLECTION_CARD_TYPE, 2},
+ {VehicleProperty::ELECTRONIC_TOLL_COLLECTION_CARD_STATUS, 2},
+ {VehicleProperty::FRONT_FOG_LIGHTS_STATE, 2},
+ {VehicleProperty::FRONT_FOG_LIGHTS_SWITCH, 2},
+ {VehicleProperty::REAR_FOG_LIGHTS_STATE, 2},
+ {VehicleProperty::REAR_FOG_LIGHTS_SWITCH, 2},
+ {VehicleProperty::EV_CHARGE_CURRENT_DRAW_LIMIT, 2},
+ {VehicleProperty::EV_CHARGE_PERCENT_LIMIT, 2},
+ {VehicleProperty::EV_CHARGE_STATE, 2},
+ {VehicleProperty::EV_CHARGE_SWITCH, 2},
+ {VehicleProperty::EV_CHARGE_TIME_REMAINING, 2},
+ {VehicleProperty::EV_REGENERATIVE_BRAKING_STATE, 2},
+ {VehicleProperty::TRAILER_PRESENT, 2},
+ {VehicleProperty::VEHICLE_CURB_WEIGHT, 2},
+ {VehicleProperty::GENERAL_SAFETY_REGULATION_COMPLIANCE_REQUIREMENT, 2},
+ {VehicleProperty::SUPPORTED_PROPERTY_IDS, 2},
+ {VehicleProperty::SHUTDOWN_REQUEST, 2},
+ {VehicleProperty::VEHICLE_IN_USE, 2},
+ {VehicleProperty::CLUSTER_HEARTBEAT, 3},
+ {VehicleProperty::VEHICLE_DRIVING_AUTOMATION_CURRENT_LEVEL, 3},
+ {VehicleProperty::AUTOMATIC_EMERGENCY_BRAKING_ENABLED, 2},
+ {VehicleProperty::AUTOMATIC_EMERGENCY_BRAKING_STATE, 2},
+ {VehicleProperty::FORWARD_COLLISION_WARNING_ENABLED, 2},
+ {VehicleProperty::FORWARD_COLLISION_WARNING_STATE, 2},
+ {VehicleProperty::BLIND_SPOT_WARNING_ENABLED, 2},
+ {VehicleProperty::BLIND_SPOT_WARNING_STATE, 2},
+ {VehicleProperty::LANE_DEPARTURE_WARNING_ENABLED, 2},
+ {VehicleProperty::LANE_DEPARTURE_WARNING_STATE, 2},
+ {VehicleProperty::LANE_KEEP_ASSIST_ENABLED, 2},
+ {VehicleProperty::LANE_KEEP_ASSIST_STATE, 2},
+ {VehicleProperty::LANE_CENTERING_ASSIST_ENABLED, 2},
+ {VehicleProperty::LANE_CENTERING_ASSIST_COMMAND, 2},
+ {VehicleProperty::LANE_CENTERING_ASSIST_STATE, 2},
+ {VehicleProperty::EMERGENCY_LANE_KEEP_ASSIST_ENABLED, 2},
+ {VehicleProperty::EMERGENCY_LANE_KEEP_ASSIST_STATE, 2},
+ {VehicleProperty::CRUISE_CONTROL_ENABLED, 2},
+ {VehicleProperty::CRUISE_CONTROL_TYPE, 2},
+ {VehicleProperty::CRUISE_CONTROL_STATE, 2},
+ {VehicleProperty::CRUISE_CONTROL_COMMAND, 2},
+ {VehicleProperty::CRUISE_CONTROL_TARGET_SPEED, 2},
+ {VehicleProperty::ADAPTIVE_CRUISE_CONTROL_TARGET_TIME_GAP, 2},
+ {VehicleProperty::ADAPTIVE_CRUISE_CONTROL_LEAD_VEHICLE_MEASURED_DISTANCE, 2},
+ {VehicleProperty::HANDS_ON_DETECTION_ENABLED, 2},
+ {VehicleProperty::HANDS_ON_DETECTION_DRIVER_STATE, 2},
+ {VehicleProperty::HANDS_ON_DETECTION_WARNING, 2},
+ {VehicleProperty::DRIVER_DROWSINESS_ATTENTION_SYSTEM_ENABLED, 3},
+ {VehicleProperty::DRIVER_DROWSINESS_ATTENTION_STATE, 3},
+ {VehicleProperty::DRIVER_DROWSINESS_ATTENTION_WARNING_ENABLED, 3},
+ {VehicleProperty::DRIVER_DROWSINESS_ATTENTION_WARNING, 3},
+ {VehicleProperty::DRIVER_DISTRACTION_SYSTEM_ENABLED, 3},
+ {VehicleProperty::DRIVER_DISTRACTION_STATE, 3},
+ {VehicleProperty::DRIVER_DISTRACTION_WARNING_ENABLED, 2},
+ {VehicleProperty::DRIVER_DISTRACTION_WARNING, 3},
+ {VehicleProperty::LOW_SPEED_COLLISION_WARNING_ENABLED, 3},
+ {VehicleProperty::LOW_SPEED_COLLISION_WARNING_STATE, 3},
+ {VehicleProperty::CROSS_TRAFFIC_MONITORING_ENABLED, 3},
+ {VehicleProperty::CROSS_TRAFFIC_MONITORING_WARNING_STATE, 3},
+ {VehicleProperty::LOW_SPEED_AUTOMATIC_EMERGENCY_BRAKING_ENABLED, 3},
+ {VehicleProperty::LOW_SPEED_AUTOMATIC_EMERGENCY_BRAKING_STATE, 3},
+};
+
+} // namespace vehicle
+} // namespace automotive
+} // namespace hardware
+} // namespace android
+} // aidl
diff --git a/automotive/vehicle/aidl/impl/fake_impl/hardware/include/FakeVehicleHardware.h b/automotive/vehicle/aidl/impl/fake_impl/hardware/include/FakeVehicleHardware.h
index 8cd92b3..1153217 100644
--- a/automotive/vehicle/aidl/impl/fake_impl/hardware/include/FakeVehicleHardware.h
+++ b/automotive/vehicle/aidl/impl/fake_impl/hardware/include/FakeVehicleHardware.h
@@ -256,6 +256,7 @@
std::string dumpSaveProperty(const std::vector<std::string>& options);
std::string dumpRestoreProperty(const std::vector<std::string>& options);
std::string dumpInjectEvent(const std::vector<std::string>& options);
+ std::string dumpSubscriptions();
template <typename T>
android::base::Result<T> safelyParseInt(int index, const std::string& s) {
@@ -294,7 +295,7 @@
void registerRefreshLocked(PropIdAreaId propIdAreaId, VehiclePropertyStore::EventMode eventMode,
float sampleRateHz) REQUIRES(mLock);
void unregisterRefreshLocked(PropIdAreaId propIdAreaId) REQUIRES(mLock);
- void refreshTimeStampForInterval(int64_t intervalInNanos) EXCLUDES(mLock);
+ void refreshTimestampForInterval(int64_t intervalInNanos) EXCLUDES(mLock);
static aidl::android::hardware::automotive::vehicle::VehiclePropValue createHwInputKeyProp(
aidl::android::hardware::automotive::vehicle::VehicleHwKeyInputAction action,
diff --git a/automotive/vehicle/aidl/impl/fake_impl/hardware/src/FakeVehicleHardware.cpp b/automotive/vehicle/aidl/impl/fake_impl/hardware/src/FakeVehicleHardware.cpp
index 385f616..bcc765c 100644
--- a/automotive/vehicle/aidl/impl/fake_impl/hardware/src/FakeVehicleHardware.cpp
+++ b/automotive/vehicle/aidl/impl/fake_impl/hardware/src/FakeVehicleHardware.cpp
@@ -51,6 +51,8 @@
namespace {
+#define PROP_ID_TO_CSTR(A) (propIdToString(A).c_str())
+
using ::aidl::android::hardware::automotive::vehicle::CruiseControlCommand;
using ::aidl::android::hardware::automotive::vehicle::CruiseControlType;
using ::aidl::android::hardware::automotive::vehicle::DriverDistractionState;
@@ -725,7 +727,7 @@
FakeVehicleHardware::ValueResultType FakeVehicleHardware::getUserHalProp(
const VehiclePropValue& value) const {
auto propId = value.prop;
- ALOGI("get(): getting value for prop %d from User HAL", propId);
+ ALOGI("get(): getting value for prop %s from User HAL", PROP_ID_TO_CSTR(propId));
auto result = mFakeUserHal->onGetProperty(value);
if (!result.ok()) {
@@ -1088,7 +1090,7 @@
const std::vector<SetValueRequest>& requests) {
for (auto& request : requests) {
if (FAKE_VEHICLEHARDWARE_DEBUG) {
- ALOGD("Set value for property ID: %d", request.value.prop);
+ ALOGD("Set value for property ID: %s", PROP_ID_TO_CSTR(request.value.prop));
}
// In a real VHAL implementation, you could either send the setValue request to vehicle bus
@@ -1109,9 +1111,9 @@
auto setSpecialValueResult = maybeSetSpecialValue(value, &isSpecialValue);
if (isSpecialValue) {
if (!setSpecialValueResult.ok()) {
- return StatusError(getErrorCode(setSpecialValueResult))
- << StringPrintf("failed to set special value for property ID: %d, error: %s",
- value.prop, getErrorMsg(setSpecialValueResult).c_str());
+ return StatusError(getErrorCode(setSpecialValueResult)) << StringPrintf(
+ "failed to set special value for property ID: %s, error: %s",
+ PROP_ID_TO_CSTR(value.prop), getErrorMsg(setSpecialValueResult).c_str());
}
return {};
}
@@ -1150,7 +1152,7 @@
const std::vector<GetValueRequest>& requests) const {
for (auto& request : requests) {
if (FAKE_VEHICLEHARDWARE_DEBUG) {
- ALOGD("getValues(%d)", request.prop.prop);
+ ALOGD("getValues(%s)", PROP_ID_TO_CSTR(request.prop.prop));
}
// In a real VHAL implementation, you could either send the getValue request to vehicle bus
@@ -1189,8 +1191,8 @@
if (isSpecialValue) {
if (!result.ok()) {
return StatusError(getErrorCode(result))
- << StringPrintf("failed to get special value: %d, error: %s", value.prop,
- getErrorMsg(result).c_str());
+ << StringPrintf("failed to get special value: %s, error: %s",
+ PROP_ID_TO_CSTR(value.prop), getErrorMsg(result).c_str());
} else {
return result;
}
@@ -1249,6 +1251,8 @@
mAddExtraTestVendorConfigs = false;
result.refreshPropertyConfigs = true;
result.buffer = "successfully restored vendor configs";
+ } else if (EqualsIgnoreCase(option, "--dumpSub")) {
+ result.buffer = dumpSubscriptions();
} else {
result.buffer = StringPrintf("Invalid option: %s\n", option.c_str());
}
@@ -1380,7 +1384,8 @@
if (mGeneratorHub->unregisterGenerator(propId)) {
return "Linear event generator stopped successfully";
}
- return StringPrintf("No linear event generator found for property: %d", propId);
+ return StringPrintf("No linear event generator found for property: %s",
+ PROP_ID_TO_CSTR(propId));
} else if (command == "--startjson") {
// --genfakedata --startjson --path path repetition
// or
@@ -1650,6 +1655,26 @@
mServerSidePropStore->writeValue(mValuePool->obtain(value));
}
+std::string FakeVehicleHardware::dumpSubscriptions() {
+ std::scoped_lock<std::mutex> lockGuard(mLock);
+ std::string result = "Subscriptions: \n";
+ for (const auto& [interval, actionForInterval] : mActionByIntervalInNanos) {
+ for (const auto& propIdAreaId : actionForInterval.propIdAreaIdsToRefresh) {
+ const auto& refreshInfo = mRefreshInfoByPropIdAreaId[propIdAreaId];
+ bool vur = (refreshInfo.eventMode == VehiclePropertyStore::EventMode::ON_VALUE_CHANGE);
+ float sampleRateHz = 1'000'000'000. / refreshInfo.intervalInNanos;
+ result += StringPrintf("Continuous{property: %s, areaId: %d, rate: %lf hz, vur: %b}\n",
+ PROP_ID_TO_CSTR(propIdAreaId.propId), propIdAreaId.areaId,
+ sampleRateHz, vur);
+ }
+ }
+ for (const auto& propIdAreaId : mSubOnChangePropIdAreaIds) {
+ result += StringPrintf("OnChange{property: %s, areaId: %d}\n",
+ PROP_ID_TO_CSTR(propIdAreaId.propId), propIdAreaId.areaId);
+ }
+ return result;
+}
+
std::string FakeVehicleHardware::dumpHelp() {
return "Usage: \n\n"
"[no args]: dumps (id and value) all supported properties \n"
@@ -1717,8 +1742,9 @@
result = mServerSidePropStore->readValue(value);
}
if (!result.ok()) {
- return StringPrintf("failed to read property value: %d, error: %s, code: %d\n", propId,
- getErrorMsg(result).c_str(), getIntErrorCode(result));
+ return StringPrintf("failed to read property value: %s, error: %s, code: %d\n",
+ PROP_ID_TO_CSTR(propId), getErrorMsg(result).c_str(),
+ getIntErrorCode(result));
} else {
return result.value()->toString() + "\n";
@@ -1733,7 +1759,7 @@
int rowNumber = 1;
std::string msg = StringPrintf("listing %zu properties\n", configs.size());
for (const auto& config : configs) {
- msg += StringPrintf("%d: %d\n", rowNumber++, config.prop);
+ msg += StringPrintf("%d: %s\n", rowNumber++, PROP_ID_TO_CSTR(config.prop));
}
return msg;
}
@@ -1766,7 +1792,7 @@
int32_t prop = propResult.value();
auto result = mServerSidePropStore->getPropConfig(prop);
if (!result.ok()) {
- msg += StringPrintf("No property %d\n", prop);
+ msg += StringPrintf("No property %s\n", PROP_ID_TO_CSTR(prop));
continue;
}
msg += dumpOnePropertyByConfig(rowNumber++, result.value());
@@ -1952,8 +1978,9 @@
}
if (!result.ok()) {
- return StringPrintf("failed to read property value: %d, error: %s, code: %d\n", prop.prop,
- getErrorMsg(result).c_str(), getIntErrorCode(result));
+ return StringPrintf("failed to read property value: %s, error: %s, code: %d\n",
+ PROP_ID_TO_CSTR(prop.prop), getErrorMsg(result).c_str(),
+ getIntErrorCode(result));
}
return StringPrintf("Get property result: %s\n", result.value()->toString().c_str());
}
@@ -2046,7 +2073,7 @@
eventFromVehicleBus(prop);
- return StringPrintf("Event for property: %d injected", prop.prop);
+ return StringPrintf("Event for property: %s injected", PROP_ID_TO_CSTR(prop.prop));
}
StatusCode FakeVehicleHardware::checkHealth() {
@@ -2109,7 +2136,7 @@
return false;
}
-void FakeVehicleHardware::refreshTimeStampForInterval(int64_t intervalInNanos) {
+void FakeVehicleHardware::refreshTimestampForInterval(int64_t intervalInNanos) {
std::unordered_map<PropIdAreaId, VehiclePropertyStore::EventMode, PropIdAreaIdHash>
eventModeByPropIdAreaId;
@@ -2159,7 +2186,7 @@
// This is the first action for the interval, register a timer callback for that interval.
auto action = std::make_shared<RecurrentTimer::Callback>(
- [this, intervalInNanos] { refreshTimeStampForInterval(intervalInNanos); });
+ [this, intervalInNanos] { refreshTimestampForInterval(intervalInNanos); });
mActionByIntervalInNanos[intervalInNanos] = ActionForInterval{
.propIdAreaIdsToRefresh = {propIdAreaId},
.recurrentAction = action,
@@ -2201,7 +2228,7 @@
case VehiclePropertyChangeMode::CONTINUOUS:
if (sampleRateHz == 0.f) {
ALOGE("Must not use sample rate 0 for a continuous property");
- return StatusCode::INTERNAL_ERROR;
+ return StatusCode::INVALID_ARG;
}
// For continuous properties, we must generate a new onPropertyChange event
// periodically according to the sample rate.
diff --git a/automotive/vehicle/aidl/impl/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp b/automotive/vehicle/aidl/impl/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp
index 6d2efd5..90643aa 100644
--- a/automotive/vehicle/aidl/impl/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp
+++ b/automotive/vehicle/aidl/impl/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp
@@ -2617,8 +2617,8 @@
DumpResult result = getHardware()->dump(options);
ASSERT_FALSE(result.callerShouldDumpState);
ASSERT_NE(result.buffer, "");
- ASSERT_THAT(result.buffer, ContainsRegex(StringPrintf("1:.*prop: %s.*\nNo property %d\n",
- prop1.c_str(), INVALID_PROP_ID)));
+ ASSERT_THAT(result.buffer, ContainsRegex(StringPrintf("1:.*prop: %s.*\nNo property INVALID\n",
+ prop1.c_str())));
}
TEST_F(FakeVehicleHardwareTest, testDumpSpecificPropertiesNoArg) {
@@ -2701,8 +2701,7 @@
{"--inject-event", propIdStr, "-i", "1234", "-t", std::to_string(timestamp)});
ASSERT_FALSE(result.callerShouldDumpState);
- ASSERT_THAT(result.buffer,
- ContainsRegex(StringPrintf("Event for property: %d injected", prop)));
+ ASSERT_THAT(result.buffer, ContainsRegex("Event for property: ENGINE_OIL_LEVEL injected"));
ASSERT_TRUE(waitForChangedProperties(prop, 0, /*count=*/1, milliseconds(1000)))
<< "No changed event received for injected event from vehicle bus";
auto events = getChangedProperties();
@@ -3444,6 +3443,14 @@
<< "must not receive on change events if the propId, areaId is unsubscribed";
}
+TEST_F(FakeVehicleHardwareTest, testSubscribeContinuous_rate0_mustReturnInvalidArg) {
+ int32_t propSpeed = toInt(VehicleProperty::PERF_VEHICLE_SPEED);
+ int32_t areaId = 0;
+ auto status = getHardware()->subscribe(newSubscribeOptions(propSpeed, areaId, 0));
+
+ ASSERT_EQ(status, StatusCode::INVALID_ARG);
+}
+
TEST_F(FakeVehicleHardwareTest, testSetHvacTemperatureValueSuggestion) {
float CELSIUS = static_cast<float>(toInt(VehicleUnit::CELSIUS));
float FAHRENHEIT = static_cast<float>(toInt(VehicleUnit::FAHRENHEIT));
diff --git a/automotive/vehicle/aidl/impl/utils/common/include/VehicleObjectPool.h b/automotive/vehicle/aidl/impl/utils/common/include/VehicleObjectPool.h
index 6e812d1..501ce40 100644
--- a/automotive/vehicle/aidl/impl/utils/common/include/VehicleObjectPool.h
+++ b/automotive/vehicle/aidl/impl/utils/common/include/VehicleObjectPool.h
@@ -235,7 +235,7 @@
bool isDisposable(aidl::android::hardware::automotive::vehicle::VehiclePropertyType type,
size_t vectorSize) const {
- return vectorSize > mMaxRecyclableVectorSize || isComplexType(type);
+ return vectorSize == 0 || vectorSize > mMaxRecyclableVectorSize || isComplexType(type);
}
RecyclableType obtainDisposable(
diff --git a/automotive/vehicle/aidl/impl/utils/common/include/VehicleUtils.h b/automotive/vehicle/aidl/impl/utils/common/include/VehicleUtils.h
index 546421e..523cac5 100644
--- a/automotive/vehicle/aidl/impl/utils/common/include/VehicleUtils.h
+++ b/automotive/vehicle/aidl/impl/utils/common/include/VehicleUtils.h
@@ -124,7 +124,6 @@
break; // Valid, but nothing to do.
default:
ALOGE("createVehiclePropValue: unknown type: %d", toInt(type));
- val.reset(nullptr);
}
return val;
}
diff --git a/automotive/vehicle/aidl/impl/utils/common/src/VehicleObjectPool.cpp b/automotive/vehicle/aidl/impl/utils/common/src/VehicleObjectPool.cpp
index 2480a73..7e02767 100644
--- a/automotive/vehicle/aidl/impl/utils/common/src/VehicleObjectPool.cpp
+++ b/automotive/vehicle/aidl/impl/utils/common/src/VehicleObjectPool.cpp
@@ -55,13 +55,6 @@
int propId = src.prop;
VehiclePropertyType type = getPropType(propId);
size_t vectorSize = getVehicleRawValueVectorSize(src.value, type);
- if (vectorSize == 0 && !isComplexType(type)) {
- ALOGW("empty vehicle prop value, contains no content");
- ALOGW("empty vehicle prop value, contains no content, prop: %d", propId);
- // Return any empty VehiclePropValue.
- return RecyclableType{new VehiclePropValue{}, mDisposableDeleter};
- }
-
auto dest = obtain(type, vectorSize);
dest->prop = propId;
diff --git a/automotive/vehicle/aidl/impl/utils/common/test/VehicleObjectPoolTest.cpp b/automotive/vehicle/aidl/impl/utils/common/test/VehicleObjectPoolTest.cpp
index a62532c..6226e89 100644
--- a/automotive/vehicle/aidl/impl/utils/common/test/VehicleObjectPoolTest.cpp
+++ b/automotive/vehicle/aidl/impl/utils/common/test/VehicleObjectPoolTest.cpp
@@ -267,6 +267,20 @@
ASSERT_EQ(*gotValue, prop);
}
+TEST_F(VehicleObjectPoolTest, testObtainCopyInt32ValuesEmptyArray) {
+ VehiclePropValue prop{
+ // INT32_VEC property.
+ .prop = toInt(VehicleProperty::INFO_FUEL_TYPE),
+ .areaId = 2,
+ .timestamp = 3,
+ .value = {.int32Values = {}},
+ };
+ auto gotValue = mValuePool->obtain(prop);
+
+ ASSERT_NE(gotValue, nullptr);
+ ASSERT_EQ(*gotValue, prop);
+}
+
TEST_F(VehicleObjectPoolTest, testObtainCopyInt64Values) {
VehiclePropValue prop{
// INT64_VEC property.
diff --git a/automotive/vehicle/aidl/impl/vhal/Android.bp b/automotive/vehicle/aidl/impl/vhal/Android.bp
index c29345f..20bba7f 100644
--- a/automotive/vehicle/aidl/impl/vhal/Android.bp
+++ b/automotive/vehicle/aidl/impl/vhal/Android.bp
@@ -61,6 +61,7 @@
],
header_libs: [
"IVehicleHardware",
+ "IVehicleGeneratedHeaders",
],
shared_libs: [
"libbinder_ndk",
diff --git a/automotive/vehicle/aidl/impl/vhal/include/DefaultVehicleHal.h b/automotive/vehicle/aidl/impl/vhal/include/DefaultVehicleHal.h
index f7a71b4..250b30c 100644
--- a/automotive/vehicle/aidl/impl/vhal/include/DefaultVehicleHal.h
+++ b/automotive/vehicle/aidl/impl/vhal/include/DefaultVehicleHal.h
@@ -49,6 +49,9 @@
explicit DefaultVehicleHal(std::unique_ptr<IVehicleHardware> hardware);
+ // Test-only
+ DefaultVehicleHal(std::unique_ptr<IVehicleHardware> hardware, int32_t testInterfaceVersion);
+
~DefaultVehicleHal();
ndk::ScopedAStatus getAllPropConfigs(
@@ -153,6 +156,8 @@
mPropertyChangeEventsBatchingConsumer;
// Only set once during initialization.
std::chrono::nanoseconds mEventBatchingWindow;
+ // Only used for testing.
+ int32_t mTestInterfaceVersion = 0;
std::mutex mLock;
std::unordered_map<const AIBinder*, std::unique_ptr<OnBinderDiedContext>> mOnBinderDiedContexts
@@ -227,6 +232,8 @@
std::vector<aidl::android::hardware::automotive::vehicle::VehiclePropValue>&&
batchedEvents);
+ int32_t getVhalInterfaceVersion();
+
// Puts the property change events into a queue so that they can handled in batch.
static void batchPropertyChangeEvent(
const std::weak_ptr<ConcurrentQueue<
diff --git a/automotive/vehicle/aidl/impl/vhal/src/DefaultVehicleHal.cpp b/automotive/vehicle/aidl/impl/vhal/src/DefaultVehicleHal.cpp
index 76d2f31..cc5edcc 100644
--- a/automotive/vehicle/aidl/impl/vhal/src/DefaultVehicleHal.cpp
+++ b/automotive/vehicle/aidl/impl/vhal/src/DefaultVehicleHal.cpp
@@ -22,6 +22,7 @@
#include <LargeParcelableBase.h>
#include <VehicleHalTypes.h>
#include <VehicleUtils.h>
+#include <VersionForVehicleProperty.h>
#include <android-base/result.h>
#include <android-base/stringprintf.h>
@@ -61,6 +62,7 @@
using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyChangeMode;
using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyStatus;
using ::aidl::android::hardware::automotive::vehicle::VehiclePropValue;
+using ::aidl::android::hardware::automotive::vehicle::VersionForVehicleProperty;
using ::android::automotive::car_binder_lib::LargeParcelableBase;
using ::android::base::Error;
using ::android::base::expected;
@@ -94,8 +96,13 @@
} // namespace
DefaultVehicleHal::DefaultVehicleHal(std::unique_ptr<IVehicleHardware> vehicleHardware)
+ : DefaultVehicleHal(std::move(vehicleHardware), /* testInterfaceVersion= */ 0){};
+
+DefaultVehicleHal::DefaultVehicleHal(std::unique_ptr<IVehicleHardware> vehicleHardware,
+ int32_t testInterfaceVersion)
: mVehicleHardware(std::move(vehicleHardware)),
- mPendingRequestPool(std::make_shared<PendingRequestPool>(TIMEOUT_IN_NANO)) {
+ mPendingRequestPool(std::make_shared<PendingRequestPool>(TIMEOUT_IN_NANO)),
+ mTestInterfaceVersion(testInterfaceVersion) {
if (!getAllPropConfigsFromHardware()) {
return;
}
@@ -312,13 +319,46 @@
mPendingRequestPool = std::make_unique<PendingRequestPool>(timeoutInNano);
}
+int32_t DefaultVehicleHal::getVhalInterfaceVersion() {
+ if (mTestInterfaceVersion != 0) {
+ return mTestInterfaceVersion;
+ }
+ int32_t myVersion = 0;
+ getInterfaceVersion(&myVersion);
+ return myVersion;
+}
+
bool DefaultVehicleHal::getAllPropConfigsFromHardware() {
auto configs = mVehicleHardware->getAllPropertyConfigs();
+ std::vector<VehiclePropConfig> filteredConfigs;
+ int32_t myVersion = getVhalInterfaceVersion();
for (auto& config : configs) {
+ if (!isSystemProp(config.prop)) {
+ filteredConfigs.push_back(std::move(config));
+ continue;
+ }
+ VehicleProperty property = static_cast<VehicleProperty>(config.prop);
+ std::string propertyName = aidl::android::hardware::automotive::vehicle::toString(property);
+ auto it = VersionForVehicleProperty.find(property);
+ if (it == VersionForVehicleProperty.end()) {
+ ALOGE("The property: %s is not a supported system property, ignore",
+ propertyName.c_str());
+ continue;
+ }
+ int requiredVersion = it->second;
+ if (myVersion < requiredVersion) {
+ ALOGE("The property: %s is not supported for current client VHAL version, "
+ "require %d, current version: %d, ignore",
+ propertyName.c_str(), requiredVersion, myVersion);
+ continue;
+ }
+ filteredConfigs.push_back(std::move(config));
+ }
+ for (auto& config : filteredConfigs) {
mConfigsByPropId[config.prop] = config;
}
VehiclePropConfigs vehiclePropConfigs;
- vehiclePropConfigs.payloads = std::move(configs);
+ vehiclePropConfigs.payloads = std::move(filteredConfigs);
auto result = LargeParcelableBase::parcelableToStableLargeParcelable(vehiclePropConfigs);
if (!result.ok()) {
ALOGE("failed to convert configs to shared memory file, error: %s, code: %d",
@@ -413,9 +453,9 @@
.status = getErrorCode(result),
.prop = {},
});
- } else {
- hardwareRequests.push_back(request);
+ continue;
}
+ hardwareRequests.push_back(request);
}
// The set of request Ids that we would send to hardware.
@@ -816,6 +856,7 @@
if (!result.ok()) {
return StatusError(StatusCode::INVALID_ARG) << getErrorMsg(result);
}
+
const VehiclePropConfig* config = result.value();
const VehicleAreaConfig* areaConfig = getAreaConfig(value, *config);
@@ -900,6 +941,7 @@
dprintf(fd, "Vehicle HAL State: \n");
{
std::scoped_lock<std::mutex> lockGuard(mLock);
+ dprintf(fd, "Interface version: %" PRId32 "\n", getVhalInterfaceVersion());
dprintf(fd, "Containing %zu property configs\n", mConfigsByPropId.size());
dprintf(fd, "Currently have %zu getValues clients\n", mGetValuesClients.size());
dprintf(fd, "Currently have %zu setValues clients\n", mSetValuesClients.size());
diff --git a/automotive/vehicle/aidl/impl/vhal/test/DefaultVehicleHalTest.cpp b/automotive/vehicle/aidl/impl/vhal/test/DefaultVehicleHalTest.cpp
index a63cb84..bb82108 100644
--- a/automotive/vehicle/aidl/impl/vhal/test/DefaultVehicleHalTest.cpp
+++ b/automotive/vehicle/aidl/impl/vhal/test/DefaultVehicleHalTest.cpp
@@ -79,36 +79,37 @@
using ::ndk::SpAIBinder;
using ::testing::ContainsRegex;
+using ::testing::ElementsAre;
using ::testing::Eq;
using ::testing::UnorderedElementsAre;
using ::testing::UnorderedElementsAreArray;
using ::testing::WhenSortedBy;
constexpr int32_t INVALID_PROP_ID = 0;
-// VehiclePropertyGroup:SYSTEM,VehicleArea:WINDOW,VehiclePropertyType:INT32
-constexpr int32_t INT32_WINDOW_PROP = 10001 + 0x10000000 + 0x03000000 + 0x00400000;
-// VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
-constexpr int32_t GLOBAL_ON_CHANGE_PROP = 10002 + 0x10000000 + 0x01000000 + 0x00400000;
-// VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
-constexpr int32_t GLOBAL_CONTINUOUS_PROP = 10003 + 0x10000000 + 0x01000000 + 0x00400000;
-// VehiclePropertyGroup:SYSTEM,VehicleArea:WINDOW,VehiclePropertyType:INT32
-constexpr int32_t AREA_ON_CHANGE_PROP = 10004 + 0x10000000 + 0x03000000 + 0x00400000;
-// VehiclePropertyGroup:SYSTEM,VehicleArea:WINDOW,VehiclePropertyType:INT32
-constexpr int32_t AREA_CONTINUOUS_PROP = 10005 + 0x10000000 + 0x03000000 + 0x00400000;
-// VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
-constexpr int32_t READ_ONLY_PROP = 10006 + 0x10000000 + 0x01000000 + 0x00400000;
-// VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
-constexpr int32_t WRITE_ONLY_PROP = 10007 + 0x10000000 + 0x01000000 + 0x00400000;
-// VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
-constexpr int32_t GLOBAL_CONTINUOUS_PROP_NO_VUR = 10008 + 0x10000000 + 0x01000000 + 0x00400000;
-// VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
-constexpr int32_t GLOBAL_NONE_ACCESS_PROP = 10009 + 0x10000000 + 0x01000000 + 0x00400000;
-// VehiclePropertyGroup:SYSTEM,VehicleArea:WINDOW,VehiclePropertyType:INT32
-constexpr int32_t AREA_NONE_ACCESS_PROP = 10010 + 0x10000000 + 0x03000000 + 0x00400000;
+// VehiclePropertyGroup:VENDOR,VehicleArea:WINDOW,VehiclePropertyType:INT32
+constexpr int32_t INT32_WINDOW_PROP = 10001 + 0x20000000 + 0x03000000 + 0x00400000;
+// VehiclePropertyGroup:VENDOR,VehicleArea:GLOBAL,VehiclePropertyType:INT32
+constexpr int32_t GLOBAL_ON_CHANGE_PROP = 10002 + 0x20000000 + 0x01000000 + 0x00400000;
+// VehiclePropertyGroup:VENDOR,VehicleArea:GLOBAL,VehiclePropertyType:INT32
+constexpr int32_t GLOBAL_CONTINUOUS_PROP = 10003 + 0x20000000 + 0x01000000 + 0x00400000;
+// VehiclePropertyGroup:VENDOR,VehicleArea:WINDOW,VehiclePropertyType:INT32
+constexpr int32_t AREA_ON_CHANGE_PROP = 10004 + 0x20000000 + 0x03000000 + 0x00400000;
+// VehiclePropertyGroup:VENDOR,VehicleArea:WINDOW,VehiclePropertyType:INT32
+constexpr int32_t AREA_CONTINUOUS_PROP = 10005 + 0x20000000 + 0x03000000 + 0x00400000;
+// VehiclePropertyGroup:VENDOR,VehicleArea:GLOBAL,VehiclePropertyType:INT32
+constexpr int32_t READ_ONLY_PROP = 10006 + 0x20000000 + 0x01000000 + 0x00400000;
+// VehiclePropertyGroup:VENDOR,VehicleArea:GLOBAL,VehiclePropertyType:INT32
+constexpr int32_t WRITE_ONLY_PROP = 10007 + 0x20000000 + 0x01000000 + 0x00400000;
+// VehiclePropertyGroup:VENDOR,VehicleArea:GLOBAL,VehiclePropertyType:INT32
+constexpr int32_t GLOBAL_CONTINUOUS_PROP_NO_VUR = 10008 + 0x20000000 + 0x01000000 + 0x00400000;
+// VehiclePropertyGroup:VENDOR,VehicleArea:GLOBAL,VehiclePropertyType:INT32
+constexpr int32_t GLOBAL_NONE_ACCESS_PROP = 10009 + 0x20000000 + 0x01000000 + 0x00400000;
+// VehiclePropertyGroup:VENDOR,VehicleArea:WINDOW,VehiclePropertyType:INT32
+constexpr int32_t AREA_NONE_ACCESS_PROP = 10010 + 0x20000000 + 0x03000000 + 0x00400000;
int32_t testInt32VecProp(size_t i) {
- // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
- return static_cast<int32_t>(i) + 0x10000000 + 0x01000000 + 0x00410000;
+ // VehiclePropertyGroup:VENDOR,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
+ return static_cast<int32_t>(i) + 0x20000000 + 0x01000000 + 0x00410000;
}
std::string toString(const std::vector<SubscribeOptions>& options) {
@@ -556,10 +557,10 @@
TEST_F(DefaultVehicleHalTest, testGetAllPropConfigsSmall) {
auto testConfigs = std::vector<VehiclePropConfig>({
VehiclePropConfig{
- .prop = 1,
+ .prop = testInt32VecProp(1),
},
VehiclePropConfig{
- .prop = 2,
+ .prop = testInt32VecProp(2),
},
});
@@ -580,7 +581,7 @@
// 5000 VehiclePropConfig exceeds 4k memory limit, so it would be sent through shared memory.
for (size_t i = 0; i < 5000; i++) {
testConfigs.push_back(VehiclePropConfig{
- .prop = static_cast<int32_t>(i),
+ .prop = testInt32VecProp(i),
});
}
@@ -600,13 +601,42 @@
ASSERT_EQ(result.value().getObject()->payloads, testConfigs);
}
+TEST_F(DefaultVehicleHalTest, testGetAllPropConfigsFilterOutUnsupportedPropIdsForThisVersion) {
+ auto testConfigs = std::vector<VehiclePropConfig>({
+ // This is supported from V2.
+ VehiclePropConfig{
+ .prop = toInt(VehicleProperty::PERF_VEHICLE_SPEED),
+ },
+ // This is supported from V3
+ VehiclePropConfig{
+ .prop = toInt(VehicleProperty::ULTRASONICS_SENSOR_POSITION),
+ },
+ });
+
+ auto hardware = std::make_unique<MockVehicleHardware>();
+ hardware->setPropertyConfigs(testConfigs);
+ auto vhal = ndk::SharedRefBase::make<DefaultVehicleHal>(std::move(hardware),
+ /* testInterfaceVersion= */ 2);
+ std::shared_ptr<IVehicle> client = IVehicle::fromBinder(vhal->asBinder());
+
+ VehiclePropConfigs output;
+ auto status = client->getAllPropConfigs(&output);
+
+ ASSERT_TRUE(status.isOk()) << "getAllPropConfigs failed: " << status.getMessage();
+ ASSERT_THAT(output.payloads, ElementsAre(VehiclePropConfig{
+ .prop = toInt(VehicleProperty::PERF_VEHICLE_SPEED),
+ }));
+}
+
TEST_F(DefaultVehicleHalTest, testGetPropConfigs) {
+ int32_t propId1 = testInt32VecProp(1);
+ int32_t propId2 = testInt32VecProp(2);
auto testConfigs = std::vector<VehiclePropConfig>({
VehiclePropConfig{
- .prop = 1,
+ .prop = propId1,
},
VehiclePropConfig{
- .prop = 2,
+ .prop = propId2,
},
});
@@ -616,7 +646,7 @@
std::shared_ptr<IVehicle> client = IVehicle::fromBinder(vhal->asBinder());
VehiclePropConfigs output;
- auto status = client->getPropConfigs(std::vector<int32_t>({1, 2}), &output);
+ auto status = client->getPropConfigs(std::vector<int32_t>({propId1, propId2}), &output);
ASSERT_TRUE(status.isOk()) << "getPropConfigs failed: " << status.getMessage();
ASSERT_EQ(output.payloads, testConfigs);
@@ -625,10 +655,10 @@
TEST_F(DefaultVehicleHalTest, testGetPropConfigsInvalidArg) {
auto testConfigs = std::vector<VehiclePropConfig>({
VehiclePropConfig{
- .prop = 1,
+ .prop = testInt32VecProp(1),
},
VehiclePropConfig{
- .prop = 2,
+ .prop = testInt32VecProp(2),
},
});
@@ -638,7 +668,9 @@
std::shared_ptr<IVehicle> client = IVehicle::fromBinder(vhal->asBinder());
VehiclePropConfigs output;
- auto status = client->getPropConfigs(std::vector<int32_t>({1, 2, 3}), &output);
+ auto status = client->getPropConfigs(
+ std::vector<int32_t>({testInt32VecProp(1), testInt32VecProp(2), testInt32VecProp(3)}),
+ &output);
ASSERT_FALSE(status.isOk()) << "getPropConfigs must fail with invalid prop ID";
ASSERT_EQ(status.getServiceSpecificError(), toInt(StatusCode::INVALID_ARG));
diff --git a/automotive/vehicle/aidl_property/Android.bp b/automotive/vehicle/aidl_property/Android.bp
index db96382..345a2e6 100644
--- a/automotive/vehicle/aidl_property/Android.bp
+++ b/automotive/vehicle/aidl_property/Android.bp
@@ -42,6 +42,9 @@
"com.android.car.framework",
],
},
+ rust: {
+ enabled: true,
+ },
},
versions_with_info: [
{
diff --git a/automotive/vehicle/aidl_property/android/hardware/automotive/vehicle/VehicleApPowerStateShutdownParam.aidl b/automotive/vehicle/aidl_property/android/hardware/automotive/vehicle/VehicleApPowerStateShutdownParam.aidl
index 966ff65..538b905 100644
--- a/automotive/vehicle/aidl_property/android/hardware/automotive/vehicle/VehicleApPowerStateShutdownParam.aidl
+++ b/automotive/vehicle/aidl_property/android/hardware/automotive/vehicle/VehicleApPowerStateShutdownParam.aidl
@@ -20,7 +20,7 @@
@Backing(type="int")
enum VehicleApPowerStateShutdownParam {
/**
- * AP must shutdown without Garage mode. Postponing is not allowed.
+ * AP must shutdown without Garage mode.
* If AP need to shutdown as soon as possible, EMERGENCY_SHUTDOWN shall be used.
*/
SHUTDOWN_IMMEDIATELY = 1,
@@ -36,13 +36,11 @@
SHUTDOWN_ONLY = 3,
/**
* AP can enter deep sleep, without Garage mode.
- * Postponing is not allowed.
* Depending on the actual implementation, it may shut down immediately
*/
SLEEP_IMMEDIATELY = 4,
/**
* AP can hibernate (suspend to disk) without Garage mode.
- * Postponing is not allowed.
* Depending on the actual implementation, it may shut down immediately.
*/
HIBERNATE_IMMEDIATELY = 5,
diff --git a/automotive/vehicle/aidl_property/android/hardware/automotive/vehicle/VehicleProperty.aidl b/automotive/vehicle/aidl_property/android/hardware/automotive/vehicle/VehicleProperty.aidl
index fb8f730..026c040 100644
--- a/automotive/vehicle/aidl_property/android/hardware/automotive/vehicle/VehicleProperty.aidl
+++ b/automotive/vehicle/aidl_property/android/hardware/automotive/vehicle/VehicleProperty.aidl
@@ -52,6 +52,7 @@
*
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
INFO_VIN = 0x0100 + 0x10000000 + 0x01000000
+ 0x00100000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:STRING
@@ -60,6 +61,7 @@
*
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
INFO_MAKE = 0x0101 + 0x10000000 + 0x01000000
+ 0x00100000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:STRING
@@ -68,6 +70,7 @@
*
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
INFO_MODEL = 0x0102 + 0x10000000 + 0x01000000
+ 0x00100000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:STRING
@@ -77,6 +80,7 @@
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:YEAR
+ * @version 2
*/
INFO_MODEL_YEAR = 0x0103 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -86,6 +90,7 @@
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:MILLILITER
+ * @version 2
*/
INFO_FUEL_CAPACITY = 0x0104 + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -105,6 +110,7 @@
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
* @data_enum FuelType
+ * @version 2
*/
INFO_FUEL_TYPE = 0x0105 + 0x10000000 + 0x01000000
+ 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
@@ -119,6 +125,7 @@
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:WH
+ * @version 2
*/
INFO_EV_BATTERY_CAPACITY = 0x0106 + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -128,6 +135,7 @@
* @change_mode VehiclePropertyChangeMode.STATIC
* @data_enum EvConnectorType
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
INFO_EV_CONNECTOR_TYPE = 0x0107 + 0x10000000 + 0x01000000
+ 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
@@ -137,6 +145,7 @@
* @change_mode VehiclePropertyChangeMode.STATIC
* @data_enum PortLocationType
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
INFO_FUEL_DOOR_LOCATION = 0x0108 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -146,6 +155,7 @@
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
* @data_enum PortLocationType
+ * @version 2
*/
INFO_EV_PORT_LOCATION = 0x0109 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -156,6 +166,7 @@
* @change_mode VehiclePropertyChangeMode.STATIC
* @data_enum VehicleAreaSeat
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
INFO_DRIVER_SEAT = 0x010A + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -174,6 +185,7 @@
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:MILLIMETER
+ * @version 2
*/
INFO_EXTERIOR_DIMENSIONS = 0x010B + 0x10000000 + 0x01000000
+ 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
@@ -189,6 +201,7 @@
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
* @data_enum PortLocationType
+ * @version 2
*/
INFO_MULTI_EV_PORT_LOCATIONS = 0x010C + 0x10000000 + 0x01000000
+ 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
@@ -198,6 +211,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:KILOMETER
+ * @version 2
*/
PERF_ODOMETER = 0x0204 + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -213,6 +227,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:METER_PER_SEC
+ * @version 2
*/
PERF_VEHICLE_SPEED = 0x0207 + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -225,6 +240,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:METER_PER_SEC
+ * @version 2
*/
PERF_VEHICLE_SPEED_DISPLAY = 0x0208 + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -236,6 +252,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:DEGREES
+ * @version 2
*/
PERF_STEERING_ANGLE = 0x0209 + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -247,6 +264,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:DEGREES
+ * @version 2
*/
PERF_REAR_STEERING_ANGLE = 0x0210 + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -256,6 +274,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:CELSIUS
+ * @version 2
*/
ENGINE_COOLANT_TEMP = 0x0301 + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -265,6 +284,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleOilLevel
+ * @version 2
*/
ENGINE_OIL_LEVEL = 0x0303 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -274,6 +294,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:CELSIUS
+ * @version 2
*/
ENGINE_OIL_TEMP = 0x0304 + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -283,6 +304,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:RPM
+ * @version 2
*/
ENGINE_RPM = 0x0305 + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -323,6 +345,7 @@
*
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
WHEEL_TICK = 0x0306 + 0x10000000 + 0x01000000
+ 0x00510000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT64_VEC
@@ -334,6 +357,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:MILLILITER
+ * @version 2
*/
FUEL_LEVEL = 0x0307 + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -346,6 +370,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
FUEL_DOOR_OPEN = 0x0308 + 0x10000000 + 0x01000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN
@@ -359,6 +384,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:WH
+ * @version 2
*/
EV_BATTERY_LEVEL = 0x0309 + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -373,6 +399,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:WH
+ * @version 2
*/
EV_CURRENT_BATTERY_CAPACITY =
0x030D + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.FLOAT,
@@ -385,6 +412,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
EV_CHARGE_PORT_OPEN = 0x030A + 0x10000000 + 0x01000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN
@@ -393,6 +421,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
EV_CHARGE_PORT_CONNECTED = 0x030B + 0x10000000 + 0x01000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN
@@ -405,6 +434,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:MW
+ * @version 2
*/
EV_BATTERY_INSTANTANEOUS_CHARGE_RATE = 0x030C + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -423,6 +453,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:METER
+ * @version 2
*/
RANGE_REMAINING = 0x0308 + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -436,6 +467,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:CELSIUS
+ * @version 3
*/
EV_BATTERY_AVERAGE_TEMPERATURE =
0x030E + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.FLOAT,
@@ -463,6 +495,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:KILOPASCAL
+ * @version 2
*/
TIRE_PRESSURE = 0x0309 + 0x10000000 + 0x07000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:WHEEL,VehiclePropertyType:FLOAT
@@ -478,6 +511,7 @@
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:KILOPASCAL
+ * @version 2
*/
CRITICALLY_LOW_TIRE_PRESSURE = 0x030A + 0x10000000 + 0x07000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:WHEEL,VehiclePropertyType:FLOAT
@@ -493,6 +527,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
ENGINE_IDLE_AUTO_STOP_ENABLED =
0x0320 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -509,6 +544,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum ImpactSensorLocation
+ * @version 3
*/
IMPACT_DETECTED =
0x0330 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -529,6 +565,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleGear
+ * @version 2
*/
GEAR_SELECTION = 0x0400 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -548,6 +585,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleGear
+ * @version 2
*/
CURRENT_GEAR = 0x0401 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -559,6 +597,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
PARKING_BRAKE_ON = 0x0402 + 0x10000000 + 0x01000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN
@@ -576,6 +615,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
PARKING_BRAKE_AUTO_APPLY = 0x0403 + 0x10000000 + 0x01000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN
@@ -594,6 +634,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
EV_BRAKE_REGENERATION_LEVEL =
0x040C + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -612,6 +653,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
FUEL_LEVEL_LOW = 0x0405 + 0x10000000 + 0x01000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN
@@ -624,6 +666,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
NIGHT_MODE = 0x0407 + 0x10000000 + 0x01000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN
@@ -633,6 +676,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleTurnSignal
+ * @version 2
*/
TURN_SIGNAL_STATE = 0x0408 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -642,6 +686,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleIgnitionState
+ * @version 2
*/
IGNITION_STATE = 0x0409 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -654,6 +699,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
ABS_ACTIVE = 0x040A + 0x10000000 + 0x01000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN
@@ -666,6 +712,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
TRACTION_CONTROL_ACTIVE = 0x040B + 0x10000000 + 0x01000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN
@@ -684,6 +731,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum EvStoppingMode
+ * @version 2
*/
EV_STOPPING_MODE =
0x040D + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -705,6 +753,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
ELECTRONIC_STABILITY_CONTROL_ENABLED =
0x040E + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -723,6 +772,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum ElectronicStabilityControlState
* @data_enum ErrorState
+ * @version 2
*/
ELECTRONIC_STABILITY_CONTROL_STATE =
0x040F + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -789,6 +839,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HVAC_FAN_SPEED = 0x0500 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -802,6 +853,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleHvacFanDirection
+ * @version 2
*/
HVAC_FAN_DIRECTION = 0x0501 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -811,6 +863,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:CELSIUS
+ * @version 2
*/
HVAC_TEMPERATURE_CURRENT = 0x0502 + 0x10000000 + 0x05000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:FLOAT
@@ -842,6 +895,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:CELSIUS
+ * @version 2
*/
HVAC_TEMPERATURE_SET = 0x0503 + 0x10000000 + 0x05000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:FLOAT
@@ -854,6 +908,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HVAC_DEFROSTER = 0x0504 + 0x10000000 + 0x03000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:WINDOW,VehiclePropertyType:BOOLEAN
@@ -867,6 +922,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @config_flags Supported areaIds
+ * @version 2
*/
HVAC_AC_ON = 0x0505 + 0x10000000 + 0x05000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN
@@ -884,6 +940,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HVAC_MAX_AC_ON = 0x0506 + 0x10000000 + 0x05000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN
@@ -907,6 +964,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HVAC_MAX_DEFROST_ON = 0x0507 + 0x10000000 + 0x05000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN
@@ -924,6 +982,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HVAC_RECIRC_ON = 0x0508 + 0x10000000 + 0x05000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN
@@ -963,6 +1022,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HVAC_DUAL_ON = 0x0509 + 0x10000000 + 0x05000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN
@@ -985,6 +1045,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HVAC_AUTO_ON = 0x050A + 0x10000000 + 0x05000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN
@@ -1007,6 +1068,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HVAC_SEAT_TEMPERATURE = 0x050B + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -1030,6 +1092,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HVAC_SIDE_MIRROR_HEAT = 0x050C + 0x10000000 + 0x04000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:MIRROR,VehiclePropertyType:INT32
@@ -1053,6 +1116,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HVAC_STEERING_WHEEL_HEAT = 0x050D + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -1079,6 +1143,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleUnit
+ * @version 2
*/
HVAC_TEMPERATURE_DISPLAY_UNITS = 0x050E + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -1087,6 +1152,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HVAC_ACTUAL_FAN_SPEED_RPM = 0x050F + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -1133,6 +1199,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HVAC_POWER_ON = 0x0510 + 0x10000000 + 0x05000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN
@@ -1152,6 +1219,7 @@
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
* @data_enum VehicleHvacFanDirection
+ * @version 2
*/
HVAC_FAN_DIRECTION_AVAILABLE = 0x0511 + 0x10000000 + 0x05000000
+ 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32_VEC
@@ -1168,6 +1236,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HVAC_AUTO_RECIRC_ON = 0x0512 + 0x10000000 + 0x05000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN
@@ -1193,6 +1262,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HVAC_SEAT_VENTILATION = 0x0513 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -1205,6 +1275,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HVAC_ELECTRIC_DEFROSTER_ON = 0x0514 + 0x10000000 + 0x03000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:WINDOW,VehiclePropertyType:BOOLEAN
@@ -1245,6 +1316,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
+ * @version 2
*/
HVAC_TEMPERATURE_VALUE_SUGGESTION = 0x0515 + 0x10000000 + 0x01000000
+ 0x00610000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT_VEC
@@ -1270,6 +1342,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleUnit
+ * @version 2
*/
DISTANCE_DISPLAY_UNITS = 0x0600 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -1294,6 +1367,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleUnit
+ * @version 2
*/
FUEL_VOLUME_DISPLAY_UNITS = 0x0601 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -1319,6 +1393,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleUnit
+ * @version 2
*/
TIRE_PRESSURE_DISPLAY_UNITS = 0x0602 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -1344,6 +1419,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleUnit
+ * @version 2
*/
EV_BATTERY_DISPLAY_UNITS = 0x0603 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -1360,6 +1436,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME = 0x0604 + 0x10000000 + 0x01000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN
@@ -1383,6 +1460,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
VEHICLE_SPEED_DISPLAY_UNITS = 0x0605 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -1427,6 +1505,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:MILLI_SECS
+ * @version 2
*/
EXTERNAL_CAR_TIME = 0x0608 + 0x10000000 // VehiclePropertyGroup:SYSTEM
+ 0x01000000 // VehicleArea:GLOBAL
@@ -1456,6 +1535,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.WRITE
* @unit VehicleUnit:MILLI_SECS
+ * @version 2
*/
ANDROID_EPOCH_TIME = 0x0606 + 0x10000000 + 0x01000000
+ 0x00500000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT64
@@ -1470,6 +1550,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
+ * @version 2
*/
STORAGE_ENCRYPTION_BINDING_SEED = 0x0607 + 0x10000000 + 0x01000000
+ 0x00700000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BYTES
@@ -1479,6 +1560,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:CELSIUS
+ * @version 2
*/
ENV_OUTSIDE_TEMPERATURE = 0x0703 + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -1497,6 +1579,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
AP_POWER_STATE_REQ = 0x0A00 + 0x10000000 + 0x01000000
+ 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
@@ -1511,6 +1594,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
+ * @version 2
*/
AP_POWER_STATE_REPORT = 0x0A01 + 0x10000000 + 0x01000000
+ 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
@@ -1525,6 +1609,7 @@
*
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
AP_POWER_BOOTUP_REASON = 0x0A02 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -1547,6 +1632,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
+ * @version 2
*/
DISPLAY_BRIGHTNESS = 0x0A03 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -1570,6 +1656,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
+ * @version 2
*/
PER_DISPLAY_BRIGHTNESS = 0x0A04 + 0x10000000 + 0x01000000
+ 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
@@ -1586,6 +1673,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
VALET_MODE_ENABLED =
0x0A05 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -1602,6 +1690,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
HEAD_UP_DISPLAY_ENABLED =
0x0A06 + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.BOOLEAN,
@@ -1619,6 +1708,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @config_flags
+ * @version 2
*/
HW_KEY_INPUT = 0x0A10 + 0x10000000 + 0x01000000
+ 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
@@ -1641,6 +1731,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @config_flags
+ * @version 2
*/
HW_KEY_INPUT_V2 =
0x0A11 + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.MIXED,
@@ -1675,6 +1766,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @config_flags
+ * @version 2
*/
HW_MOTION_INPUT =
0x0A12 + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.MIXED,
@@ -1698,6 +1790,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @data_enum RotaryInputType
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HW_ROTARY_INPUT = 0x0A20 + 0x10000000 + 0x01000000
+ 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
@@ -1721,6 +1814,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @data_enum CustomInputType
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HW_CUSTOM_INPUT = 0X0A30 + 0x10000000 + 0x01000000
+ 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
@@ -1765,6 +1859,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
DOOR_POS = 0x0B00 + 0x10000000 + 0x06000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:DOOR,VehiclePropertyType:INT32
@@ -1790,6 +1885,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
DOOR_MOVE = 0x0B01 + 0x10000000 + 0x06000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:DOOR,VehiclePropertyType:INT32
@@ -1804,6 +1900,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
DOOR_LOCK = 0x0B02 + 0x10000000 + 0x06000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:DOOR,VehiclePropertyType:BOOLEAN
@@ -1820,6 +1917,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
DOOR_CHILD_LOCK_ENABLED =
0x0B03 + VehiclePropertyGroup.SYSTEM + VehicleArea.DOOR + VehiclePropertyType.BOOLEAN,
@@ -1846,6 +1944,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
MIRROR_Z_POS = 0x0B40 + 0x10000000 + 0x04000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:MIRROR,VehiclePropertyType:INT32
@@ -1872,6 +1971,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
MIRROR_Z_MOVE = 0x0B41 + 0x10000000 + 0x04000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:MIRROR,VehiclePropertyType:INT32
@@ -1898,6 +1998,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
MIRROR_Y_POS = 0x0B42 + 0x10000000 + 0x04000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:MIRROR,VehiclePropertyType:INT32
@@ -1923,6 +2024,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
MIRROR_Y_MOVE = 0x0B43 + 0x10000000 + 0x04000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:MIRROR,VehiclePropertyType:INT32
@@ -1937,6 +2039,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
MIRROR_LOCK = 0x0B44 + 0x10000000 + 0x01000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN
@@ -1951,6 +2054,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
MIRROR_FOLD = 0x0B45 + 0x10000000 + 0x01000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN
@@ -1968,6 +2072,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
MIRROR_AUTO_FOLD_ENABLED =
@@ -1986,6 +2091,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
MIRROR_AUTO_TILT_ENABLED =
@@ -2005,6 +2111,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.WRITE
+ * @version 2
*/
SEAT_MEMORY_SELECT = 0x0B80 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2018,6 +2125,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.WRITE
+ * @version 2
*/
SEAT_MEMORY_SET = 0x0B81 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2035,6 +2143,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_BELT_BUCKLED = 0x0B82 + 0x10000000 + 0x05000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN
@@ -2060,6 +2169,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_BELT_HEIGHT_POS = 0x0B83 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2088,6 +2198,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_BELT_HEIGHT_MOVE = 0x0B84 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2113,6 +2224,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_FORE_AFT_POS = 0x0B85 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2140,6 +2252,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_FORE_AFT_MOVE = 0x0B86 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2167,6 +2280,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_BACKREST_ANGLE_1_POS = 0x0B87 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2194,6 +2308,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_BACKREST_ANGLE_1_MOVE = 0x0B88 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2223,6 +2338,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_BACKREST_ANGLE_2_POS = 0x0B89 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2250,6 +2366,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_BACKREST_ANGLE_2_MOVE = 0x0B8A + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2273,6 +2390,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_HEIGHT_POS = 0x0B8B + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2298,6 +2416,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_HEIGHT_MOVE = 0x0B8C + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2326,6 +2445,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_DEPTH_POS = 0x0B8D + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2352,6 +2472,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_DEPTH_MOVE = 0x0B8E + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2379,6 +2500,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_TILT_POS = 0x0B8F + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2406,6 +2528,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_TILT_MOVE = 0x0B90 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2431,6 +2554,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_LUMBAR_FORE_AFT_POS = 0x0B91 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2459,6 +2583,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_LUMBAR_FORE_AFT_MOVE = 0x0B92 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2484,6 +2609,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_LUMBAR_SIDE_SUPPORT_POS = 0x0B93 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2512,6 +2638,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_LUMBAR_SIDE_SUPPORT_MOVE = 0x0B94 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2532,6 +2659,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_HEADREST_HEIGHT_POS = 0x0B95 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -2559,6 +2687,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_HEADREST_HEIGHT_POS_V2 =
0x0BA4 + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.INT32,
@@ -2588,6 +2717,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_HEADREST_HEIGHT_MOVE = 0x0B96 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2611,6 +2741,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_HEADREST_ANGLE_POS = 0x0B97 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2639,6 +2770,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_HEADREST_ANGLE_MOVE = 0x0B98 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2662,6 +2794,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_HEADREST_FORE_AFT_POS = 0x0B99 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2690,6 +2823,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_HEADREST_FORE_AFT_MOVE = 0x0B9A + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2711,6 +2845,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @version 2
*/
SEAT_FOOTWELL_LIGHTS_STATE =
0x0B9B + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.INT32,
@@ -2736,6 +2871,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @version 2
*/
SEAT_FOOTWELL_LIGHTS_SWITCH =
0x0B9C + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.INT32,
@@ -2752,6 +2888,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_EASY_ACCESS_ENABLED =
0x0B9D + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.BOOLEAN,
@@ -2772,6 +2909,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
SEAT_AIRBAG_ENABLED =
0x0B9E + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.BOOLEAN,
@@ -2794,6 +2932,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleAirbagLocation
+ * @version 2
*/
SEAT_AIRBAGS_DEPLOYED =
0x0BA5 + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.INT32,
@@ -2819,6 +2958,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_CUSHION_SIDE_SUPPORT_POS =
0x0B9F + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.INT32,
@@ -2847,6 +2987,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_CUSHION_SIDE_SUPPORT_MOVE =
0x0BA0 + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.INT32,
@@ -2870,6 +3011,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_LUMBAR_VERTICAL_POS =
0x0BA1 + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.INT32,
@@ -2896,6 +3038,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_LUMBAR_VERTICAL_MOVE =
0x0BA2 + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.INT32,
@@ -2922,6 +3065,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SEAT_WALK_IN_POS =
0x0BA3 + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.INT32,
@@ -2940,6 +3084,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
SEAT_BELT_PRETENSIONER_DEPLOYED =
0x0BA6 + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.BOOLEAN,
@@ -2952,6 +3097,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleSeatOccupancyState
+ * @version 2
*/
SEAT_OCCUPANCY = 0x0BB0 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -2988,6 +3134,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
WINDOW_POS = 0x0BC0 + 0x10000000 + 0x03000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:WINDOW,VehiclePropertyType:INT32
@@ -3030,6 +3177,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
WINDOW_MOVE = 0x0BC1 + 0x10000000 + 0x03000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:WINDOW,VehiclePropertyType:INT32
@@ -3044,6 +3192,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
WINDOW_LOCK = 0x0BC4 + 0x10000000 + 0x03000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:WINDOW,VehiclePropertyType:BOOLEAN
@@ -3064,6 +3213,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:MILLI_SECS
+ * @version 2
*/
WINDSHIELD_WIPERS_PERIOD =
0x0BC5 + VehiclePropertyGroup.SYSTEM + VehicleArea.WINDOW + VehiclePropertyType.INT32,
@@ -3085,6 +3235,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum WindshieldWipersState
+ * @version 2
*/
WINDSHIELD_WIPERS_STATE =
0x0BC6 + VehiclePropertyGroup.SYSTEM + VehicleArea.WINDOW + VehiclePropertyType.INT32,
@@ -3111,6 +3262,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum WindshieldWipersSwitch
+ * @version 2
*/
WINDSHIELD_WIPERS_SWITCH =
0x0BC7 + VehiclePropertyGroup.SYSTEM + VehicleArea.WINDOW + VehiclePropertyType.INT32,
@@ -3137,6 +3289,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
STEERING_WHEEL_DEPTH_POS =
0x0BE0 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -3163,6 +3316,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
STEERING_WHEEL_DEPTH_MOVE =
0x0BE1 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -3186,6 +3340,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
STEERING_WHEEL_HEIGHT_POS =
0x0BE2 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -3212,6 +3367,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
STEERING_WHEEL_HEIGHT_MOVE =
0x0BE3 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -3227,6 +3383,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
STEERING_WHEEL_THEFT_LOCK_ENABLED =
0x0BE4 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -3241,6 +3398,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
STEERING_WHEEL_LOCKED =
0x0BE5 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -3256,6 +3414,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
STEERING_WHEEL_EASY_ACCESS_ENABLED =
0x0BE6 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -3283,6 +3442,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
GLOVE_BOX_DOOR_POS =
0x0BF0 + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.INT32,
@@ -3302,6 +3462,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
GLOVE_BOX_LOCKED =
0x0BF1 + VehiclePropertyGroup.SYSTEM + VehicleArea.SEAT + VehiclePropertyType.BOOLEAN,
@@ -3321,6 +3482,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
+ * @version 2
*/
VEHICLE_MAP_SERVICE = 0x0C00 + 0x10000000 + 0x01000000
+ 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED
@@ -3340,6 +3502,7 @@
*
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
LOCATION_CHARACTERIZATION =
0x0C10 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -3363,6 +3526,7 @@
*
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
ULTRASONICS_SENSOR_POSITION = 0x0C20 + VehiclePropertyGroup.SYSTEM + VehicleArea.VENDOR
+ VehiclePropertyType.INT32_VEC,
@@ -3394,6 +3558,7 @@
*
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
ULTRASONICS_SENSOR_ORIENTATION = 0x0C21 + VehiclePropertyGroup.SYSTEM + VehicleArea.VENDOR
+ VehiclePropertyType.INT32_VEC,
@@ -3417,6 +3582,7 @@
*
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
ULTRASONICS_SENSOR_FIELD_OF_VIEW = 0x0C22 + VehiclePropertyGroup.SYSTEM + VehicleArea.VENDOR
+ VehiclePropertyType.INT32_VEC,
@@ -3438,6 +3604,7 @@
*
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
ULTRASONICS_SENSOR_DETECTION_RANGE = 0x0C23 + VehiclePropertyGroup.SYSTEM + VehicleArea.VENDOR
+ VehiclePropertyType.INT32_VEC,
@@ -3484,6 +3651,7 @@
*
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
ULTRASONICS_SENSOR_SUPPORTED_RANGES = 0x0C24 + VehiclePropertyGroup.SYSTEM + VehicleArea.VENDOR
+ VehiclePropertyType.INT32_VEC,
@@ -3510,6 +3678,7 @@
*
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
ULTRASONICS_SENSOR_MEASURED_DISTANCE = 0x0C25 + VehiclePropertyGroup.SYSTEM + VehicleArea.VENDOR
+ VehiclePropertyType.INT32_VEC,
@@ -3554,6 +3723,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
OBD2_LIVE_FRAME = 0x0D00 + 0x10000000 + 0x01000000
+ 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED
@@ -3580,6 +3750,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
OBD2_FREEZE_FRAME = 0x0D01 + 0x10000000 + 0x01000000
+ 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED
@@ -3597,6 +3768,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
OBD2_FREEZE_FRAME_INFO = 0x0D02 + 0x10000000 + 0x01000000
+ 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED
@@ -3619,6 +3791,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.WRITE
+ * @version 2
*/
OBD2_FREEZE_FRAME_CLEAR = 0x0D03 + 0x10000000 + 0x01000000
+ 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED
@@ -3630,6 +3803,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @version 2
*/
HEADLIGHTS_STATE = 0x0E00 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -3641,6 +3815,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @version 2
*/
HIGH_BEAM_LIGHTS_STATE = 0x0E01 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -3668,6 +3843,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @version 2
*/
FOG_LIGHTS_STATE = 0x0E02 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -3679,6 +3855,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @version 2
*/
HAZARD_LIGHTS_STATE = 0x0E03 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -3694,6 +3871,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @version 2
*/
HEADLIGHTS_SWITCH = 0x0E10 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -3709,6 +3887,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @version 2
*/
HIGH_BEAM_LIGHTS_SWITCH = 0x0E11 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -3740,6 +3919,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @version 2
*/
FOG_LIGHTS_SWITCH = 0x0E12 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -3755,6 +3935,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @version 2
*/
HAZARD_LIGHTS_SWITCH = 0x0E13 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -3766,6 +3947,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @version 2
*/
CABIN_LIGHTS_STATE = 0x0F01 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -3784,6 +3966,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @version 2
*/
CABIN_LIGHTS_SWITCH = 0x0F02 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -3795,6 +3978,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @version 2
*/
READING_LIGHTS_STATE = 0x0F03 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -3813,6 +3997,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @version 2
*/
READING_LIGHTS_SWITCH = 0x0F04 + 0x10000000 + 0x05000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32
@@ -3834,6 +4019,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @version 2
*/
STEERING_WHEEL_LIGHTS_STATE =
0x0F0C + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -3859,6 +4045,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @version 2
*/
STEERING_WHEEL_LIGHTS_SWITCH =
0x0F0D + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -3887,6 +4074,7 @@
*
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SUPPORT_CUSTOMIZE_VENDOR_PERMISSION = 0x0F05 + 0x10000000 + 0x01000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN
@@ -3903,6 +4091,7 @@
* ex) "com.android.car.user.CarUserNoticeService,storage_monitoring"
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
DISABLED_OPTIONAL_FEATURES = 0x0F06 + 0x10000000 + 0x01000000
+ 0x00100000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:STRING
@@ -3953,6 +4142,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
+ * @version 2
*/
INITIAL_USER_INFO = 0x0F07 + 0x10000000 + 0x01000000
+ 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED
@@ -4119,6 +4309,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
+ * @version 2
*/
SWITCH_USER = 0x0F08 + 0x10000000 + 0x01000000
+ 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED
@@ -4165,6 +4356,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
+ * @version 2
*/
CREATE_USER = 0x0F09 + 0x10000000 + 0x01000000
+ 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED
@@ -4196,6 +4388,7 @@
*
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.WRITE
+ * @version 2
*/
REMOVE_USER = 0x0F0A + 0x10000000 + 0x01000000
+ 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED
@@ -4271,6 +4464,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
+ * @version 2
*/
USER_IDENTIFICATION_ASSOCIATION = 0x0F0B + 0x10000000 + 0x01000000
+ 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED
@@ -4290,6 +4484,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
EVS_SERVICE_REQUEST = 0x0F10 + 0x10000000 + 0x01000000
+ 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
@@ -4307,6 +4502,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
POWER_POLICY_REQ = 0x0F21 + 0x10000000 + 0x01000000
+ 0x00100000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:STRING
@@ -4326,6 +4522,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
POWER_POLICY_GROUP_REQ = 0x0F22 + 0x10000000 + 0x01000000
+ 0x00100000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:STRING
@@ -4338,6 +4535,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
+ * @version 2
*/
CURRENT_POWER_POLICY = 0x0F23 + 0x10000000 + 0x01000000
+ 0x00100000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:STRING
@@ -4349,6 +4547,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.WRITE
+ * @version 2
*/
WATCHDOG_ALIVE = 0xF31 + 0x10000000 + 0x01000000
+ 0x00500000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT64
@@ -4360,6 +4559,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.WRITE
+ * @version 2
*/
WATCHDOG_TERMINATED_PROCESS = 0x0F32 + 0x10000000 + 0x01000000
+ 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED
@@ -4375,6 +4575,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
VHAL_HEARTBEAT = 0x0F33 + 0x10000000 + 0x01000000
+ 0x00500000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT64
@@ -4388,6 +4589,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
CLUSTER_SWITCH_UI = 0x0F34 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -4412,6 +4614,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
CLUSTER_DISPLAY_STATE = 0x0F35 + 0x10000000 + 0x01000000
+ 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
@@ -4447,6 +4650,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.WRITE
+ * @version 2
*/
CLUSTER_REPORT_STATE = 0x0F36 + 0x10000000 + 0x01000000
+ 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED
@@ -4461,6 +4665,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.WRITE
+ * @version 2
*/
CLUSTER_REQUEST_DISPLAY = 0x0F37 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -4471,6 +4676,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.WRITE
+ * @version 2
*/
CLUSTER_NAVIGATION_STATE = 0x0F38 + 0x10000000 + 0x01000000
+ 0x00700000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BYTES
@@ -4484,6 +4690,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum ElectronicTollCollectionCardType
+ * @version 2
*/
ELECTRONIC_TOLL_COLLECTION_CARD_TYPE = 0x0F39 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -4498,6 +4705,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum ElectronicTollCollectionCardStatus
+ * @version 2
*/
ELECTRONIC_TOLL_COLLECTION_CARD_STATUS = 0x0F3A + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -4511,6 +4719,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @version 2
*/
FRONT_FOG_LIGHTS_STATE = 0x0F3B + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -4529,6 +4738,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @version 2
*/
FRONT_FOG_LIGHTS_SWITCH = 0x0F3C + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -4543,6 +4753,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @version 2
*/
REAR_FOG_LIGHTS_STATE = 0x0F3D + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -4561,6 +4772,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @version 2
*/
REAR_FOG_LIGHTS_SWITCH = 0x0F3E + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -4578,6 +4790,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:AMPERE
+ * @version 2
*/
EV_CHARGE_CURRENT_DRAW_LIMIT = 0x0F3F + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -4599,6 +4812,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
EV_CHARGE_PERCENT_LIMIT = 0x0F40 + 0x10000000 + 0x01000000
+ 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT
@@ -4611,6 +4825,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum EvChargeState
+ * @version 2
*/
EV_CHARGE_STATE = 0x0F41 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -4627,6 +4842,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
EV_CHARGE_SWITCH = 0x0F42 + 0x10000000 + 0x01000000
+ 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN
@@ -4639,6 +4855,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:SECS
+ * @version 2
*/
EV_CHARGE_TIME_REMAINING = 0x0F43 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -4652,6 +4869,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum EvRegenerativeBrakingState
+ * @version 2
*/
EV_REGENERATIVE_BRAKING_STATE = 0x0F44 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -4664,6 +4882,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum TrailerState
+ * @version 2
*/
TRAILER_PRESENT = 0x0F45 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -4687,6 +4906,7 @@
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:KILOGRAM
+ * @version 2
*/
VEHICLE_CURB_WEIGHT = 0x0F46 + 0x10000000 + 0x01000000
@@ -4701,6 +4921,7 @@
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
* @data_enum GsrComplianceRequirementType
+ * @version 2
*/
GENERAL_SAFETY_REGULATION_COMPLIANCE_REQUIREMENT = 0x0F47 + 0x10000000 + 0x01000000
+ 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32
@@ -4725,6 +4946,7 @@
*
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
SUPPORTED_PROPERTY_IDS = 0x0F48 + 0x10000000 + 0x01000000
+ 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
@@ -4772,6 +4994,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.WRITE
* @data_enum VehicleApPowerStateShutdownParam
+ * @version 2
*/
SHUTDOWN_REQUEST =
0x0F49 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -4804,6 +5027,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
VEHICLE_IN_USE =
0x0F4A + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -4818,6 +5042,7 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.WRITE
+ * @version 3
*/
CLUSTER_HEARTBEAT =
0x0F4B + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.MIXED,
@@ -4837,6 +5062,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleAutonomousState
+ * @version 3
*/
VEHICLE_DRIVING_AUTOMATION_CURRENT_LEVEL =
0x0F4C + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -4866,6 +5092,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
AUTOMATIC_EMERGENCY_BRAKING_ENABLED =
0x1000 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -4890,6 +5117,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum AutomaticEmergencyBrakingState
* @data_enum ErrorState
+ * @version 2
*/
AUTOMATIC_EMERGENCY_BRAKING_STATE =
0x1001 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -4911,6 +5139,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
FORWARD_COLLISION_WARNING_ENABLED =
0x1002 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -4930,6 +5159,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum ForwardCollisionWarningState
* @data_enum ErrorState
+ * @version 2
*/
FORWARD_COLLISION_WARNING_STATE =
0x1003 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -4951,6 +5181,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
BLIND_SPOT_WARNING_ENABLED =
0x1004 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -4970,6 +5201,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum BlindSpotWarningState
* @data_enum ErrorState
+ * @version 2
*/
BLIND_SPOT_WARNING_STATE =
0x1005 + VehiclePropertyGroup.SYSTEM + VehicleArea.MIRROR + VehiclePropertyType.INT32,
@@ -4992,6 +5224,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
LANE_DEPARTURE_WARNING_ENABLED =
0x1006 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -5011,6 +5244,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum LaneDepartureWarningState
* @data_enum ErrorState
+ * @version 2
*/
LANE_DEPARTURE_WARNING_STATE =
0x1007 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5037,6 +5271,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
LANE_KEEP_ASSIST_ENABLED =
0x1008 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -5059,6 +5294,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum LaneKeepAssistState
* @data_enum ErrorState
+ * @version 2
*/
LANE_KEEP_ASSIST_STATE =
0x1009 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5086,6 +5322,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
LANE_CENTERING_ASSIST_ENABLED =
0x100A + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -5116,6 +5353,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.WRITE
* @data_enum LaneCenteringAssistCommand
+ * @version 2
*/
LANE_CENTERING_ASSIST_COMMAND =
0x100B + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5138,6 +5376,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum LaneCenteringAssistState
* @data_enum ErrorState
+ * @version 2
*/
LANE_CENTERING_ASSIST_STATE =
0x100C + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5161,6 +5400,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
EMERGENCY_LANE_KEEP_ASSIST_ENABLED =
0x100D + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -5181,6 +5421,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum EmergencyLaneKeepAssistState
* @data_enum ErrorState
+ * @version 2
*/
EMERGENCY_LANE_KEEP_ASSIST_STATE =
0x100E + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5205,6 +5446,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
CRUISE_CONTROL_ENABLED =
0x100F + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -5233,6 +5475,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum CruiseControlType
* @data_enum ErrorState
+ * @version 2
*/
CRUISE_CONTROL_TYPE =
0x1010 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5253,6 +5496,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum CruiseControlState
* @data_enum ErrorState
+ * @version 2
*/
CRUISE_CONTROL_STATE =
0x1011 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5276,6 +5520,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.WRITE
* @data_enum CruiseControlCommand
+ * @version 2
*/
CRUISE_CONTROL_COMMAND =
0x1012 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5299,6 +5544,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:METER_PER_SEC
+ * @version 2
*/
CRUISE_CONTROL_TARGET_SPEED =
0x1013 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.FLOAT,
@@ -5330,6 +5576,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:MILLI_SECS
+ * @version 2
*/
ADAPTIVE_CRUISE_CONTROL_TARGET_TIME_GAP =
0x1014 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5360,6 +5607,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit:MILLIMETER
+ * @version 2
*/
ADAPTIVE_CRUISE_CONTROL_LEAD_VEHICLE_MEASURED_DISTANCE =
0x1015 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5381,6 +5629,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
HANDS_ON_DETECTION_ENABLED =
0x1016 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -5405,6 +5654,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum HandsOnDetectionDriverState
* @data_enum ErrorState
+ * @version 2
*/
HANDS_ON_DETECTION_DRIVER_STATE =
0x1017 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5427,6 +5677,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum HandsOnDetectionWarning
* @data_enum ErrorState
+ * @version 2
*/
HANDS_ON_DETECTION_WARNING =
0x1018 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5449,6 +5700,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
DRIVER_DROWSINESS_ATTENTION_SYSTEM_ENABLED =
0x1019 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -5475,6 +5727,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum DriverDrowsinessAttentionState
* @data_enum ErrorState
+ * @version 3
*/
DRIVER_DROWSINESS_ATTENTION_STATE =
0x101A + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5499,6 +5752,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
DRIVER_DROWSINESS_ATTENTION_WARNING_ENABLED =
0x101B + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -5520,6 +5774,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum DriverDrowsinessAttentionWarning
* @data_enum ErrorState
+ * @version 3
*/
DRIVER_DROWSINESS_ATTENTION_WARNING =
0x101C + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5542,6 +5797,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
DRIVER_DISTRACTION_SYSTEM_ENABLED =
0x101D + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -5566,6 +5822,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum DriverDistractionState
* @data_enum ErrorState
+ * @version 3
*/
DRIVER_DISTRACTION_STATE =
0x101E + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5589,6 +5846,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 2
*/
DRIVER_DISTRACTION_WARNING_ENABLED =
0x101F + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -5610,6 +5868,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum DriverDistractionWarning
* @data_enum ErrorState
+ * @version 3
*/
DRIVER_DISTRACTION_WARNING =
0x1020 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5635,6 +5894,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
LOW_SPEED_COLLISION_WARNING_ENABLED =
0x1021 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -5657,6 +5917,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum LowSpeedCollisionWarningState
* @data_enum ErrorState
+ * @version 3
*/
LOW_SPEED_COLLISION_WARNING_STATE =
0x1022 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5679,6 +5940,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
CROSS_TRAFFIC_MONITORING_ENABLED =
0x1023 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -5698,6 +5960,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum CrossTrafficMonitoringWarningState
* @data_enum ErrorState
+ * @version 3
*/
CROSS_TRAFFIC_MONITORING_WARNING_STATE =
0x1024 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
@@ -5724,6 +5987,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @version 3
*/
LOW_SPEED_AUTOMATIC_EMERGENCY_BRAKING_ENABLED =
0x1025 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.BOOLEAN,
@@ -5750,6 +6014,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum LowSpeedAutomaticEmergencyBrakingState
* @data_enum ErrorState
+ * @version 3
*/
LOW_SPEED_AUTOMATIC_EMERGENCY_BRAKING_STATE =
0x1026 + VehiclePropertyGroup.SYSTEM + VehicleArea.GLOBAL + VehiclePropertyType.INT32,
diff --git a/automotive/vehicle/tools/generate_annotation_enums.py b/automotive/vehicle/tools/generate_annotation_enums.py
index 05fc99a..93d408e 100755
--- a/automotive/vehicle/tools/generate_annotation_enums.py
+++ b/automotive/vehicle/tools/generate_annotation_enums.py
@@ -42,6 +42,8 @@
'AccessForVehicleProperty.java')
ENUM_JAVA_FILE_PATH = ('hardware/interfaces/automotive/vehicle/aidl/generated_lib/java/' +
'EnumForVehicleProperty.java')
+VERSION_CPP_FILE_PATH = ('hardware/interfaces/automotive/vehicle/aidl/generated_lib/cpp/' +
+ 'VersionForVehicleProperty.h')
SCRIPT_PATH = 'hardware/interfaces/automotive/vehicle/tools/generate_annotation_enums.py'
TAB = ' '
@@ -50,6 +52,7 @@
RE_COMMENT_BEGIN = re.compile('\s*\/\*\*?')
RE_COMMENT_END = re.compile('\s*\*\/')
RE_CHANGE_MODE = re.compile('\s*\* @change_mode (\S+)\s*')
+RE_VERSION = re.compile('\s*\* @version (\S+)\s*')
RE_ACCESS = re.compile('\s*\* @access (\S+)\s*')
RE_DATA_ENUM = re.compile('\s*\* @data_enum (\S+)\s*')
RE_UNIT = re.compile('\s*\* @unit (\S+)\s+')
@@ -81,8 +84,7 @@
"""
-CHANGE_MODE_CPP_HEADER = """#ifndef android_hardware_automotive_vehicle_aidl_generated_lib_ChangeModeForVehicleProperty_H_
-#define android_hardware_automotive_vehicle_aidl_generated_lib_ChangeModeForVehicleProperty_H_
+CHANGE_MODE_CPP_HEADER = """#pragma once
#include <aidl/android/hardware/automotive/vehicle/VehicleProperty.h>
#include <aidl/android/hardware/automotive/vehicle/VehiclePropertyChangeMode.h>
@@ -98,7 +100,7 @@
std::unordered_map<VehicleProperty, VehiclePropertyChangeMode> ChangeModeForVehicleProperty = {
"""
-CHANGE_MODE_CPP_FOOTER = """
+CPP_FOOTER = """
};
} // namespace vehicle
@@ -106,12 +108,9 @@
} // namespace hardware
} // namespace android
} // aidl
-
-#endif // android_hardware_automotive_vehicle_aidl_generated_lib_ChangeModeForVehicleProperty_H_
"""
-ACCESS_CPP_HEADER = """#ifndef android_hardware_automotive_vehicle_aidl_generated_lib_AccessForVehicleProperty_H_
-#define android_hardware_automotive_vehicle_aidl_generated_lib_AccessForVehicleProperty_H_
+ACCESS_CPP_HEADER = """#pragma once
#include <aidl/android/hardware/automotive/vehicle/VehicleProperty.h>
#include <aidl/android/hardware/automotive/vehicle/VehiclePropertyAccess.h>
@@ -127,16 +126,19 @@
std::unordered_map<VehicleProperty, VehiclePropertyAccess> AccessForVehicleProperty = {
"""
-ACCESS_CPP_FOOTER = """
-};
+VERSION_CPP_HEADER = """#pragma once
-} // namespace vehicle
-} // namespace automotive
-} // namespace hardware
-} // namespace android
-} // aidl
+#include <aidl/android/hardware/automotive/vehicle/VehicleProperty.h>
-#endif // android_hardware_automotive_vehicle_aidl_generated_lib_AccessForVehicleProperty_H_
+#include <unordered_map>
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace automotive {
+namespace vehicle {
+
+std::unordered_map<VehicleProperty, int32_t> VersionForVehicleProperty = {
"""
CHANGE_MODE_JAVA_HEADER = """package android.hardware.automotive.vehicle;
@@ -148,7 +150,7 @@
public static final Map<Integer, Integer> values = Map.ofEntries(
"""
-CHANGE_MODE_JAVA_FOOTER = """
+JAVA_FOOTER = """
);
}
@@ -163,12 +165,6 @@
public static final Map<Integer, Integer> values = Map.ofEntries(
"""
-ACCESS_JAVA_FOOTER = """
- );
-
-}
-"""
-
ENUM_JAVA_HEADER = """package android.hardware.automotive.vehicle;
import java.util.List;
@@ -179,12 +175,6 @@
public static final Map<Integer, List<Class<?>>> values = Map.ofEntries(
"""
-ENUM_JAVA_FOOTER = """
- );
-
-}
-"""
-
class PropertyConfig:
"""Represents one VHAL property definition in VehicleProperty.aidl."""
@@ -192,10 +182,12 @@
def __init__(self):
self.name = None
self.description = None
+ self.comment = None
self.change_mode = None
self.access_modes = []
self.enum_types = []
self.unit_type = None
+ self.version = None
def __repr__(self):
return self.__str__()
@@ -203,8 +195,9 @@
def __str__(self):
return ('PropertyConfig{{' +
'name: {}, description: {}, change_mode: {}, access_modes: {}, enum_types: {}' +
- ', unit_type: {}}}').format(self.name, self.description, self.change_mode,
- self.access_modes, self.enum_types, self.unit_type)
+ ', unit_type: {}, version: {}, comment: {}}}').format(self.name, self.description,
+ self.change_mode, self.access_modes, self.enum_types, self.unit_type,
+ self.version, self.comment)
class FileParser:
@@ -230,34 +223,59 @@
in_comment = True
config = PropertyConfig()
description = ''
+ continue
+
if RE_COMMENT_END.match(line):
in_comment = False
if in_comment:
- if not config.description:
- sline = line.strip()
- # Skip the first line of comment
- if sline.startswith('*'):
- # Remove the '*'.
- sline = sline[1:].strip()
- # We reach an empty line of comment, the description part is ending.
- if sline == '':
- config.description = description
- else:
- if description != '':
- description += ' '
- description += sline
match = RE_CHANGE_MODE.match(line)
if match:
config.change_mode = match.group(1).replace('VehiclePropertyChangeMode.', '')
+ continue
match = RE_ACCESS.match(line)
if match:
config.access_modes.append(match.group(1).replace('VehiclePropertyAccess.', ''))
+ continue
match = RE_UNIT.match(line)
if match:
config.unit_type = match.group(1)
+ continue
match = RE_DATA_ENUM.match(line)
if match:
config.enum_types.append(match.group(1))
+ continue
+ match = RE_VERSION.match(line)
+ if match:
+ if config.version != None:
+ raise Exception('Duplicate version annotation for property: ' + prop_name)
+ config.version = match.group(1)
+ continue
+
+ sline = line.strip()
+ if sline.startswith('*'):
+ # Remove the '*'.
+ sline = sline[1:].strip()
+
+ if not config.description:
+ # We reach an empty line of comment, the description part is ending.
+ if sline == '':
+ config.description = description
+ else:
+ if description != '':
+ description += ' '
+ description += sline
+ else:
+ if not config.comment:
+ if sline != '':
+ # This is the first line for comment.
+ config.comment = sline
+ else:
+ if sline != '':
+ # Concat this line with the previous line's comment with a space.
+ config.comment += ' ' + sline
+ else:
+ # Treat empty line comment as a new line.
+ config.comment += '\n'
else:
match = RE_VALUE.match(line)
if match:
@@ -270,6 +288,9 @@
if not config.access_modes:
raise Exception(
'No access_mode annotation for property: ' + prop_name)
+ if not config.version:
+ raise Exception(
+ 'no version annotation for property: ' + prop_name)
config.name = prop_name
configs.append(config)
@@ -295,6 +316,9 @@
continue;
if not cpp:
annotation = "List.of(" + ', '.join([class_name + ".class" for class_name in config.enum_types]) + ")"
+ elif field == 'version':
+ if cpp:
+ annotation = config.version
else:
raise Exception('Unknown field: ' + field)
if counter != 0:
@@ -317,7 +341,7 @@
f.write(content)
def outputAsCsv(self, output):
- content = 'name,description,change mode,access mode,enum type,unit type\n'
+ content = 'name,description,change mode,access mode,enum type,unit type,comment\n'
for config in self.configs:
enum_types = None
if not config.enum_types:
@@ -328,14 +352,18 @@
if not unit_type:
unit_type = '/'
access_modes = ''
- content += '"{}","{}","{}","{}","{}","{}"\n'.format(
+ comment = config.comment
+ if not comment:
+ comment = ''
+ content += '"{}","{}","{}","{}","{}","{}", "{}"\n'.format(
config.name,
# Need to escape quote as double quote.
config.description.replace('"', '""'),
config.change_mode,
'/'.join(config.access_modes),
enum_types,
- unit_type)
+ unit_type,
+ comment.replace('"', '""'))
with open(output, 'w+') as f:
f.write(content)
@@ -347,6 +375,69 @@
return f.name
+class GeneratedFile:
+
+ def __init__(self, type):
+ self.type = type
+ self.cpp_file_path = None
+ self.java_file_path = None
+ self.cpp_header = None
+ self.java_header = None
+ self.cpp_footer = None
+ self.java_footer = None
+ self.cpp_output_file = None
+ self.java_output_file = None
+
+ def setCppFilePath(self, cpp_file_path):
+ self.cpp_file_path = cpp_file_path
+
+ def setJavaFilePath(self, java_file_path):
+ self.java_file_path = java_file_path
+
+ def setCppHeader(self, cpp_header):
+ self.cpp_header = cpp_header
+
+ def setCppFooter(self, cpp_footer):
+ self.cpp_footer = cpp_footer
+
+ def setJavaHeader(self, java_header):
+ self.java_header = java_header
+
+ def setJavaFooter(self, java_footer):
+ self.java_footer = java_footer
+
+ def convert(self, file_parser, check_only, temp_files):
+ if self.cpp_file_path:
+ output_file = GeneratedFile._getOutputFile(self.cpp_file_path, check_only, temp_files)
+ file_parser.convert(output_file, self.cpp_header, self.cpp_footer, True, self.type)
+ self.cpp_output_file = output_file
+
+ if self.java_file_path:
+ output_file = GeneratedFile._getOutputFile(self.java_file_path, check_only, temp_files)
+ file_parser.convert(output_file, self.java_header, self.java_footer, False, self.type)
+ self.java_output_file = output_file
+
+ def cmp(self):
+ if self.cpp_file_path:
+ if not filecmp.cmp(self.cpp_output_file, self.cpp_file_path):
+ return False
+
+ if self.java_file_path:
+ if not filecmp.cmp(self.java_output_file, self.java_file_path):
+ return False
+
+ return True
+
+ @staticmethod
+ def _getOutputFile(file_path, check_only, temp_files):
+ if not check_only:
+ return file_path
+
+ temp_file = createTempFile()
+ temp_files.append(temp_file)
+ return temp_file
+
+
def main():
parser = argparse.ArgumentParser(
description='Generate Java and C++ enums based on annotations in VehicleProperty.aidl')
@@ -382,51 +473,52 @@
f.outputAsCsv(args.output_csv)
return
- change_mode_cpp_file = os.path.join(android_top, CHANGE_MODE_CPP_FILE_PATH);
- access_cpp_file = os.path.join(android_top, ACCESS_CPP_FILE_PATH);
- change_mode_java_file = os.path.join(android_top, CHANGE_MODE_JAVA_FILE_PATH);
- access_java_file = os.path.join(android_top, ACCESS_JAVA_FILE_PATH);
- enum_java_file = os.path.join(android_top, ENUM_JAVA_FILE_PATH);
+ generated_files = []
+
+ change_mode = GeneratedFile('change_mode')
+ change_mode.setCppFilePath(os.path.join(android_top, CHANGE_MODE_CPP_FILE_PATH))
+ change_mode.setJavaFilePath(os.path.join(android_top, CHANGE_MODE_JAVA_FILE_PATH))
+ change_mode.setCppHeader(CHANGE_MODE_CPP_HEADER)
+ change_mode.setCppFooter(CPP_FOOTER)
+ change_mode.setJavaHeader(CHANGE_MODE_JAVA_HEADER)
+ change_mode.setJavaFooter(JAVA_FOOTER)
+ generated_files.append(change_mode)
+
+ access_mode = GeneratedFile('access_mode')
+ access_mode.setCppFilePath(os.path.join(android_top, ACCESS_CPP_FILE_PATH))
+ access_mode.setJavaFilePath(os.path.join(android_top, ACCESS_JAVA_FILE_PATH))
+ access_mode.setCppHeader(ACCESS_CPP_HEADER)
+ access_mode.setCppFooter(CPP_FOOTER)
+ access_mode.setJavaHeader(ACCESS_JAVA_HEADER)
+ access_mode.setJavaFooter(JAVA_FOOTER)
+ generated_files.append(access_mode)
+
+ enum_types = GeneratedFile('enum_types')
+ enum_types.setJavaFilePath(os.path.join(android_top, ENUM_JAVA_FILE_PATH))
+ enum_types.setJavaHeader(ENUM_JAVA_HEADER)
+ enum_types.setJavaFooter(JAVA_FOOTER)
+ generated_files.append(enum_types)
+
+ version = GeneratedFile('version')
+ version.setCppFilePath(os.path.join(android_top, VERSION_CPP_FILE_PATH))
+ version.setCppHeader(VERSION_CPP_HEADER)
+ version.setCppFooter(CPP_FOOTER)
+ generated_files.append(version)
+
temp_files = []
- if not args.check_only:
- change_mode_cpp_output = change_mode_cpp_file
- access_cpp_output = access_cpp_file
- change_mode_java_output = change_mode_java_file
- access_java_output = access_java_file
- enum_java_output = enum_java_file
- else:
- change_mode_cpp_output = createTempFile()
- temp_files.append(change_mode_cpp_output)
- access_cpp_output = createTempFile()
- temp_files.append(access_cpp_output)
- change_mode_java_output = createTempFile()
- temp_files.append(change_mode_java_output)
- access_java_output = createTempFile()
- temp_files.append(access_java_output)
- enum_java_output = createTempFile()
- temp_files.append(enum_java_output)
-
try:
- f.convert(change_mode_cpp_output, CHANGE_MODE_CPP_HEADER, CHANGE_MODE_CPP_FOOTER,
- True, 'change_mode')
- f.convert(change_mode_java_output, CHANGE_MODE_JAVA_HEADER,
- CHANGE_MODE_JAVA_FOOTER, False, 'change_mode')
- f.convert(access_cpp_output, ACCESS_CPP_HEADER, ACCESS_CPP_FOOTER, True, 'access_mode')
- f.convert(access_java_output, ACCESS_JAVA_HEADER, ACCESS_JAVA_FOOTER, False, 'access_mode')
- f.convert(enum_java_output, ENUM_JAVA_HEADER, ENUM_JAVA_FOOTER, False, 'enum_types')
+ for generated_file in generated_files:
+ generated_file.convert(f, args.check_only, temp_files)
if not args.check_only:
return
- if ((not filecmp.cmp(change_mode_cpp_output, change_mode_cpp_file)) or
- (not filecmp.cmp(change_mode_java_output, change_mode_java_file)) or
- (not filecmp.cmp(access_cpp_output, access_cpp_file)) or
- (not filecmp.cmp(access_java_output, access_java_file)) or
- (not filecmp.cmp(enum_java_output, enum_java_file))):
- print('The generated enum files for VehicleProperty.aidl requires update, ')
- print('Run \npython ' + android_top + '/' + SCRIPT_PATH)
- sys.exit(1)
+ for generated_file in generated_files:
+ if not generated_file.cmp():
+ print('The generated enum files for VehicleProperty.aidl requires update, ')
+ print('Run \npython ' + android_top + '/' + SCRIPT_PATH)
+ sys.exit(1)
except Exception as e:
print('Error parsing VehicleProperty.aidl')
print(e)
diff --git a/automotive/vehicle/vts/Android.bp b/automotive/vehicle/vts/Android.bp
index 736787b..67d0d34 100644
--- a/automotive/vehicle/vts/Android.bp
+++ b/automotive/vehicle/vts/Android.bp
@@ -30,6 +30,7 @@
],
static_libs: [
"libgtest",
+ "libgmock",
"libvhalclient",
],
shared_libs: [
@@ -41,6 +42,9 @@
"use_libaidlvintf_gtest_helper_static",
"vhalclient_defaults",
],
+ header_libs: [
+ "IVehicleGeneratedHeaders",
+ ],
test_suites: [
"general-tests",
"vts",
diff --git a/automotive/vehicle/vts/src/VtsHalAutomotiveVehicle_TargetTest.cpp b/automotive/vehicle/vts/src/VtsHalAutomotiveVehicle_TargetTest.cpp
index b5ee335..f8ddfaa 100644
--- a/automotive/vehicle/vts/src/VtsHalAutomotiveVehicle_TargetTest.cpp
+++ b/automotive/vehicle/vts/src/VtsHalAutomotiveVehicle_TargetTest.cpp
@@ -19,12 +19,14 @@
#include <IVhalClient.h>
#include <VehicleHalTypes.h>
#include <VehicleUtils.h>
+#include <VersionForVehicleProperty.h>
#include <aidl/Gtest.h>
#include <aidl/Vintf.h>
#include <aidl/android/hardware/automotive/vehicle/IVehicle.h>
#include <android-base/stringprintf.h>
#include <android-base/thread_annotations.h>
#include <android/binder_process.h>
+#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <hidl/GtestPrinter.h>
#include <hidl/ServiceManagement.h>
@@ -47,6 +49,7 @@
using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyChangeMode;
using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyGroup;
using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyType;
+using ::aidl::android::hardware::automotive::vehicle::VersionForVehicleProperty;
using ::android::getAidlHalInstanceNames;
using ::android::base::ScopedLockAssertion;
using ::android::base::StringPrintf;
@@ -58,7 +61,10 @@
using ::android::frameworks::automotive::vhal::IVhalClient;
using ::android::hardware::getAllHalInstanceNames;
using ::android::hardware::Sanitize;
+using ::android::hardware::automotive::vehicle::isSystemProp;
+using ::android::hardware::automotive::vehicle::propIdToString;
using ::android::hardware::automotive::vehicle::toInt;
+using ::testing::Ge;
constexpr int32_t kInvalidProp = 0x31600207;
@@ -202,6 +208,41 @@
ASSERT_NE(result.error().message(), "") << "Expect error message not to be empty";
}
+// Test system property IDs returned by getPropConfigs() are defined in the VHAL property interface.
+TEST_P(VtsHalAutomotiveVehicleTargetTest, testPropConfigs_onlyDefinedSystemPropertyIdsReturned) {
+ if (!mVhalClient->isAidlVhal()) {
+ GTEST_SKIP() << "Skip for HIDL VHAL because HAL interface run-time version is only"
+ << "introduced for AIDL";
+ }
+
+ auto result = mVhalClient->getAllPropConfigs();
+ ASSERT_TRUE(result.ok()) << "Failed to get all property configs, error: "
+ << result.error().message();
+
+ int32_t vhalVersion = mVhalClient->getRemoteInterfaceVersion();
+ const auto& configs = result.value();
+ for (size_t i = 0; i < configs.size(); i++) {
+ int32_t propId = configs[i]->getPropId();
+ if (!isSystemProp(propId)) {
+ continue;
+ }
+
+ std::string propName = propIdToString(propId);
+ auto it = VersionForVehicleProperty.find(static_cast<VehicleProperty>(propId));
+ bool found = (it != VersionForVehicleProperty.end());
+ EXPECT_TRUE(found) << "System Property: " << propName
+ << " is not defined in VHAL property interface";
+ if (!found) {
+ continue;
+ }
+ int32_t requiredVersion = it->second;
+ EXPECT_THAT(vhalVersion, Ge(requiredVersion))
+ << "System Property: " << propName << " requires VHAL version: " << requiredVersion
+ << ", but the current VHAL version"
+ << " is " << vhalVersion << ", must not be supported";
+ }
+}
+
// Test get() return current value for properties.
TEST_P(VtsHalAutomotiveVehicleTargetTest, get) {
ALOGD("VtsHalAutomotiveVehicleTargetTest::get");
diff --git a/biometrics/common/aidl/aidl_api/android.hardware.biometrics.common/current/android/hardware/biometrics/common/OperationContext.aidl b/biometrics/common/aidl/aidl_api/android.hardware.biometrics.common/current/android/hardware/biometrics/common/OperationContext.aidl
index 42c305a..8d913c8 100644
--- a/biometrics/common/aidl/aidl_api/android.hardware.biometrics.common/current/android/hardware/biometrics/common/OperationContext.aidl
+++ b/biometrics/common/aidl/aidl_api/android.hardware.biometrics.common/current/android/hardware/biometrics/common/OperationContext.aidl
@@ -46,4 +46,5 @@
android.hardware.biometrics.common.DisplayState displayState = android.hardware.biometrics.common.DisplayState.UNKNOWN;
@nullable android.hardware.biometrics.common.AuthenticateReason authenticateReason;
android.hardware.biometrics.common.FoldState foldState = android.hardware.biometrics.common.FoldState.UNKNOWN;
+ @nullable android.hardware.biometrics.common.OperationState operationState;
}
diff --git a/biometrics/common/aidl/aidl_api/android.hardware.biometrics.common/current/android/hardware/biometrics/common/OperationState.aidl b/biometrics/common/aidl/aidl_api/android.hardware.biometrics.common/current/android/hardware/biometrics/common/OperationState.aidl
new file mode 100644
index 0000000..fca9525
--- /dev/null
+++ b/biometrics/common/aidl/aidl_api/android.hardware.biometrics.common/current/android/hardware/biometrics/common/OperationState.aidl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.biometrics.common;
+/* @hide */
+@VintfStability
+union OperationState {
+ android.hardware.biometrics.common.OperationState.FingerprintOperationState fingerprintOperationState;
+ android.hardware.biometrics.common.OperationState.FaceOperationState faceOperationState;
+ @VintfStability
+ parcelable FingerprintOperationState {
+ ParcelableHolder extension;
+ boolean isHardwareIgnoringTouches = false;
+ }
+ @VintfStability
+ parcelable FaceOperationState {
+ ParcelableHolder extension;
+ }
+}
diff --git a/biometrics/common/aidl/android/hardware/biometrics/common/OperationContext.aidl b/biometrics/common/aidl/android/hardware/biometrics/common/OperationContext.aidl
index 584057d..5f9844f 100644
--- a/biometrics/common/aidl/android/hardware/biometrics/common/OperationContext.aidl
+++ b/biometrics/common/aidl/android/hardware/biometrics/common/OperationContext.aidl
@@ -20,6 +20,7 @@
import android.hardware.biometrics.common.DisplayState;
import android.hardware.biometrics.common.FoldState;
import android.hardware.biometrics.common.OperationReason;
+import android.hardware.biometrics.common.OperationState;
import android.hardware.biometrics.common.WakeReason;
/**
@@ -75,4 +76,7 @@
/** The current fold/unfold state. */
FoldState foldState = FoldState.UNKNOWN;
+
+ /** An associated operation state for this operation. */
+ @nullable OperationState operationState;
}
diff --git a/biometrics/common/aidl/android/hardware/biometrics/common/OperationState.aidl b/biometrics/common/aidl/android/hardware/biometrics/common/OperationState.aidl
new file mode 100644
index 0000000..40cf589
--- /dev/null
+++ b/biometrics/common/aidl/android/hardware/biometrics/common/OperationState.aidl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.biometrics.common;
+
+/**
+ * Additional state associated with an operation
+ *
+ * @hide
+ */
+@VintfStability
+union OperationState {
+ /** Operation state related to fingerprint*/
+ @VintfStability
+ parcelable FingerprintOperationState {
+ ParcelableHolder extension;
+
+ /** Flag indicating if the HAL should ignore touches on the fingerprint sensor */
+ boolean isHardwareIgnoringTouches = false;
+ }
+
+ /** Operation state related to face*/
+ @VintfStability
+ parcelable FaceOperationState {
+ ParcelableHolder extension;
+ }
+
+ OperationState.FingerprintOperationState fingerprintOperationState;
+ OperationState.FaceOperationState faceOperationState;
+}
diff --git a/biometrics/face/aidl/default/FakeFaceEngine.cpp b/biometrics/face/aidl/default/FakeFaceEngine.cpp
index 7380611..bdc13fd 100644
--- a/biometrics/face/aidl/default/FakeFaceEngine.cpp
+++ b/biometrics/face/aidl/default/FakeFaceEngine.cpp
@@ -70,7 +70,7 @@
EnrollmentType /*enrollmentType*/,
const std::vector<Feature>& /*features*/,
const std::future<void>& cancel) {
- BEGIN_OP(FaceHalProperties::operation_start_enroll_latency().value_or(0));
+ BEGIN_OP(getLatency(FaceHalProperties::operation_enroll_latency()));
// Do proper HAT verification in the real implementation.
if (hat.mac.empty()) {
@@ -158,7 +158,7 @@
void FakeFaceEngine::authenticateImpl(ISessionCallback* cb, int64_t /*operationId*/,
const std::future<void>& cancel) {
- BEGIN_OP(FaceHalProperties::operation_authenticate_latency().value_or(0));
+ BEGIN_OP(getLatency(FaceHalProperties::operation_authenticate_latency()));
auto id = FaceHalProperties::enrollment_hit().value_or(0);
auto enrolls = FaceHalProperties::enrollments();
@@ -291,7 +291,7 @@
}
void FakeFaceEngine::detectInteractionImpl(ISessionCallback* cb, const std::future<void>& cancel) {
- BEGIN_OP(FaceHalProperties::operation_detect_interaction_latency().value_or(0));
+ BEGIN_OP(getLatency(FaceHalProperties::operation_detect_interaction_latency()));
if (FaceHalProperties::operation_detect_interaction_fails().value_or(false)) {
LOG(ERROR) << "Fail: operation_detect_interaction_fails";
@@ -418,4 +418,33 @@
cb->onLockoutCleared();
}
+int32_t FakeFaceEngine::getRandomInRange(int32_t bound1, int32_t bound2) {
+ std::uniform_int_distribution<int32_t> dist(std::min(bound1, bound2), std::max(bound1, bound2));
+ return dist(mRandom);
+}
+
+int32_t FakeFaceEngine::getLatency(const std::vector<std::optional<std::int32_t>>& latencyIn) {
+ int32_t res = DEFAULT_LATENCY;
+
+ std::vector<int32_t> latency;
+ for (auto x : latencyIn)
+ if (x.has_value()) latency.push_back(*x);
+
+ switch (latency.size()) {
+ case 0:
+ break;
+ case 1:
+ res = latency[0];
+ break;
+ case 2:
+ res = getRandomInRange(latency[0], latency[1]);
+ break;
+ default:
+ LOG(ERROR) << "ERROR: unexpected input of size " << latency.size();
+ break;
+ }
+
+ return res;
+}
+
} // namespace aidl::android::hardware::biometrics::face
diff --git a/biometrics/face/aidl/default/FakeFaceEngine.h b/biometrics/face/aidl/default/FakeFaceEngine.h
index 8d9303c..b1e1388 100644
--- a/biometrics/face/aidl/default/FakeFaceEngine.h
+++ b/biometrics/face/aidl/default/FakeFaceEngine.h
@@ -60,6 +60,7 @@
void getAuthenticatorIdImpl(ISessionCallback* cb);
void invalidateAuthenticatorIdImpl(ISessionCallback* cb);
void resetLockoutImpl(ISessionCallback* cb, const keymaster::HardwareAuthToken& /*hat*/);
+ int32_t getLatency(const std::vector<std::optional<std::int32_t>>& latencyVec);
virtual std::string toString() const {
std::ostringstream os;
@@ -71,6 +72,7 @@
std::mt19937 mRandom;
private:
+ int32_t getRandomInRange(int32_t bound1, int32_t bound2);
static constexpr int32_t FACE_ACQUIRED_VENDOR_BASE = 1000;
static constexpr int32_t FACE_ERROR_VENDOR_BASE = 1000;
std::pair<AcquiredInfo, int32_t> convertAcquiredInfo(int32_t code);
diff --git a/biometrics/face/aidl/default/FakeLockoutTracker.h b/biometrics/face/aidl/default/FakeLockoutTracker.h
index f2d38f3..82cc313 100644
--- a/biometrics/face/aidl/default/FakeLockoutTracker.h
+++ b/biometrics/face/aidl/default/FakeLockoutTracker.h
@@ -28,7 +28,9 @@
public:
FakeLockoutTracker()
: mFailedCount(0),
+ mTimedFailedCount(0),
mLastFailedTime(0),
+ mCurrentMode(LockoutMode::kNone),
mIsLockoutTimerStarted(false),
mIsLockoutTimerAborted(false) {}
~FakeLockoutTracker() {}
diff --git a/biometrics/face/aidl/default/api/android.hardware.biometrics.face.VirtualProps-current.txt b/biometrics/face/aidl/default/api/android.hardware.biometrics.face.VirtualProps-current.txt
index 9548920..e69de29 100644
--- a/biometrics/face/aidl/default/api/android.hardware.biometrics.face.VirtualProps-current.txt
+++ b/biometrics/face/aidl/default/api/android.hardware.biometrics.face.VirtualProps-current.txt
@@ -1,98 +0,0 @@
-props {
- owner: Vendor
- module: "android.face.virt.FaceHalProperties"
- prop {
- api_name: "authenticator_id"
- type: Long
- access: ReadWrite
- prop_name: "vendor.face.virtual.authenticator_id"
- }
- prop {
- api_name: "challenge"
- type: Long
- access: ReadWrite
- prop_name: "vendor.face.virtual.challenge"
- }
- prop {
- api_name: "enrollment_hit"
- type: Integer
- access: ReadWrite
- prop_name: "vendor.face.virtual.enrollment_hit"
- }
- prop {
- api_name: "enrollments"
- type: IntegerList
- access: ReadWrite
- prop_name: "persist.vendor.face.virtual.enrollments"
- }
- prop {
- api_name: "features"
- type: IntegerList
- access: ReadWrite
- prop_name: "persist.vendor.face.virtual.features"
- }
- prop {
- api_name: "lockout"
- access: ReadWrite
- prop_name: "vendor.face.virtual.lockout"
- }
- prop {
- api_name: "next_enrollment"
- type: String
- access: ReadWrite
- prop_name: "vendor.face.virtual.next_enrollment"
- }
- prop {
- api_name: "operation_authenticate_duration"
- type: Integer
- access: ReadWrite
- prop_name: "vendor.face.virtual.operation_authenticate_duration"
- }
- prop {
- api_name: "operation_authenticate_fails"
- access: ReadWrite
- prop_name: "vendor.face.virtual.operation_authenticate_fails"
- }
- prop {
- api_name: "operation_authenticate_latency"
- type: Integer
- access: ReadWrite
- prop_name: "vendor.face.virtual.operation_authenticate_latency"
- }
- prop {
- api_name: "operation_detect_interaction_fails"
- access: ReadWrite
- prop_name: "vendor.face.virtual.operation_detect_interaction_fails"
- }
- prop {
- api_name: "operation_detect_interaction_latency"
- type: Integer
- access: ReadWrite
- prop_name: "vendor.face.virtual.operation_detect_interaction_latency"
- }
- prop {
- api_name: "operation_enroll_fails"
- access: ReadWrite
- prop_name: "vendor.face.virtual.operation_enroll_fails"
- }
- prop {
- api_name: "operation_start_enroll_latency"
- type: Integer
- access: ReadWrite
- prop_name: "vendor.face.virtual.operation_start_enroll_latency"
- }
- prop {
- api_name: "strength"
- type: String
- access: ReadWrite
- prop_name: "persist.vendor.face.virtual.strength"
- enum_values: "convenience|weak|strong"
- }
- prop {
- api_name: "type"
- type: String
- access: ReadWrite
- prop_name: "persist.vendor.face.virtual.type"
- enum_values: "IR|RGB"
- }
-}
diff --git a/biometrics/face/aidl/default/face.sysprop b/biometrics/face/aidl/default/face.sysprop
index 95b0b43..997fd67 100644
--- a/biometrics/face/aidl/default/face.sysprop
+++ b/biometrics/face/aidl/default/face.sysprop
@@ -7,7 +7,7 @@
prop {
prop_name: "persist.vendor.face.virtual.type"
type: String
- scope: Public
+ scope: Internal
access: ReadWrite
enum_values: "IR|RGB"
api_name: "type"
@@ -17,7 +17,7 @@
prop {
prop_name: "persist.vendor.face.virtual.strength"
type: String
- scope: Public
+ scope: Internal
access: ReadWrite
enum_values: "convenience|weak|strong"
api_name: "strength"
@@ -27,7 +27,7 @@
prop {
prop_name: "persist.vendor.face.virtual.enrollments"
type: IntegerList
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "enrollments"
}
@@ -36,7 +36,7 @@
prop {
prop_name: "persist.vendor.face.virtual.features"
type: IntegerList
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "features"
}
@@ -46,20 +46,11 @@
prop {
prop_name: "vendor.face.virtual.enrollment_hit"
type: Integer
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "enrollment_hit"
}
-# The initial latency for enrollment
-prop {
- prop_name: "vendor.face.virtual.operation_start_enroll_latency"
- type: Integer
- scope: Public
- access: ReadWrite
- api_name: "operation_start_enroll_latency"
-}
-
# the next enrollment in the format:
# "<id>,<bucket_id>:<delay>:<succeeds>,<bucket_id>..."
# for example: "0:1,0:100:1,1:200:1" indicating that bucket 0 took
@@ -69,7 +60,7 @@
prop {
prop_name: "vendor.face.virtual.next_enrollment"
type: String
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "next_enrollment"
}
@@ -78,7 +69,7 @@
prop {
prop_name: "vendor.face.virtual.authenticator_id"
type: Long
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "authenticator_id"
}
@@ -87,7 +78,7 @@
prop {
prop_name: "vendor.face.virtual.challenge"
type: Long
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "challenge"
}
@@ -96,7 +87,7 @@
prop {
prop_name: "vendor.face.virtual.lockout"
type: Boolean
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "lockout"
}
@@ -105,7 +96,7 @@
prop {
prop_name: "vendor.face.virtual.operation_authenticate_fails"
type: Boolean
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "operation_authenticate_fails"
}
@@ -114,7 +105,7 @@
prop {
prop_name: "vendor.face.virtual.operation_detect_interaction_fails"
type: Boolean
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "operation_detect_interaction_fails"
}
@@ -123,7 +114,7 @@
prop {
prop_name: "vendor.face.virtual.operation_enroll_fails"
type: Boolean
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "operation_enroll_fails"
}
@@ -133,8 +124,8 @@
# the HAL will send AcquiredInfo::START and AcquiredInfo::FIRST_FRAME_RECEIVED
prop {
prop_name: "vendor.face.virtual.operation_authenticate_latency"
- type: Integer
- scope: Public
+ type: IntegerList
+ scope: Internal
access: ReadWrite
api_name: "operation_authenticate_latency"
}
@@ -142,18 +133,27 @@
# add a latency to detectInteraction operations
prop {
prop_name: "vendor.face.virtual.operation_detect_interaction_latency"
- type: Integer
- scope: Public
+ type: IntegerList
+ scope: Internal
access: ReadWrite
api_name: "operation_detect_interaction_latency"
}
+# add a latency to enroll operations
+prop {
+ prop_name: "vendor.face.virtual.operation_enroll_latency"
+ type: IntegerList
+ scope: Internal
+ access: ReadWrite
+ api_name: "operation_enroll_latency"
+}
+
# millisecond duration for authenticate operations
# (waits for changes to enrollment_hit)
prop {
prop_name: "vendor.face.virtual.operation_authenticate_duration"
type: Integer
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "operation_authenticate_duration"
}
diff --git a/biometrics/face/aidl/default/tests/FakeFaceEngineTest.cpp b/biometrics/face/aidl/default/tests/FakeFaceEngineTest.cpp
index 69c9bf4..8c39b58 100644
--- a/biometrics/face/aidl/default/tests/FakeFaceEngineTest.cpp
+++ b/biometrics/face/aidl/default/tests/FakeFaceEngineTest.cpp
@@ -22,6 +22,7 @@
#include <android-base/logging.h>
#include "FakeFaceEngine.h"
+#include "util/Util.h"
using namespace ::android::face::virt;
using namespace ::aidl::android::hardware::biometrics::face;
@@ -137,11 +138,15 @@
void SetUp() override {
LOG(ERROR) << "JRM SETUP";
mCallback = ndk::SharedRefBase::make<TestSessionCallback>();
+ }
+
+ void TearDown() override {
FaceHalProperties::enrollments({});
FaceHalProperties::challenge({});
FaceHalProperties::features({});
FaceHalProperties::authenticator_id({});
FaceHalProperties::strength("");
+ FaceHalProperties::operation_detect_interaction_latency({});
}
FakeFaceEngine mEngine;
@@ -383,4 +388,26 @@
ASSERT_FALSE(mCallback->mAuthenticateFailed);
}
+TEST_F(FakeFaceEngineTest, LatencyDefault) {
+ FaceHalProperties::operation_detect_interaction_latency({});
+ ASSERT_EQ(DEFAULT_LATENCY,
+ mEngine.getLatency(FaceHalProperties::operation_detect_interaction_latency()));
+}
+
+TEST_F(FakeFaceEngineTest, LatencyFixed) {
+ FaceHalProperties::operation_detect_interaction_latency({10});
+ ASSERT_EQ(10, mEngine.getLatency(FaceHalProperties::operation_detect_interaction_latency()));
+}
+
+TEST_F(FakeFaceEngineTest, LatencyRandom) {
+ FaceHalProperties::operation_detect_interaction_latency({1, 1000});
+ std::set<int32_t> latencySet;
+ for (int i = 0; i < 100; i++) {
+ auto x = mEngine.getLatency(FaceHalProperties::operation_detect_interaction_latency());
+ ASSERT_TRUE(x >= 1 && x <= 1000);
+ latencySet.insert(x);
+ }
+ ASSERT_TRUE(latencySet.size() > 95); // unique values
+}
+
} // namespace aidl::android::hardware::biometrics::face
diff --git a/biometrics/fingerprint/aidl/aidl_api/android.hardware.biometrics.fingerprint/current/android/hardware/biometrics/fingerprint/ISession.aidl b/biometrics/fingerprint/aidl/aidl_api/android.hardware.biometrics.fingerprint/current/android/hardware/biometrics/fingerprint/ISession.aidl
index 4fdcefc..feb6ba3 100644
--- a/biometrics/fingerprint/aidl/aidl_api/android.hardware.biometrics.fingerprint/current/android/hardware/biometrics/fingerprint/ISession.aidl
+++ b/biometrics/fingerprint/aidl/aidl_api/android.hardware.biometrics.fingerprint/current/android/hardware/biometrics/fingerprint/ISession.aidl
@@ -62,5 +62,8 @@
void onPointerUpWithContext(in android.hardware.biometrics.fingerprint.PointerContext context);
void onContextChanged(in android.hardware.biometrics.common.OperationContext context);
void onPointerCancelWithContext(in android.hardware.biometrics.fingerprint.PointerContext context);
+ /**
+ * @deprecated use isHardwareIgnoringTouches in OperationContext from onContextChanged instead
+ */
void setIgnoreDisplayTouches(in boolean shouldIgnore);
}
diff --git a/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/ISession.aidl b/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/ISession.aidl
index 83e7bbc..07e22c2 100644
--- a/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/ISession.aidl
+++ b/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/ISession.aidl
@@ -544,6 +544,8 @@
* whenever it's appropriate.
*
* @param shouldIgnore whether the display touches should be ignored.
+
+ * @deprecated use isHardwareIgnoringTouches in OperationContext from onContextChanged instead
*/
void setIgnoreDisplayTouches(in boolean shouldIgnore);
}
diff --git a/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp b/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp
index 4e80052..a7acf3d 100644
--- a/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp
+++ b/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp
@@ -62,12 +62,17 @@
return;
}
+ waitForFingerDown(cb, cancel);
+
updateContext(WorkMode::kEnroll, cb, const_cast<std::future<void>&>(cancel), 0, hat);
}
void FakeFingerprintEngine::authenticateImpl(ISessionCallback* cb, int64_t operationId,
const std::future<void>& cancel) {
BEGIN_OP(0);
+
+ waitForFingerDown(cb, cancel);
+
updateContext(WorkMode::kAuthenticate, cb, const_cast<std::future<void>&>(cancel), operationId,
keymaster::HardwareAuthToken());
}
@@ -84,6 +89,8 @@
return;
}
+ waitForFingerDown(cb, cancel);
+
updateContext(WorkMode::kDetectInteract, cb, const_cast<std::future<void>&>(cancel), 0,
keymaster::HardwareAuthToken());
}
@@ -398,6 +405,7 @@
ndk::ScopedAStatus FakeFingerprintEngine::onPointerUpImpl(int32_t /*pointerId*/) {
BEGIN_OP(0);
+ mFingerIsDown = false;
return ndk::ScopedAStatus::ok();
}
@@ -533,4 +541,17 @@
isLockoutTimerStarted = false;
isLockoutTimerAborted = false;
}
+
+void FakeFingerprintEngine::waitForFingerDown(ISessionCallback* cb,
+ const std::future<void>& cancel) {
+ while (!mFingerIsDown) {
+ if (shouldCancel(cancel)) {
+ LOG(ERROR) << "waitForFingerDown, Fail: cancel";
+ cb->onError(Error::CANCELED, 0 /* vendorCode */);
+ return;
+ }
+ SLEEP_MS(10);
+ }
+}
+
} // namespace aidl::android::hardware::biometrics::fingerprint
diff --git a/biometrics/fingerprint/aidl/default/Session.cpp b/biometrics/fingerprint/aidl/default/Session.cpp
index c06c931..0dd6603 100644
--- a/biometrics/fingerprint/aidl/default/Session.cpp
+++ b/biometrics/fingerprint/aidl/default/Session.cpp
@@ -249,6 +249,7 @@
ndk::ScopedAStatus Session::onPointerDown(int32_t pointerId, int32_t x, int32_t y, float minor,
float major) {
LOG(INFO) << "onPointerDown";
+ mEngine->notifyFingerdown();
mWorker->schedule(Callable::from([this, pointerId, x, y, minor, major] {
mEngine->onPointerDownImpl(pointerId, x, y, minor, major);
enterIdling();
diff --git a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h
index 15d8360..0d53575 100644
--- a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h
+++ b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h
@@ -75,6 +75,7 @@
enum class WorkMode : int8_t { kIdle = 0, kAuthenticate, kEnroll, kDetectInteract };
WorkMode getWorkMode() { return mWorkMode; }
+ void notifyFingerdown() { mFingerIsDown = true; }
virtual std::string toString() const {
std::ostringstream os;
@@ -100,6 +101,7 @@
keymaster::HardwareAuthToken mHat;
std::future<void> mCancel;
int64_t mOperationId;
+ bool mFingerIsDown;
private:
static constexpr int32_t FINGERPRINT_ACQUIRED_VENDOR_BASE = 1000;
@@ -109,6 +111,7 @@
int32_t getRandomInRange(int32_t bound1, int32_t bound2);
bool checkSensorLockout(ISessionCallback*);
void clearLockout(ISessionCallback* cb);
+ void waitForFingerDown(ISessionCallback* cb, const std::future<void>& cancel);
FakeLockoutTracker mLockoutTracker;
diff --git a/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineTest.cpp b/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineTest.cpp
index eedcae1..8b06c8e 100644
--- a/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineTest.cpp
+++ b/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineTest.cpp
@@ -185,6 +185,7 @@
FingerprintHalProperties::enrollments({});
FingerprintHalProperties::next_enrollment("4:0,0:true");
keymaster::HardwareAuthToken hat{.mac = {2, 4}};
+ mEngine.notifyFingerdown();
mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kEnroll);
mEngine.fingerDownAction();
@@ -202,6 +203,7 @@
FingerprintHalProperties::next_enrollment(next);
keymaster::HardwareAuthToken hat{.mac = {2, 4}};
mCancel.set_value();
+ mEngine.notifyFingerdown();
mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_EQ(Error::CANCELED, mCallback->mError);
@@ -215,6 +217,7 @@
auto next = "2:0,0:false";
FingerprintHalProperties::next_enrollment(next);
keymaster::HardwareAuthToken hat{.mac = {2, 4}};
+ mEngine.notifyFingerdown();
mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_EQ(Error::UNABLE_TO_PROCESS, mCallback->mError);
@@ -228,6 +231,7 @@
FingerprintHalProperties::next_enrollment("4:0,5-[12,1013]:true");
keymaster::HardwareAuthToken hat{.mac = {2, 4}};
int32_t prevCnt = mCallback->mLastAcquiredCount;
+ mEngine.notifyFingerdown();
mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_FALSE(FingerprintHalProperties::next_enrollment().has_value());
@@ -242,6 +246,7 @@
TEST_F(FakeFingerprintEngineTest, Authenticate) {
FingerprintHalProperties::enrollments({1, 2});
FingerprintHalProperties::enrollment_hit(2);
+ mEngine.notifyFingerdown();
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kAuthenticate);
mEngine.fingerDownAction();
@@ -255,6 +260,7 @@
FingerprintHalProperties::enrollments({2});
FingerprintHalProperties::enrollment_hit(2);
mCancel.set_value();
+ mEngine.notifyFingerdown();
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_EQ(Error::CANCELED, mCallback->mError);
@@ -264,6 +270,7 @@
TEST_F(FakeFingerprintEngineTest, AuthenticateNotSet) {
FingerprintHalProperties::enrollments({1, 2});
FingerprintHalProperties::enrollment_hit({});
+ mEngine.notifyFingerdown();
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_TRUE(mCallback->mAuthenticateFailed);
@@ -272,6 +279,7 @@
TEST_F(FakeFingerprintEngineTest, AuthenticateNotEnrolled) {
FingerprintHalProperties::enrollments({1, 2});
FingerprintHalProperties::enrollment_hit(3);
+ mEngine.notifyFingerdown();
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_TRUE(mCallback->mAuthenticateFailed);
@@ -282,6 +290,7 @@
FingerprintHalProperties::enrollments({22, 2});
FingerprintHalProperties::enrollment_hit(2);
FingerprintHalProperties::lockout(true);
+ mEngine.notifyFingerdown();
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_TRUE(mCallback->mLockoutPermanent);
@@ -290,6 +299,7 @@
TEST_F(FakeFingerprintEngineTest, AuthenticateError8) {
FingerprintHalProperties::operation_authenticate_error(8);
+ mEngine.notifyFingerdown();
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_EQ(mCallback->mError, (Error)8);
@@ -298,6 +308,7 @@
TEST_F(FakeFingerprintEngineTest, AuthenticateError9) {
FingerprintHalProperties::operation_authenticate_error(1009);
+ mEngine.notifyFingerdown();
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_EQ(mCallback->mError, (Error)7);
@@ -306,6 +317,7 @@
TEST_F(FakeFingerprintEngineTest, AuthenticateFails) {
FingerprintHalProperties::operation_authenticate_fails(true);
+ mEngine.notifyFingerdown();
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_TRUE(mCallback->mAuthenticateFailed);
@@ -318,6 +330,7 @@
FingerprintHalProperties::enrollment_hit(2);
FingerprintHalProperties::operation_authenticate_acquired("4,1009");
int32_t prevCount = mCallback->mLastAcquiredCount;
+ mEngine.notifyFingerdown();
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_FALSE(mCallback->mAuthenticateFailed);
@@ -332,6 +345,7 @@
FingerprintHalProperties::enrollments({1, 2});
FingerprintHalProperties::enrollment_hit(2);
FingerprintHalProperties::operation_detect_interaction_acquired("");
+ mEngine.notifyFingerdown();
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kDetectInteract);
mEngine.fingerDownAction();
@@ -345,6 +359,7 @@
FingerprintHalProperties::enrollments({1, 2});
FingerprintHalProperties::enrollment_hit(2);
mCancel.set_value();
+ mEngine.notifyFingerdown();
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_EQ(Error::CANCELED, mCallback->mError);
@@ -355,6 +370,7 @@
FingerprintHalProperties::detect_interaction(true);
FingerprintHalProperties::enrollments({1, 2});
FingerprintHalProperties::enrollment_hit({});
+ mEngine.notifyFingerdown();
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
@@ -363,6 +379,7 @@
TEST_F(FakeFingerprintEngineTest, InteractionDetectNotEnrolled) {
FingerprintHalProperties::enrollments({1, 2});
FingerprintHalProperties::enrollment_hit(25);
+ mEngine.notifyFingerdown();
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
@@ -371,6 +388,7 @@
TEST_F(FakeFingerprintEngineTest, InteractionDetectError) {
FingerprintHalProperties::detect_interaction(true);
FingerprintHalProperties::operation_detect_interaction_error(8);
+ mEngine.notifyFingerdown();
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
@@ -384,6 +402,7 @@
FingerprintHalProperties::enrollment_hit(2);
FingerprintHalProperties::operation_detect_interaction_acquired("4,1013");
int32_t prevCount = mCallback->mLastAcquiredCount;
+ mEngine.notifyFingerdown();
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
diff --git a/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineUdfpsTest.cpp b/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineUdfpsTest.cpp
index f551899..5a30db1 100644
--- a/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineUdfpsTest.cpp
+++ b/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineUdfpsTest.cpp
@@ -145,6 +145,7 @@
TEST_F(FakeFingerprintEngineUdfpsTest, authenticate) {
std::shared_ptr<TestSessionCallback> cb = ndk::SharedRefBase::make<TestSessionCallback>();
std::promise<void> cancel;
+ mEngine.notifyFingerdown();
mEngine.authenticateImpl(cb.get(), 1, cancel.get_future());
ASSERT_TRUE(mEngine.getWorkMode() == FakeFingerprintEngineUdfps::WorkMode::kAuthenticate);
mEngine.onPointerDownImpl(1, 2, 3, 4.0, 5.0);
@@ -158,6 +159,7 @@
std::promise<void> cancel;
keymaster::HardwareAuthToken hat{.mac = {5, 6}};
FingerprintHalProperties::next_enrollment("5:0,0:true");
+ mEngine.notifyFingerdown();
mEngine.enrollImpl(cb.get(), hat, cancel.get_future());
ASSERT_TRUE(mEngine.getWorkMode() == FakeFingerprintEngineUdfps::WorkMode::kEnroll);
mEngine.onPointerDownImpl(1, 2, 3, 4.0, 5.0);
@@ -173,6 +175,7 @@
FingerprintHalProperties::operation_detect_interaction_acquired("");
std::shared_ptr<TestSessionCallback> cb = ndk::SharedRefBase::make<TestSessionCallback>();
std::promise<void> cancel;
+ mEngine.notifyFingerdown();
mEngine.detectInteractionImpl(cb.get(), cancel.get_future());
ASSERT_TRUE(mEngine.getWorkMode() == FakeFingerprintEngineUdfps::WorkMode::kDetectInteract);
mEngine.onPointerDownImpl(1, 2, 3, 4.0, 5.0);
diff --git a/bluetooth/audio/aidl/aidl_api/android.hardware.bluetooth.audio/current/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl b/bluetooth/audio/aidl/aidl_api/android.hardware.bluetooth.audio/current/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl
index f155634..87401ff 100644
--- a/bluetooth/audio/aidl/aidl_api/android.hardware.bluetooth.audio/current/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl
+++ b/bluetooth/audio/aidl/aidl_api/android.hardware.bluetooth.audio/current/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl
@@ -45,7 +45,7 @@
void setCodecPriority(in android.hardware.bluetooth.audio.CodecId codecId, int priority);
List<android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioAseConfigurationSetting> getLeAudioAseConfiguration(in @nullable List<android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioDeviceCapabilities> remoteSinkAudioCapabilities, in @nullable List<android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioDeviceCapabilities> remoteSourceAudioCapabilities, in List<android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioConfigurationRequirement> requirements);
android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioAseQosConfigurationPair getLeAudioAseQosConfiguration(in android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioAseQosConfigurationRequirement qosRequirement);
- android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioDataPathConfigurationPair getLeAudioAseDatapathConfiguration(in android.hardware.bluetooth.audio.AudioContext context, in android.hardware.bluetooth.audio.LeAudioConfiguration.StreamMap[] streamMap);
+ android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioDataPathConfigurationPair getLeAudioAseDatapathConfiguration(in @nullable android.hardware.bluetooth.audio.IBluetoothAudioProvider.StreamConfig sinkConfig, in @nullable android.hardware.bluetooth.audio.IBluetoothAudioProvider.StreamConfig sourceConfig);
void onSinkAseMetadataChanged(in android.hardware.bluetooth.audio.IBluetoothAudioProvider.AseState state, int cigId, int cisId, in @nullable android.hardware.bluetooth.audio.MetadataLtv[] metadata);
void onSourceAseMetadataChanged(in android.hardware.bluetooth.audio.IBluetoothAudioProvider.AseState state, int cigId, int cisId, in @nullable android.hardware.bluetooth.audio.MetadataLtv[] metadata);
android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioBroadcastConfigurationSetting getLeAudioBroadcastConfiguration(in @nullable List<android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioDeviceCapabilities> remoteSinkAudioCapabilities, in android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioBroadcastConfigurationRequirement requirement);
@@ -146,6 +146,10 @@
@nullable android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioDataPathConfiguration inputConfig;
@nullable android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioDataPathConfiguration outputConfig;
}
+ parcelable StreamConfig {
+ android.hardware.bluetooth.audio.AudioContext context;
+ android.hardware.bluetooth.audio.LeAudioConfiguration.StreamMap[] streamMap;
+ }
@Backing(type="byte") @VintfStability
enum AseState {
ENABLING = 0x00,
diff --git a/bluetooth/audio/aidl/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl b/bluetooth/audio/aidl/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl
index 2e16f4e..8c6fe69 100644
--- a/bluetooth/audio/aidl/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl
+++ b/bluetooth/audio/aidl/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl
@@ -519,14 +519,37 @@
}
/**
+ * Stream Configuration
+ */
+ parcelable StreamConfig {
+ /**
+ * Streaming Audio Context.
+ * This can serve as a hint for selecting the proper configuration by
+ * the offloader.
+ */
+ AudioContext context;
+ /**
+ * Stream configuration, including connection handles and audio channel
+ * allocations.
+ */
+ StreamMap[] streamMap;
+ }
+
+ /**
* Used to get a data path configuration which dynamically depends on CIS
* connection handles in StreamMap. This is used if non-dynamic data path
* was not provided in LeAudioAseConfigurationSetting. Calling this during
* the unicast audio stream establishment might slightly delay the stream
* start.
+ *
+ * @param sinkConfig - remote sink device stream configuration
+ * @param sourceConfig - remote source device stream configuration
+ *
+ * @return LeAudioDataPathConfigurationPair
*/
LeAudioDataPathConfigurationPair getLeAudioAseDatapathConfiguration(
- in AudioContext context, in StreamMap[] streamMap);
+ in @nullable StreamConfig sinkConfig,
+ in @nullable StreamConfig sourceConfig);
/*
* Audio Stream Endpoint state used to report Metadata changes on the remote
diff --git a/bluetooth/audio/aidl/default/BluetoothAudioProvider.cpp b/bluetooth/audio/aidl/default/BluetoothAudioProvider.cpp
index bdba898..8d03fae 100644
--- a/bluetooth/audio/aidl/default/BluetoothAudioProvider.cpp
+++ b/bluetooth/audio/aidl/default/BluetoothAudioProvider.cpp
@@ -229,14 +229,17 @@
};
ndk::ScopedAStatus BluetoothAudioProvider::getLeAudioAseDatapathConfiguration(
- const ::aidl::android::hardware::bluetooth::audio::AudioContext& in_context,
- const std::vector<::aidl::android::hardware::bluetooth::audio::
- LeAudioConfiguration::StreamMap>& in_streamMap,
+ const std::optional<::aidl::android::hardware::bluetooth::audio::
+ IBluetoothAudioProvider::StreamConfig>&
+ in_sinkConfig,
+ const std::optional<::aidl::android::hardware::bluetooth::audio::
+ IBluetoothAudioProvider::StreamConfig>&
+ in_sourceConfig,
::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
LeAudioDataPathConfigurationPair* _aidl_return) {
/* TODO: Implement */
- (void)in_context;
- (void)in_streamMap;
+ (void)in_sinkConfig;
+ (void)in_sourceConfig;
(void)_aidl_return;
return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
}
diff --git a/bluetooth/audio/aidl/default/BluetoothAudioProvider.h b/bluetooth/audio/aidl/default/BluetoothAudioProvider.h
index 5064869..2c21440 100644
--- a/bluetooth/audio/aidl/default/BluetoothAudioProvider.h
+++ b/bluetooth/audio/aidl/default/BluetoothAudioProvider.h
@@ -71,10 +71,12 @@
::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
LeAudioAseQosConfigurationPair* _aidl_return) override;
ndk::ScopedAStatus getLeAudioAseDatapathConfiguration(
- const ::aidl::android::hardware::bluetooth::audio::AudioContext&
- in_context,
- const std::vector<::aidl::android::hardware::bluetooth::audio::
- LeAudioConfiguration::StreamMap>& in_streamMap,
+ const std::optional<::aidl::android::hardware::bluetooth::audio::
+ IBluetoothAudioProvider::StreamConfig>&
+ in_sinkConfig,
+ const std::optional<::aidl::android::hardware::bluetooth::audio::
+ IBluetoothAudioProvider::StreamConfig>&
+ in_sourceConfig,
::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
LeAudioDataPathConfigurationPair* _aidl_return) override;
ndk::ScopedAStatus onSinkAseMetadataChanged(
diff --git a/bluetooth/audio/aidl/vts/VtsHalBluetoothAudioTargetTest.cpp b/bluetooth/audio/aidl/vts/VtsHalBluetoothAudioTargetTest.cpp
index 88f2f97..85bc48a 100644
--- a/bluetooth/audio/aidl/vts/VtsHalBluetoothAudioTargetTest.cpp
+++ b/bluetooth/audio/aidl/vts/VtsHalBluetoothAudioTargetTest.cpp
@@ -120,6 +120,16 @@
ChannelMode::UNKNOWN, ChannelMode::MONO, ChannelMode::STEREO};
static std::vector<LatencyMode> latency_modes = {LatencyMode::FREE};
+enum class BluetoothAudioHalVersion : int32_t {
+ VERSION_UNAVAILABLE = 0,
+ VERSION_2_0,
+ VERSION_2_1,
+ VERSION_AIDL_V1,
+ VERSION_AIDL_V2,
+ VERSION_AIDL_V3,
+ VERSION_AIDL_V4,
+};
+
// Some valid configs for HFP PCM configuration (software sessions)
static constexpr int32_t hfp_sample_rates_[] = {8000, 16000, 32000};
static constexpr int8_t hfp_bits_per_samples_[] = {16};
@@ -221,7 +231,6 @@
temp_provider_info_ = std::nullopt;
auto aidl_reval =
provider_factory_->getProviderInfo(session_type, &temp_provider_info_);
- ASSERT_TRUE(aidl_reval.isOk());
}
void GetProviderCapabilitiesHelper(const SessionType& session_type) {
@@ -623,9 +632,38 @@
SessionType::LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH,
SessionType::A2DP_SOFTWARE_DECODING_DATAPATH,
SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH,
+ };
+
+ static constexpr SessionType kAndroidVSessionType[] = {
SessionType::HFP_SOFTWARE_ENCODING_DATAPATH,
SessionType::HFP_SOFTWARE_DECODING_DATAPATH,
};
+
+ BluetoothAudioHalVersion GetProviderFactoryInterfaceVersion() {
+ int32_t aidl_version = 0;
+ if (provider_factory_ == nullptr) {
+ return BluetoothAudioHalVersion::VERSION_UNAVAILABLE;
+ }
+
+ auto aidl_retval = provider_factory_->getInterfaceVersion(&aidl_version);
+ if (!aidl_retval.isOk()) {
+ return BluetoothAudioHalVersion::VERSION_UNAVAILABLE;
+ }
+ switch (aidl_version) {
+ case 1:
+ return BluetoothAudioHalVersion::VERSION_AIDL_V1;
+ case 2:
+ return BluetoothAudioHalVersion::VERSION_AIDL_V2;
+ case 3:
+ return BluetoothAudioHalVersion::VERSION_AIDL_V3;
+ case 4:
+ return BluetoothAudioHalVersion::VERSION_AIDL_V4;
+ default:
+ return BluetoothAudioHalVersion::VERSION_UNAVAILABLE;
+ }
+
+ return BluetoothAudioHalVersion::VERSION_UNAVAILABLE;
+ }
};
/**
@@ -647,6 +685,15 @@
EXPECT_TRUE(temp_provider_capabilities_.empty() ||
audio_provider_ != nullptr);
}
+ if (GetProviderFactoryInterfaceVersion() >=
+ BluetoothAudioHalVersion::VERSION_AIDL_V4) {
+ for (auto session_type : kAndroidVSessionType) {
+ GetProviderCapabilitiesHelper(session_type);
+ OpenProviderHelper(session_type);
+ EXPECT_TRUE(temp_provider_capabilities_.empty() ||
+ audio_provider_ != nullptr);
+ }
+ }
}
/**
@@ -736,8 +783,7 @@
ASSERT_NE(codec_info.id.getTag(), CodecId::a2dp);
// The codec info must contain the information
// for le audio transport.
- // ASSERT_EQ(codec_info.transport.getTag(),
- // CodecInfo::Transport::le_audio);
+ ASSERT_EQ(codec_info.transport.getTag(), CodecInfo::Transport::leAudio);
}
}
}
@@ -1465,8 +1511,8 @@
/**
* Test whether each provider of type
- * SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH can be started and stopped with
- * different PCM config
+ * SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH can be started and stopped
+ * with different PCM config
*/
TEST_P(BluetoothAudioProviderA2dpEncodingSoftwareAidl,
StartAndEndA2dpEncodingSoftwareSessionWithPossiblePcmConfig) {
@@ -1503,6 +1549,10 @@
public:
virtual void SetUp() override {
BluetoothAudioProviderFactoryAidl::SetUp();
+ if (GetProviderFactoryInterfaceVersion() <
+ BluetoothAudioHalVersion::VERSION_AIDL_V4) {
+ GTEST_SKIP();
+ }
GetProviderCapabilitiesHelper(SessionType::HFP_SOFTWARE_ENCODING_DATAPATH);
OpenProviderHelper(SessionType::HFP_SOFTWARE_ENCODING_DATAPATH);
ASSERT_NE(audio_provider_, nullptr);
@@ -1570,6 +1620,10 @@
public:
virtual void SetUp() override {
BluetoothAudioProviderFactoryAidl::SetUp();
+ if (GetProviderFactoryInterfaceVersion() <
+ BluetoothAudioHalVersion::VERSION_AIDL_V4) {
+ GTEST_SKIP();
+ }
GetProviderCapabilitiesHelper(SessionType::HFP_SOFTWARE_DECODING_DATAPATH);
OpenProviderHelper(SessionType::HFP_SOFTWARE_DECODING_DATAPATH);
ASSERT_NE(audio_provider_, nullptr);
@@ -1658,13 +1712,13 @@
/**
* Test whether each provider of type
- * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped with
- * SBC hardware encoding config
+ * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped
+ * with SBC hardware encoding config
*/
TEST_P(BluetoothAudioProviderA2dpEncodingHardwareAidl,
StartAndEndA2dpSbcEncodingHardwareSession) {
if (!IsOffloadSupported()) {
- return;
+ GTEST_SKIP();
}
CodecConfiguration codec_config = {
@@ -1688,13 +1742,13 @@
/**
* Test whether each provider of type
- * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped with
- * AAC hardware encoding config
+ * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped
+ * with AAC hardware encoding config
*/
TEST_P(BluetoothAudioProviderA2dpEncodingHardwareAidl,
StartAndEndA2dpAacEncodingHardwareSession) {
if (!IsOffloadSupported()) {
- return;
+ GTEST_SKIP();
}
CodecConfiguration codec_config = {
@@ -1718,13 +1772,13 @@
/**
* Test whether each provider of type
- * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped with
- * LDAC hardware encoding config
+ * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped
+ * with LDAC hardware encoding config
*/
TEST_P(BluetoothAudioProviderA2dpEncodingHardwareAidl,
StartAndEndA2dpLdacEncodingHardwareSession) {
if (!IsOffloadSupported()) {
- return;
+ GTEST_SKIP();
}
CodecConfiguration codec_config = {
@@ -1748,13 +1802,13 @@
/**
* Test whether each provider of type
- * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped with
- * Opus hardware encoding config
+ * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped
+ * with Opus hardware encoding config
*/
TEST_P(BluetoothAudioProviderA2dpEncodingHardwareAidl,
StartAndEndA2dpOpusEncodingHardwareSession) {
if (!IsOffloadSupported()) {
- return;
+ GTEST_SKIP();
}
CodecConfiguration codec_config = {
@@ -1778,13 +1832,13 @@
/**
* Test whether each provider of type
- * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped with
- * AptX hardware encoding config
+ * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped
+ * with AptX hardware encoding config
*/
TEST_P(BluetoothAudioProviderA2dpEncodingHardwareAidl,
StartAndEndA2dpAptxEncodingHardwareSession) {
if (!IsOffloadSupported()) {
- return;
+ GTEST_SKIP();
}
for (auto codec_type : {CodecType::APTX, CodecType::APTX_HD}) {
@@ -1814,13 +1868,13 @@
/**
* Test whether each provider of type
- * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped with
- * an invalid codec config
+ * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped
+ * with an invalid codec config
*/
TEST_P(BluetoothAudioProviderA2dpEncodingHardwareAidl,
StartAndEndA2dpEncodingHardwareSessionInvalidCodecConfig) {
if (!IsOffloadSupported()) {
- return;
+ GTEST_SKIP();
}
ASSERT_NE(audio_provider_, nullptr);
@@ -1886,6 +1940,10 @@
public:
virtual void SetUp() override {
BluetoothAudioProviderFactoryAidl::SetUp();
+ if (GetProviderFactoryInterfaceVersion() <
+ BluetoothAudioHalVersion::VERSION_AIDL_V4) {
+ GTEST_SKIP();
+ }
OpenProviderHelper(SessionType::HFP_HARDWARE_OFFLOAD_DATAPATH);
// Can open or empty capability
ASSERT_TRUE(temp_provider_capabilities_.empty() ||
@@ -2419,8 +2477,12 @@
TEST_P(
BluetoothAudioProviderLeAudioOutputHardwareAidl,
StartAndEndLeAudioOutputSessionWithPossibleUnicastConfigFromProviderInfo) {
+ if (GetProviderFactoryInterfaceVersion() <
+ BluetoothAudioHalVersion::VERSION_AIDL_V4) {
+ GTEST_SKIP();
+ }
if (!IsOffloadOutputProviderInfoSupported()) {
- return;
+ GTEST_SKIP();
}
auto lc3_codec_configs = GetUnicastLc3SupportedListFromProviderInfo();
@@ -2444,6 +2506,10 @@
TEST_P(BluetoothAudioProviderLeAudioOutputHardwareAidl,
GetEmptyAseConfigurationEmptyCapability) {
+ if (GetProviderFactoryInterfaceVersion() <
+ BluetoothAudioHalVersion::VERSION_AIDL_V4) {
+ GTEST_SKIP();
+ }
std::vector<std::optional<LeAudioDeviceCapabilities>> empty_capability;
std::vector<LeAudioConfigurationRequirement> empty_requirement;
std::vector<LeAudioAseConfigurationSetting> configurations;
@@ -2465,6 +2531,10 @@
TEST_P(BluetoothAudioProviderLeAudioOutputHardwareAidl,
GetEmptyAseConfigurationMismatchedRequirement) {
+ if (GetProviderFactoryInterfaceVersion() <
+ BluetoothAudioHalVersion::VERSION_AIDL_V4) {
+ GTEST_SKIP();
+ }
std::vector<std::optional<LeAudioDeviceCapabilities>> capabilities = {
GetDefaultRemoteCapability()};
@@ -2489,6 +2559,10 @@
}
TEST_P(BluetoothAudioProviderLeAudioOutputHardwareAidl, GetQoSConfiguration) {
+ if (GetProviderFactoryInterfaceVersion() <
+ BluetoothAudioHalVersion::VERSION_AIDL_V4) {
+ GTEST_SKIP();
+ }
IBluetoothAudioProvider::LeAudioAseQosConfigurationRequirement requirement;
std::vector<IBluetoothAudioProvider::LeAudioAseQosConfiguration>
QoSConfigurations;
@@ -2506,6 +2580,40 @@
// QoS Configurations should not be empty, as we searched for all contexts
ASSERT_FALSE(QoSConfigurations.empty());
}
+
+TEST_P(BluetoothAudioProviderLeAudioOutputHardwareAidl,
+ GetDataPathConfiguration) {
+ IBluetoothAudioProvider::StreamConfig sink_requirement;
+ IBluetoothAudioProvider::StreamConfig source_requirement;
+ std::vector<IBluetoothAudioProvider::LeAudioDataPathConfiguration>
+ DataPathConfigurations;
+ bool is_supported = false;
+
+ for (auto bitmask : all_context_bitmasks) {
+ sink_requirement.context = GetAudioContext(bitmask);
+ source_requirement.context = GetAudioContext(bitmask);
+ IBluetoothAudioProvider::LeAudioDataPathConfigurationPair result;
+ auto aidl_retval = audio_provider_->getLeAudioAseDatapathConfiguration(
+ sink_requirement, source_requirement, &result);
+ if (!aidl_retval.isOk()) {
+ // If not OK, then it could be not supported, as it is an optional feature
+ ASSERT_EQ(aidl_retval.getExceptionCode(), EX_UNSUPPORTED_OPERATION);
+ } else {
+ is_supported = true;
+ if (result.inputConfig.has_value())
+ DataPathConfigurations.push_back(result.inputConfig.value());
+ if (result.inputConfig.has_value())
+ DataPathConfigurations.push_back(result.inputConfig.value());
+ }
+ }
+
+ if (is_supported) {
+ // Datapath Configurations should not be empty, as we searched for all
+ // contexts
+ ASSERT_FALSE(DataPathConfigurations.empty());
+ }
+}
+
/**
* Test whether each provider of type
* SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH can be started and
@@ -2514,7 +2622,7 @@
TEST_P(BluetoothAudioProviderLeAudioOutputHardwareAidl,
StartAndEndLeAudioOutputSessionWithPossibleUnicastConfig) {
if (!IsOffloadOutputSupported()) {
- return;
+ GTEST_SKIP();
}
auto lc3_codec_configs =
@@ -2547,7 +2655,7 @@
TEST_P(BluetoothAudioProviderLeAudioOutputHardwareAidl,
DISABLED_StartAndEndLeAudioOutputSessionWithInvalidAudioConfiguration) {
if (!IsOffloadOutputSupported()) {
- return;
+ GTEST_SKIP();
}
auto lc3_codec_configs =
@@ -2585,7 +2693,7 @@
TEST_P(BluetoothAudioProviderLeAudioOutputHardwareAidl,
StartAndEndLeAudioOutputSessionWithAptxAdaptiveLeUnicastConfig) {
if (!IsOffloadOutputSupported()) {
- return;
+ GTEST_SKIP();
}
for (auto codec_type :
{CodecType::APTX_ADAPTIVE_LE, CodecType::APTX_ADAPTIVE_LEX}) {
@@ -2622,7 +2730,7 @@
BluetoothAudioProviderLeAudioOutputHardwareAidl,
BluetoothAudioProviderLeAudioOutputHardwareAidl_StartAndEndLeAudioOutputSessionWithInvalidAptxAdaptiveLeAudioConfiguration) {
if (!IsOffloadOutputSupported()) {
- return;
+ GTEST_SKIP();
}
for (auto codec_type :
@@ -2708,7 +2816,7 @@
BluetoothAudioProviderLeAudioInputHardwareAidl,
StartAndEndLeAudioInputSessionWithPossibleUnicastConfigFromProviderInfo) {
if (!IsOffloadOutputProviderInfoSupported()) {
- return;
+ GTEST_SKIP();
}
auto lc3_codec_configs = GetUnicastLc3SupportedListFromProviderInfo();
@@ -2738,7 +2846,7 @@
TEST_P(BluetoothAudioProviderLeAudioInputHardwareAidl,
StartAndEndLeAudioInputSessionWithPossibleUnicastConfig) {
if (!IsOffloadInputSupported()) {
- return;
+ GTEST_SKIP();
}
auto lc3_codec_configs =
@@ -2771,7 +2879,7 @@
TEST_P(BluetoothAudioProviderLeAudioInputHardwareAidl,
DISABLED_StartAndEndLeAudioInputSessionWithInvalidAudioConfiguration) {
if (!IsOffloadInputSupported()) {
- return;
+ GTEST_SKIP();
}
auto lc3_codec_configs =
@@ -2829,16 +2937,16 @@
/**
* Test whether each provider of type
- * SessionType::LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH can be started and
- * stopped
+ * SessionType::LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH can be started
+ * and stopped
*/
TEST_P(BluetoothAudioProviderLeAudioBroadcastSoftwareAidl,
OpenLeAudioOutputSoftwareProvider) {}
/**
* Test whether each provider of type
- * SessionType::LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH can be started and
- * stopped with different PCM config
+ * SessionType::LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH can be started
+ * and stopped with different PCM config
*/
TEST_P(BluetoothAudioProviderLeAudioBroadcastSoftwareAidl,
StartAndEndLeAudioOutputSessionWithPossiblePcmConfig) {
@@ -3012,6 +3120,10 @@
TEST_P(
BluetoothAudioProviderLeAudioBroadcastHardwareAidl,
StartAndEndLeAudioBroadcastSessionWithPossibleUnicastConfigFromProviderInfo) {
+ if (GetProviderFactoryInterfaceVersion() <
+ BluetoothAudioHalVersion::VERSION_AIDL_V4) {
+ GTEST_SKIP();
+ }
if (!IsBroadcastOffloadProviderInfoSupported()) {
return;
}
@@ -3043,6 +3155,10 @@
TEST_P(BluetoothAudioProviderLeAudioBroadcastHardwareAidl,
GetEmptyBroadcastConfigurationEmptyCapability) {
+ if (GetProviderFactoryInterfaceVersion() <
+ BluetoothAudioHalVersion::VERSION_AIDL_V4) {
+ GTEST_SKIP();
+ }
std::vector<std::optional<LeAudioDeviceCapabilities>> empty_capability;
IBluetoothAudioProvider::LeAudioBroadcastConfigurationRequirement
empty_requirement;
@@ -3157,8 +3273,8 @@
/**
* Test whether each provider of type
- * SessionType::A2DP_SOFTWARE_DECODING_DATAPATH can be started and stopped with
- * different PCM config
+ * SessionType::A2DP_SOFTWARE_DECODING_DATAPATH can be started and stopped
+ * with different PCM config
*/
TEST_P(BluetoothAudioProviderA2dpDecodingSoftwareAidl,
StartAndEndA2dpDecodingSoftwareSessionWithPossiblePcmConfig) {
@@ -3219,13 +3335,13 @@
/**
* Test whether each provider of type
- * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped with
- * SBC hardware encoding config
+ * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped
+ * with SBC hardware encoding config
*/
TEST_P(BluetoothAudioProviderA2dpDecodingHardwareAidl,
StartAndEndA2dpSbcDecodingHardwareSession) {
if (!IsOffloadSupported()) {
- return;
+ GTEST_SKIP();
}
CodecConfiguration codec_config = {
@@ -3249,13 +3365,13 @@
/**
* Test whether each provider of type
- * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped with
- * AAC hardware encoding config
+ * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped
+ * with AAC hardware encoding config
*/
TEST_P(BluetoothAudioProviderA2dpDecodingHardwareAidl,
StartAndEndA2dpAacDecodingHardwareSession) {
if (!IsOffloadSupported()) {
- return;
+ GTEST_SKIP();
}
CodecConfiguration codec_config = {
@@ -3279,13 +3395,13 @@
/**
* Test whether each provider of type
- * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped with
- * LDAC hardware encoding config
+ * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped
+ * with LDAC hardware encoding config
*/
TEST_P(BluetoothAudioProviderA2dpDecodingHardwareAidl,
StartAndEndA2dpLdacDecodingHardwareSession) {
if (!IsOffloadSupported()) {
- return;
+ GTEST_SKIP();
}
CodecConfiguration codec_config = {
@@ -3309,13 +3425,13 @@
/**
* Test whether each provider of type
- * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped with
- * Opus hardware encoding config
+ * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped
+ * with Opus hardware encoding config
*/
TEST_P(BluetoothAudioProviderA2dpDecodingHardwareAidl,
StartAndEndA2dpOpusDecodingHardwareSession) {
if (!IsOffloadSupported()) {
- return;
+ GTEST_SKIP();
}
CodecConfiguration codec_config = {
@@ -3339,13 +3455,13 @@
/**
* Test whether each provider of type
- * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped with
- * AptX hardware encoding config
+ * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped
+ * with AptX hardware encoding config
*/
TEST_P(BluetoothAudioProviderA2dpDecodingHardwareAidl,
StartAndEndA2dpAptxDecodingHardwareSession) {
if (!IsOffloadSupported()) {
- return;
+ GTEST_SKIP();
}
for (auto codec_type : {CodecType::APTX, CodecType::APTX_HD}) {
@@ -3375,13 +3491,13 @@
/**
* Test whether each provider of type
- * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped with
- * an invalid codec config
+ * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped
+ * with an invalid codec config
*/
TEST_P(BluetoothAudioProviderA2dpDecodingHardwareAidl,
StartAndEndA2dpDecodingHardwareSessionInvalidCodecConfig) {
if (!IsOffloadSupported()) {
- return;
+ GTEST_SKIP();
}
ASSERT_NE(audio_provider_, nullptr);
diff --git a/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.cpp b/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.cpp
index 216e169..d37825a 100644
--- a/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.cpp
+++ b/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.cpp
@@ -428,7 +428,7 @@
if (kDefaultOffloadLeAudioCodecInfoMap.empty()) {
auto le_audio_offload_setting =
BluetoothLeAudioCodecsProvider::ParseFromLeAudioOffloadSettingFile();
- auto kDefaultOffloadLeAudioCodecInfoMap =
+ kDefaultOffloadLeAudioCodecInfoMap =
BluetoothLeAudioCodecsProvider::GetLeAudioCodecInfo(
le_audio_offload_setting);
}
diff --git a/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.cpp b/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.cpp
index c057505..67ba93c 100644
--- a/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.cpp
+++ b/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.cpp
@@ -500,14 +500,12 @@
<< " has NO session";
return false;
}
- bool retval = false;
-
if (!stack_iface_->getPresentationPosition(&presentation_position).isOk()) {
LOG(WARNING) << __func__ << " - IBluetoothAudioPort SessionType="
<< toString(session_type_) << " failed";
return false;
}
- return retval;
+ return true;
}
void BluetoothAudioSession::UpdateSourceMetadata(
diff --git a/bluetooth/audio/utils/aidl_session/BluetoothLeAudioCodecsProvider.cpp b/bluetooth/audio/utils/aidl_session/BluetoothLeAudioCodecsProvider.cpp
index b6df67e..473777c 100644
--- a/bluetooth/audio/utils/aidl_session/BluetoothLeAudioCodecsProvider.cpp
+++ b/bluetooth/audio/utils/aidl_session/BluetoothLeAudioCodecsProvider.cpp
@@ -43,9 +43,6 @@
std::optional<setting::LeAudioOffloadSetting>
BluetoothLeAudioCodecsProvider::ParseFromLeAudioOffloadSettingFile() {
- if (!leAudioCodecCapabilities.empty() || isInvalidFileContent) {
- return std::nullopt;
- }
auto le_audio_offload_setting =
setting::readLeAudioOffloadSetting(kLeAudioCodecCapabilitiesFile);
if (!le_audio_offload_setting.has_value()) {
@@ -77,8 +74,6 @@
for (auto& p : configuration_map_) {
// Initialize new CodecInfo for the config
auto config_name = p.first;
- if (config_codec_info_map_.count(config_name) == 0)
- config_codec_info_map_[config_name] = CodecInfo();
// Getting informations from codecConfig and strategyConfig
const auto codec_config_name = p.second.getCodecConfiguration();
@@ -92,6 +87,9 @@
if (strategy_configuration_map_iter == strategy_configuration_map_.end())
continue;
+ if (config_codec_info_map_.count(config_name) == 0)
+ config_codec_info_map_[config_name] = CodecInfo();
+
const auto& codec_config = codec_configuration_map_iter->second;
const auto codec = codec_config.getCodec();
const auto& strategy_config = strategy_configuration_map_iter->second;
@@ -137,12 +135,19 @@
}
}
- // Goes through every scenario, deduplicate configuration
+ // Goes through every scenario, deduplicate configuration, skip the invalid
+ // config references (e.g. the "invalid" entries in the xml file).
std::set<std::string> encoding_config, decoding_config, broadcast_config;
for (auto& s : supported_scenarios_) {
- if (s.hasEncode()) encoding_config.insert(s.getEncode());
- if (s.hasDecode()) decoding_config.insert(s.getDecode());
- if (s.hasBroadcast()) broadcast_config.insert(s.getBroadcast());
+ if (s.hasEncode() && config_codec_info_map_.count(s.getEncode())) {
+ encoding_config.insert(s.getEncode());
+ }
+ if (s.hasDecode() && config_codec_info_map_.count(s.getDecode())) {
+ decoding_config.insert(s.getDecode());
+ }
+ if (s.hasBroadcast() && config_codec_info_map_.count(s.getBroadcast())) {
+ broadcast_config.insert(s.getBroadcast());
+ }
}
// Split by session types and add results
diff --git a/bluetooth/finder/aidl/Android.bp b/bluetooth/finder/aidl/Android.bp
index e606d2d..24f5ca5 100644
--- a/bluetooth/finder/aidl/Android.bp
+++ b/bluetooth/finder/aidl/Android.bp
@@ -28,7 +28,11 @@
},
java: {
enabled: true,
- platform_apis: true,
+ sdk_version: "module_current",
+ min_sdk_version: "30",
+ apex_available: [
+ "com.android.tethering",
+ ],
},
},
}
diff --git a/bluetooth/finder/aidl/android/hardware/bluetooth/finder/Eid.aidl b/bluetooth/finder/aidl/android/hardware/bluetooth/finder/Eid.aidl
index ae9b159..0de306f 100644
--- a/bluetooth/finder/aidl/android/hardware/bluetooth/finder/Eid.aidl
+++ b/bluetooth/finder/aidl/android/hardware/bluetooth/finder/Eid.aidl
@@ -17,7 +17,7 @@
package android.hardware.bluetooth.finder;
/**
- * Ephemeral Identifier
+ * Find My Device network ephemeral identifier
*/
@VintfStability
parcelable Eid {
diff --git a/bluetooth/finder/aidl/android/hardware/bluetooth/finder/IBluetoothFinder.aidl b/bluetooth/finder/aidl/android/hardware/bluetooth/finder/IBluetoothFinder.aidl
index 615739b..a374c2a 100644
--- a/bluetooth/finder/aidl/android/hardware/bluetooth/finder/IBluetoothFinder.aidl
+++ b/bluetooth/finder/aidl/android/hardware/bluetooth/finder/IBluetoothFinder.aidl
@@ -21,7 +21,7 @@
@VintfStability
interface IBluetoothFinder {
/**
- * API to set the EIDs to the Bluetooth Controller
+ * API to set Find My Device network EIDs to the Bluetooth Controller
*
* @param eids array of 20 bytes EID to the Bluetooth
* controller
diff --git a/bluetooth/lmp_event/aidl/Android.bp b/bluetooth/lmp_event/aidl/Android.bp
new file mode 100644
index 0000000..6c2f278
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/Android.bp
@@ -0,0 +1,33 @@
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "hardware_interfaces_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["hardware_interfaces_license"],
+}
+
+aidl_interface {
+ name: "android.hardware.bluetooth.lmp_event",
+ vendor_available: true,
+ host_supported: true,
+ srcs: ["android/hardware/bluetooth/lmp_event/*.aidl"],
+ stability: "vintf",
+ backend: {
+ java: {
+ enabled: true,
+ platform_apis: true,
+ },
+ cpp: {
+ enabled: true,
+ },
+ ndk: {
+ enabled: true,
+ min_sdk_version: "33",
+ },
+ rust: {
+ enabled: true,
+ min_sdk_version: "33",
+ },
+ },
+}
diff --git a/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/AddressType.aidl b/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/AddressType.aidl
new file mode 100644
index 0000000..0f239e8
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/AddressType.aidl
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.bluetooth.lmp_event;
+@Backing(type="byte") @VintfStability
+enum AddressType {
+ PUBLIC = 0x00,
+ RANDOM = 0x01,
+}
diff --git a/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/Direction.aidl b/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/Direction.aidl
new file mode 100644
index 0000000..6f807cc
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/Direction.aidl
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.bluetooth.lmp_event;
+@Backing(type="byte") @VintfStability
+enum Direction {
+ TX = 0x00,
+ RX = 0x01,
+}
diff --git a/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/IBluetoothLmpEvent.aidl b/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/IBluetoothLmpEvent.aidl
new file mode 100644
index 0000000..3431010
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/IBluetoothLmpEvent.aidl
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.bluetooth.lmp_event;
+@VintfStability
+interface IBluetoothLmpEvent {
+ void registerForLmpEvents(in android.hardware.bluetooth.lmp_event.IBluetoothLmpEventCallback callback, in android.hardware.bluetooth.lmp_event.AddressType addressType, in byte[6] address, in android.hardware.bluetooth.lmp_event.LmpEventId[] lmpEventIds);
+ void unregisterLmpEvents(in android.hardware.bluetooth.lmp_event.AddressType addressType, in byte[6] address);
+}
diff --git a/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/IBluetoothLmpEventCallback.aidl b/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/IBluetoothLmpEventCallback.aidl
new file mode 100644
index 0000000..fc6758c
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/IBluetoothLmpEventCallback.aidl
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.bluetooth.lmp_event;
+@VintfStability
+interface IBluetoothLmpEventCallback {
+ void onEventGenerated(in android.hardware.bluetooth.lmp_event.Timestamp timestamp, in android.hardware.bluetooth.lmp_event.AddressType addressType, in byte[6] address, in android.hardware.bluetooth.lmp_event.Direction direction, in android.hardware.bluetooth.lmp_event.LmpEventId lmpEventId, in char connEventCounter);
+ void onRegistered(in boolean status);
+}
diff --git a/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/LmpEventId.aidl b/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/LmpEventId.aidl
new file mode 100644
index 0000000..4ee95d1
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/LmpEventId.aidl
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.bluetooth.lmp_event;
+@Backing(type="byte") @VintfStability
+enum LmpEventId {
+ CONNECT_IND = 0x00,
+ LL_PHY_UPDATE_IND = 0x01,
+}
diff --git a/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/Timestamp.aidl b/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/Timestamp.aidl
new file mode 100644
index 0000000..5ef32ba
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/aidl_api/android.hardware.bluetooth.lmp_event/current/android/hardware/bluetooth/lmp_event/Timestamp.aidl
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.bluetooth.lmp_event;
+@VintfStability
+parcelable Timestamp {
+ long systemTimeUs;
+ long bluetoothTimeUs;
+}
diff --git a/health/2.0/utils/libhealthstoragedefault/StorageHealthDefault.cpp b/bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/AddressType.aidl
similarity index 68%
rename from health/2.0/utils/libhealthstoragedefault/StorageHealthDefault.cpp
rename to bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/AddressType.aidl
index aba6cc3..6bfc7c7 100644
--- a/health/2.0/utils/libhealthstoragedefault/StorageHealthDefault.cpp
+++ b/bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/AddressType.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -13,12 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#include "include/StorageHealthDefault.h"
-void get_storage_info(std::vector<struct StorageInfo>&) {
- // Use defaults.
-}
+package android.hardware.bluetooth.lmp_event;
-void get_disk_stats(std::vector<struct DiskStats>&) {
- // Use defaults
+/**
+ * Type of Address
+ */
+@VintfStability
+@Backing(type="byte")
+enum AddressType {
+ PUBLIC = 0x00,
+ RANDOM = 0x01,
}
diff --git a/health/2.0/utils/libhealthstoragedefault/StorageHealthDefault.cpp b/bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/Direction.aidl
similarity index 68%
copy from health/2.0/utils/libhealthstoragedefault/StorageHealthDefault.cpp
copy to bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/Direction.aidl
index aba6cc3..884c2bb 100644
--- a/health/2.0/utils/libhealthstoragedefault/StorageHealthDefault.cpp
+++ b/bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/Direction.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * 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.
@@ -13,12 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#include "include/StorageHealthDefault.h"
-void get_storage_info(std::vector<struct StorageInfo>&) {
- // Use defaults.
-}
+package android.hardware.bluetooth.lmp_event;
-void get_disk_stats(std::vector<struct DiskStats>&) {
- // Use defaults
+/**
+ * Direction of the LMP event
+ */
+@VintfStability
+@Backing(type="byte")
+enum Direction {
+ TX = 0x00,
+ RX = 0x01,
}
diff --git a/bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/IBluetoothLmpEvent.aidl b/bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/IBluetoothLmpEvent.aidl
new file mode 100644
index 0000000..3828af6
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/IBluetoothLmpEvent.aidl
@@ -0,0 +1,45 @@
+/*
+ * 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.
+ */
+
+package android.hardware.bluetooth.lmp_event;
+
+import android.hardware.bluetooth.lmp_event.IBluetoothLmpEventCallback;
+import android.hardware.bluetooth.lmp_event.AddressType;
+import android.hardware.bluetooth.lmp_event.LmpEventId;
+
+@VintfStability
+interface IBluetoothLmpEvent {
+ /**
+ * API to monitor specific LMP event timestamp for given Bluetooth device.
+ *
+ * @param callback An instance of the |IBluetoothLmpEventCallback| AIDL interface object.
+ * @param addressType Type of bluetooth address.
+ * @param address Bluetooth address to monitor.
+ * @param lmpEventIds LMP events to monitor.
+ */
+ void registerForLmpEvents(in IBluetoothLmpEventCallback callback,
+ in AddressType addressType,
+ in byte[6] address,
+ in LmpEventId[] lmpEventIds);
+
+ /**
+ * API to stop monitoring a given Bluetooth device.
+ *
+ * @param addressType Type of Bluetooth address.
+ * @param address Bluetooth device to stop monitoring.
+ */
+ void unregisterLmpEvents(in AddressType addressType, in byte[6] address);
+}
diff --git a/bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/IBluetoothLmpEventCallback.aidl b/bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/IBluetoothLmpEventCallback.aidl
new file mode 100644
index 0000000..3295ef0
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/IBluetoothLmpEventCallback.aidl
@@ -0,0 +1,47 @@
+/*
+ * 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.
+ */
+
+package android.hardware.bluetooth.lmp_event;
+
+import android.hardware.bluetooth.lmp_event.Direction;
+import android.hardware.bluetooth.lmp_event.AddressType;
+import android.hardware.bluetooth.lmp_event.LmpEventId;
+import android.hardware.bluetooth.lmp_event.Timestamp;
+
+@VintfStability
+interface IBluetoothLmpEventCallback {
+ /**
+ * Callback when monitored LMP event invoked.
+ *
+ * @param timestamp Timestamp when the LMP event invoked
+ * @param addressType Type of Bluetooth address.
+ * @param address Remote bluetooth address that invoke LMP event
+ * @param direction Direction of the invoked LMP event
+ * @param lmpEventId LMP event id that bluetooth chip invoked
+ * @param connEventCounter counter incremented by one for each new connection event
+ */
+ void onEventGenerated(in Timestamp timestamp,
+ in AddressType addressType,
+ in byte[6] address,
+ in Direction direction,
+ in LmpEventId lmpEventId,
+ in char connEventCounter);
+
+ /**
+ * Callback when registration done.
+ */
+ void onRegistered(in boolean status);
+}
diff --git a/health/2.0/utils/libhealthservice/include/health2/service.h b/bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/LmpEventId.aidl
similarity index 61%
rename from health/2.0/utils/libhealthservice/include/health2/service.h
rename to bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/LmpEventId.aidl
index d260568..3584b0c 100644
--- a/health/2.0/utils/libhealthservice/include/health2/service.h
+++ b/bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/LmpEventId.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright 2018 The Android Open Source Project
+ * 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.
@@ -14,9 +14,16 @@
* limitations under the License.
*/
-#ifndef ANDROID_HARDWARE_HEALTH_V2_0_SERVICE_COMMON
-#define ANDROID_HARDWARE_HEALTH_V2_0_SERVICE_COMMON
+package android.hardware.bluetooth.lmp_event;
-int health_service_main(const char* instance = "");
-
-#endif // ANDROID_HARDWARE_HEALTH_V2_0_SERVICE_COMMON
+/**
+ * LMP event id to be monitored
+ * CONNECT_IND indicator for initiating connection
+ * LL_PHY_UPDATE_IND indicator for PHY update
+ */
+@VintfStability
+@Backing(type="byte")
+enum LmpEventId {
+ CONNECT_IND = 0x00,
+ LL_PHY_UPDATE_IND = 0x01,
+}
diff --git a/bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/Timestamp.aidl b/bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/Timestamp.aidl
new file mode 100644
index 0000000..e3c991d
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/android/hardware/bluetooth/lmp_event/Timestamp.aidl
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ */
+
+package android.hardware.bluetooth.lmp_event;
+
+/**
+ * Generic structure to return the timestamp
+ */
+@VintfStability
+parcelable Timestamp {
+ /**
+ * Timestamp in microsecond since system boot.
+ * if systemTimeUs is set to 0, its value is to be ignored
+ */
+ long systemTimeUs;
+ /**
+ * Timestamp in microsecond since Bluetooth controller power up.
+ */
+ long bluetoothTimeUs;
+}
diff --git a/bluetooth/lmp_event/aidl/default/Android.bp b/bluetooth/lmp_event/aidl/default/Android.bp
new file mode 100644
index 0000000..f8ca5e6
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/default/Android.bp
@@ -0,0 +1,28 @@
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "hardware_interfaces_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["hardware_interfaces_license"],
+}
+
+rust_binary {
+ name: "android.hardware.bluetooth.lmp_event-service.default",
+ relative_install_path: "hw",
+ init_rc: ["lmp_event-default.rc"],
+ vintf_fragments: [":manifest_android.hardware.bluetooth.lmp_event-service.default.xml"],
+ vendor: true,
+ rustlibs: [
+ "liblogger",
+ "liblog_rust",
+ "libbinder_rs",
+ "android.hardware.bluetooth.lmp_event-V1-rust",
+ ],
+ srcs: [ "src/main.rs" ],
+}
+
+filegroup {
+ name: "manifest_android.hardware.bluetooth.lmp_event-service.default.xml",
+ srcs: [ "lmp_event-default.xml" ],
+}
diff --git a/bluetooth/lmp_event/aidl/default/lmp_event-default.rc b/bluetooth/lmp_event/aidl/default/lmp_event-default.rc
new file mode 100644
index 0000000..845e04d
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/default/lmp_event-default.rc
@@ -0,0 +1,6 @@
+service vendor.bluetooth.lmp_event-default /vendor/bin/hw/android.hardware.bluetooth.lmp_event-service.default
+ class hal
+ capabilities BLOCK_SUSPEND NET_ADMIN SYS_NICE
+ user bluetooth
+ group bluetooth
+ task_profiles HighPerformance
diff --git a/bluetooth/lmp_event/aidl/default/lmp_event-default.xml b/bluetooth/lmp_event/aidl/default/lmp_event-default.xml
new file mode 100644
index 0000000..24d93f8
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/default/lmp_event-default.xml
@@ -0,0 +1,10 @@
+<manifest version="1.0" type="device">
+ <hal format="aidl">
+ <name>android.hardware.bluetooth.lmp_event</name>
+ <version>1</version>
+ <interface>
+ <name>IBluetoothLmpEvent</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+</manifest>
diff --git a/bluetooth/lmp_event/aidl/default/src/lmp_event.rs b/bluetooth/lmp_event/aidl/default/src/lmp_event.rs
new file mode 100644
index 0000000..f016c3f
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/default/src/lmp_event.rs
@@ -0,0 +1,80 @@
+/*
+ * 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.
+ */
+//! Implements LMP Event AIDL Interface.
+
+use android_hardware_bluetooth_lmp_event::aidl::android::hardware::bluetooth::lmp_event::{
+ Direction::Direction, AddressType::AddressType, IBluetoothLmpEvent::IBluetoothLmpEvent,
+ IBluetoothLmpEventCallback::IBluetoothLmpEventCallback, LmpEventId::LmpEventId,
+ Timestamp::Timestamp,
+};
+
+use binder::{Interface, Result, Strong};
+
+use log::info;
+use std::thread;
+use std::time;
+
+
+pub struct LmpEvent;
+
+impl LmpEvent {
+ pub fn new() -> Self {
+ Self
+ }
+}
+
+impl Interface for LmpEvent {}
+
+impl IBluetoothLmpEvent for LmpEvent {
+ fn registerForLmpEvents(&self,
+ callback: &Strong<dyn IBluetoothLmpEventCallback>,
+ address_type: AddressType,
+ address: &[u8; 6],
+ lmp_event_ids: &[LmpEventId]
+ ) -> Result<()> {
+ info!("registerForLmpEvents");
+
+ let cb = callback.clone();
+ let addr_type = address_type;
+ let addr = address.clone();
+ let lmp_event = lmp_event_ids.to_vec();
+
+ let thread_handle = thread::spawn(move || {
+ let ts = Timestamp {
+ bluetoothTimeUs: 1000000,
+ systemTimeUs: 2000000,
+ };
+
+ info!("sleep for 1000 ms");
+ thread::sleep(time::Duration::from_millis(1000));
+
+ info!("callback event");
+ cb.onEventGenerated(&ts, addr_type, &addr, Direction::RX, lmp_event[0], 1)
+ .expect("onEventGenerated failed");
+ });
+
+ info!("callback register");
+ callback.onRegistered(true)?;
+
+ thread_handle.join().expect("join failed");
+ Ok(())
+ }
+ fn unregisterLmpEvents(&self, _address_type: AddressType, _address: &[u8; 6]) -> Result<()> {
+ info!("unregisterLmpEvents");
+
+ Ok(())
+ }
+}
diff --git a/bluetooth/lmp_event/aidl/default/src/main.rs b/bluetooth/lmp_event/aidl/default/src/main.rs
new file mode 100644
index 0000000..cbdd4d1
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/default/src/main.rs
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+//! Implements LMP Event Example Service.
+
+
+use android_hardware_bluetooth_lmp_event::aidl::android::hardware::bluetooth::lmp_event::IBluetoothLmpEvent::{
+ IBluetoothLmpEvent, BnBluetoothLmpEvent
+};
+
+use binder::BinderFeatures;
+use log::{info, Level};
+
+mod lmp_event;
+
+const LOG_TAG: &str = "lmp_event_service_example";
+
+fn main() {
+ info!("{LOG_TAG}: starting service");
+ let logger_success = logger::init(
+ logger::Config::default().with_tag_on_device(LOG_TAG).with_min_level(Level::Trace)
+ );
+ if !logger_success {
+ panic!("{LOG_TAG}: Failed to start logger");
+ }
+
+ binder::ProcessState::set_thread_pool_max_thread_count(0);
+
+ let lmp_event_service = lmp_event::LmpEvent::new();
+ let lmp_event_service_binder = BnBluetoothLmpEvent::new_binder(lmp_event_service, BinderFeatures::default());
+
+ binder::add_service(
+ &format!("{}/default", lmp_event::LmpEvent::get_descriptor()),
+ lmp_event_service_binder.as_binder(),
+ ).expect("Failed to register service");
+
+ binder::ProcessState::join_thread_pool()
+}
diff --git a/bluetooth/lmp_event/aidl/vts/Android.bp b/bluetooth/lmp_event/aidl/vts/Android.bp
new file mode 100644
index 0000000..b89351e
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/vts/Android.bp
@@ -0,0 +1,20 @@
+cc_test {
+ name: "VtsHalLmpEventTargetTest",
+ defaults: [
+ "VtsHalTargetTestDefaults",
+ "use_libaidlvintf_gtest_helper_static",
+ ],
+ srcs: ["VtsHalLmpEventTargetTest.cpp"],
+ shared_libs: [
+ "libbinder",
+ "libbinder_ndk"
+ ],
+ static_libs: [
+ "android.hardware.bluetooth.lmp_event-V1-ndk",
+ ],
+ test_suites: [
+ "general-tests",
+ "vts",
+ ]
+}
+
diff --git a/bluetooth/lmp_event/aidl/vts/VtsHalLmpEventTargetTest.cpp b/bluetooth/lmp_event/aidl/vts/VtsHalLmpEventTargetTest.cpp
new file mode 100644
index 0000000..c49f60b
--- /dev/null
+++ b/bluetooth/lmp_event/aidl/vts/VtsHalLmpEventTargetTest.cpp
@@ -0,0 +1,176 @@
+/*
+ * 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 std::shared_ptrecific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "lmp_event_hal_test"
+
+#include <aidl/Gtest.h>
+#include <aidl/Vintf.h>
+
+#include <aidl/android/hardware/bluetooth/lmp_event/BnBluetoothLmpEvent.h>
+#include <aidl/android/hardware/bluetooth/lmp_event/BnBluetoothLmpEventCallback.h>
+#include <aidl/android/hardware/bluetooth/lmp_event/Direction.h>
+#include <aidl/android/hardware/bluetooth/lmp_event/AddressType.h>
+#include <aidl/android/hardware/bluetooth/lmp_event/LmpEventId.h>
+#include <aidl/android/hardware/bluetooth/lmp_event/Timestamp.h>
+
+#include <android/binder_auto_utils.h>
+#include <android/binder_manager.h>
+#include <binder/IServiceManager.h>
+#include <binder/ProcessState.h>
+#include <log/log.h>
+
+#include <chrono>
+#include <condition_variable>
+#include <cinttypes>
+#include <thread>
+
+using ::aidl::android::hardware::bluetooth::lmp_event::BnBluetoothLmpEventCallback;
+using ::aidl::android::hardware::bluetooth::lmp_event::IBluetoothLmpEvent;
+using ::aidl::android::hardware::bluetooth::lmp_event::IBluetoothLmpEventCallback;
+using ::aidl::android::hardware::bluetooth::lmp_event::Direction;
+using ::aidl::android::hardware::bluetooth::lmp_event::AddressType;
+using ::aidl::android::hardware::bluetooth::lmp_event::LmpEventId;
+using ::aidl::android::hardware::bluetooth::lmp_event::Timestamp;
+
+using ::android::ProcessState;
+using ::ndk::SpAIBinder;
+
+namespace {
+ static constexpr std::chrono::milliseconds kEventTimeoutMs(10000);
+}
+
+class BluetoothLmpEventTest : public testing::TestWithParam<std::string> {
+ public:
+ virtual void SetUp() override {
+ ALOGI("%s", __func__);
+
+ ibt_lmp_event_ = IBluetoothLmpEvent::fromBinder(SpAIBinder(AServiceManager_waitForService(GetParam().c_str())));
+ ASSERT_NE(ibt_lmp_event_, nullptr);
+
+ ibt_lmp_event_cb_ = ndk::SharedRefBase::make<BluetoothLmpEventCallback>(*this);
+ ASSERT_NE(ibt_lmp_event_cb_, nullptr);
+ }
+
+ virtual void TearDown() override {
+ ALOGI("%s", __func__);
+ ibt_lmp_event_->unregisterLmpEvents(address_type, address);
+
+ ibt_lmp_event_cb_ = nullptr;
+ }
+
+ class BluetoothLmpEventCallback : public BnBluetoothLmpEventCallback {
+ public:
+ BluetoothLmpEventTest& parent_;
+ BluetoothLmpEventCallback(BluetoothLmpEventTest& parent)
+ : parent_(parent) {}
+ ~BluetoothLmpEventCallback() = default;
+
+ ::ndk::ScopedAStatus onEventGenerated(const Timestamp& timestamp, AddressType address_type,
+ const std::array<uint8_t, 6>& address, Direction direction,
+ LmpEventId lmp_event_id, char16_t conn_event_counter) override {
+ for (auto t: address) {
+ ALOGD("%s: 0x%02x", __func__, t);
+ }
+ if (direction == Direction::TX) {
+ ALOGD("%s: Transmitting", __func__);
+ } else if (direction == Direction::RX) {
+ ALOGD("%s: Receiving", __func__);
+ }
+ if (address_type == AddressType::PUBLIC) {
+ ALOGD("%s: Public address", __func__);
+ } else if (address_type == AddressType::RANDOM) {
+ ALOGD("%s: Random address", __func__);
+ }
+ if (lmp_event_id == LmpEventId::CONNECT_IND) {
+ ALOGD("%s: initiating connection", __func__);
+ } else if (lmp_event_id == LmpEventId::LL_PHY_UPDATE_IND) {
+ ALOGD("%s: PHY update indication", __func__);
+ }
+
+ ALOGD("%s: time: %" PRId64 "counter value: %x", __func__, timestamp.bluetoothTimeUs, conn_event_counter);
+
+ parent_.event_recv = true;
+ parent_.notify();
+
+ return ::ndk::ScopedAStatus::ok();
+ }
+ ::ndk::ScopedAStatus onRegistered(bool status) override {
+ ALOGD("%s: status: %d", __func__, status);
+ parent_.status_recv = status;
+ parent_.notify();
+ return ::ndk::ScopedAStatus::ok();
+ }
+ };
+
+ inline void notify() {
+ std::unique_lock<std::mutex> lock(lmp_event_mtx);
+ lmp_event_cv.notify_one();
+ }
+
+ inline void wait(bool is_register_event) {
+ std::unique_lock<std::mutex> lock(lmp_event_mtx);
+
+
+ if (is_register_event) {
+ lmp_event_cv.wait(lock, [&]() { return status_recv == true; });
+ } else {
+ lmp_event_cv.wait_for(lock, kEventTimeoutMs,
+ [&](){ return event_recv == true; });
+ }
+
+ }
+
+ std::shared_ptr<IBluetoothLmpEvent> ibt_lmp_event_;
+ std::shared_ptr<IBluetoothLmpEventCallback> ibt_lmp_event_cb_;
+
+ AddressType address_type;
+ std::array<uint8_t, 6> address;
+
+ std::atomic<bool> event_recv;
+ bool status_recv;
+
+ std::mutex lmp_event_mtx;
+ std::condition_variable lmp_event_cv;
+};
+
+TEST_P(BluetoothLmpEventTest, RegisterAndReceive) {
+ address = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
+ address_type = AddressType::RANDOM;
+ std::vector<LmpEventId> lmp_event_ids{LmpEventId::CONNECT_IND, LmpEventId::LL_PHY_UPDATE_IND};
+
+ ibt_lmp_event_->registerForLmpEvents(ibt_lmp_event_cb_, address_type, address, lmp_event_ids);
+ wait(true);
+ EXPECT_EQ(true, status_recv);
+
+ /* Wait for event generated here */
+ wait(false);
+ EXPECT_EQ(true, event_recv);
+
+ ibt_lmp_event_->unregisterLmpEvents(address_type, address);
+}
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BluetoothLmpEventTest);
+INSTANTIATE_TEST_SUITE_P(BluetoothLmpEvent, BluetoothLmpEventTest,
+ testing::ValuesIn(android::getAidlHalInstanceNames(IBluetoothLmpEvent::descriptor)),
+ android::PrintInstanceNameToString);
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ ProcessState::self()->setThreadPoolMaxThreadCount(1);
+ ProcessState::self()->startThreadPool();
+ return RUN_ALL_TESTS();
+}
+
diff --git a/bluetooth/ranging/aidl/aidl_api/android.hardware.bluetooth.ranging/current/android/hardware/bluetooth/ranging/ChannelSoundingSingleSideData.aidl b/bluetooth/ranging/aidl/aidl_api/android.hardware.bluetooth.ranging/current/android/hardware/bluetooth/ranging/ChannelSoundingSingleSideData.aidl
index ddaba72..172ac5e 100644
--- a/bluetooth/ranging/aidl/aidl_api/android.hardware.bluetooth.ranging/current/android/hardware/bluetooth/ranging/ChannelSoundingSingleSideData.aidl
+++ b/bluetooth/ranging/aidl/aidl_api/android.hardware.bluetooth.ranging/current/android/hardware/bluetooth/ranging/ChannelSoundingSingleSideData.aidl
@@ -34,13 +34,13 @@
package android.hardware.bluetooth.ranging;
@VintfStability
parcelable ChannelSoundingSingleSideData {
- @nullable List<android.hardware.bluetooth.ranging.StepTonePct> stepTonePcts;
+ @nullable android.hardware.bluetooth.ranging.StepTonePct[] stepTonePcts;
@nullable byte[] packetQuality;
@nullable byte[] packetRssiDbm;
@nullable android.hardware.bluetooth.ranging.Nadm[] packetNadm;
@nullable int[] measuredFreqOffset;
- @nullable List<android.hardware.bluetooth.ranging.ComplexNumber> packetPct1;
- @nullable List<android.hardware.bluetooth.ranging.ComplexNumber> packetPct2;
+ @nullable android.hardware.bluetooth.ranging.ComplexNumber[] packetPct1;
+ @nullable android.hardware.bluetooth.ranging.ComplexNumber[] packetPct2;
byte referencePowerDbm;
@nullable byte[] vendorSpecificCsSingleSidedata;
}
diff --git a/bluetooth/ranging/aidl/aidl_api/android.hardware.bluetooth.ranging/current/android/hardware/bluetooth/ranging/ModeType.aidl b/bluetooth/ranging/aidl/aidl_api/android.hardware.bluetooth.ranging/current/android/hardware/bluetooth/ranging/ModeType.aidl
index 75cdabc..1e8ae91 100644
--- a/bluetooth/ranging/aidl/aidl_api/android.hardware.bluetooth.ranging/current/android/hardware/bluetooth/ranging/ModeType.aidl
+++ b/bluetooth/ranging/aidl/aidl_api/android.hardware.bluetooth.ranging/current/android/hardware/bluetooth/ranging/ModeType.aidl
@@ -32,7 +32,7 @@
// later when a module using the interface is updated, e.g., Mainline modules.
package android.hardware.bluetooth.ranging;
-@Backing(type="int") @VintfStability
+@Backing(type="byte") @VintfStability
enum ModeType {
ZERO = 0x00,
ONE = 0x01,
diff --git a/bluetooth/ranging/aidl/aidl_api/android.hardware.bluetooth.ranging/current/android/hardware/bluetooth/ranging/SubModeType.aidl b/bluetooth/ranging/aidl/aidl_api/android.hardware.bluetooth.ranging/current/android/hardware/bluetooth/ranging/SubModeType.aidl
index f660c91..b72a97d 100644
--- a/bluetooth/ranging/aidl/aidl_api/android.hardware.bluetooth.ranging/current/android/hardware/bluetooth/ranging/SubModeType.aidl
+++ b/bluetooth/ranging/aidl/aidl_api/android.hardware.bluetooth.ranging/current/android/hardware/bluetooth/ranging/SubModeType.aidl
@@ -32,10 +32,10 @@
// later when a module using the interface is updated, e.g., Mainline modules.
package android.hardware.bluetooth.ranging;
-@Backing(type="int") @VintfStability
+@Backing(type="byte") @VintfStability
enum SubModeType {
ONE = 0x01,
TWO = 0x02,
THREE = 0x03,
- UNUSED = 0xff,
+ UNUSED = 0xffu8,
}
diff --git a/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/AddressType.aidl b/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/AddressType.aidl
index bd03213..499d42f 100644
--- a/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/AddressType.aidl
+++ b/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/AddressType.aidl
@@ -16,9 +16,13 @@
package android.hardware.bluetooth.ranging;
+/**
+ * Same as the BLE address type, except anonymous isn't supported for ranging.
+ */
@VintfStability
@Backing(type="int")
enum AddressType {
PUBLIC = 0x00,
+ /* Still may be fixed on the device and is not randomized on boot */
RANDOM = 0x01,
}
diff --git a/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/ChannelSoudingRawData.aidl b/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/ChannelSoudingRawData.aidl
index 0106865..78ce4f4 100644
--- a/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/ChannelSoudingRawData.aidl
+++ b/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/ChannelSoudingRawData.aidl
@@ -21,6 +21,9 @@
/**
* Raw ranging data of Channel Sounding.
+ * See Channel Sounding CR_PR 3.1.10 and Channel Sounding HCI Updates CR_PR 3.1.23 for details.
+ *
+ * Specification: https://www.bluetooth.com/specifications/specs/channel-sounding-cr-pr/
*/
@VintfStability
parcelable ChannelSoudingRawData {
diff --git a/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/ChannelSoundingSingleSideData.aidl b/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/ChannelSoundingSingleSideData.aidl
index 942fc0d..9c4b472 100644
--- a/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/ChannelSoundingSingleSideData.aidl
+++ b/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/ChannelSoundingSingleSideData.aidl
@@ -21,14 +21,17 @@
import android.hardware.bluetooth.ranging.StepTonePct;
/**
- * Raw ranging data of Channel Sounding from either Initator or Reflector
+ * Raw ranging data of Channel Sounding from either Initator or Reflector.
+ * See Channel Sounding CR_PR 3.1.10 and Channel Sounding HCI Updates CR_PR 3.1.23 for details.
+ *
+ * Specification: https://www.bluetooth.com/specifications/specs/channel-sounding-cr-pr/
*/
@VintfStability
parcelable ChannelSoundingSingleSideData {
/**
* PCT (complex value) measured from mode-2 or mode-3 steps in a CS procedure (in time order).
*/
- @nullable List<StepTonePct> stepTonePcts;
+ @nullable StepTonePct[] stepTonePcts;
/**
* Packet Quality from mode-1 or mode-3 steps in a CS procedures (in time order).
*/
@@ -49,8 +52,8 @@
* Packet_PCT1 or packet_PCT2 of mode-1 or mode-3, if sounding sequence is used and sounding
* phase-based ranging is supported.
*/
- @nullable List<ComplexNumber> packetPct1;
- @nullable List<ComplexNumber> packetPct2;
+ @nullable ComplexNumber[] packetPct1;
+ @nullable ComplexNumber[] packetPct2;
/**
* Reference power level (-127 to 20) of the signal in the procedure, in dBm.
*/
diff --git a/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/ModeType.aidl b/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/ModeType.aidl
index 2058ae8..3a727aa 100644
--- a/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/ModeType.aidl
+++ b/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/ModeType.aidl
@@ -17,7 +17,7 @@
package android.hardware.bluetooth.ranging;
@VintfStability
-@Backing(type="int")
+@Backing(type="byte")
enum ModeType {
ZERO = 0x00,
ONE = 0x01,
diff --git a/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/Nadm.aidl b/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/Nadm.aidl
index 3cfb22f..74cf731 100644
--- a/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/Nadm.aidl
+++ b/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/Nadm.aidl
@@ -16,6 +16,12 @@
package android.hardware.bluetooth.ranging;
+/**
+ * Normalized Attack Detector Metric.
+ * See Channel Sounding CR_PR, 3.13.24 for details.
+ *
+ * Specification: https://www.bluetooth.com/specifications/specs/channel-sounding-cr-pr/
+ */
@VintfStability
@Backing(type="byte")
enum Nadm {
@@ -26,5 +32,7 @@
ATTACK_IS_LIKELY = 0x04,
ATTACK_IS_VERY_LIKELY = 0x05,
ATTACK_IS_EXTREMELY_LIKELY = 0x06,
+ /* If a device is unable to determine a NADM value, then it shall report a NADM value of Unknown
+ */
UNKNOWN = 0xFFu8,
}
diff --git a/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/SubModeType.aidl b/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/SubModeType.aidl
index ca9bfcb..b775002 100644
--- a/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/SubModeType.aidl
+++ b/bluetooth/ranging/aidl/android/hardware/bluetooth/ranging/SubModeType.aidl
@@ -17,10 +17,10 @@
package android.hardware.bluetooth.ranging;
@VintfStability
-@Backing(type="int")
+@Backing(type="byte")
enum SubModeType {
ONE = 0x01,
TWO = 0x02,
THREE = 0x03,
- UNUSED = 0xff,
+ UNUSED = 0xffu8,
}
diff --git a/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp b/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp
index cac3dd0..dec1f17 100644
--- a/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp
+++ b/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp
@@ -52,10 +52,9 @@
using ::android::hardware::broadcastradio::V1_0::Result;
using ::android::hardware::broadcastradio::V1_0::vts::RadioClassFromString;
-#define RETURN_IF_SKIPPED \
- if (skipped) { \
- std::cout << "[ SKIPPED ] This device class is not supported. " << std::endl; \
- return; \
+#define RETURN_IF_SKIPPED \
+ if (skipped) { \
+ GTEST_SKIP() << "This device class is not supported."; \
}
// The main test class for Broadcast Radio HIDL HAL.
@@ -734,4 +733,4 @@
testing::Combine(testing::ValuesIn(android::hardware::getAllHalInstanceNames(
IBroadcastRadioFactory::descriptor)),
::testing::Values("AM_FM", "SAT", "DT")),
- android::hardware::PrintInstanceTupleNameToString<>);
\ No newline at end of file
+ android::hardware::PrintInstanceTupleNameToString<>);
diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp
index caf6cbd..b54e9d8 100644
--- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp
+++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp
@@ -73,10 +73,6 @@
ProgramType::AM, ProgramType::FM, ProgramType::AM_HD, ProgramType::FM_HD,
ProgramType::DAB, ProgramType::DRMO, ProgramType::SXM};
-static void printSkipped(std::string msg) {
- std::cout << "[ SKIPPED ] " << msg << std::endl;
-}
-
struct TunerCallbackMock : public ITunerCallback {
TunerCallbackMock() { EXPECT_CALL(*this, hardwareFailure()).Times(0); }
@@ -106,7 +102,6 @@
bool getProgramList(std::function<void(const hidl_vec<ProgramInfo>& list)> cb);
Class radioClass;
- bool skipped = false;
sp<IBroadcastRadio> mRadioModule;
sp<ITuner> mTuner;
@@ -137,9 +132,7 @@
ASSERT_TRUE(onConnect.waitForCall(kConnectModuleTimeout));
if (connectResult == Result::INVALID_ARGUMENTS) {
- printSkipped("This device class is not supported.");
- skipped = true;
- return;
+ GTEST_SKIP() << "This device class is not supported.";
}
ASSERT_EQ(connectResult, Result::OK);
ASSERT_NE(nullptr, mRadioModule.get());
@@ -285,8 +278,6 @@
* might fail.
*/
TEST_P(BroadcastRadioHalTest, OpenTunerTwice) {
- if (skipped) return;
-
ASSERT_TRUE(openTuner());
auto secondTuner = mTuner;
@@ -306,7 +297,6 @@
* - getProgramInformation_1_1 returns the same selector as returned in tuneComplete_1_1 call.
*/
TEST_P(BroadcastRadioHalTest, TuneFromProgramList) {
- if (skipped) return;
ASSERT_TRUE(openTuner());
ProgramInfo firstProgram;
@@ -320,8 +310,7 @@
} while (nextBand());
if (HasFailure()) return;
if (!foundAny) {
- printSkipped("Program list is empty.");
- return;
+ GTEST_SKIP() << "Program list is empty.";
}
ProgramInfo infoCb;
@@ -356,7 +345,6 @@
* identifier for program types other than VENDORn.
*/
TEST_P(BroadcastRadioHalTest, TuneFailsForPrimaryVendor) {
- if (skipped) return;
ASSERT_TRUE(openTuner());
for (auto ptype : kStandardProgramTypes) {
@@ -377,7 +365,6 @@
* - tuneByProgramSelector fails with INVALID_ARGUMENT when unknown program type is passed.
*/
TEST_P(BroadcastRadioHalTest, TuneFailsForUnknownProgram) {
- if (skipped) return;
ASSERT_TRUE(openTuner());
// Program type is 1-based, so 0 will be always invalid.
@@ -393,7 +380,6 @@
* - cancelAnnouncement succeeds either when there is an announcement or there is none.
*/
TEST_P(BroadcastRadioHalTest, CancelAnnouncement) {
- if (skipped) return;
ASSERT_TRUE(openTuner());
auto hidlResult = mTuner->cancelAnnouncement();
@@ -407,8 +393,6 @@
* - getImage call handles argument 0 gracefully.
*/
TEST_P(BroadcastRadioHalTest, GetNoImage) {
- if (skipped) return;
-
size_t len = 0;
auto hidlResult =
mRadioModule->getImage(0, [&](hidl_vec<uint8_t> rawImage) { len = rawImage.size(); });
@@ -425,7 +409,6 @@
* - images are available for getImage call.
*/
TEST_P(BroadcastRadioHalTest, OobImagesOnly) {
- if (skipped) return;
ASSERT_TRUE(openTuner());
std::vector<int> imageIds;
@@ -446,8 +429,7 @@
} while (nextBand());
if (imageIds.size() == 0) {
- printSkipped("No images found");
- return;
+ GTEST_SKIP() << "No images found";
}
for (auto id : imageIds) {
@@ -469,7 +451,6 @@
* - setAnalogForced results either with INVALID_STATE, or isAnalogForced replying the same.
*/
TEST_P(BroadcastRadioHalTest, AnalogForcedSwitch) {
- if (skipped) return;
ASSERT_TRUE(openTuner());
bool forced;
@@ -584,7 +565,6 @@
* - values of ProgramIdentifier match their definitions at IdentifierType.
*/
TEST_P(BroadcastRadioHalTest, VerifyIdentifiersFormat) {
- if (skipped) return;
ASSERT_TRUE(openTuner());
do {
diff --git a/broadcastradio/TEST_MAPPING b/broadcastradio/TEST_MAPPING
new file mode 100644
index 0000000..8295331
--- /dev/null
+++ b/broadcastradio/TEST_MAPPING
@@ -0,0 +1,18 @@
+{
+ "postsubmit": [
+ {
+ "name": "broadcastradio_utils_aidl_test"
+ },
+ {
+ "name": "DefaultBroadcastRadioHalTestCase"
+ },
+ {
+ "name": "android.hardware.broadcastradio@common-utils-tests"
+ }
+ ],
+ "auto-presubmit": [
+ {
+ "name": "VtsHalBroadcastradioAidlTargetTest"
+ }
+ ]
+}
diff --git a/broadcastradio/aidl/android/hardware/broadcastradio/Metadata.aidl b/broadcastradio/aidl/android/hardware/broadcastradio/Metadata.aidl
index 0ce967f..f1800dc 100644
--- a/broadcastradio/aidl/android/hardware/broadcastradio/Metadata.aidl
+++ b/broadcastradio/aidl/android/hardware/broadcastradio/Metadata.aidl
@@ -86,7 +86,7 @@
/**
* DAB ensemble name abbreviated (string).
*
- * <p>Note: The string must be up to 8 characters long.
+ * <p>Note: The string should be <= 8 characters.
*
* <p>Note: If the short variant is present, the long ({@link Metadata#dabEnsembleName})
* one must be present as well.
@@ -101,7 +101,7 @@
/**
* DAB service name abbreviated (string)
*
- * <p>Note: The string must be up to 8 characters long.
+ * <p>Note: The string should be <= 8 characters.
*/
String dabServiceNameShort;
@@ -113,7 +113,7 @@
/**
* DAB component name abbreviated (string)
*
- * <p>Note: The string must be up to 8 characters long.
+ * <p>Note: The string should be <= 8 characters.
*/
String dabComponentNameShort;
@@ -161,7 +161,7 @@
/**
* HD short station name or HD universal short station name
*
- * <p>It can be up to 12 characters (see SY_IDD_1020s for more info).
+ * <p>It can be <= 12 characters (see SY_IDD_1020s for more info).
*/
String hdStationNameShort;
diff --git a/broadcastradio/aidl/default/Android.bp b/broadcastradio/aidl/default/Android.bp
index 743365a..d7bb751 100644
--- a/broadcastradio/aidl/default/Android.bp
+++ b/broadcastradio/aidl/default/Android.bp
@@ -26,11 +26,11 @@
cc_defaults {
name: "BroadcastRadioHalDefaults",
static_libs: [
+ "android.hardware.broadcastradio-V2-ndk",
"android.hardware.broadcastradio@common-utils-aidl-lib-V2",
"android.hardware.broadcastradio@common-utils-lib",
],
shared_libs: [
- "android.hardware.broadcastradio-V2-ndk",
"libbase",
"libbinder_ndk",
"liblog",
diff --git a/broadcastradio/aidl/default/test/Android.bp b/broadcastradio/aidl/default/test/Android.bp
new file mode 100644
index 0000000..9e1b89d
--- /dev/null
+++ b/broadcastradio/aidl/default/test/Android.bp
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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"],
+}
+
+cc_test {
+ name: "DefaultBroadcastRadioHalTestCase",
+ vendor: true,
+ srcs: ["*.cpp"],
+ static_libs: [
+ "DefaultBroadcastRadioHal",
+ "libgtest",
+ "libgmock",
+ ],
+ shared_libs: [
+ "libbase",
+ "libbinder_ndk",
+ "liblog",
+ "libutils",
+ ],
+ header_libs: [
+ "IVehicleHardware",
+ ],
+ defaults: [
+ "BroadcastRadioHalDefaults",
+ ],
+ test_suites: ["device-tests"],
+}
diff --git a/broadcastradio/aidl/default/test/DefaultBroadcastRadioHalTest.cpp b/broadcastradio/aidl/default/test/DefaultBroadcastRadioHalTest.cpp
new file mode 100644
index 0000000..a370436
--- /dev/null
+++ b/broadcastradio/aidl/default/test/DefaultBroadcastRadioHalTest.cpp
@@ -0,0 +1,139 @@
+/*
+ * 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.
+ */
+
+#include <BroadcastRadio.h>
+#include <VirtualRadio.h>
+#include <broadcastradio-utils-aidl/Utils.h>
+
+#include <gtest/gtest.h>
+
+namespace aidl::android::hardware::broadcastradio {
+
+namespace {
+using ::std::vector;
+
+constexpr uint32_t kAmFreq1 = 560u;
+constexpr uint32_t kAmFreq2 = 680u;
+constexpr uint32_t kAmHdFreq = 1170u;
+constexpr uint64_t kAmHdSid = 0xB0000001u;
+constexpr uint32_t kFmFreq1 = 94900u;
+constexpr uint64_t kFmHdSid1 = 0xA0000001u;
+constexpr uint64_t kFmHdSid2 = 0xA0000002u;
+constexpr uint32_t kFmHdFreq1 = 98500u;
+constexpr uint32_t kFmHdSubChannel0 = 0u;
+constexpr uint32_t kFmHdSubChannel1 = 1u;
+constexpr uint32_t kFmFreq2 = 99100u;
+constexpr uint32_t kFmHdFreq2 = 101100u;
+
+const ProgramSelector kAmSel1 = utils::makeSelectorAmfm(kAmFreq1);
+const ProgramSelector kAmSel2 = utils::makeSelectorAmfm(kAmFreq2);
+const ProgramSelector kAmHdSel = utils::makeSelectorHd(kAmHdSid, kFmHdSubChannel0, kAmHdFreq);
+const ProgramSelector kFmSel1 = utils::makeSelectorAmfm(kFmFreq1);
+const ProgramSelector kFmSel2 = utils::makeSelectorAmfm(kFmFreq2);
+const ProgramSelector kFmHdFreq1Sel1 =
+ utils::makeSelectorHd(kFmHdSid1, kFmHdSubChannel0, kFmHdFreq1);
+const ProgramSelector kFmHdFreq1Sel2 =
+ utils::makeSelectorHd(kFmHdSid1, kFmHdSubChannel1, kFmHdFreq1);
+const ProgramSelector kFmHdFreq2Sel1 =
+ utils::makeSelectorHd(kFmHdSid2, kFmHdSubChannel0, kFmHdFreq2);
+const ProgramSelector kFmHdFreq2Sel2 =
+ utils::makeSelectorHd(kFmHdSid2, kFmHdSubChannel1, kFmHdFreq2);
+
+const VirtualRadio& getAmFmMockTestRadio() {
+ static VirtualRadio amFmRadioMockTestRadio(
+ "AM/FM radio mock for test",
+ {
+ {kAmSel1, "ProgramAm1", "ArtistAm1", "TitleAm1"},
+ {kAmSel2, "ProgramAm2", "ArtistAm2", "TitleAm2"},
+ {kFmSel1, "ProgramFm1", "ArtistFm1", "TitleFm1"},
+ {kFmSel2, "ProgramFm2", "ArtistFm2", "TitleFm2"},
+ {kAmHdSel, "ProgramAmHd1", "ArtistAmHd1", "TitleAmHd1"},
+ {kFmHdFreq1Sel1, "ProgramFmHd1", "ArtistFmHd1", "TitleFmHd1"},
+ {kFmHdFreq1Sel2, "ProgramFmHd2", "ArtistFmHd2", "TitleFmHd2"},
+ {kFmHdFreq2Sel1, "ProgramFmHd3", "ArtistFmHd3", "TitleFmHd3"},
+ {kFmHdFreq2Sel2, "ProgramFmHd4", "ArtistFmHd4", "TitleFmHd4"},
+ });
+ return amFmRadioMockTestRadio;
+}
+
+} // namespace
+
+class DefaultBroadcastRadioHalTest : public testing::Test {
+ public:
+ void SetUp() override {
+ const VirtualRadio& amFmRadioMockTest = getAmFmMockTestRadio();
+ mBroadcastRadioHal = ::ndk::SharedRefBase::make<BroadcastRadio>(amFmRadioMockTest);
+ }
+ std::shared_ptr<BroadcastRadio> mBroadcastRadioHal;
+};
+
+TEST_F(DefaultBroadcastRadioHalTest, GetAmFmRegionConfig) {
+ AmFmRegionConfig config;
+
+ auto halResult = mBroadcastRadioHal->getAmFmRegionConfig(/* full= */ false, &config);
+
+ ASSERT_TRUE(halResult.isOk());
+ EXPECT_EQ(config.fmDeemphasis, AmFmRegionConfig::DEEMPHASIS_D50);
+ EXPECT_EQ(config.fmRds, AmFmRegionConfig::RDS);
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, GetAmFmRegionConfigWithFullBand) {
+ AmFmRegionConfig config;
+
+ auto halResult = mBroadcastRadioHal->getAmFmRegionConfig(/* full= */ true, &config);
+
+ ASSERT_TRUE(halResult.isOk());
+ EXPECT_EQ(config.fmDeemphasis,
+ AmFmRegionConfig::DEEMPHASIS_D50 | AmFmRegionConfig::DEEMPHASIS_D75);
+ EXPECT_EQ(config.fmRds, AmFmRegionConfig::RDS | AmFmRegionConfig::RBDS);
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, GetDabRegionConfig) {
+ vector<DabTableEntry> config;
+
+ auto halResult = mBroadcastRadioHal->getDabRegionConfig(&config);
+
+ ASSERT_TRUE(halResult.isOk());
+ ASSERT_FALSE(config.empty());
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, GetImage) {
+ vector<uint8_t> img;
+
+ auto halResult = mBroadcastRadioHal->getImage(BroadcastRadio::INVALID_IMAGE, &img);
+
+ ASSERT_TRUE(halResult.isOk());
+ ASSERT_TRUE(img.empty());
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, GetProperties) {
+ vector<VirtualProgram> mockPrograms = getAmFmMockTestRadio().getProgramList();
+ Properties prop;
+
+ auto halResult = mBroadcastRadioHal->getProperties(&prop);
+
+ ASSERT_TRUE(halResult.isOk());
+ ASSERT_FALSE(prop.supportedIdentifierTypes.empty());
+ std::unordered_set<IdentifierType> supportedTypeSet;
+ for (const auto& supportedType : prop.supportedIdentifierTypes) {
+ supportedTypeSet.insert(supportedType);
+ }
+ for (const auto& program : mockPrograms) {
+ EXPECT_NE(supportedTypeSet.find(program.selector.primaryId.type), supportedTypeSet.end());
+ }
+}
+
+} // namespace aidl::android::hardware::broadcastradio
diff --git a/broadcastradio/aidl/vts/src/VtsHalBroadcastradioAidlTargetTest.cpp b/broadcastradio/aidl/vts/src/VtsHalBroadcastradioAidlTargetTest.cpp
index 2668a97..9633ebb 100644
--- a/broadcastradio/aidl/vts/src/VtsHalBroadcastradioAidlTargetTest.cpp
+++ b/broadcastradio/aidl/vts/src/VtsHalBroadcastradioAidlTargetTest.cpp
@@ -35,6 +35,7 @@
#include <broadcastradio-utils-aidl/UtilsV2.h>
#include <cutils/bitops.h>
#include <gmock/gmock.h>
+#include <gtest/gtest.h>
#include <chrono>
#include <condition_variable>
@@ -76,12 +77,6 @@
constexpr int32_t kAidlVersion1 = 1;
constexpr int32_t kAidlVersion2 = 2;
-void printSkipped(const std::string& msg) {
- const auto testInfo = testing::UnitTest::GetInstance()->current_test_info();
- LOG(INFO) << "[ SKIPPED ] " << testInfo->test_case_name() << "." << testInfo->name()
- << " with message: " << msg;
-}
-
bool isValidAmFmFreq(int64_t freq, int aidlVersion) {
ProgramIdentifier id = bcutils::makeIdentifier(IdentifierType::AMFM_FREQUENCY_KHZ, freq);
if (aidlVersion == kAidlVersion1) {
@@ -255,6 +250,16 @@
}
}
+ for (const auto& metadataItem : info.metadata) {
+ bool validMetadata = false;
+ if (mCallbackAidlVersion == kAidlVersion1) {
+ validMetadata = bcutils::isValidMetadata(metadataItem);
+ } else {
+ validMetadata = bcutils::isValidMetadataV2(metadataItem);
+ }
+ EXPECT_TRUE(validMetadata) << "Invalid metadata " << metadataItem.toString().c_str();
+ }
+
{
std::lock_guard<std::mutex> lk(mLock);
mCurrentProgramInfo = info;
@@ -385,7 +390,7 @@
auto startResult = mModule->startProgramListUpdates(filter);
if (startResult.getServiceSpecificError() == resultToInt(Result::NOT_SUPPORTED)) {
- printSkipped("Program list not supported");
+ LOG(WARNING) << "Program list not supported";
return std::nullopt;
}
EXPECT_TRUE(startResult.isOk());
@@ -430,8 +435,7 @@
bool supported = getAmFmRegionConfig(/* full= */ false, &config);
if (!supported) {
- printSkipped("AM/FM not supported");
- return;
+ GTEST_SKIP() << "AM/FM not supported";
}
EXPECT_LE(popcountll(static_cast<unsigned long long>(config.fmDeemphasis)), 1);
@@ -459,8 +463,7 @@
bool supported = getAmFmRegionConfig(/* full= */ false, &config);
if (!supported) {
- printSkipped("AM/FM not supported");
- return;
+ GTEST_SKIP() << "AM/FM not supported";
}
EXPECT_GT(config.ranges.size(), 0u);
@@ -488,7 +491,7 @@
if (supported && supportsFM(config)) {
EXPECT_GE(popcountll(static_cast<unsigned long long>(config.fmDeemphasis)), 1);
} else {
- printSkipped("FM not supported");
+ GTEST_SKIP() << "FM not supported";
}
}
@@ -509,8 +512,7 @@
bool supported = getAmFmRegionConfig(/* full= */ true, &config);
if (!supported) {
- printSkipped("AM/FM not supported");
- return;
+ GTEST_SKIP() << "AM/FM not supported";
}
EXPECT_GT(config.ranges.size(), 0u);
@@ -536,8 +538,7 @@
auto halResult = mModule->getDabRegionConfig(&config);
if (halResult.getServiceSpecificError() == resultToInt(Result::NOT_SUPPORTED)) {
- printSkipped("DAB not supported");
- return;
+ GTEST_SKIP() << "DAB not supported";
}
ASSERT_TRUE(halResult.isOk());
@@ -671,7 +672,7 @@
* - if it is supported, the method succeeds;
* - after a successful tune call, onCurrentProgramInfoChanged callback is
* invoked carrying a proper selector;
- * - program changes exactly to what was requested.
+ * - program changes to a program info with the program selector requested.
*/
TEST_P(BroadcastRadioHalTest, FmTune) {
LOG(DEBUG) << "FmTune Test";
@@ -715,8 +716,7 @@
LOG(DEBUG) << "HdTune Test";
auto programList = getProgramList();
if (!programList) {
- printSkipped("Empty station list, tune cannot be performed");
- return;
+ GTEST_SKIP() << "Empty station list, tune cannot be performed";
}
ProgramSelector hdSel = {};
ProgramIdentifier physicallyTunedToExpected = {};
@@ -732,8 +732,7 @@
break;
}
if (!hdStationPresent) {
- printSkipped("No HD stations in the list, tune cannot be performed");
- return;
+ GTEST_SKIP() << "No HD stations in the list, tune cannot be performed";
}
// try tuning
@@ -762,7 +761,7 @@
* - if it is supported, the method succeeds;
* - after a successful tune call, onCurrentProgramInfoChanged callback is
* invoked carrying a proper selector;
- * - program changes exactly to what was requested.
+ * - program changes to a program info with the program selector requested.
*/
TEST_P(BroadcastRadioHalTest, DabTune) {
LOG(DEBUG) << "DabTune Test";
@@ -771,8 +770,7 @@
auto halResult = mModule->getDabRegionConfig(&config);
if (halResult.getServiceSpecificError() == resultToInt(Result::NOT_SUPPORTED)) {
- printSkipped("DAB not supported");
- return;
+ GTEST_SKIP() << "DAB not supported";
}
ASSERT_TRUE(halResult.isOk());
ASSERT_NE(config.size(), 0U);
@@ -780,8 +778,7 @@
auto programList = getProgramList();
if (!programList) {
- printSkipped("Empty DAB station list, tune cannot be performed");
- return;
+ GTEST_SKIP() << "Empty DAB station list, tune cannot be performed";
}
ProgramSelector sel = {};
@@ -811,8 +808,7 @@
}
if (!dabStationPresent) {
- printSkipped("No DAB stations in the list, tune cannot be performed");
- return;
+ GTEST_SKIP() << "No DAB stations in the list, tune cannot be performed";
}
// try tuning
@@ -844,7 +840,7 @@
* Verifies that:
* - the method succeeds;
* - the program info is changed within kTuneTimeoutMs;
- * - works both directions and with or without skipping sub-channel.
+ * - works both directions and with or without ing sub-channel.
*/
TEST_P(BroadcastRadioHalTest, Seek) {
LOG(DEBUG) << "Seek Test";
@@ -854,8 +850,7 @@
auto result = mModule->seek(/* in_directionUp= */ true, /* in_skipSubChannel= */ true);
if (result.getServiceSpecificError() == resultToInt(Result::NOT_SUPPORTED)) {
- printSkipped("Seek not supported");
- return;
+ GTEST_SKIP() << "Seek not supported";
}
EXPECT_TRUE(result.isOk());
@@ -905,8 +900,7 @@
auto result = mModule->step(/* in_directionUp= */ true);
if (result.getServiceSpecificError() == resultToInt(Result::NOT_SUPPORTED)) {
- printSkipped("Step not supported");
- return;
+ GTEST_SKIP() << "Step not supported";
}
EXPECT_TRUE(result.isOk());
EXPECT_TRUE(mCallback->waitOnCurrentProgramInfoChangedCallback());
@@ -957,8 +951,7 @@
auto result = mModule->seek(/* in_directionUp= */ true, /* in_skipSubChannel= */ true);
if (result.getServiceSpecificError() == notSupportedError) {
- printSkipped("Cancel is skipped because of seek not supported");
- return;
+ GTEST_SKIP() << "Cancel is skipped because of seek not supported";
}
EXPECT_TRUE(result.isOk());
@@ -1152,8 +1145,7 @@
std::optional<bcutils::ProgramInfoSet> completeList = getProgramList();
if (!completeList) {
- printSkipped("No program list available");
- return;
+ GTEST_SKIP() << "No program list available";
}
ProgramFilter amfmFilter = {};
@@ -1178,8 +1170,7 @@
}
if (expectedResultSize == 0) {
- printSkipped("No Am/FM programs available");
- return;
+ GTEST_SKIP() << "No Am/FM programs available";
}
std::optional<bcutils::ProgramInfoSet> amfmList = getProgramList(amfmFilter);
ASSERT_EQ(amfmList->size(), expectedResultSize) << "amfm filter result size is wrong";
@@ -1200,8 +1191,7 @@
std::optional<bcutils::ProgramInfoSet> completeList = getProgramList();
if (!completeList) {
- printSkipped("No program list available");
- return;
+ GTEST_SKIP() << "No program list available";
}
ProgramFilter dabFilter = {};
@@ -1225,8 +1215,7 @@
}
if (expectedResultSize == 0) {
- printSkipped("No DAB programs available");
- return;
+ GTEST_SKIP() << "No DAB programs available";
}
std::optional<bcutils::ProgramInfoSet> dabList = getProgramList(dabFilter);
ASSERT_EQ(dabList->size(), expectedResultSize) << "dab filter result size is wrong";
@@ -1245,8 +1234,7 @@
std::optional<bcutils::ProgramInfoSet> list = getProgramList();
if (!list) {
- printSkipped("No program list");
- return;
+ GTEST_SKIP() << "No program list";
}
for (const auto& program : *list) {
@@ -1297,8 +1285,7 @@
if (halResult.getServiceSpecificError() == resultToInt(Result::NOT_SUPPORTED)) {
ASSERT_EQ(closeHandle.get(), nullptr);
- printSkipped("Announcements not supported");
- return;
+ GTEST_SKIP() << "Announcements not supported";
}
ASSERT_TRUE(halResult.isOk());
diff --git a/broadcastradio/common/tests/Android.bp b/broadcastradio/common/tests/Android.bp
index 0a6a3a2..1ea4e85 100644
--- a/broadcastradio/common/tests/Android.bp
+++ b/broadcastradio/common/tests/Android.bp
@@ -86,4 +86,7 @@
],
static_libs: ["android.hardware.broadcastradio@common-utils-lib"],
test_suites: ["general-tests"],
+ shared_libs: [
+ "libbase",
+ ],
}
diff --git a/broadcastradio/common/utils/WorkerThread.cpp b/broadcastradio/common/utils/WorkerThread.cpp
index 43fd04a..5c8e59c 100644
--- a/broadcastradio/common/utils/WorkerThread.cpp
+++ b/broadcastradio/common/utils/WorkerThread.cpp
@@ -69,8 +69,11 @@
}
void WorkerThread::threadLoop() {
- while (!mIsTerminating) {
+ while (true) {
unique_lock<mutex> lk(mMut);
+ if (mIsTerminating) {
+ return;
+ }
if (mTasks.empty()) {
mCond.wait(lk);
continue;
diff --git a/broadcastradio/common/utils/include/broadcastradio-utils/WorkerThread.h b/broadcastradio/common/utils/include/broadcastradio-utils/WorkerThread.h
index 457b57e..e381f5a 100644
--- a/broadcastradio/common/utils/include/broadcastradio-utils/WorkerThread.h
+++ b/broadcastradio/common/utils/include/broadcastradio-utils/WorkerThread.h
@@ -20,6 +20,8 @@
#include <queue>
#include <thread>
+#include <android-base/thread_annotations.h>
+
namespace android {
class WorkerThread {
@@ -40,11 +42,11 @@
};
friend bool operator<(const Task& lhs, const Task& rhs);
- std::atomic<bool> mIsTerminating;
std::mutex mMut;
- std::condition_variable mCond;
+ bool mIsTerminating GUARDED_BY(mMut);
+ std::condition_variable mCond GUARDED_BY(mMut);
std::thread mThread;
- std::priority_queue<Task> mTasks;
+ std::priority_queue<Task> mTasks GUARDED_BY(mMut);
void threadLoop();
};
diff --git a/broadcastradio/common/utilsaidl/Android.bp b/broadcastradio/common/utilsaidl/Android.bp
index 4ec635b..4814778 100644
--- a/broadcastradio/common/utilsaidl/Android.bp
+++ b/broadcastradio/common/utilsaidl/Android.bp
@@ -26,7 +26,7 @@
cc_library_static {
name: "android.hardware.broadcastradio@common-utils-aidl-lib",
defaults: [
- "VtsBroadcastRadioDefaults",
+ "BroadcastRadioUtilsDefaults",
],
shared_libs: [
"android.hardware.broadcastradio-V1-ndk",
@@ -36,7 +36,7 @@
cc_library_static {
name: "android.hardware.broadcastradio@common-utils-aidl-lib-V2",
defaults: [
- "VtsBroadcastRadioDefaults",
+ "BroadcastRadioUtilsDefaults",
],
srcs: [
"src/UtilsV2.cpp",
@@ -46,8 +46,23 @@
],
}
+cc_test {
+ name: "broadcastradio_utils_aidl_test",
+ defaults: [
+ "BroadcastRadioUtilsDefaults",
+ ],
+ srcs: [
+ "test/*.cpp",
+ ],
+ static_libs: [
+ "android.hardware.broadcastradio@common-utils-aidl-lib-V2",
+ "android.hardware.broadcastradio-V2-ndk",
+ ],
+ test_suites: ["general-tests"],
+}
+
cc_defaults {
- name: "VtsBroadcastRadioDefaults",
+ name: "BroadcastRadioUtilsDefaults",
vendor_available: true,
relative_install_path: "hw",
cflags: [
diff --git a/broadcastradio/common/utilsaidl/include/broadcastradio-utils-aidl/Utils.h b/broadcastradio/common/utilsaidl/include/broadcastradio-utils-aidl/Utils.h
index 3ced685..25c96d0 100644
--- a/broadcastradio/common/utilsaidl/include/broadcastradio-utils-aidl/Utils.h
+++ b/broadcastradio/common/utilsaidl/include/broadcastradio-utils-aidl/Utils.h
@@ -143,6 +143,8 @@
bool satisfies(const ProgramFilter& filter, const ProgramSelector& sel);
+bool isValidMetadata(const Metadata& metadata);
+
struct ProgramSelectorComparator {
bool operator()(const ProgramSelector& lhs, const ProgramSelector& rhs) const;
};
diff --git a/broadcastradio/common/utilsaidl/include/broadcastradio-utils-aidl/UtilsV2.h b/broadcastradio/common/utilsaidl/include/broadcastradio-utils-aidl/UtilsV2.h
index e411aa4..734758d 100644
--- a/broadcastradio/common/utilsaidl/include/broadcastradio-utils-aidl/UtilsV2.h
+++ b/broadcastradio/common/utilsaidl/include/broadcastradio-utils-aidl/UtilsV2.h
@@ -28,6 +28,7 @@
bool isValidV2(const ProgramIdentifier& id);
bool isValidV2(const ProgramSelector& sel);
+bool isValidMetadataV2(const Metadata& metadata);
std::optional<std::string> getMetadataStringV2(const ProgramInfo& info, const Metadata::Tag& tag);
} // namespace utils
diff --git a/broadcastradio/common/utilsaidl/src/Utils.cpp b/broadcastradio/common/utilsaidl/src/Utils.cpp
index b647442..ddc5b8d 100644
--- a/broadcastradio/common/utilsaidl/src/Utils.cpp
+++ b/broadcastradio/common/utilsaidl/src/Utils.cpp
@@ -442,9 +442,9 @@
}
std::optional<std::string> getMetadataString(const ProgramInfo& info, const Metadata::Tag& tag) {
- auto isRdsPs = [tag](const Metadata& item) { return item.getTag() == tag; };
+ auto hasMetadataType = [tag](const Metadata& item) { return item.getTag() == tag; };
- auto it = std::find_if(info.metadata.begin(), info.metadata.end(), isRdsPs);
+ auto it = std::find_if(info.metadata.begin(), info.metadata.end(), hasMetadataType);
if (it == info.metadata.end()) {
return std::nullopt;
}
@@ -579,6 +579,45 @@
return getHdFrequency(sel);
}
+bool isValidMetadata(const Metadata& metadata) {
+ bool valid = true;
+
+ auto expect = [&valid](bool condition, const std::string& message) {
+ if (!condition) {
+ valid = false;
+ LOG(ERROR) << "metadata not valid, expected " << message;
+ }
+ };
+
+ switch (metadata.getTag()) {
+ case Metadata::rdsPty:
+ expect(metadata.get<Metadata::rdsPty>() >= 0, "RDS PTY >= 0");
+ expect(metadata.get<Metadata::rdsPty>() <= std::numeric_limits<uint8_t>::max(),
+ "8bit RDS PTY");
+ break;
+ case Metadata::rbdsPty:
+ expect(metadata.get<Metadata::rbdsPty>() >= 0, "RBDS PTY >= 0");
+ expect(metadata.get<Metadata::rbdsPty>() <= std::numeric_limits<uint8_t>::max(),
+ "8bit RBDS PTY");
+ break;
+ case Metadata::dabEnsembleNameShort:
+ expect(metadata.get<Metadata::dabEnsembleNameShort>().size() <= 8,
+ "Dab ensemble name abbreviated length <= 8");
+ break;
+ case Metadata::dabServiceNameShort:
+ expect(metadata.get<Metadata::dabServiceNameShort>().size() <= 8,
+ "Dab component name abbreviated length <= 8");
+ break;
+ case Metadata::dabComponentNameShort:
+ expect(metadata.get<Metadata::dabComponentNameShort>().size() <= 8,
+ "Dab component name abbreviated length <= 8");
+ break;
+ default:
+ break;
+ }
+ return valid;
+}
+
bool parseArgInt(const std::string& s, int* out) {
return ::android::base::ParseInt(s, out);
}
diff --git a/broadcastradio/common/utilsaidl/src/UtilsV2.cpp b/broadcastradio/common/utilsaidl/src/UtilsV2.cpp
index ef739df..6c75759 100644
--- a/broadcastradio/common/utilsaidl/src/UtilsV2.cpp
+++ b/broadcastradio/common/utilsaidl/src/UtilsV2.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "BcRadioAidlDef.utilsV2"
#include "broadcastradio-utils-aidl/UtilsV2.h"
+#include "broadcastradio-utils-aidl/Utils.h"
#include <android-base/logging.h>
#include <android-base/strings.h>
@@ -137,10 +138,33 @@
return isValidV2(sel.primaryId);
}
-std::optional<std::string> getMetadataStringV2(const ProgramInfo& info, const Metadata::Tag& tag) {
- auto isRdsPs = [tag](const Metadata& item) { return item.getTag() == tag; };
+bool isValidMetadataV2(const Metadata& metadata) {
+ if (!isValidMetadata(metadata)) {
+ return false;
+ }
- auto it = std::find_if(info.metadata.begin(), info.metadata.end(), isRdsPs);
+ if (metadata.getTag() == Metadata::hdStationNameShort) {
+ if (metadata.get<Metadata::hdStationNameShort>().size() > 12) {
+ LOG(ERROR) << "metadata not valid, expected HD short name length <= 12";
+ return false;
+ }
+ } else if (metadata.getTag() == Metadata::hdSubChannelsAvailable) {
+ if (metadata.get<Metadata::hdSubChannelsAvailable>() < 0) {
+ LOG(ERROR) << "metadata not valid, expected HD subchannels available >= 0";
+ return false;
+ } else if (metadata.get<Metadata::hdSubChannelsAvailable>() >
+ std::numeric_limits<uint8_t>::max()) {
+ LOG(ERROR) << "metadata not valid, expected 8bit HD subchannels available";
+ return false;
+ }
+ }
+ return true;
+}
+
+std::optional<std::string> getMetadataStringV2(const ProgramInfo& info, const Metadata::Tag& tag) {
+ auto hasMetadataType = [tag](const Metadata& item) { return item.getTag() == tag; };
+
+ auto it = std::find_if(info.metadata.begin(), info.metadata.end(), hasMetadataType);
if (it == info.metadata.end()) {
return std::nullopt;
}
diff --git a/broadcastradio/common/utilsaidl/test/BroadcastRadioUtilsTest.cpp b/broadcastradio/common/utilsaidl/test/BroadcastRadioUtilsTest.cpp
new file mode 100644
index 0000000..b115f75
--- /dev/null
+++ b/broadcastradio/common/utilsaidl/test/BroadcastRadioUtilsTest.cpp
@@ -0,0 +1,390 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 <broadcastradio-utils-aidl/Utils.h>
+#include <gtest/gtest.h>
+
+namespace aidl::android::hardware::broadcastradio {
+
+namespace {
+constexpr int64_t kFmFrequencyKHz = 97900;
+constexpr uint32_t kDabSid = 0x0000C221u;
+constexpr int kDabEccCode = 0xE1u;
+constexpr int kDabSCIdS = 0x1u;
+constexpr uint64_t kDabSidExt = static_cast<uint64_t>(kDabSid) |
+ (static_cast<uint64_t>(kDabEccCode) << 32) |
+ (static_cast<uint64_t>(kDabSCIdS) << 40);
+constexpr uint32_t kDabEnsemble = 0xCE15u;
+constexpr uint64_t kDabFrequencyKhz = 225648u;
+constexpr uint64_t kHdStationId = 0xA0000001u;
+constexpr uint64_t kHdSubChannel = 1u;
+constexpr uint64_t kHdFrequency = 97700u;
+
+const Properties kAmFmTunerProp = {
+ .maker = "makerTest",
+ .product = "productTest",
+ .supportedIdentifierTypes = {IdentifierType::AMFM_FREQUENCY_KHZ, IdentifierType::RDS_PI,
+ IdentifierType::HD_STATION_ID_EXT}};
+
+struct GetBandTestCase {
+ std::string name;
+ int64_t frequency;
+ utils::FrequencyBand bandResult;
+};
+
+std::vector<GetBandTestCase> getBandTestCases() {
+ return std::vector<GetBandTestCase>(
+ {GetBandTestCase{.name = "unknown_low_band",
+ .frequency = 0,
+ .bandResult = utils::FrequencyBand::UNKNOWN},
+ GetBandTestCase{.name = "am_lw_band",
+ .frequency = 30,
+ .bandResult = utils::FrequencyBand::AM_LW},
+ GetBandTestCase{.name = "am_mw_band",
+ .frequency = 700,
+ .bandResult = utils::FrequencyBand::AM_MW},
+ GetBandTestCase{.name = "am_sw_band",
+ .frequency = 2000,
+ .bandResult = utils::FrequencyBand::AM_SW},
+ GetBandTestCase{
+ .name = "fm_band", .frequency = 97900, .bandResult = utils::FrequencyBand::FM},
+ GetBandTestCase{.name = "unknown_high_band",
+ .frequency = 110000,
+ .bandResult = utils::FrequencyBand::UNKNOWN}});
+}
+
+struct IsValidMetadataTestCase {
+ std::string name;
+ Metadata metadata;
+ bool valid;
+};
+
+std::vector<IsValidMetadataTestCase> getIsValidMetadataTestCases() {
+ return std::vector<IsValidMetadataTestCase>({
+ IsValidMetadataTestCase{.name = "valid_rds_pty",
+ .metadata = Metadata::make<Metadata::rdsPty>(1),
+ .valid = true},
+ IsValidMetadataTestCase{.name = "negative_rds_pty",
+ .metadata = Metadata::make<Metadata::rdsPty>(-1),
+ .valid = false},
+ IsValidMetadataTestCase{.name = "large_rds_pty",
+ .metadata = Metadata::make<Metadata::rdsPty>(256),
+ .valid = false},
+ IsValidMetadataTestCase{.name = "valid_rbds_pty",
+ .metadata = Metadata::make<Metadata::rbdsPty>(1),
+ .valid = true},
+ IsValidMetadataTestCase{.name = "negative_rbds_pty",
+ .metadata = Metadata::make<Metadata::rbdsPty>(-1),
+ .valid = false},
+ IsValidMetadataTestCase{.name = "large_rbds_pty",
+ .metadata = Metadata::make<Metadata::rbdsPty>(256),
+ .valid = false},
+ IsValidMetadataTestCase{
+ .name = "valid_dab_ensemble_name_short",
+ .metadata = Metadata::make<Metadata::dabEnsembleNameShort>("name"),
+ .valid = true},
+ IsValidMetadataTestCase{
+ .name = "too_long_dab_ensemble_name_short",
+ .metadata = Metadata::make<Metadata::dabEnsembleNameShort>("name_long"),
+ .valid = false},
+ IsValidMetadataTestCase{
+ .name = "valid_dab_service_name_short",
+ .metadata = Metadata::make<Metadata::dabServiceNameShort>("name"),
+ .valid = true},
+ IsValidMetadataTestCase{
+ .name = "too_long_dab_service_name_short",
+ .metadata = Metadata::make<Metadata::dabServiceNameShort>("name_long"),
+ .valid = false},
+ IsValidMetadataTestCase{
+ .name = "valid_dab_component_name_short",
+ .metadata = Metadata::make<Metadata::dabComponentNameShort>("name"),
+ .valid = true},
+ IsValidMetadataTestCase{
+ .name = "too_long_dab_component_name_short",
+ .metadata = Metadata::make<Metadata::dabComponentNameShort>("name_long"),
+ .valid = false},
+ });
+}
+} // namespace
+
+class GetBandTest : public testing::TestWithParam<GetBandTestCase> {};
+
+INSTANTIATE_TEST_SUITE_P(GetBandTests, GetBandTest, testing::ValuesIn(getBandTestCases()),
+ [](const testing::TestParamInfo<GetBandTest::ParamType>& info) {
+ return info.param.name;
+ });
+
+TEST_P(GetBandTest, GetBand) {
+ GetBandTestCase testcase = GetParam();
+
+ ASSERT_EQ(utils::getBand(testcase.frequency), testcase.bandResult);
+}
+
+class IsValidMetadataTest : public testing::TestWithParam<IsValidMetadataTestCase> {};
+
+INSTANTIATE_TEST_SUITE_P(IsValidMetadataTests, IsValidMetadataTest,
+ testing::ValuesIn(getIsValidMetadataTestCases()),
+ [](const testing::TestParamInfo<IsValidMetadataTest::ParamType>& info) {
+ return info.param.name;
+ });
+
+TEST_P(IsValidMetadataTest, IsValidMetadata) {
+ IsValidMetadataTestCase testParam = GetParam();
+
+ ASSERT_EQ(utils::isValidMetadata(testParam.metadata), testParam.valid);
+}
+
+TEST(BroadcastRadioUtilsTest, IsSupportedWithSupportedSelector) {
+ ProgramSelector sel = utils::makeSelectorAmfm(kFmFrequencyKHz);
+
+ ASSERT_TRUE(utils::isSupported(kAmFmTunerProp, sel));
+}
+
+TEST(BroadcastRadioUtilsTest, IsSupportedWithUnsupportedSelector) {
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_FALSE(utils::isSupported(kAmFmTunerProp, sel));
+}
+
+TEST(BroadcastRadioUtilsTest, GetBandWithFmFrequency) {
+ ProgramSelector sel = utils::makeSelectorAmfm(kFmFrequencyKHz);
+
+ ASSERT_TRUE(utils::hasId(sel, IdentifierType::AMFM_FREQUENCY_KHZ));
+}
+
+TEST(BroadcastRadioUtilsTest, HasIdWithPrimaryIdType) {
+ ProgramSelector sel = utils::makeSelectorAmfm(kFmFrequencyKHz);
+
+ ASSERT_TRUE(utils::hasId(sel, IdentifierType::AMFM_FREQUENCY_KHZ));
+}
+
+TEST(BroadcastRadioUtilsTest, HasIdWithSecondaryIdType) {
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_TRUE(utils::hasId(sel, IdentifierType::DAB_FREQUENCY_KHZ));
+}
+
+TEST(BroadcastRadioUtilsTest, HasIdWithIdNotInSelector) {
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_FALSE(utils::hasId(sel, IdentifierType::AMFM_FREQUENCY_KHZ));
+}
+
+TEST(BroadcastRadioUtilsTest, GetIdWithPrimaryIdType) {
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_EQ(utils::getId(sel, IdentifierType::DAB_SID_EXT), static_cast<int64_t>(kDabSidExt));
+}
+
+TEST(BroadcastRadioUtilsTest, GetIdWithSecondaryIdType) {
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_EQ(utils::getId(sel, IdentifierType::DAB_ENSEMBLE), static_cast<int64_t>(kDabEnsemble));
+}
+
+TEST(BroadcastRadioUtilsTest, GetIdWithIdNotFound) {
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_EQ(utils::getId(sel, IdentifierType::AMFM_FREQUENCY_KHZ), 0);
+}
+
+TEST(BroadcastRadioUtilsTest, GetIdWithIdFoundAndDefaultValue) {
+ int64_t defaultValue = 0x0E10000C222u;
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_EQ(utils::getId(sel, IdentifierType::DAB_SID_EXT, defaultValue),
+ static_cast<int64_t>(kDabSidExt));
+}
+
+TEST(BroadcastRadioUtilsTest, GetIdWithIdNotFoundAndDefaultValue) {
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_EQ(utils::getId(sel, IdentifierType::AMFM_FREQUENCY_KHZ, kFmFrequencyKHz),
+ static_cast<int64_t>(kFmFrequencyKHz));
+}
+
+TEST(BroadcastRadioUtilsTest, GetAllIdsWithAvailableIds) {
+ int64_t secondaryFrequencyKHz = kFmFrequencyKHz + 200;
+ ProgramSelector sel = utils::makeSelectorAmfm(kFmFrequencyKHz);
+ sel.secondaryIds.push_back(
+ utils::makeIdentifier(IdentifierType::AMFM_FREQUENCY_KHZ, secondaryFrequencyKHz));
+
+ std::vector<int> allIds = utils::getAllIds(sel, IdentifierType::AMFM_FREQUENCY_KHZ);
+
+ ASSERT_EQ(allIds.size(), 2u);
+ EXPECT_NE(std::find(allIds.begin(), allIds.end(), kFmFrequencyKHz), allIds.end());
+ EXPECT_NE(std::find(allIds.begin(), allIds.end(), secondaryFrequencyKHz), allIds.end());
+}
+
+TEST(BroadcastRadioUtilsTest, GetAllIdsWithIdNotFound) {
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_TRUE(utils::getAllIds(sel, IdentifierType::AMFM_FREQUENCY_KHZ).empty());
+}
+
+TEST(BroadcastRadioUtilsTest, MakeIdentifier) {
+ ProgramIdentifier id =
+ utils::makeIdentifier(IdentifierType::AMFM_FREQUENCY_KHZ, kFmFrequencyKHz);
+
+ EXPECT_EQ(id.type, IdentifierType::AMFM_FREQUENCY_KHZ);
+ EXPECT_EQ(id.value, kFmFrequencyKHz);
+}
+
+TEST(BroadcastRadioUtilsTest, MakeSelectorAmfm) {
+ ProgramSelector sel = utils::makeSelectorAmfm(kFmFrequencyKHz);
+
+ EXPECT_EQ(sel.primaryId.type, IdentifierType::AMFM_FREQUENCY_KHZ);
+ EXPECT_EQ(sel.primaryId.value, kFmFrequencyKHz);
+ EXPECT_TRUE(sel.secondaryIds.empty());
+}
+
+TEST(BroadcastRadioUtilsTest, MakeSelectorHd) {
+ ProgramSelector sel = utils::makeSelectorHd(kHdStationId, kHdSubChannel, kHdFrequency);
+
+ EXPECT_EQ(sel.primaryId.type, IdentifierType::HD_STATION_ID_EXT);
+ EXPECT_TRUE(sel.secondaryIds.empty());
+ EXPECT_EQ(utils::getHdSubchannel(sel), static_cast<int>(kHdSubChannel));
+ EXPECT_EQ(utils::getHdFrequency(sel), static_cast<uint32_t>(kHdFrequency));
+}
+
+TEST(BroadcastRadioUtilsTest, MakeHdRadioStationName) {
+ std::string stationName = "aB1-FM";
+ int64_t expectedIdValue = 0x4D46314241;
+
+ ProgramIdentifier stationNameId = utils::makeHdRadioStationName(stationName);
+
+ EXPECT_EQ(stationNameId.type, IdentifierType::HD_STATION_NAME);
+ EXPECT_EQ(stationNameId.value, expectedIdValue);
+}
+
+TEST(BroadcastRadioUtilsTest, GetHdFrequencyWithoutHdId) {
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_EQ(utils::getHdFrequency(sel), 0u);
+}
+
+TEST(BroadcastRadioUtilsTest, HasAmFmFrequencyWithAmFmSelector) {
+ ProgramSelector sel = utils::makeSelectorAmfm(kFmFrequencyKHz);
+
+ ASSERT_TRUE(utils::hasAmFmFrequency(sel));
+}
+
+TEST(BroadcastRadioUtilsTest, HasAmFmFrequencyWithHdSelector) {
+ ProgramSelector sel = utils::makeSelectorHd(kHdStationId, kHdSubChannel, kHdFrequency);
+
+ ASSERT_TRUE(utils::hasAmFmFrequency(sel));
+}
+
+TEST(BroadcastRadioUtilsTest, HasAmFmFrequencyWithNonAmFmHdSelector) {
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_FALSE(utils::hasAmFmFrequency(sel));
+}
+
+TEST(BroadcastRadioUtilsTest, GetAmFmFrequencyWithAmFmSelector) {
+ ProgramSelector sel = utils::makeSelectorAmfm(kFmFrequencyKHz);
+
+ ASSERT_EQ(utils::getAmFmFrequency(sel), static_cast<uint32_t>(kFmFrequencyKHz));
+}
+
+TEST(BroadcastRadioUtilsTest, GetAmFmFrequencyWithHdSelector) {
+ ProgramSelector sel = utils::makeSelectorHd(kHdStationId, kHdSubChannel, kHdFrequency);
+
+ ASSERT_EQ(utils::getAmFmFrequency(sel), static_cast<uint32_t>(kHdFrequency));
+}
+
+TEST(BroadcastRadioUtilsTest, GetAmFmFrequencyWithNonAmFmHdSelector) {
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_EQ(utils::getAmFmFrequency(sel), 0u);
+}
+
+TEST(BroadcastRadioUtilsTest, MakeSelectorDabWithOnlySidExt) {
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt);
+
+ EXPECT_EQ(sel.primaryId.type, IdentifierType::DAB_SID_EXT);
+ EXPECT_EQ(sel.primaryId.value, static_cast<int64_t>(kDabSidExt));
+ EXPECT_TRUE(sel.secondaryIds.empty());
+}
+
+TEST(BroadcastRadioUtilsTest, MakeSelectorDab) {
+ ProgramIdentifier ensembleIdExpected =
+ utils::makeIdentifier(IdentifierType::DAB_ENSEMBLE, kDabEnsemble);
+ ProgramIdentifier frequencyIdExpected =
+ utils::makeIdentifier(IdentifierType::DAB_FREQUENCY_KHZ, kDabFrequencyKhz);
+
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ EXPECT_EQ(sel.primaryId.type, IdentifierType::DAB_SID_EXT);
+ EXPECT_EQ(sel.primaryId.value, static_cast<int64_t>(kDabSidExt));
+ EXPECT_EQ(sel.secondaryIds.size(), 2u);
+ EXPECT_NE(std::find(sel.secondaryIds.begin(), sel.secondaryIds.end(), ensembleIdExpected),
+ sel.secondaryIds.end());
+ EXPECT_NE(std::find(sel.secondaryIds.begin(), sel.secondaryIds.end(), frequencyIdExpected),
+ sel.secondaryIds.end());
+}
+
+TEST(BroadcastRadioUtilsTest, GetDabSId) {
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_EQ(utils::getDabSId(sel), kDabSid);
+}
+
+TEST(BroadcastRadioUtilsTest, GetDabEccCode) {
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_EQ(utils::getDabEccCode(sel), kDabEccCode);
+}
+
+TEST(BroadcastRadioUtilsTest, GetDabSCIdS) {
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_EQ(utils::getDabSCIdS(sel), kDabSCIdS);
+}
+
+TEST(BroadcastRadioUtilsTest, SatisfiesWithSatisfiedIdTypesFilter) {
+ ProgramFilter filter = ProgramFilter{.identifierTypes = {IdentifierType::DAB_FREQUENCY_KHZ}};
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_TRUE(utils::satisfies(filter, sel));
+}
+
+TEST(BroadcastRadioUtilsTest, SatisfiesWithUnsatisfiedIdTypesFilter) {
+ ProgramFilter filter = ProgramFilter{.identifierTypes = {IdentifierType::DAB_FREQUENCY_KHZ}};
+ ProgramSelector sel = utils::makeSelectorAmfm(kFmFrequencyKHz);
+
+ ASSERT_FALSE(utils::satisfies(filter, sel));
+}
+
+TEST(BroadcastRadioUtilsTest, SatisfiesWithSatisfiedIdsFilter) {
+ ProgramFilter filter =
+ ProgramFilter{.identifiers = {utils::makeIdentifier(IdentifierType::DAB_FREQUENCY_KHZ,
+ kDabFrequencyKhz)}};
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz);
+
+ ASSERT_TRUE(utils::satisfies(filter, sel));
+}
+
+TEST(BroadcastRadioUtilsTest, SatisfiesWithUnsatisfiedIdsFilter) {
+ ProgramFilter filter =
+ ProgramFilter{.identifiers = {utils::makeIdentifier(IdentifierType::DAB_FREQUENCY_KHZ,
+ kDabFrequencyKhz)}};
+ ProgramSelector sel = utils::makeSelectorDab(kDabSidExt, kDabEnsemble, kDabFrequencyKhz + 100);
+
+ ASSERT_FALSE(utils::satisfies(filter, sel));
+}
+
+} // namespace aidl::android::hardware::broadcastradio
diff --git a/broadcastradio/common/utilsaidl/test/BroadcastRadioUtilsV2Test.cpp b/broadcastradio/common/utilsaidl/test/BroadcastRadioUtilsV2Test.cpp
new file mode 100644
index 0000000..cf9f9e9
--- /dev/null
+++ b/broadcastradio/common/utilsaidl/test/BroadcastRadioUtilsV2Test.cpp
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 <broadcastradio-utils-aidl/UtilsV2.h>
+#include <gtest/gtest.h>
+
+namespace aidl::android::hardware::broadcastradio {
+
+namespace {
+struct IsValidMetadataV2TestCase {
+ std::string name;
+ Metadata metadata;
+ bool valid;
+};
+
+std::vector<IsValidMetadataV2TestCase> getIsValidMetadataV2TestCases() {
+ return std::vector<IsValidMetadataV2TestCase>({
+ IsValidMetadataV2TestCase{.name = "valid_rds_pty",
+ .metadata = Metadata::make<Metadata::rdsPty>(1),
+ .valid = true},
+ IsValidMetadataV2TestCase{.name = "negative_rds_pty",
+ .metadata = Metadata::make<Metadata::rdsPty>(-1),
+ .valid = false},
+ IsValidMetadataV2TestCase{
+ .name = "valid_hd_station_name_short",
+ .metadata = Metadata::make<Metadata::hdStationNameShort>("name_short"),
+ .valid = true},
+ IsValidMetadataV2TestCase{
+ .name = "too_long_hd_station_name_short",
+ .metadata = Metadata::make<Metadata::hdStationNameShort>("name_too_long"),
+ .valid = false},
+ IsValidMetadataV2TestCase{
+ .name = "valid_hd_subchannel_available",
+ .metadata = Metadata::make<Metadata::hdSubChannelsAvailable>(1),
+ .valid = true},
+ IsValidMetadataV2TestCase{
+ .name = "negative_subchannel_available",
+ .metadata = Metadata::make<Metadata::hdSubChannelsAvailable>(-1),
+ .valid = false},
+ IsValidMetadataV2TestCase{
+ .name = "large_subchannel_available",
+ .metadata = Metadata::make<Metadata::hdSubChannelsAvailable>(256),
+ .valid = false},
+ });
+}
+} // namespace
+
+class IsValidMetadataV2Test : public testing::TestWithParam<IsValidMetadataV2TestCase> {};
+
+INSTANTIATE_TEST_SUITE_P(IsValidMetadataV2Tests, IsValidMetadataV2Test,
+ testing::ValuesIn(getIsValidMetadataV2TestCases()),
+ [](const testing::TestParamInfo<IsValidMetadataV2Test::ParamType>& info) {
+ return info.param.name;
+ });
+
+TEST_P(IsValidMetadataV2Test, IsValidMetadataV2) {
+ IsValidMetadataV2TestCase testParam = GetParam();
+
+ ASSERT_EQ(utils::isValidMetadataV2(testParam.metadata), testParam.valid);
+}
+
+} // namespace aidl::android::hardware::broadcastradio
diff --git a/camera/device/aidl/Android.bp b/camera/device/aidl/Android.bp
index 4115c65..0104636 100644
--- a/camera/device/aidl/Android.bp
+++ b/camera/device/aidl/Android.bp
@@ -17,7 +17,7 @@
"android.hardware.common-V2",
"android.hardware.common.fmq-V1",
"android.hardware.camera.common-V1",
- "android.hardware.camera.metadata-V2",
+ "android.hardware.camera.metadata-V3",
"android.hardware.graphics.common-V5",
],
backend: {
diff --git a/camera/device/aidl/android/hardware/camera/device/ICameraDevice.aidl b/camera/device/aidl/android/hardware/camera/device/ICameraDevice.aidl
index 3a1d762..da3d5df 100644
--- a/camera/device/aidl/android/hardware/camera/device/ICameraDevice.aidl
+++ b/camera/device/aidl/android/hardware/camera/device/ICameraDevice.aidl
@@ -365,16 +365,20 @@
* isStreamCombinationWithSettingsSupported:
*
* This is the same as isStreamCombinationSupported with below exceptions:
- *
* 1. The input StreamConfiguration parameter may contain session parameters
- * supported by this camera device. When checking if the particular StreamConfiguration
- * is supported, the camera HAL must take the session parameters into consideration.
+ * as well as additional CaptureRequest keys. See the comment
+ * sections below on what additional capture request keys are passed in
+ * StreamConfiguration::sessionParameters for each interface version. When checking if
+ * the particular StreamConfiguration is supported, the camera HAL must take all
+ * the keys in sessionParameters into consideration.
*
* 2. For version 3 of this interface, the camera compliance test will verify that
* isStreamCombinationWithSettingsSupported behaves properly for all combinations of
* below features. This function must return true for all supported combinations,
* and return false for non-supported feature combinations. The list of features
- * required may grow in future versions.
+ * required may grow in future versions. The additional metadata entries in
+ * StreamConfiguration::sessionParameters are {CONTROL_AE_TARGET_FPS_RANGE,
+ * CONTROL_VIDEO_STABILIZATION_MODE}.
*
* - Stream Combinations (a subset of LEGACY device mandatory stream combinations):
* {
@@ -429,7 +433,7 @@
* 4032 x 3024, the camera compliance test will verify both
* {PRIV, 1920 x 1440, JPEG, 4032 x 3024} and {PRIV, 2560 x 1440, JPEG, 4032 x 2268}.
*
- * @param streams The StreamConfiguration to be tested, with optional session parameters.
+ * @param streams The StreamConfiguration to be tested, with optional CaptureRequest parameters.
*
* @return true in case the stream combination is supported, false otherwise.
*
@@ -444,6 +448,7 @@
*
* For Android 15, the characteristics which need to be set are:
* - ANDROID_CONTROL_ZOOM_RATIO_RANGE
+ * - SCALER_AVAILABLE_MAX_DIGITAL_ZOOM
*
* A service specific error will be returned on the following conditions
* INTERNAL_ERROR:
diff --git a/camera/device/aidl/android/hardware/camera/device/StreamConfiguration.aidl b/camera/device/aidl/android/hardware/camera/device/StreamConfiguration.aidl
index 197d9af..0f5bad9 100644
--- a/camera/device/aidl/android/hardware/camera/device/StreamConfiguration.aidl
+++ b/camera/device/aidl/android/hardware/camera/device/StreamConfiguration.aidl
@@ -59,6 +59,14 @@
* pipeline updates. The field is optional, clients can choose to ignore it and avoid
* including any initial settings. If parameters are present, then hal must examine
* their values and configure the internal camera pipeline accordingly.
+ *
+ * A null pointer is equivalent to a valid CameraMetadata object with zero entries.
+ *
+ * For a StreamConfiguration passed to ICameraDevice.isStreamCombinationWithSettingsSupported
+ * or ICameraDevice.getSessionCharacteristics, this variable may also contain keys
+ * that are not session parameters, but are used to specify certain features for a
+ * session. For example, CONTROL_VIDEO_STABILIZATION_MODE may be included even if it's not a
+ * session parameter.
*/
CameraMetadata sessionParams;
diff --git a/camera/device/default/ExternalCameraDevice.cpp b/camera/device/default/ExternalCameraDevice.cpp
index 677fb42..8e84748 100644
--- a/camera/device/default/ExternalCameraDevice.cpp
+++ b/camera/device/default/ExternalCameraDevice.cpp
@@ -399,6 +399,10 @@
const uint8_t hotPixelMode = ANDROID_HOT_PIXEL_MODE_OFF;
UPDATE(ANDROID_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES, &hotPixelMode, 1);
+ // android.info
+ const uint8_t bufMgrVer = ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_HIDL_DEVICE_3_5;
+ UPDATE(ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION, &bufMgrVer, 1);
+
// android.jpeg
const int32_t jpegAvailableThumbnailSizes[] = {0, 0, 176, 144, 240, 144, 256,
144, 240, 160, 256, 154, 240, 180};
@@ -493,6 +497,9 @@
const int32_t maxLatency = ANDROID_SYNC_MAX_LATENCY_UNKNOWN;
UPDATE(ANDROID_SYNC_MAX_LATENCY, &maxLatency, 1);
+ const uint8_t sensorReadoutTimestamp = ANDROID_SENSOR_READOUT_TIMESTAMP_NOT_SUPPORTED;
+ UPDATE(ANDROID_SENSOR_READOUT_TIMESTAMP, &sensorReadoutTimestamp, 1);
+
/* Other sensor/RAW related keys:
* android.sensor.info.colorFilterArrangement -> no need if we don't do RAW
* android.sensor.info.physicalSize -> not available
@@ -998,4 +1005,4 @@
} // namespace device
} // namespace camera
} // namespace hardware
-} // namespace android
\ No newline at end of file
+} // namespace android
diff --git a/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataTag.aidl b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataTag.aidl
index 542b296..9321ec0 100644
--- a/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataTag.aidl
+++ b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataTag.aidl
@@ -246,6 +246,7 @@
ANDROID_SENSOR_OPAQUE_RAW_SIZE_MAXIMUM_RESOLUTION,
ANDROID_SENSOR_PIXEL_MODE,
ANDROID_SENSOR_RAW_BINNING_FACTOR_USED,
+ ANDROID_SENSOR_READOUT_TIMESTAMP,
ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE = android.hardware.camera.metadata.CameraMetadataSectionStart.ANDROID_SENSOR_INFO_START /* 983040 */,
ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
diff --git a/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/SensorReadoutTimestamp.aidl b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/SensorReadoutTimestamp.aidl
new file mode 100644
index 0000000..35dc1a9
--- /dev/null
+++ b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/SensorReadoutTimestamp.aidl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *//*
+ * Autogenerated from camera metadata definitions in
+ * /system/media/camera/docs/metadata_definitions.xml
+ * *** DO NOT EDIT BY HAND ***
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.camera.metadata;
+@Backing(type="int") @VintfStability
+enum SensorReadoutTimestamp {
+ ANDROID_SENSOR_READOUT_TIMESTAMP_NOT_SUPPORTED,
+ ANDROID_SENSOR_READOUT_TIMESTAMP_HARDWARE,
+}
diff --git a/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataTag.aidl b/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataTag.aidl
index 03cfba1..f133372 100644
--- a/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataTag.aidl
+++ b/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataTag.aidl
@@ -1591,6 +1591,13 @@
*/
ANDROID_SENSOR_RAW_BINNING_FACTOR_USED,
/**
+ * android.sensor.readoutTimestamp [static, enum, java_public]
+ *
+ * <p>Whether or not the camera device supports readout timestamp and
+ * {@code onReadoutStarted} callback.</p>
+ */
+ ANDROID_SENSOR_READOUT_TIMESTAMP,
+ /**
* android.sensor.info.activeArraySize [static, int32[], public]
*
* <p>The area of the image sensor which corresponds to active pixels after any geometric
diff --git a/camera/metadata/aidl/android/hardware/camera/metadata/SensorReadoutTimestamp.aidl b/camera/metadata/aidl/android/hardware/camera/metadata/SensorReadoutTimestamp.aidl
new file mode 100644
index 0000000..1678515
--- /dev/null
+++ b/camera/metadata/aidl/android/hardware/camera/metadata/SensorReadoutTimestamp.aidl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * Autogenerated from camera metadata definitions in
+ * /system/media/camera/docs/metadata_definitions.xml
+ * *** DO NOT EDIT BY HAND ***
+ */
+
+package android.hardware.camera.metadata;
+
+/**
+ * android.sensor.readoutTimestamp enumeration values
+ * @see ANDROID_SENSOR_READOUT_TIMESTAMP
+ */
+@VintfStability
+@Backing(type="int")
+enum SensorReadoutTimestamp {
+ ANDROID_SENSOR_READOUT_TIMESTAMP_NOT_SUPPORTED,
+ ANDROID_SENSOR_READOUT_TIMESTAMP_HARDWARE,
+}
diff --git a/camera/provider/aidl/vts/Android.bp b/camera/provider/aidl/vts/Android.bp
index f9305bb..1c106f6 100644
--- a/camera/provider/aidl/vts/Android.bp
+++ b/camera/provider/aidl/vts/Android.bp
@@ -61,7 +61,7 @@
"android.hardware.camera.common@1.0-helper",
"android.hardware.camera.common-V1-ndk",
"android.hardware.camera.device-V3-ndk",
- "android.hardware.camera.metadata-V2-ndk",
+ "android.hardware.camera.metadata-V3-ndk",
"android.hardware.camera.provider-V3-ndk",
"android.hidl.allocator@1.0",
"libgrallocusage",
diff --git a/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp b/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp
index 720a9d4..9a5f248 100644
--- a/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp
+++ b/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp
@@ -283,6 +283,64 @@
}
}
+TEST_P(CameraAidlTest, getSessionCharacteristics) {
+ if (flags::feature_combination_query()) {
+ std::vector<std::string> cameraDeviceNames = getCameraDeviceNames(mProvider);
+
+ for (const auto& name : cameraDeviceNames) {
+ std::shared_ptr<ICameraDevice> device;
+ ALOGI("getSessionCharacteristics: Testing camera device %s", name.c_str());
+ ndk::ScopedAStatus ret = mProvider->getCameraDeviceInterface(name, &device);
+ ALOGI("getCameraDeviceInterface returns: %d:%d", ret.getExceptionCode(),
+ ret.getServiceSpecificError());
+ ASSERT_TRUE(ret.isOk());
+ ASSERT_NE(device, nullptr);
+
+ CameraMetadata meta;
+ openEmptyDeviceSession(name, mProvider, &mSession /*out*/, &meta /*out*/,
+ &device /*out*/);
+
+ std::vector<AvailableStream> outputStreams;
+ camera_metadata_t* staticMeta =
+ reinterpret_cast<camera_metadata_t*>(meta.metadata.data());
+ outputStreams.clear();
+ ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, outputStreams));
+ ASSERT_NE(0u, outputStreams.size());
+
+ AvailableStream sampleStream = outputStreams[0];
+
+ int32_t streamId = 0;
+ Stream stream = {streamId,
+ StreamType::OUTPUT,
+ sampleStream.width,
+ sampleStream.height,
+ static_cast<PixelFormat>(sampleStream.format),
+ static_cast<aidl::android::hardware::graphics::common::BufferUsage>(
+ GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER),
+ Dataspace::UNKNOWN,
+ StreamRotation::ROTATION_0,
+ std::string(),
+ /*bufferSize*/ 0,
+ /*groupId*/ -1,
+ {SensorPixelMode::ANDROID_SENSOR_PIXEL_MODE_DEFAULT},
+ RequestAvailableDynamicRangeProfilesMap::
+ ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD};
+
+ std::vector<Stream> streams = {stream};
+ StreamConfiguration config;
+ createStreamConfiguration(streams, StreamConfigurationMode::NORMAL_MODE, &config);
+
+ CameraMetadata chars;
+ ret = device->getSessionCharacteristics(config, &chars);
+ ASSERT_TRUE(ret.isOk());
+ verifySessionCharacteristics(chars);
+ }
+ } else {
+ ALOGI("getSessionCharacteristics: Test skipped.\n");
+ GTEST_SKIP();
+ }
+}
+
// Verify that the torch strength level can be set and retrieved successfully.
TEST_P(CameraAidlTest, turnOnTorchWithStrengthLevel) {
std::vector<std::string> cameraDeviceNames = getCameraDeviceNames(mProvider);
@@ -531,11 +589,7 @@
}
if (ret.isOk()) {
- const camera_metadata_t* metadata = (camera_metadata_t*)rawMetadata.metadata.data();
- size_t expectedSize = rawMetadata.metadata.size();
- int result = validate_camera_metadata_structure(metadata, &expectedSize);
- ASSERT_TRUE((result == 0) || (result == CAMERA_METADATA_VALIDATION_SHIFTED));
- verifyRequestTemplate(metadata, reqTemplate);
+ validateDefaultRequestMetadata(reqTemplate, rawMetadata);
} else {
ASSERT_EQ(0u, rawMetadata.metadata.size());
}
@@ -546,24 +600,12 @@
ndk::ScopedAStatus ret2 =
device->constructDefaultRequestSettings(reqTemplate, &rawMetadata2);
- // TODO: Do not allow OPERATION_NOT_SUPPORTED once HAL
- // implementation is in place.
- if (static_cast<Status>(ret2.getServiceSpecificError()) !=
- Status::OPERATION_NOT_SUPPORTED) {
- ASSERT_EQ(ret.isOk(), ret2.isOk());
- ASSERT_EQ(ret.getStatus(), ret2.getStatus());
+ ASSERT_EQ(ret.isOk(), ret2.isOk());
+ ASSERT_EQ(ret.getStatus(), ret2.getStatus());
- ASSERT_EQ(rawMetadata.metadata.size(), rawMetadata2.metadata.size());
- if (ret2.isOk()) {
- const camera_metadata_t* metadata =
- (camera_metadata_t*)rawMetadata2.metadata.data();
- size_t expectedSize = rawMetadata2.metadata.size();
- int result =
- validate_camera_metadata_structure(metadata, &expectedSize);
- ASSERT_TRUE((result == 0) ||
- (result == CAMERA_METADATA_VALIDATION_SHIFTED));
- verifyRequestTemplate(metadata, reqTemplate);
- }
+ ASSERT_EQ(rawMetadata.metadata.size(), rawMetadata2.metadata.size());
+ if (ret2.isOk()) {
+ validateDefaultRequestMetadata(reqTemplate, rawMetadata2);
}
}
}
diff --git a/camera/provider/aidl/vts/camera_aidl_test.cpp b/camera/provider/aidl/vts/camera_aidl_test.cpp
index eef9362..7958da9 100644
--- a/camera/provider/aidl/vts/camera_aidl_test.cpp
+++ b/camera/provider/aidl/vts/camera_aidl_test.cpp
@@ -1909,18 +1909,62 @@
if (supportFeatureCombinationQuery) {
ret = device->isStreamCombinationWithSettingsSupported(config,
&streamCombinationSupported);
- // TODO: Do not allow OPERATION_NOT_SUPPORTED once HAL
- // implementation is in place.
- ASSERT_TRUE(ret.isOk() || static_cast<Status>(ret.getServiceSpecificError()) ==
- Status::OPERATION_NOT_SUPPORTED);
- if (ret.isOk()) {
- ASSERT_EQ(expectedStatus, streamCombinationSupported);
- }
+ ASSERT_TRUE(ret.isOk());
+ ASSERT_EQ(expectedStatus, streamCombinationSupported);
}
}
}
}
+void CameraAidlTest::verifySessionCharacteristics(const CameraMetadata& chars) {
+ if (flags::feature_combination_query()) {
+ const camera_metadata_t* metadata =
+ reinterpret_cast<const camera_metadata_t*>(chars.metadata.data());
+
+ size_t expectedSize = chars.metadata.size();
+ int result = validate_camera_metadata_structure(metadata, &expectedSize);
+ ASSERT_TRUE((result == 0) || (result == CAMERA_METADATA_VALIDATION_SHIFTED));
+ size_t entryCount = get_camera_metadata_entry_count(metadata);
+ ASSERT_GT(entryCount, 0u);
+
+ camera_metadata_ro_entry entry;
+ int retcode = 0;
+ float maxDigitalZoom = 1.0;
+
+ retcode = find_camera_metadata_ro_entry(metadata, ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
+ &entry);
+ // ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM should always be present.
+ if ((0 == retcode) && (entry.count == 1)) {
+ maxDigitalZoom = entry.data.f[0];
+ } else {
+ ADD_FAILURE() << "Get camera scalerAvailableMaxDigitalZoom failed!";
+ }
+
+ retcode = find_camera_metadata_ro_entry(metadata, ANDROID_CONTROL_ZOOM_RATIO_RANGE, &entry);
+ bool hasZoomRatioRange = (0 == retcode && entry.count == 2);
+ if (!hasZoomRatioRange) {
+ return;
+ }
+ float minZoomRatio = entry.data.f[0];
+ float maxZoomRatio = entry.data.f[1];
+ constexpr float FLOATING_POINT_THRESHOLD = 0.00001f;
+ if (abs(maxDigitalZoom - maxZoomRatio) > FLOATING_POINT_THRESHOLD) {
+ ADD_FAILURE() << "Difference between maximum digital zoom " << maxDigitalZoom
+ << " and maximum zoom ratio " << maxZoomRatio
+ << " is greater than the threshold " << FLOATING_POINT_THRESHOLD << "!";
+ }
+ if (minZoomRatio > maxZoomRatio) {
+ ADD_FAILURE() << "Maximum zoom ratio is less than minimum zoom ratio!";
+ }
+ if (minZoomRatio > 1.0f) {
+ ADD_FAILURE() << "Minimum zoom ratio is more than 1.0!";
+ }
+ if (maxZoomRatio < 1.0f) {
+ ADD_FAILURE() << "Maximum zoom ratio is less than 1.0!";
+ }
+ }
+}
+
std::vector<ConcurrentCameraIdCombination> CameraAidlTest::getConcurrentDeviceCombinations(
std::shared_ptr<ICameraProvider>& provider) {
std::vector<ConcurrentCameraIdCombination> combinations;
@@ -4049,3 +4093,12 @@
}
}
}
+
+void CameraAidlTest::validateDefaultRequestMetadata(RequestTemplate reqTemplate,
+ const CameraMetadata& rawMetadata) {
+ const camera_metadata_t* metadata = (camera_metadata_t*)rawMetadata.metadata.data();
+ size_t expectedSize = rawMetadata.metadata.size();
+ int result = validate_camera_metadata_structure(metadata, &expectedSize);
+ ASSERT_TRUE((result == 0) || (result == CAMERA_METADATA_VALIDATION_SHIFTED));
+ verifyRequestTemplate(metadata, reqTemplate);
+}
diff --git a/camera/provider/aidl/vts/camera_aidl_test.h b/camera/provider/aidl/vts/camera_aidl_test.h
index f892397..7bcf430 100644
--- a/camera/provider/aidl/vts/camera_aidl_test.h
+++ b/camera/provider/aidl/vts/camera_aidl_test.h
@@ -290,6 +290,8 @@
static void verifyStreamCombination(const std::shared_ptr<ICameraDevice>& device,
const StreamConfiguration& config, bool expectedStatus);
+ static void verifySessionCharacteristics(const CameraMetadata& chars);
+
static void verifyLogicalCameraResult(const camera_metadata_t* staticMetadata,
const std::vector<uint8_t>& resultMetadata);
@@ -598,6 +600,9 @@
static void waitForReleaseFence(
std::vector<InFlightRequest::StreamBufferAndTimestamp>& resultOutputBuffers);
+ static void validateDefaultRequestMetadata(RequestTemplate reqTemplate,
+ const CameraMetadata& rawMetadata);
+
// Map from frame number to the in-flight request state
typedef std::unordered_map<uint32_t, std::shared_ptr<InFlightRequest>> InFlightMap;
diff --git a/compatibility_matrices/Android.bp b/compatibility_matrices/Android.bp
index 9bee3b9..eefca39 100644
--- a/compatibility_matrices/Android.bp
+++ b/compatibility_matrices/Android.bp
@@ -84,10 +84,10 @@
}
vintf_compatibility_matrix {
- name: "framework_compatibility_matrix.9.xml",
- stem: "compatibility_matrix.9.xml",
+ name: "framework_compatibility_matrix.202404.xml",
+ stem: "compatibility_matrix.202404.xml",
srcs: [
- "compatibility_matrix.9.xml",
+ "compatibility_matrix.202404.xml",
],
kernel_configs: [
"kernel_config_v_6.1",
diff --git a/compatibility_matrices/Android.mk b/compatibility_matrices/Android.mk
index c2ffb84..72ead58 100644
--- a/compatibility_matrices/Android.mk
+++ b/compatibility_matrices/Android.mk
@@ -112,7 +112,7 @@
# interfaces (in the `next` release configuration).
ifeq ($(RELEASE_AIDL_USE_UNFROZEN),true)
my_system_matrix_deps += \
- framework_compatibility_matrix.9.xml
+ framework_compatibility_matrix.202404.xml
endif
my_framework_matrix_deps += \
diff --git a/compatibility_matrices/compatibility_matrix.9.xml b/compatibility_matrices/compatibility_matrix.202404.xml
similarity index 81%
rename from compatibility_matrices/compatibility_matrix.9.xml
rename to compatibility_matrices/compatibility_matrix.202404.xml
index 328f1c8..2080c69 100644
--- a/compatibility_matrices/compatibility_matrix.9.xml
+++ b/compatibility_matrices/compatibility_matrix.202404.xml
@@ -1,23 +1,5 @@
-<compatibility-matrix version="1.0" type="framework" level="9">
- <hal format="hidl" optional="true">
- <name>android.hardware.audio</name>
- <version>6.0</version>
- <version>7.0-1</version>
- <interface>
- <name>IDevicesFactory</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl" optional="true">
- <name>android.hardware.audio.effect</name>
- <version>6.0</version>
- <version>7.0</version>
- <interface>
- <name>IEffectsFactory</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="aidl" optional="true">
+<compatibility-matrix version="1.0" type="framework" level="202404">
+ <hal format="aidl">
<name>android.hardware.audio.core</name>
<version>1-2</version>
<interface>
@@ -36,7 +18,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.audio.effect</name>
<version>1-2</version>
<interface>
@@ -44,7 +26,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.audio.sounddose</name>
<version>1-2</version>
<interface>
@@ -52,7 +34,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.authsecret</name>
<version>1</version>
<interface>
@@ -60,7 +42,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.audiocontrol</name>
<version>2-4</version>
<interface>
@@ -68,7 +50,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.can</name>
<version>1</version>
<interface>
@@ -76,7 +58,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.evs</name>
<version>1-2</version>
<interface>
@@ -84,7 +66,7 @@
<regex-instance>[a-z]+/[0-9]+</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.macsec</name>
<version>1</version>
<interface>
@@ -92,7 +74,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.occupant_awareness</name>
<version>1</version>
<interface>
@@ -100,7 +82,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.vehicle</name>
<version>1-3</version>
<interface>
@@ -108,7 +90,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.remoteaccess</name>
<version>1-2</version>
<interface>
@@ -116,14 +98,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.ivn</name>
<interface>
<name>IIvnAndroidDevice</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.biometrics.face</name>
<version>3-4</version>
<interface>
@@ -132,7 +114,7 @@
<instance>virtual</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.biometrics.fingerprint</name>
<version>3-4</version>
<interface>
@@ -141,14 +123,14 @@
<instance>virtual</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.bluetooth</name>
<interface>
<name>IBluetoothHci</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.bluetooth.audio</name>
<version>3-4</version>
<interface>
@@ -156,7 +138,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.bluetooth.ranging</name>
<version>1</version>
<interface>
@@ -164,7 +146,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.bluetooth.finder</name>
<version>1</version>
<interface>
@@ -172,14 +154,22 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
+ <name>android.hardware.bluetooth.lmp_event</name>
+ <version>1</version>
+ <interface>
+ <name>IBluetoothLmpEvent</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
<name>android.hardware.boot</name>
<interface>
<name>IBootControl</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.broadcastradio</name>
<version>1-2</version>
<interface>
@@ -187,7 +177,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.camera.provider</name>
<version>1-3</version>
<interface>
@@ -195,14 +185,14 @@
<regex-instance>[^/]+/[0-9]+</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.cas</name>
<interface>
<name>IMediaCasService</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.confirmationui</name>
<version>1</version>
<interface>
@@ -210,7 +200,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.contexthub</name>
<version>3</version>
<interface>
@@ -218,7 +208,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.drm</name>
<version>1</version>
<interface>
@@ -226,14 +216,14 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.dumpstate</name>
<interface>
<name>IDumpstateDevice</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.gatekeeper</name>
<version>1</version>
<interface>
@@ -241,7 +231,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.gnss</name>
<version>2-4</version>
<interface>
@@ -249,7 +239,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.graphics.allocator</name>
<version>1-2</version>
<interface>
@@ -257,7 +247,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.graphics.composer3</name>
<version>3</version>
<interface>
@@ -265,7 +255,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.health</name>
<version>3</version>
<interface>
@@ -273,7 +263,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.health.storage</name>
<version>1</version>
<interface>
@@ -281,7 +271,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.identity</name>
<version>1-5</version>
<interface>
@@ -289,14 +279,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.net.nlinterceptor</name>
<interface>
<name>IInterceptor</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.oemlock</name>
<version>1</version>
<interface>
@@ -304,7 +294,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.ir</name>
<version>1</version>
<interface>
@@ -312,7 +302,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.input.processor</name>
<version>1</version>
<interface>
@@ -320,15 +310,16 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.security.secretkeeper</name>
<version>1</version>
<interface>
<name>ISecretkeeper</name>
+ <instance>default</instance>
<instance>nonsecure</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.security.keymint</name>
<version>1-3</version>
<interface>
@@ -337,7 +328,7 @@
<instance>strongbox</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.security.keymint</name>
<version>1-3</version>
<interface>
@@ -346,7 +337,7 @@
<instance>strongbox</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.light</name>
<version>2</version>
<interface>
@@ -354,7 +345,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.c2</name>
<version>1.0-2</version>
<interface>
@@ -364,7 +355,7 @@
<regex-instance>vendor[0-9]*_software</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.c2</name>
<version>1.0</version>
<interface>
@@ -373,7 +364,7 @@
<instance>software</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.media.c2</name>
<version>1</version>
<interface>
@@ -382,7 +373,7 @@
<regex-instance>vendor[0-9]*_software</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.memtrack</name>
<version>1</version>
<interface>
@@ -390,7 +381,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.neuralnetworks</name>
<version>1-4</version>
<interface>
@@ -398,14 +389,14 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.nfc</name>
<interface>
<name>INfc</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.power</name>
<version>5</version>
<interface>
@@ -413,7 +404,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.power.stats</name>
<version>2</version>
<interface>
@@ -421,7 +412,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.config</name>
<version>3</version>
<interface>
@@ -429,7 +420,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.data</name>
<version>3</version>
<interface>
@@ -439,7 +430,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.messaging</name>
<version>3</version>
<interface>
@@ -449,7 +440,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.modem</name>
<version>3</version>
<interface>
@@ -459,7 +450,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.network</name>
<version>3</version>
<interface>
@@ -469,7 +460,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.sim</name>
<version>3</version>
<interface>
@@ -479,7 +470,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.sap</name>
<version>1</version>
<interface>
@@ -489,7 +480,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.voice</name>
<version>3</version>
<interface>
@@ -499,7 +490,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.ims</name>
<version>2</version>
<interface>
@@ -509,7 +500,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.ims.media</name>
<version>2</version>
<interface>
@@ -517,7 +508,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.rebootescrow</name>
<version>1</version>
<interface>
@@ -525,7 +516,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.secure_element</name>
<version>1</version>
<interface>
@@ -534,7 +525,7 @@
<regex-instance>SIM[1-9][0-9]*</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.security.authgraph</name>
<version>1</version>
<interface>
@@ -542,7 +533,7 @@
<instance>nonsecure</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.security.secureclock</name>
<version>1</version>
<interface>
@@ -550,7 +541,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.security.sharedsecret</name>
<version>1</version>
<interface>
@@ -559,7 +550,7 @@
<instance>strongbox</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.sensors</name>
<version>2</version>
<interface>
@@ -567,7 +558,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.soundtrigger3</name>
<version>1-2</version>
<interface>
@@ -575,7 +566,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.tetheroffload</name>
<version>1</version>
<interface>
@@ -583,7 +574,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.thermal</name>
<version>2</version>
<interface>
@@ -591,7 +582,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.threadnetwork</name>
<version>1</version>
<interface>
@@ -599,7 +590,7 @@
<regex-instance>chip[0-9]+</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.tv.hdmi.cec</name>
<version>1</version>
<interface>
@@ -607,7 +598,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.tv.hdmi.earc</name>
<version>1</version>
<interface>
@@ -615,7 +606,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.tv.hdmi.connection</name>
<version>1</version>
<interface>
@@ -623,7 +614,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.tv.tuner</name>
<version>1-2</version>
<interface>
@@ -631,7 +622,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.tv.input</name>
<version>1-2</version>
<interface>
@@ -639,7 +630,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.usb</name>
<version>1-3</version>
<interface>
@@ -647,14 +638,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.usb.gadget</name>
<interface>
<name>IUsbGadget</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.vibrator</name>
<version>1-2</version>
<interface>
@@ -662,7 +653,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.vibrator</name>
<version>1-2</version>
<interface>
@@ -670,7 +661,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.weaver</name>
<version>2</version>
<interface>
@@ -678,7 +669,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.wifi</name>
<version>1-2</version>
<interface>
@@ -686,7 +677,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.uwb</name>
<version>1</version>
<interface>
@@ -694,7 +685,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.wifi.hostapd</name>
<version>1-2</version>
<interface>
@@ -702,7 +693,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.wifi.supplicant</name>
<version>2-3</version>
<interface>
@@ -711,7 +702,7 @@
</interface>
</hal>
<!-- The native mapper HAL must exist on the device -->
- <hal format="native" optional="true">
+ <hal format="native">
<name>mapper</name>
<version>5.0</version>
<interface>
diff --git a/compatibility_matrices/compatibility_matrix.4.xml b/compatibility_matrices/compatibility_matrix.4.xml
index bb7637a..952f53d 100644
--- a/compatibility_matrices/compatibility_matrix.4.xml
+++ b/compatibility_matrices/compatibility_matrix.4.xml
@@ -1,5 +1,5 @@
<compatibility-matrix version="1.0" type="framework" level="4">
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.atrace</name>
<version>1.0</version>
<interface>
@@ -7,7 +7,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.audio</name>
<version>5.0</version>
<interface>
@@ -15,7 +15,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.audio.effect</name>
<version>5.0</version>
<interface>
@@ -23,7 +23,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.authsecret</name>
<version>1.0</version>
<interface>
@@ -31,7 +31,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.automotive.audiocontrol</name>
<version>1.0</version>
<interface>
@@ -39,7 +39,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.automotive.evs</name>
<version>1.0</version>
<interface>
@@ -47,7 +47,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.automotive.vehicle</name>
<version>2.0</version>
<interface>
@@ -55,7 +55,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.biometrics.face</name>
<version>1.0</version>
<interface>
@@ -63,7 +63,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.biometrics.fingerprint</name>
<version>2.1</version>
<interface>
@@ -71,7 +71,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.bluetooth</name>
<version>1.0</version>
<interface>
@@ -79,7 +79,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.bluetooth.audio</name>
<version>2.0</version>
<interface>
@@ -87,7 +87,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.boot</name>
<version>1.0</version>
<interface>
@@ -95,7 +95,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.broadcastradio</name>
<version>1.0-1</version>
<interface>
@@ -103,7 +103,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.broadcastradio</name>
<version>2.0</version>
<interface>
@@ -111,7 +111,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.camera.provider</name>
<version>2.4-5</version>
<interface>
@@ -119,7 +119,7 @@
<regex-instance>[^/]+/[0-9]+</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.cas</name>
<version>1.1</version>
<interface>
@@ -127,7 +127,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.configstore</name>
<version>1.1</version>
<interface>
@@ -135,7 +135,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.confirmationui</name>
<version>1.0</version>
<interface>
@@ -143,7 +143,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.contexthub</name>
<version>1.0</version>
<interface>
@@ -151,7 +151,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.drm</name>
<version>1.0-2</version>
<interface>
@@ -163,7 +163,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.dumpstate</name>
<version>1.0</version>
<interface>
@@ -171,7 +171,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.gatekeeper</name>
<version>1.0</version>
<interface>
@@ -179,7 +179,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.gnss</name>
<version>2.0</version>
<interface>
@@ -190,7 +190,7 @@
<!-- Either the AIDL or the HIDL allocator HAL must exist on the device.
If the HIDL composer HAL exists, it must be at least version 2.0.
See DeviceManifestTest.GrallocHal -->
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.graphics.allocator</name>
<version>2.0</version>
<version>3.0</version>
@@ -199,7 +199,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.graphics.composer</name>
<version>2.1-3</version>
<interface>
@@ -207,7 +207,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.graphics.mapper</name>
<version>2.1</version>
<version>3.0</version>
@@ -219,7 +219,7 @@
<!-- Either the AIDL or the HIDL health HAL must exist on the device.
If the HIDL health HAL exists, it must be at least version 2.0.
See DeviceManifestTest.HealthHal -->
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.health</name>
<version>2.0</version>
<interface>
@@ -227,7 +227,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.health.storage</name>
<version>1.0</version>
<interface>
@@ -235,7 +235,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.ir</name>
<version>1.0</version>
<interface>
@@ -243,7 +243,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.input.classifier</name>
<version>1.0</version>
<interface>
@@ -251,7 +251,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.keymaster</name>
<version>3.0</version>
<version>4.0</version>
@@ -260,7 +260,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.keymaster</name>
<version>4.0</version>
<interface>
@@ -268,7 +268,7 @@
<instance>strongbox</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.light</name>
<version>2.0</version>
<interface>
@@ -276,7 +276,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.c2</name>
<version>1.0</version>
<interface>
@@ -291,7 +291,7 @@
<instance>software</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.omx</name>
<version>1.0</version>
<interface>
@@ -303,7 +303,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.memtrack</name>
<version>1.0</version>
<interface>
@@ -311,7 +311,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.neuralnetworks</name>
<version>1.0-2</version>
<interface>
@@ -319,7 +319,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.nfc</name>
<version>1.2</version>
<interface>
@@ -327,7 +327,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.oemlock</name>
<version>1.0</version>
<interface>
@@ -335,7 +335,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.power</name>
<version>1.0-3</version>
<interface>
@@ -343,7 +343,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.power.stats</name>
<version>1.0</version>
<interface>
@@ -351,7 +351,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.radio</name>
<version>1.4</version>
<interface>
@@ -361,7 +361,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.radio</name>
<version>1.2</version>
<interface>
@@ -370,7 +370,7 @@
<instance>slot2</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.radio.config</name>
<!--
Note: Devices launching with target-level 4, if implementing the
@@ -384,7 +384,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.renderscript</name>
<version>1.0</version>
<interface>
@@ -392,7 +392,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.secure_element</name>
<version>1.0</version>
<interface>
@@ -401,7 +401,7 @@
<regex-instance>SIM[1-9][0-9]*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.sensors</name>
<version>1.0</version>
<version>2.0</version>
@@ -410,7 +410,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.soundtrigger</name>
<version>2.0-2</version>
<interface>
@@ -418,7 +418,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tetheroffload.config</name>
<version>1.0</version>
<interface>
@@ -426,7 +426,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tetheroffload.control</name>
<version>1.0</version>
<interface>
@@ -434,7 +434,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.thermal</name>
<version>2.0</version>
<interface>
@@ -442,7 +442,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tv.cec</name>
<version>1.0</version>
<interface>
@@ -450,7 +450,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tv.input</name>
<version>1.0</version>
<interface>
@@ -458,7 +458,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.usb</name>
<version>1.0-2</version>
<interface>
@@ -466,7 +466,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.usb.gadget</name>
<version>1.0</version>
<interface>
@@ -474,7 +474,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.vibrator</name>
<version>1.0-3</version>
<interface>
@@ -482,7 +482,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.vr</name>
<version>1.0</version>
<interface>
@@ -490,7 +490,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.weaver</name>
<version>1.0</version>
<interface>
@@ -498,7 +498,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.wifi</name>
<version>1.0-3</version>
<interface>
@@ -506,7 +506,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.wifi.hostapd</name>
<version>1.0-1</version>
<interface>
@@ -514,7 +514,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.wifi.supplicant</name>
<version>1.0-2</version>
<interface>
diff --git a/compatibility_matrices/compatibility_matrix.5.xml b/compatibility_matrices/compatibility_matrix.5.xml
index dad1558..1cf98b0 100644
--- a/compatibility_matrices/compatibility_matrix.5.xml
+++ b/compatibility_matrices/compatibility_matrix.5.xml
@@ -1,5 +1,5 @@
<compatibility-matrix version="1.0" type="framework" level="5">
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.atrace</name>
<version>1.0</version>
<interface>
@@ -7,7 +7,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.audio</name>
<version>6.0</version>
<interface>
@@ -15,7 +15,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.audio.effect</name>
<version>6.0</version>
<interface>
@@ -23,7 +23,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.authsecret</name>
<version>1.0</version>
<interface>
@@ -31,7 +31,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.automotive.audiocontrol</name>
<version>1.0</version>
<version>2.0</version>
@@ -40,7 +40,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.automotive.can</name>
<version>1.0</version>
<interface>
@@ -52,7 +52,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.automotive.evs</name>
<version>1.0-1</version>
<interface>
@@ -61,14 +61,14 @@
<regex-instance>[a-z]+/[0-9]+</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.occupant_awareness</name>
<interface>
<name>IOccupantAwareness</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.automotive.sv</name>
<version>1.0</version>
<interface>
@@ -76,7 +76,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.automotive.vehicle</name>
<version>2.0</version>
<interface>
@@ -84,7 +84,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.biometrics.face</name>
<version>1.0</version>
<interface>
@@ -92,7 +92,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.biometrics.fingerprint</name>
<version>2.1-2</version>
<interface>
@@ -100,7 +100,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.bluetooth</name>
<version>1.0-1</version>
<interface>
@@ -108,7 +108,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.bluetooth.audio</name>
<version>2.0</version>
<interface>
@@ -116,7 +116,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.boot</name>
<version>1.1</version>
<interface>
@@ -124,7 +124,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.broadcastradio</name>
<version>1.0-1</version>
<interface>
@@ -132,7 +132,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.broadcastradio</name>
<version>2.0</version>
<interface>
@@ -140,7 +140,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.camera.provider</name>
<version>2.4-6</version>
<interface>
@@ -148,7 +148,7 @@
<regex-instance>[^/]+/[0-9]+</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.cas</name>
<version>1.1-2</version>
<interface>
@@ -156,7 +156,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.confirmationui</name>
<version>1.0</version>
<interface>
@@ -164,7 +164,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.contexthub</name>
<version>1.0-1</version>
<interface>
@@ -172,7 +172,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.drm</name>
<version>1.3</version>
<interface>
@@ -184,7 +184,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.dumpstate</name>
<version>1.1</version>
<interface>
@@ -192,7 +192,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.gatekeeper</name>
<version>1.0</version>
<interface>
@@ -200,7 +200,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.gnss</name>
<version>2.0-1</version>
<interface>
@@ -211,7 +211,7 @@
<!-- Either the AIDL or the HIDL allocator HAL must exist on the device.
If the HIDL composer HAL exists, it must be at least version 2.0.
See DeviceManifestTest.GrallocHal -->
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.graphics.allocator</name>
<!-- New, non-Go devices should use 4.0, tested in vts_treble_vintf_vendor_test -->
<version>2.0</version>
@@ -222,7 +222,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.graphics.composer</name>
<version>2.1-4</version>
<interface>
@@ -230,7 +230,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.graphics.mapper</name>
<!-- New, non-Go devices should use 4.0, tested in vts_treble_vintf_vendor_test -->
<version>2.1</version>
@@ -244,7 +244,7 @@
<!-- Either the AIDL or the HIDL health HAL must exist on the device.
If the HIDL health HAL exists, it must be at least version 2.1.
See DeviceManifestTest.HealthHal -->
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.health</name>
<version>2.1</version>
<interface>
@@ -252,7 +252,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.health.storage</name>
<version>1.0</version>
<interface>
@@ -260,7 +260,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.identity</name>
<!--
b/178458001: identity V2 is introduced in R, but Android R VINTF does not support AIDL
@@ -274,7 +274,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.ir</name>
<version>1.0</version>
<interface>
@@ -282,7 +282,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.input.classifier</name>
<version>1.0</version>
<interface>
@@ -290,7 +290,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.keymaster</name>
<version>3.0</version>
<version>4.0-1</version>
@@ -299,7 +299,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.keymaster</name>
<version>4.0-1</version>
<interface>
@@ -307,14 +307,14 @@
<instance>strongbox</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.light</name>
<interface>
<name>ILights</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.c2</name>
<version>1.0-1</version>
<interface>
@@ -324,7 +324,7 @@
<regex-instance>vendor[0-9]*_software</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.c2</name>
<version>1.0</version>
<interface>
@@ -333,7 +333,7 @@
<instance>software</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.omx</name>
<version>1.0</version>
<interface>
@@ -345,7 +345,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.memtrack</name>
<version>1.0</version>
<interface>
@@ -353,7 +353,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.neuralnetworks</name>
<version>1.0-3</version>
<interface>
@@ -361,7 +361,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.nfc</name>
<version>1.2</version>
<interface>
@@ -369,7 +369,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.oemlock</name>
<version>1.0</version>
<interface>
@@ -377,14 +377,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.power</name>
<interface>
<name>IPower</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.power.stats</name>
<version>1.0</version>
<interface>
@@ -392,7 +392,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.radio</name>
<version>1.4</version>
<version>1.5</version>
@@ -403,7 +403,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.radio</name>
<version>1.2</version>
<interface>
@@ -412,7 +412,7 @@
<instance>slot2</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.radio.config</name>
<!--
See compatibility_matrix.4.xml on versioning of radio config HAL.
@@ -423,7 +423,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.renderscript</name>
<version>1.0</version>
<interface>
@@ -431,14 +431,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.rebootescrow</name>
<interface>
<name>IRebootEscrow</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.secure_element</name>
<version>1.0-2</version>
<interface>
@@ -447,7 +447,7 @@
<regex-instance>SIM[1-9][0-9]*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.sensors</name>
<version>1.0</version>
<version>2.0-1</version>
@@ -456,7 +456,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.soundtrigger</name>
<version>2.0-3</version>
<interface>
@@ -464,7 +464,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tetheroffload.config</name>
<version>1.0</version>
<interface>
@@ -472,7 +472,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tetheroffload.control</name>
<version>1.0</version>
<interface>
@@ -480,7 +480,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.thermal</name>
<version>2.0</version>
<interface>
@@ -488,7 +488,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tv.cec</name>
<version>1.0</version>
<interface>
@@ -496,7 +496,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tv.input</name>
<version>1.0</version>
<interface>
@@ -504,7 +504,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tv.tuner</name>
<version>1.0</version>
<interface>
@@ -512,7 +512,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.usb</name>
<version>1.0-2</version>
<interface>
@@ -520,7 +520,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.usb.gadget</name>
<version>1.0-1</version>
<interface>
@@ -528,14 +528,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.vibrator</name>
<interface>
<name>IVibrator</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.vr</name>
<version>1.0</version>
<interface>
@@ -543,7 +543,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.weaver</name>
<version>1.0</version>
<interface>
@@ -551,7 +551,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.wifi</name>
<version>1.0-4</version>
<interface>
@@ -559,7 +559,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.wifi.hostapd</name>
<version>1.0-2</version>
<interface>
@@ -567,7 +567,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.wifi.supplicant</name>
<version>1.0-3</version>
<interface>
diff --git a/compatibility_matrices/compatibility_matrix.6.xml b/compatibility_matrices/compatibility_matrix.6.xml
index 23f634d..fdd7952 100644
--- a/compatibility_matrices/compatibility_matrix.6.xml
+++ b/compatibility_matrices/compatibility_matrix.6.xml
@@ -1,5 +1,5 @@
<compatibility-matrix version="1.0" type="framework" level="6">
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.atrace</name>
<version>1.0</version>
<interface>
@@ -7,7 +7,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.audio</name>
<version>6.0</version>
<version>7.0</version>
@@ -16,7 +16,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.audio.effect</name>
<version>6.0</version>
<version>7.0</version>
@@ -25,7 +25,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.authsecret</name>
<version>1</version>
<interface>
@@ -33,7 +33,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.authsecret</name>
<version>1.0</version>
<interface>
@@ -41,14 +41,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.audiocontrol</name>
<interface>
<name>IAudioControl</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.automotive.can</name>
<version>1.0</version>
<interface>
@@ -60,7 +60,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.automotive.evs</name>
<version>1.0-1</version>
<interface>
@@ -69,7 +69,7 @@
<regex-instance>[a-z]+/[0-9]+</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.occupant_awareness</name>
<version>1</version>
<interface>
@@ -77,7 +77,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.automotive.sv</name>
<version>1.0</version>
<interface>
@@ -85,7 +85,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.automotive.vehicle</name>
<version>2.0</version>
<interface>
@@ -93,7 +93,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.biometrics.face</name>
<version>1.0</version>
<interface>
@@ -101,14 +101,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.biometrics.face</name>
<interface>
<name>IFace</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.biometrics.fingerprint</name>
<version>2.1-3</version>
<interface>
@@ -116,14 +116,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.biometrics.fingerprint</name>
<interface>
<name>IFingerprint</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.bluetooth</name>
<version>1.0-1</version>
<interface>
@@ -131,7 +131,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.bluetooth.audio</name>
<version>2.0-1</version>
<interface>
@@ -139,7 +139,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.boot</name>
<version>1.2</version>
<interface>
@@ -147,7 +147,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.broadcastradio</name>
<version>1.0-1</version>
<interface>
@@ -155,7 +155,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.broadcastradio</name>
<version>2.0</version>
<interface>
@@ -163,7 +163,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.camera.provider</name>
<version>2.4-7</version>
<interface>
@@ -171,7 +171,7 @@
<regex-instance>[^/]+/[0-9]+</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.cas</name>
<version>1.1-2</version>
<interface>
@@ -179,7 +179,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.confirmationui</name>
<version>1.0</version>
<interface>
@@ -187,7 +187,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.contexthub</name>
<version>1.2</version>
<interface>
@@ -195,7 +195,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.drm</name>
<version>1.3-4</version>
<interface>
@@ -207,7 +207,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.dumpstate</name>
<version>1.1</version>
<interface>
@@ -215,7 +215,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.gatekeeper</name>
<version>1.0</version>
<interface>
@@ -223,7 +223,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.gnss</name>
<version>2.0-1</version>
<interface>
@@ -231,7 +231,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.gnss</name>
<interface>
<name>IGnss</name>
@@ -241,7 +241,7 @@
<!-- Either the AIDL or the HIDL allocator HAL must exist on the device.
If the HIDL composer HAL exists, it must be at least version 2.0.
See DeviceManifestTest.GrallocHal -->
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.graphics.allocator</name>
<!-- New, non-Go devices should use 4.0, tested in vts_treble_vintf_vendor_test -->
<version>2.0</version>
@@ -252,7 +252,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.graphics.composer</name>
<version>2.1-4</version>
<interface>
@@ -260,7 +260,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.graphics.mapper</name>
<!-- New, non-Go devices should use 4.0, tested in vts_treble_vintf_vendor_test -->
<version>2.1</version>
@@ -274,7 +274,7 @@
<!-- Either the AIDL or the HIDL health HAL must exist on the device.
If the HIDL health HAL exists, it must be at least version 2.1.
See DeviceManifestTest.HealthHal -->
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.health</name>
<version>2.1</version>
<interface>
@@ -282,7 +282,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.health.storage</name>
<version>1</version>
<interface>
@@ -290,7 +290,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.identity</name>
<version>1-3</version>
<interface>
@@ -298,7 +298,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.oemlock</name>
<version>1</version>
<interface>
@@ -306,7 +306,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.ir</name>
<version>1.0</version>
<interface>
@@ -314,7 +314,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.input.classifier</name>
<version>1.0</version>
<interface>
@@ -322,7 +322,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.keymaster</name>
<version>3.0</version>
<version>4.0-1</version>
@@ -331,7 +331,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.keymaster</name>
<version>4.0-1</version>
<interface>
@@ -339,7 +339,7 @@
<instance>strongbox</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.security.keymint</name>
<version>1</version>
<interface>
@@ -348,14 +348,14 @@
<instance>strongbox</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.security.keymint</name>
<interface>
<name>IRemotelyProvisionedComponent</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.light</name>
<version>1</version>
<interface>
@@ -363,7 +363,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.c2</name>
<version>1.0-2</version>
<interface>
@@ -373,7 +373,7 @@
<regex-instance>vendor[0-9]*_software</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.c2</name>
<version>1.0</version>
<interface>
@@ -382,7 +382,7 @@
<instance>software</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.omx</name>
<version>1.0</version>
<interface>
@@ -394,7 +394,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.memtrack</name>
<version>1</version>
<interface>
@@ -402,7 +402,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.neuralnetworks</name>
<version>1.0-3</version>
<interface>
@@ -410,14 +410,14 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.neuralnetworks</name>
<interface>
<name>IDevice</name>
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.nfc</name>
<version>1.2</version>
<interface>
@@ -425,7 +425,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.oemlock</name>
<version>1.0</version>
<interface>
@@ -433,7 +433,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.power</name>
<version>1-2</version>
<interface>
@@ -441,14 +441,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.power.stats</name>
<interface>
<name>IPowerStats</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.radio</name>
<version>1.6</version>
<interface>
@@ -458,7 +458,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.radio</name>
<version>1.2</version>
<interface>
@@ -467,7 +467,7 @@
<instance>slot2</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.radio.config</name>
<!--
See compatibility_matrix.4.xml on versioning of radio config HAL.
@@ -478,7 +478,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.radio.config</name>
<version>1.3</version>
<interface>
@@ -486,7 +486,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.renderscript</name>
<version>1.0</version>
<interface>
@@ -494,7 +494,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.rebootescrow</name>
<version>1</version>
<interface>
@@ -502,7 +502,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.secure_element</name>
<version>1.0-2</version>
<interface>
@@ -511,7 +511,7 @@
<regex-instance>SIM[1-9][0-9]*</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.security.secureclock</name>
<version>1</version>
<interface>
@@ -519,7 +519,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.security.sharedsecret</name>
<version>1</version>
<interface>
@@ -528,7 +528,7 @@
<instance>strongbox</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.sensors</name>
<version>1.0</version>
<version>2.0-1</version>
@@ -537,7 +537,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.soundtrigger</name>
<version>2.3</version>
<interface>
@@ -545,7 +545,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tetheroffload.config</name>
<version>1.0</version>
<interface>
@@ -553,7 +553,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tetheroffload.control</name>
<version>1.1</version>
<interface>
@@ -561,7 +561,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.thermal</name>
<version>2.0</version>
<interface>
@@ -569,7 +569,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tv.cec</name>
<version>1.0-1</version>
<interface>
@@ -577,7 +577,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tv.input</name>
<version>1.0</version>
<interface>
@@ -585,7 +585,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tv.tuner</name>
<version>1.0-1</version>
<interface>
@@ -593,7 +593,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.usb</name>
<version>1.0-3</version>
<interface>
@@ -601,7 +601,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.usb.gadget</name>
<version>1.0-2</version>
<interface>
@@ -609,7 +609,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.vibrator</name>
<version>1-2</version>
<interface>
@@ -617,7 +617,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.vibrator</name>
<version>1-2</version>
<interface>
@@ -625,7 +625,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.weaver</name>
<version>1.0</version>
<interface>
@@ -633,7 +633,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.weaver</name>
<version>1</version>
<interface>
@@ -641,7 +641,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.wifi</name>
<version>1.3-5</version>
<interface>
@@ -649,7 +649,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.wifi.hostapd</name>
<version>1.0-3</version>
<interface>
@@ -657,7 +657,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.wifi.supplicant</name>
<version>1.2-4</version>
<interface>
diff --git a/compatibility_matrices/compatibility_matrix.7.xml b/compatibility_matrices/compatibility_matrix.7.xml
index fe424bd..8dcc4ae 100644
--- a/compatibility_matrices/compatibility_matrix.7.xml
+++ b/compatibility_matrices/compatibility_matrix.7.xml
@@ -1,5 +1,5 @@
<compatibility-matrix version="1.0" type="framework" level="7">
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.atrace</name>
<version>1.0</version>
<interface>
@@ -7,7 +7,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.audio</name>
<version>6.0</version>
<version>7.0-1</version>
@@ -16,7 +16,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.audio.effect</name>
<version>6.0</version>
<version>7.0</version>
@@ -25,7 +25,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.authsecret</name>
<version>1</version>
<interface>
@@ -33,7 +33,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.authsecret</name>
<version>1.0</version>
<interface>
@@ -41,7 +41,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.audiocontrol</name>
<version>1-2</version>
<interface>
@@ -49,7 +49,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.automotive.can</name>
<version>1.0</version>
<interface>
@@ -61,7 +61,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.evs</name>
<interface>
<name>IEvsEnumerator</name>
@@ -69,7 +69,7 @@
<regex-instance>[a-z]+/[0-9]+</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.automotive.evs</name>
<version>1.0-1</version>
<interface>
@@ -78,7 +78,7 @@
<regex-instance>[a-z]+/[0-9]+</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.occupant_awareness</name>
<version>1</version>
<interface>
@@ -86,14 +86,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.vehicle</name>
<interface>
<name>IVehicle</name>
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.automotive.vehicle</name>
<version>2.0</version>
<interface>
@@ -101,7 +101,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.biometrics.face</name>
<version>1.0</version>
<interface>
@@ -109,7 +109,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.biometrics.face</name>
<version>2</version>
<interface>
@@ -117,7 +117,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.biometrics.fingerprint</name>
<version>2.1-3</version>
<interface>
@@ -125,7 +125,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.biometrics.fingerprint</name>
<version>2</version>
<interface>
@@ -133,7 +133,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.bluetooth</name>
<version>1.0-1</version>
<interface>
@@ -141,7 +141,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.bluetooth.audio</name>
<version>2</version>
<interface>
@@ -149,7 +149,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.boot</name>
<version>1.2</version>
<interface>
@@ -157,7 +157,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.broadcastradio</name>
<version>1.0-1</version>
<interface>
@@ -165,7 +165,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.broadcastradio</name>
<version>2.0</version>
<interface>
@@ -173,7 +173,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.camera.provider</name>
<version>2.4-7</version>
<interface>
@@ -181,7 +181,7 @@
<regex-instance>[^/]+/[0-9]+</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.camera.provider</name>
<version>1</version>
<interface>
@@ -189,7 +189,7 @@
<regex-instance>[^/]+/[0-9]+</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.cas</name>
<version>1.1-2</version>
<interface>
@@ -197,7 +197,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.confirmationui</name>
<version>1.0</version>
<interface>
@@ -205,14 +205,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.contexthub</name>
<interface>
<name>IContextHub</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.drm</name>
<version>1</version>
<interface>
@@ -220,7 +220,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.drm</name>
<version>1.3-4</version>
<interface>
@@ -232,14 +232,14 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.dumpstate</name>
<interface>
<name>IDumpstateDevice</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.gatekeeper</name>
<version>1.0</version>
<interface>
@@ -247,7 +247,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.gnss</name>
<version>2.0-1</version>
<interface>
@@ -255,7 +255,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.gnss</name>
<version>2</version>
<interface>
@@ -263,7 +263,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.graphics.allocator</name>
<!-- New, non-Go devices should use 4.0 or the AIDL hal. -->
<version>2.0</version>
@@ -274,7 +274,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.graphics.allocator</name>
<version>1</version>
<interface>
@@ -285,7 +285,7 @@
<!-- Either the AIDL or the HIDL composer HAL must exist on the device.
If the HIDL composer HAL exists, it must be at least version 2.1.
See DeviceManifestTest.ComposerHal -->
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.graphics.composer</name>
<version>2.1-4</version>
<interface>
@@ -293,7 +293,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.graphics.composer3</name>
<version>1</version>
<interface>
@@ -301,7 +301,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.graphics.mapper</name>
<!-- New, non-Go devices should use 4.0, tested in vts_treble_vintf_vendor_test -->
<version>2.1</version>
@@ -312,7 +312,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.health</name>
<version>1</version>
<interface>
@@ -320,7 +320,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.health.storage</name>
<version>1</version>
<interface>
@@ -328,7 +328,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.identity</name>
<version>1-4</version>
<interface>
@@ -336,14 +336,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.net.nlinterceptor</name>
<interface>
<name>IInterceptor</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.oemlock</name>
<version>1</version>
<interface>
@@ -351,7 +351,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.ir</name>
<version>1</version>
<interface>
@@ -359,7 +359,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.input.processor</name>
<version>1</version>
<interface>
@@ -367,7 +367,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.keymaster</name>
<version>3.0</version>
<version>4.0-1</version>
@@ -376,7 +376,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.keymaster</name>
<version>4.0-1</version>
<interface>
@@ -384,7 +384,7 @@
<instance>strongbox</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.security.keymint</name>
<version>1-2</version>
<interface>
@@ -393,7 +393,7 @@
<instance>strongbox</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.security.keymint</name>
<version>1-2</version>
<interface>
@@ -402,7 +402,7 @@
<instance>strongbox</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.light</name>
<version>1-2</version>
<interface>
@@ -410,7 +410,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.c2</name>
<version>1.0-2</version>
<interface>
@@ -420,7 +420,7 @@
<regex-instance>vendor[0-9]*_software</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.c2</name>
<version>1.0</version>
<interface>
@@ -429,7 +429,7 @@
<instance>software</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.omx</name>
<version>1.0</version>
<interface>
@@ -441,7 +441,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.memtrack</name>
<version>1</version>
<interface>
@@ -449,7 +449,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.neuralnetworks</name>
<version>1.0-3</version>
<interface>
@@ -457,7 +457,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.neuralnetworks</name>
<version>1-4</version>
<interface>
@@ -465,7 +465,7 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.nfc</name>
<version>1.2</version>
<interface>
@@ -473,14 +473,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.nfc</name>
<interface>
<name>INfc</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.oemlock</name>
<version>1.0</version>
<interface>
@@ -488,7 +488,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.power</name>
<version>2-3</version>
<interface>
@@ -496,14 +496,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.power.stats</name>
<interface>
<name>IPowerStats</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.config</name>
<version>1</version>
<interface>
@@ -511,7 +511,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.data</name>
<version>1</version>
<interface>
@@ -521,7 +521,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.messaging</name>
<version>1</version>
<interface>
@@ -531,7 +531,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.modem</name>
<version>1</version>
<interface>
@@ -541,7 +541,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.network</name>
<version>1</version>
<interface>
@@ -551,7 +551,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.sim</name>
<version>1</version>
<interface>
@@ -561,7 +561,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.voice</name>
<version>1</version>
<interface>
@@ -571,7 +571,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.radio</name>
<version>1.2</version>
<interface>
@@ -580,7 +580,7 @@
<instance>slot2</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.renderscript</name>
<version>1.0</version>
<interface>
@@ -588,7 +588,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.rebootescrow</name>
<version>1</version>
<interface>
@@ -596,7 +596,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.secure_element</name>
<version>1.0-2</version>
<interface>
@@ -605,7 +605,7 @@
<regex-instance>SIM[1-9][0-9]*</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.security.secureclock</name>
<version>1</version>
<interface>
@@ -613,7 +613,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.security.sharedsecret</name>
<version>1</version>
<interface>
@@ -622,14 +622,14 @@
<instance>strongbox</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.sensors</name>
<interface>
<name>ISensors</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.sensors</name>
<version>1.0</version>
<version>2.0-1</version>
@@ -638,7 +638,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.soundtrigger</name>
<version>2.3</version>
<interface>
@@ -646,7 +646,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.soundtrigger3</name>
<version>1</version>
<interface>
@@ -654,7 +654,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tetheroffload.config</name>
<version>1.0</version>
<interface>
@@ -662,7 +662,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tetheroffload.control</name>
<version>1.1</version>
<interface>
@@ -670,7 +670,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.thermal</name>
<version>2.0</version>
<interface>
@@ -678,7 +678,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tv.cec</name>
<version>1.0-1</version>
<interface>
@@ -686,7 +686,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tv.input</name>
<version>1.0</version>
<interface>
@@ -694,7 +694,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tv.tuner</name>
<version>1.0-1</version>
<interface>
@@ -702,7 +702,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.tv.tuner</name>
<version>1</version>
<interface>
@@ -710,7 +710,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.usb</name>
<version>1.0-3</version>
<interface>
@@ -718,14 +718,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.usb</name>
<interface>
<name>IUsb</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.usb.gadget</name>
<version>1.0-2</version>
<interface>
@@ -733,7 +733,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.vibrator</name>
<version>1-2</version>
<interface>
@@ -741,7 +741,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.vibrator</name>
<version>1-2</version>
<interface>
@@ -749,7 +749,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.weaver</name>
<version>1.0</version>
<interface>
@@ -757,7 +757,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.weaver</name>
<version>1</version>
<interface>
@@ -765,7 +765,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.wifi</name>
<version>1.3-6</version>
<interface>
@@ -773,7 +773,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.uwb</name>
<version>1</version>
<interface>
@@ -781,7 +781,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.wifi.hostapd</name>
<version>1</version>
<interface>
@@ -789,7 +789,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.wifi.supplicant</name>
<interface>
<name>ISupplicant</name>
diff --git a/compatibility_matrices/compatibility_matrix.8.xml b/compatibility_matrices/compatibility_matrix.8.xml
index 777eb84..7054bfa 100644
--- a/compatibility_matrices/compatibility_matrix.8.xml
+++ b/compatibility_matrices/compatibility_matrix.8.xml
@@ -1,5 +1,5 @@
<compatibility-matrix version="1.0" type="framework" level="8">
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.audio</name>
<version>6.0</version>
<version>7.0-1</version>
@@ -8,7 +8,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.audio.effect</name>
<version>6.0</version>
<version>7.0</version>
@@ -17,7 +17,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.audio.core</name>
<version>1</version>
<interface>
@@ -36,7 +36,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.audio.effect</name>
<version>1</version>
<interface>
@@ -44,7 +44,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.audio.sounddose</name>
<version>1</version>
<interface>
@@ -52,7 +52,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.authsecret</name>
<version>1</version>
<interface>
@@ -60,7 +60,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.audiocontrol</name>
<version>2-3</version>
<interface>
@@ -68,7 +68,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.can</name>
<version>1</version>
<interface>
@@ -76,7 +76,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.evs</name>
<version>1-2</version>
<interface>
@@ -84,7 +84,7 @@
<regex-instance>[a-z]+/[0-9]+</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.occupant_awareness</name>
<version>1</version>
<interface>
@@ -92,7 +92,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.vehicle</name>
<version>1-2</version>
<interface>
@@ -100,21 +100,21 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.remoteaccess</name>
<interface>
<name>IRemoteAccess</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.automotive.ivn</name>
<interface>
<name>IIvnAndroidDevice</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.biometrics.face</name>
<version>3-4</version>
<interface>
@@ -123,7 +123,7 @@
<instance>virtual</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.biometrics.fingerprint</name>
<version>3</version>
<interface>
@@ -132,7 +132,7 @@
<instance>virtual</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.bluetooth</name>
<version>1.0-1</version>
<interface>
@@ -140,14 +140,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.bluetooth</name>
<interface>
<name>IBluetoothHci</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.bluetooth.audio</name>
<version>3</version>
<interface>
@@ -155,21 +155,21 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.boot</name>
<interface>
<name>IBootControl</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.broadcastradio</name>
<interface>
<name>IBroadcastRadio</name>
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.camera.provider</name>
<version>1-2</version>
<interface>
@@ -177,14 +177,14 @@
<regex-instance>[^/]+/[0-9]+</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.cas</name>
<interface>
<name>IMediaCasService</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.confirmationui</name>
<version>1</version>
<interface>
@@ -192,7 +192,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.contexthub</name>
<version>2</version>
<interface>
@@ -200,7 +200,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.drm</name>
<version>1</version>
<interface>
@@ -208,14 +208,14 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.dumpstate</name>
<interface>
<name>IDumpstateDevice</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.gatekeeper</name>
<version>1</version>
<interface>
@@ -223,7 +223,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.gnss</name>
<version>2-3</version>
<interface>
@@ -231,7 +231,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.graphics.allocator</name>
<version>1-2</version>
<interface>
@@ -239,7 +239,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.graphics.composer3</name>
<version>2</version>
<interface>
@@ -248,7 +248,7 @@
</interface>
</hal>
<!-- Either the native or the HIDL mapper HAL must exist on the device -->
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.graphics.mapper</name>
<!-- New, non-Go devices should use 4.0, tested in vts_treble_vintf_vendor_test -->
<version>2.1</version>
@@ -259,7 +259,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.health</name>
<version>1-2</version>
<interface>
@@ -267,7 +267,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.health.storage</name>
<version>1</version>
<interface>
@@ -275,7 +275,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.identity</name>
<version>1-5</version>
<interface>
@@ -283,14 +283,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.net.nlinterceptor</name>
<interface>
<name>IInterceptor</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.oemlock</name>
<version>1</version>
<interface>
@@ -298,7 +298,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.ir</name>
<version>1</version>
<interface>
@@ -306,7 +306,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.input.processor</name>
<version>1</version>
<interface>
@@ -314,7 +314,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.security.keymint</name>
<version>1-3</version>
<interface>
@@ -323,7 +323,7 @@
<instance>strongbox</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.security.keymint</name>
<version>1-3</version>
<interface>
@@ -333,7 +333,7 @@
<instance>widevine</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.light</name>
<version>2</version>
<interface>
@@ -341,7 +341,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.c2</name>
<version>1.0-2</version>
<interface>
@@ -351,7 +351,7 @@
<regex-instance>vendor[0-9]*_software</regex-instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.c2</name>
<version>1.0</version>
<interface>
@@ -360,7 +360,7 @@
<instance>software</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.media.omx</name>
<version>1.0</version>
<interface>
@@ -372,7 +372,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.memtrack</name>
<version>1</version>
<interface>
@@ -380,7 +380,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.neuralnetworks</name>
<version>1-4</version>
<interface>
@@ -388,14 +388,14 @@
<regex-instance>.*</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.nfc</name>
<interface>
<name>INfc</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.power</name>
<version>4</version>
<interface>
@@ -403,7 +403,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.power.stats</name>
<version>2</version>
<interface>
@@ -411,7 +411,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.config</name>
<version>2</version>
<interface>
@@ -419,7 +419,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.data</name>
<version>2</version>
<interface>
@@ -429,7 +429,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.messaging</name>
<version>2</version>
<interface>
@@ -439,7 +439,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.modem</name>
<version>2</version>
<interface>
@@ -449,7 +449,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.network</name>
<version>2</version>
<interface>
@@ -459,7 +459,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.sim</name>
<version>2</version>
<interface>
@@ -469,7 +469,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.sap</name>
<version>1</version>
<interface>
@@ -479,7 +479,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.voice</name>
<version>2</version>
<interface>
@@ -489,7 +489,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.ims</name>
<version>1</version>
<interface>
@@ -499,7 +499,7 @@
<instance>slot3</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.radio.ims.media</name>
<version>1</version>
<interface>
@@ -507,7 +507,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.renderscript</name>
<version>1.0</version>
<interface>
@@ -515,7 +515,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.rebootescrow</name>
<version>1</version>
<interface>
@@ -523,7 +523,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.secure_element</name>
<version>1</version>
<interface>
@@ -532,7 +532,7 @@
<regex-instance>SIM[1-9][0-9]*</regex-instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.security.secureclock</name>
<version>1</version>
<interface>
@@ -540,7 +540,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.security.sharedsecret</name>
<version>1</version>
<interface>
@@ -549,7 +549,7 @@
<instance>strongbox</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.sensors</name>
<version>2</version>
<interface>
@@ -557,7 +557,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.soundtrigger</name>
<version>2.3</version>
<interface>
@@ -565,7 +565,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.soundtrigger3</name>
<version>1</version>
<interface>
@@ -573,7 +573,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tetheroffload.config</name>
<version>1.0</version>
<interface>
@@ -581,7 +581,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="hidl" optional="true">
+ <hal format="hidl">
<name>android.hardware.tetheroffload.control</name>
<version>1.1</version>
<interface>
@@ -589,7 +589,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.tetheroffload</name>
<version>1</version>
<interface>
@@ -597,7 +597,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.thermal</name>
<version>1</version>
<interface>
@@ -605,7 +605,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.tv.hdmi.cec</name>
<version>1</version>
<interface>
@@ -613,7 +613,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.tv.hdmi.earc</name>
<version>1</version>
<interface>
@@ -621,7 +621,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.tv.hdmi.connection</name>
<version>1</version>
<interface>
@@ -629,7 +629,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.tv.tuner</name>
<version>1-2</version>
<interface>
@@ -637,7 +637,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.tv.input</name>
<version>1</version>
<interface>
@@ -645,7 +645,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.usb</name>
<version>1-2</version>
<interface>
@@ -653,14 +653,14 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.usb.gadget</name>
<interface>
<name>IUsbGadget</name>
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.vibrator</name>
<version>1-2</version>
<interface>
@@ -668,7 +668,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.vibrator</name>
<version>1-2</version>
<interface>
@@ -676,7 +676,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.weaver</name>
<version>2</version>
<interface>
@@ -684,7 +684,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.wifi</name>
<version>1</version>
<interface>
@@ -692,7 +692,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true" updatable-via-apex="true">
+ <hal format="aidl" updatable-via-apex="true">
<name>android.hardware.uwb</name>
<version>1</version>
<interface>
@@ -700,7 +700,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.wifi.hostapd</name>
<version>1</version>
<interface>
@@ -708,7 +708,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal format="aidl" optional="true">
+ <hal format="aidl">
<name>android.hardware.wifi.supplicant</name>
<version>2</version>
<interface>
@@ -717,7 +717,7 @@
</interface>
</hal>
<!-- Either the native or the HIDL mapper HAL must exist on the device -->
- <hal format="native" optional="true">
+ <hal format="native">
<name>mapper</name>
<version>5.0</version>
<interface>
diff --git a/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp b/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp
index b67cfc2..a1992b9 100644
--- a/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp
+++ b/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp
@@ -315,6 +315,8 @@
* required client targets.
*/
TEST_P(GraphicsComposerHidlTest, GetClientTargetSupport) {
+ ASSERT_NO_FATAL_FAILURE(
+ mComposerClient->setPowerMode(mPrimaryDisplay, IComposerClient::PowerMode::ON));
std::vector<Config> configs = mComposerClient->getDisplayConfigs(mPrimaryDisplay);
for (auto config : configs) {
int32_t width = mComposerClient->getDisplayAttribute(mPrimaryDisplay, config,
diff --git a/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2TargetTest.cpp b/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2TargetTest.cpp
index 2bd287b..cd4cb58 100644
--- a/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2TargetTest.cpp
+++ b/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2TargetTest.cpp
@@ -256,6 +256,8 @@
* required client targets.
*/
TEST_P(GraphicsComposerHidlTest, GetClientTargetSupport_2_2) {
+ ASSERT_NO_FATAL_FAILURE(
+ mComposerClient->setPowerMode_2_2(mPrimaryDisplay, IComposerClient::PowerMode::ON));
std::vector<Config> configs = mComposerClient->getDisplayConfigs(mPrimaryDisplay);
for (auto config : configs) {
int32_t width = mComposerClient->getDisplayAttribute(mPrimaryDisplay, config,
diff --git a/graphics/composer/2.3/vts/functional/VtsHalGraphicsComposerV2_3TargetTest.cpp b/graphics/composer/2.3/vts/functional/VtsHalGraphicsComposerV2_3TargetTest.cpp
index c072ef0..f99c72d 100644
--- a/graphics/composer/2.3/vts/functional/VtsHalGraphicsComposerV2_3TargetTest.cpp
+++ b/graphics/composer/2.3/vts/functional/VtsHalGraphicsComposerV2_3TargetTest.cpp
@@ -274,6 +274,8 @@
* Test IComposerClient::getClientTargetSupport_2_3
*/
TEST_P(GraphicsComposerHidlTest, GetClientTargetSupport_2_3) {
+ ASSERT_NO_FATAL_FAILURE(
+ mComposerClient->setPowerMode_2_2(mPrimaryDisplay, IComposerClient::PowerMode::ON));
std::vector<V2_1::Config> configs = mComposerClient->getDisplayConfigs(mPrimaryDisplay);
for (auto config : configs) {
int32_t width = mComposerClient->getDisplayAttribute(mPrimaryDisplay, config,
diff --git a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/VrrConfig.aidl b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/VrrConfig.aidl
index bb2569f..7377b4b 100644
--- a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/VrrConfig.aidl
+++ b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/VrrConfig.aidl
@@ -42,7 +42,7 @@
int averageRefreshPeriodNs;
}
parcelable NotifyExpectedPresentConfig {
- int notifyExpectedPresentHeadsUpNs;
- int notifyExpectedPresentTimeoutNs;
+ int headsUpNs;
+ int timeoutNs;
}
}
diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl
index 725c947..213e8e9 100644
--- a/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl
+++ b/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl
@@ -895,9 +895,9 @@
*
* The framework will call this function based on the parameters specified in
* DisplayConfiguration.VrrConfig:
- * - notifyExpectedPresentTimeoutNs specifies the idle time from the previous present command
- * where the framework must send the early hint for the next frame.
- * - notifyExpectedPresentHeadsUpNs specifies minimal time that framework must send
+ * - notifyExpectedPresentConfig.timeoutNs specifies the idle time from the previous
+ * present command where the framework must send the early hint for the next frame.
+ * - notifyExpectedPresentConfig.headsUpNs specifies minimal time that framework must send
* the early hint before the next frame.
*
* The framework can omit calling this API when the next present command matches
diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/LayerLifecycleBatchCommandType.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/LayerLifecycleBatchCommandType.aidl
index ec2d55f..e619712 100644
--- a/graphics/composer/aidl/android/hardware/graphics/composer3/LayerLifecycleBatchCommandType.aidl
+++ b/graphics/composer/aidl/android/hardware/graphics/composer3/LayerLifecycleBatchCommandType.aidl
@@ -32,8 +32,8 @@
*/
CREATE = 1,
/**
- * This indicates that the current LayerCommand should also destroyes the layer,
- * after processing the other attributes in the LayerCommand.
+ * This indicates that the current LayerCommand should also destroy the layer,
+ * before processing the other attributes in the LayerCommand.
*/
DESTROY = 2,
}
diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/VrrConfig.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/VrrConfig.aidl
index 3b241ba..99c1c62 100644
--- a/graphics/composer/aidl/android/hardware/graphics/composer3/VrrConfig.aidl
+++ b/graphics/composer/aidl/android/hardware/graphics/composer3/VrrConfig.aidl
@@ -45,15 +45,16 @@
* The minimal time in nanoseconds that IComposerClient.notifyExpectedPresent needs to be
* called ahead of an expectedPresentTime provided on a presentDisplay command.
*/
- int notifyExpectedPresentHeadsUpNs;
+ int headsUpNs;
/**
* The time in nanoseconds that represents a timeout from the previous presentDisplay, which
* after this point the display needs a call to IComposerClient.notifyExpectedPresent before
- * sending the next frame. If set to 0, there is no need to call
+ * sending the next frame.
+ * If set to 0, hint is sent for every frame.
* IComposerClient.notifyExpectedPresent for timeout.
*/
- int notifyExpectedPresentTimeoutNs;
+ int timeoutNs;
}
/**
diff --git a/graphics/composer/aidl/vts/ReadbackVts.cpp b/graphics/composer/aidl/vts/ReadbackVts.cpp
index 8605628..c72ec69 100644
--- a/graphics/composer/aidl/vts/ReadbackVts.cpp
+++ b/graphics/composer/aidl/vts/ReadbackVts.cpp
@@ -293,8 +293,8 @@
TestBufferLayer::TestBufferLayer(const std::shared_ptr<VtsComposerClient>& client,
TestRenderEngine& renderEngine, int64_t display, uint32_t width,
uint32_t height, common::PixelFormat format,
- Composition composition)
- : TestLayer{client, display}, mRenderEngine(renderEngine) {
+ ComposerClientWriter& writer, Composition composition)
+ : TestLayer{client, display, writer}, mRenderEngine(renderEngine) {
mComposition = composition;
mWidth = width;
mHeight = height;
diff --git a/graphics/composer/aidl/vts/ReadbackVts.h b/graphics/composer/aidl/vts/ReadbackVts.h
index ee20573..8ac0f4b 100644
--- a/graphics/composer/aidl/vts/ReadbackVts.h
+++ b/graphics/composer/aidl/vts/ReadbackVts.h
@@ -50,9 +50,10 @@
class TestLayer {
public:
- TestLayer(const std::shared_ptr<VtsComposerClient>& client, int64_t display)
+ TestLayer(const std::shared_ptr<VtsComposerClient>& client, int64_t display,
+ ComposerClientWriter& writer)
: mDisplay(display) {
- const auto& [status, layer] = client->createLayer(display, kBufferSlotCount);
+ const auto& [status, layer] = client->createLayer(display, kBufferSlotCount, &writer);
EXPECT_TRUE(status.isOk());
mLayer = layer;
}
@@ -108,8 +109,9 @@
class TestColorLayer : public TestLayer {
public:
- TestColorLayer(const std::shared_ptr<VtsComposerClient>& client, int64_t display)
- : TestLayer{client, display} {}
+ TestColorLayer(const std::shared_ptr<VtsComposerClient>& client, int64_t display,
+ ComposerClientWriter& writer)
+ : TestLayer{client, display, writer} {}
void write(ComposerClientWriter& writer) override;
@@ -125,7 +127,7 @@
public:
TestBufferLayer(const std::shared_ptr<VtsComposerClient>& client,
TestRenderEngine& renderEngine, int64_t display, uint32_t width,
- uint32_t height, common::PixelFormat format,
+ uint32_t height, common::PixelFormat format, ComposerClientWriter& writer,
Composition composition = Composition::DEVICE);
void write(ComposerClientWriter& writer) override;
diff --git a/graphics/composer/aidl/vts/VtsComposerClient.cpp b/graphics/composer/aidl/vts/VtsComposerClient.cpp
index ac08cd1..89ba2e6 100644
--- a/graphics/composer/aidl/vts/VtsComposerClient.cpp
+++ b/graphics/composer/aidl/vts/VtsComposerClient.cpp
@@ -33,6 +33,14 @@
mComposer = IComposer::fromBinder(binder);
ALOGE_IF(mComposer == nullptr, "Failed to acquire the composer from the binder");
}
+
+ const auto& [status, capabilities] = getCapabilities();
+ EXPECT_TRUE(status.isOk());
+ if (std::any_of(capabilities.begin(), capabilities.end(), [&](const Capability& cap) {
+ return cap == Capability::LAYER_LIFECYCLE_BATCH_COMMAND;
+ })) {
+ mSupportsBatchedCreateLayer = true;
+ }
}
ScopedAStatus VtsComposerClient::createClient() {
@@ -54,12 +62,15 @@
return mComposerClient->registerCallback(mComposerCallback);
}
-bool VtsComposerClient::tearDown() {
- return verifyComposerCallbackParams() && destroyAllLayers();
+bool VtsComposerClient::tearDown(ComposerClientWriter* writer) {
+ return verifyComposerCallbackParams() && destroyAllLayers(writer);
}
std::pair<ScopedAStatus, int32_t> VtsComposerClient::getInterfaceVersion() const {
int32_t version = 1;
+ if (!mComposerClient) {
+ return {ScopedAStatus{nullptr}, version};
+ }
auto status = mComposerClient->getInterfaceVersion(&version);
return {std::move(status), version};
}
@@ -86,7 +97,16 @@
}
std::pair<ScopedAStatus, int64_t> VtsComposerClient::createLayer(int64_t display,
- int32_t bufferSlotCount) {
+ int32_t bufferSlotCount,
+ ComposerClientWriter* writer) {
+ if (mSupportsBatchedCreateLayer) {
+ int64_t layer = mNextLayerHandle++;
+ writer->setLayerLifecycleBatchCommandType(display, layer,
+ LayerLifecycleBatchCommandType::CREATE);
+ writer->setNewBufferSlotCount(display, layer, bufferSlotCount);
+ return {addLayerToDisplayResources(display, layer), layer};
+ }
+
int64_t outLayer;
auto status = mComposerClient->createLayer(display, bufferSlotCount, &outLayer);
@@ -96,14 +116,20 @@
return {addLayerToDisplayResources(display, outLayer), outLayer};
}
-ScopedAStatus VtsComposerClient::destroyLayer(int64_t display, int64_t layer) {
- auto status = mComposerClient->destroyLayer(display, layer);
-
- if (!status.isOk()) {
- return status;
+ScopedAStatus VtsComposerClient::destroyLayer(int64_t display, int64_t layer,
+ ComposerClientWriter* writer) {
+ if (mSupportsBatchedCreateLayer) {
+ writer->setLayerLifecycleBatchCommandType(display, layer,
+ LayerLifecycleBatchCommandType::DESTROY);
+ } else {
+ auto status = mComposerClient->destroyLayer(display, layer);
+ if (!status.isOk()) {
+ return status;
+ }
}
+
removeLayerFromDisplayResources(display, layer);
- return status;
+ return ScopedAStatus::ok();
}
std::pair<ScopedAStatus, int32_t> VtsComposerClient::getActiveConfig(int64_t display) {
@@ -632,7 +658,7 @@
return interfaceVersion >= 3;
}
-bool VtsComposerClient::destroyAllLayers() {
+bool VtsComposerClient::destroyAllLayers(ComposerClientWriter* writer) {
std::unordered_map<int64_t, DisplayResource> physicalDisplays;
while (!mDisplayResources.empty()) {
const auto& it = mDisplayResources.begin();
@@ -640,7 +666,7 @@
while (!resource.layers.empty()) {
auto layer = *resource.layers.begin();
- const auto status = destroyLayer(display, layer);
+ const auto status = destroyLayer(display, layer, writer);
if (!status.isOk()) {
ALOGE("Unable to destroy all the layers, failed at layer %" PRId64 " with error %s",
layer, status.getDescription().c_str());
diff --git a/graphics/composer/aidl/vts/VtsComposerClient.h b/graphics/composer/aidl/vts/VtsComposerClient.h
index 292bc40..fabc82a 100644
--- a/graphics/composer/aidl/vts/VtsComposerClient.h
+++ b/graphics/composer/aidl/vts/VtsComposerClient.h
@@ -25,6 +25,7 @@
#include <android/binder_manager.h>
#include <android/binder_process.h>
#include <android/hardware/graphics/composer3/ComposerClientReader.h>
+#include <android/hardware/graphics/composer3/ComposerClientWriter.h>
#include <binder/ProcessState.h>
#include <gtest/gtest.h>
#include <ui/Fence.h>
@@ -59,7 +60,7 @@
ScopedAStatus createClient();
- bool tearDown();
+ bool tearDown(ComposerClientWriter*);
std::pair<ScopedAStatus, int32_t> getInterfaceVersion() const;
@@ -69,9 +70,10 @@
ScopedAStatus destroyVirtualDisplay(int64_t display);
- std::pair<ScopedAStatus, int64_t> createLayer(int64_t display, int32_t bufferSlotCount);
+ std::pair<ScopedAStatus, int64_t> createLayer(int64_t display, int32_t bufferSlotCount,
+ ComposerClientWriter*);
- ScopedAStatus destroyLayer(int64_t display, int64_t layer);
+ ScopedAStatus destroyLayer(int64_t display, int64_t layer, ComposerClientWriter*);
std::pair<ScopedAStatus, int32_t> getActiveConfig(int64_t display);
@@ -211,7 +213,7 @@
void removeLayerFromDisplayResources(int64_t display, int64_t layer);
- bool destroyAllLayers();
+ bool destroyAllLayers(ComposerClientWriter*);
bool verifyComposerCallbackParams();
@@ -229,6 +231,8 @@
std::shared_ptr<IComposerClient> mComposerClient;
std::shared_ptr<GraphicsComposerCallback> mComposerCallback;
std::unordered_map<int64_t, DisplayResource> mDisplayResources;
+ bool mSupportsBatchedCreateLayer = false;
+ std::atomic<int64_t> mNextLayerHandle = 1;
};
class VtsDisplay {
diff --git a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_ReadbackTest.cpp b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_ReadbackTest.cpp
index 2e3f4df..3f82925 100644
--- a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_ReadbackTest.cpp
+++ b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_ReadbackTest.cpp
@@ -85,8 +85,9 @@
}
void TearDown() override {
+ ASSERT_FALSE(mDisplays.empty());
ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
- ASSERT_TRUE(mComposerClient->tearDown());
+ ASSERT_TRUE(mComposerClient->tearDown(mWriter.get()));
mComposerClient.reset();
const auto errors = mReader.takeErrors();
ASSERT_TRUE(mReader.takeErrors().empty());
@@ -201,7 +202,8 @@
return;
}
- auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
+ auto layer =
+ std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
common::Rect coloredSquare({0, 0, getDisplayWidth(), getDisplayHeight()});
layer->setColor(BLUE);
layer->setDisplayFrame(coloredSquare);
@@ -270,7 +272,7 @@
auto layer = std::make_shared<TestBufferLayer>(
mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
- getDisplayHeight(), common::PixelFormat::RGBA_8888);
+ getDisplayHeight(), common::PixelFormat::RGBA_8888, *mWriter);
layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
layer->setZOrder(10);
layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
@@ -315,7 +317,8 @@
return;
}
- auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
+ auto layer =
+ std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
common::Rect coloredSquare({0, 0, getDisplayWidth(), getDisplayHeight()});
layer->setColor(BLUE);
layer->setDisplayFrame(coloredSquare);
@@ -454,9 +457,9 @@
expectedColors, getDisplayWidth(),
{0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
- auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
- getPrimaryDisplayId(), getDisplayWidth(),
- getDisplayHeight(), PixelFormat::RGBA_FP16);
+ auto layer = std::make_shared<TestBufferLayer>(
+ mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
+ getDisplayHeight(), PixelFormat::RGBA_FP16, *mWriter);
layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
layer->setZOrder(10);
layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
@@ -550,7 +553,7 @@
auto deviceLayer = std::make_shared<TestBufferLayer>(
mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
- getDisplayHeight() / 2, PixelFormat::RGBA_8888);
+ getDisplayHeight() / 2, PixelFormat::RGBA_8888, *mWriter);
std::vector<Color> deviceColors(deviceLayer->getWidth() * deviceLayer->getHeight());
ReadbackHelper::fillColorsArea(deviceColors, static_cast<int32_t>(deviceLayer->getWidth()),
{0, 0, static_cast<int32_t>(deviceLayer->getWidth()),
@@ -574,7 +577,7 @@
auto clientLayer = std::make_shared<TestBufferLayer>(
mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), clientWidth,
- clientHeight, PixelFormat::RGBA_FP16, Composition::DEVICE);
+ clientHeight, PixelFormat::RGBA_FP16, *mWriter, Composition::DEVICE);
common::Rect clientFrame = {0, getDisplayHeight() / 2, getDisplayWidth(),
getDisplayHeight()};
clientLayer->setDisplayFrame(clientFrame);
@@ -643,9 +646,9 @@
static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
- auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
- getPrimaryDisplayId(), getDisplayWidth(),
- getDisplayHeight(), PixelFormat::RGBA_8888);
+ auto layer = std::make_shared<TestBufferLayer>(
+ mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
+ getDisplayHeight(), PixelFormat::RGBA_8888, *mWriter);
layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
layer->setZOrder(10);
layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
@@ -714,7 +717,8 @@
return;
}
- auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
+ auto layer =
+ std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
layer->setColor(RED);
layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
layer->setZOrder(10);
@@ -774,9 +778,9 @@
expectedColors, getDisplayWidth(),
{0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
- auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
- getPrimaryDisplayId(), getDisplayWidth(),
- getDisplayHeight(), PixelFormat::RGBA_8888);
+ auto layer = std::make_shared<TestBufferLayer>(
+ mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
+ getDisplayHeight(), PixelFormat::RGBA_8888, *mWriter);
layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
layer->setZOrder(10);
layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
@@ -828,11 +832,13 @@
common::Rect redRect = {0, 0, getDisplayWidth(), getDisplayHeight() / 2};
common::Rect blueRect = {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight()};
- auto redLayer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
+ auto redLayer =
+ std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
redLayer->setColor(RED);
redLayer->setDisplayFrame(redRect);
- auto blueLayer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
+ auto blueLayer =
+ std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
blueLayer->setColor(BLUE);
blueLayer->setDisplayFrame(blueRect);
blueLayer->setZOrder(5);
@@ -914,14 +920,14 @@
static constexpr float kMaxBrightnessNits = 300.f;
const auto redLayer =
- std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
+ std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
redLayer->setColor(RED);
redLayer->setDisplayFrame(redRect);
redLayer->setWhitePointNits(kMaxBrightnessNits);
redLayer->setBrightness(1.f);
const auto dimmerRedLayer =
- std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
+ std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
dimmerRedLayer->setColor(RED);
dimmerRedLayer->setDisplayFrame(dimmerRedRect);
// Intentionally use a small dimming ratio as some implementations may be more likely to
@@ -992,14 +998,14 @@
mTopLayerColor);
auto backgroundLayer =
- std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
+ std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
backgroundLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
backgroundLayer->setZOrder(0);
backgroundLayer->setColor(mBackgroundColor);
- auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
- getPrimaryDisplayId(), getDisplayWidth(),
- getDisplayHeight(), PixelFormat::RGBA_8888);
+ auto layer = std::make_shared<TestBufferLayer>(
+ mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
+ getDisplayHeight(), PixelFormat::RGBA_8888, *mWriter);
layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
layer->setZOrder(10);
layer->setDataspace(Dataspace::UNKNOWN);
@@ -1190,7 +1196,7 @@
GraphicsCompositionTest::SetUp();
auto backgroundLayer =
- std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
+ std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
backgroundLayer->setColor({0.0f, 0.0f, 0.0f, 0.0f});
backgroundLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
backgroundLayer->setZOrder(0);
@@ -1202,7 +1208,7 @@
mLayer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
getPrimaryDisplayId(), mSideLength, mSideLength,
- PixelFormat::RGBA_8888);
+ PixelFormat::RGBA_8888, *mWriter);
mLayer->setDisplayFrame({0, 0, mSideLength, mSideLength});
mLayer->setZOrder(10);
@@ -1388,7 +1394,7 @@
void makeLayer() {
mLayer = std::make_shared<TestBufferLayer>(
mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
- getDisplayHeight(), common::PixelFormat::RGBA_8888);
+ getDisplayHeight(), common::PixelFormat::RGBA_8888, *mWriter);
mLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
mLayer->setZOrder(10);
mLayer->setAlpha(1.f);
diff --git a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp
index 2bbaf29..5e45fd9 100644
--- a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp
+++ b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp
@@ -70,7 +70,7 @@
}
void TearDown() override {
- ASSERT_TRUE(mComposerClient->tearDown());
+ ASSERT_TRUE(mComposerClient->tearDown(nullptr));
mComposerClient.reset();
}
@@ -832,36 +832,58 @@
}
TEST_P(GraphicsComposerAidlTest, CreateLayer) {
+ if (hasCapability(Capability::LAYER_LIFECYCLE_BATCH_COMMAND)) {
+ GTEST_SKIP() << "Create layer will be tested in GraphicsComposerAidlBatchedCommandTest";
+ return;
+ }
+
const auto& [status, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, nullptr);
EXPECT_TRUE(status.isOk());
- EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
+ EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer, nullptr).isOk());
}
TEST_P(GraphicsComposerAidlTest, CreateLayer_BadDisplay) {
- const auto& [status, _] = mComposerClient->createLayer(getInvalidDisplayId(), kBufferSlotCount);
+ if (hasCapability(Capability::LAYER_LIFECYCLE_BATCH_COMMAND)) {
+ GTEST_SKIP() << "Create layer will be tested in GraphicsComposerAidlBatchedCommandTest";
+ return;
+ }
+
+ const auto& [status, _] =
+ mComposerClient->createLayer(getInvalidDisplayId(), kBufferSlotCount, nullptr);
EXPECT_FALSE(status.isOk());
EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
}
TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadDisplay) {
+ if (hasCapability(Capability::LAYER_LIFECYCLE_BATCH_COMMAND)) {
+ GTEST_SKIP() << "Destroy layer will be tested in GraphicsComposerAidlBatchedCommandTest";
+ return;
+ }
+
const auto& [status, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, nullptr);
EXPECT_TRUE(status.isOk());
- const auto& destroyStatus = mComposerClient->destroyLayer(getInvalidDisplayId(), layer);
+ const auto& destroyStatus =
+ mComposerClient->destroyLayer(getInvalidDisplayId(), layer, nullptr);
EXPECT_FALSE(destroyStatus.isOk());
EXPECT_NO_FATAL_FAILURE(
assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
- ASSERT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
+ ASSERT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer, nullptr).isOk());
}
TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadLayerError) {
+ if (hasCapability(Capability::LAYER_LIFECYCLE_BATCH_COMMAND)) {
+ GTEST_SKIP() << "Destroy layer will be tested in GraphicsComposerAidlBatchedCommandTest";
+ return;
+ }
+
// We haven't created any layers yet, so any id should be invalid
- const auto& status = mComposerClient->destroyLayer(getPrimaryDisplayId(), /*layer*/ 1);
+ const auto& status = mComposerClient->destroyLayer(getPrimaryDisplayId(), /*layer*/ 1, nullptr);
EXPECT_FALSE(status.isOk());
EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_LAYER));
@@ -1171,6 +1193,12 @@
}
}
+TEST_P(GraphicsComposerAidlTest, LayerLifecycleCapabilityNotSupportedOnOldVersions) {
+ if (hasCapability(Capability::LAYER_LIFECYCLE_BATCH_COMMAND)) {
+ EXPECT_GE(getInterfaceVersion(), 3);
+ }
+}
+
class GraphicsComposerAidlV2Test : public GraphicsComposerAidlTest {
protected:
void SetUp() override {
@@ -1275,8 +1303,8 @@
if (vrrConfig.notifyExpectedPresentConfig) {
const auto& notifyExpectedPresentConfig =
*vrrConfig.notifyExpectedPresentConfig;
- EXPECT_GT(0, notifyExpectedPresentConfig.notifyExpectedPresentHeadsUpNs);
- EXPECT_GE(0, notifyExpectedPresentConfig.notifyExpectedPresentTimeoutNs);
+ EXPECT_GE(notifyExpectedPresentConfig.headsUpNs, 0);
+ EXPECT_GE(notifyExpectedPresentConfig.timeoutNs, 0);
}
}
}
@@ -1372,10 +1400,11 @@
class GraphicsComposerAidlCommandTest : public GraphicsComposerAidlTest {
protected:
void TearDown() override {
- const auto errors = mReader.takeErrors();
+ ASSERT_FALSE(mDisplays.empty());
ASSERT_TRUE(mReader.takeErrors().empty());
ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
+ ASSERT_TRUE(mComposerClient->tearDown(&getWriter(getPrimaryDisplayId())));
ASSERT_NO_FATAL_FAILURE(GraphicsComposerAidlTest::TearDown());
}
@@ -1463,10 +1492,10 @@
RenderIntent::COLORIMETRIC)
.isOk());
- const auto& [status, layer] =
- mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
- EXPECT_TRUE(status.isOk());
auto& writer = getWriter(display.getDisplayId());
+ const auto& [status, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(status.isOk());
{
const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ASSERT_NE(nullptr, buffer);
@@ -1506,7 +1535,7 @@
execute();
}
- EXPECT_TRUE(mComposerClient->destroyLayer(display.getDisplayId(), layer).isOk());
+ EXPECT_TRUE(mComposerClient->destroyLayer(display.getDisplayId(), layer, &writer).isOk());
}
sp<::android::Fence> presentAndGetFence(
@@ -1541,15 +1570,16 @@
}
int64_t createOnScreenLayer(Composition composition = Composition::DEVICE) {
+ auto& writer = getWriter(getPrimaryDisplayId());
const auto& [status, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(status.isOk());
Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
getPrimaryDisplay().getDisplayHeight()};
FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
(float)getPrimaryDisplay().getDisplayHeight()};
configureLayer(getPrimaryDisplay(), layer, composition, displayFrame, cropRect);
- auto& writer = getWriter(getPrimaryDisplayId());
+
writer.setLayerDataspace(getPrimaryDisplayId(), layer, common::Dataspace::UNKNOWN);
return layer;
}
@@ -1758,10 +1788,10 @@
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerColorTransform) {
- const auto& [status, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
- EXPECT_TRUE(status.isOk());
auto& writer = getWriter(getPrimaryDisplayId());
+ const auto& [status, layer] =
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(status.isOk());
writer.setLayerColorTransform(getPrimaryDisplayId(), layer, kIdentity.data());
execute();
@@ -1773,6 +1803,7 @@
}
TEST_P(GraphicsComposerAidlCommandTest, SetDisplayBrightness) {
+ EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
const auto& [status, capabilities] =
mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
ASSERT_TRUE(status.isOk());
@@ -1899,7 +1930,7 @@
ASSERT_NE(nullptr, handle);
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
@@ -1936,15 +1967,15 @@
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerCursorPosition) {
+ auto& writer = getWriter(getPrimaryDisplayId());
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
const auto handle = buffer->handle;
ASSERT_NE(nullptr, handle);
- auto& writer = getWriter(getPrimaryDisplayId());
writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
@@ -1980,19 +2011,19 @@
const auto handle = buffer->handle;
ASSERT_NE(nullptr, handle);
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
- EXPECT_TRUE(layerStatus.isOk());
auto& writer = getWriter(getPrimaryDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
execute();
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerBufferMultipleTimes) {
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
- EXPECT_TRUE(layerStatus.isOk());
auto& writer = getWriter(getPrimaryDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
// Setup 3 buffers in the buffer cache, with the last buffer being active. Then, emulate the
// Android platform code that clears all 3 buffer slots by setting all but the active buffer
@@ -2040,14 +2071,14 @@
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerSurfaceDamage) {
+ auto& writer = getWriter(getPrimaryDisplayId());
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
Rect empty{0, 0, 0, 0};
Rect unit{0, 0, 1, 1};
- auto& writer = getWriter(getPrimaryDisplayId());
writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
execute();
ASSERT_TRUE(mReader.takeErrors().empty());
@@ -2062,14 +2093,14 @@
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlockingRegion) {
+ auto& writer = getWriter(getPrimaryDisplayId());
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
Rect empty{0, 0, 0, 0};
Rect unit{0, 0, 1, 1};
- auto& writer = getWriter(getPrimaryDisplayId());
writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
execute();
ASSERT_TRUE(mReader.takeErrors().empty());
@@ -2084,11 +2115,11 @@
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlendMode) {
+ auto& writer = getWriter(getPrimaryDisplayId());
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
- auto& writer = getWriter(getPrimaryDisplayId());
writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::NONE);
execute();
ASSERT_TRUE(mReader.takeErrors().empty());
@@ -2103,11 +2134,11 @@
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerColor) {
+ auto& writer = getWriter(getPrimaryDisplayId());
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
- auto& writer = getWriter(getPrimaryDisplayId());
writer.setLayerColor(getPrimaryDisplayId(), layer, Color{1.0f, 1.0f, 1.0f, 1.0f});
execute();
ASSERT_TRUE(mReader.takeErrors().empty());
@@ -2118,11 +2149,11 @@
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerCompositionType) {
+ auto& writer = getWriter(getPrimaryDisplayId());
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
- auto& writer = getWriter(getPrimaryDisplayId());
writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CLIENT);
execute();
ASSERT_TRUE(mReader.takeErrors().empty());
@@ -2141,8 +2172,9 @@
TEST_P(GraphicsComposerAidlCommandTest, DisplayDecoration) {
for (VtsDisplay& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
const auto [layerStatus, layer] =
- mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
const auto [error, support] =
@@ -2165,8 +2197,7 @@
}
configureLayer(display, layer, Composition::DISPLAY_DECORATION, display.getFrameRect(),
- display.getCrop());
- auto& writer = getWriter(display.getDisplayId());
+ display.getCrop());
writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, decorBuffer->handle,
/*acquireFence*/ -1);
writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp,
@@ -2183,31 +2214,31 @@
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerDataspace) {
+ auto& writer = getWriter(getPrimaryDisplayId());
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
- auto& writer = getWriter(getPrimaryDisplayId());
writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
execute();
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerDisplayFrame) {
+ auto& writer = getWriter(getPrimaryDisplayId());
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
- auto& writer = getWriter(getPrimaryDisplayId());
writer.setLayerDisplayFrame(getPrimaryDisplayId(), layer, Rect{0, 0, 1, 1});
execute();
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerPlaneAlpha) {
+ auto& writer = getWriter(getPrimaryDisplayId());
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
- auto& writer = getWriter(getPrimaryDisplayId());
writer.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 0.0f);
execute();
ASSERT_TRUE(mReader.takeErrors().empty());
@@ -2227,31 +2258,31 @@
const auto handle = buffer->handle;
ASSERT_NE(nullptr, handle);
+ auto& writer = getWriter(getPrimaryDisplayId());
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
- auto& writer = getWriter(getPrimaryDisplayId());
writer.setLayerSidebandStream(getPrimaryDisplayId(), layer, handle);
execute();
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerSourceCrop) {
+ auto& writer = getWriter(getPrimaryDisplayId());
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
- auto& writer = getWriter(getPrimaryDisplayId());
writer.setLayerSourceCrop(getPrimaryDisplayId(), layer, FRect{0.0f, 0.0f, 1.0f, 1.0f});
execute();
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerTransform) {
+ auto& writer = getWriter(getPrimaryDisplayId());
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
- auto& writer = getWriter(getPrimaryDisplayId());
writer.setLayerTransform(getPrimaryDisplayId(), layer, static_cast<Transform>(0));
execute();
ASSERT_TRUE(mReader.takeErrors().empty());
@@ -2290,14 +2321,14 @@
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerVisibleRegion) {
+ auto& writer = getWriter(getPrimaryDisplayId());
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
Rect empty{0, 0, 0, 0};
Rect unit{0, 0, 1, 1};
- auto& writer = getWriter(getPrimaryDisplayId());
writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
execute();
ASSERT_TRUE(mReader.takeErrors().empty());
@@ -2312,11 +2343,12 @@
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerZOrder) {
+ auto& writer = getWriter(getPrimaryDisplayId());
+
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
- auto& writer = getWriter(getPrimaryDisplayId());
writer.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 10);
execute();
ASSERT_TRUE(mReader.takeErrors().empty());
@@ -2327,8 +2359,9 @@
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerPerFrameMetadata) {
+ auto& writer = getWriter(getPrimaryDisplayId());
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
/**
@@ -2343,7 +2376,6 @@
* white (D65) 0.3127 0.3290
*/
- auto& writer = getWriter(getPrimaryDisplayId());
std::vector<PerFrameMetadata> aidlMetadata;
aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X, 0.680f});
aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y, 0.320f});
@@ -2363,18 +2395,19 @@
const auto errors = mReader.takeErrors();
if (errors.size() == 1 && errors[0].errorCode == EX_UNSUPPORTED_OPERATION) {
GTEST_SUCCEED() << "SetLayerPerFrameMetadata is not supported";
- EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
+ EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer, &writer).isOk());
return;
}
- EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer).isOk());
+ EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer, &writer).isOk());
}
TEST_P(GraphicsComposerAidlCommandTest, setLayerBrightness) {
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
-
auto& writer = getWriter(getPrimaryDisplayId());
+
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
+
writer.setLayerBrightness(getPrimaryDisplayId(), layer, 0.2f);
execute();
ASSERT_TRUE(mReader.takeErrors().empty());
@@ -2603,12 +2636,12 @@
}
TEST_P(GraphicsComposerAidlCommandV2Test, SetLayerBufferSlotsToClear) {
+ auto& writer = getWriter(getPrimaryDisplayId());
// Older HAL versions use a backwards compatible way of clearing buffer slots
// HAL at version 1 or lower does not have LayerCommand::bufferSlotsToClear
const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount);
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(layerStatus.isOk());
- auto& writer = getWriter(getPrimaryDisplayId());
// setup 3 buffers in the buffer cache, with the last buffer being active
// then emulate the Android platform code that clears all 3 buffer slots
@@ -2867,7 +2900,8 @@
EXPECT_TRUE(mComposerClient->setPowerMode(displayId, PowerMode::ON).isOk());
- const auto& [status, layer] = mComposerClient->createLayer(displayId, kBufferSlotCount);
+ const auto& [status, layer] =
+ mComposerClient->createLayer(displayId, kBufferSlotCount, &writer);
const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
ASSERT_NE(nullptr, buffer);
ASSERT_EQ(::android::OK, buffer->initCheck());
@@ -2917,7 +2951,8 @@
}
for (auto& [displayId, layer] : layers) {
- EXPECT_TRUE(mComposerClient->destroyLayer(displayId, layer).isOk());
+ auto& writer = getWriter(displayId);
+ EXPECT_TRUE(mComposerClient->destroyLayer(displayId, layer, &writer).isOk());
}
std::lock_guard guard{readersMutex};
@@ -2927,22 +2962,22 @@
}
}
-class GraphicsComposerAidlBatchedCommandTest : public GraphicsComposerAidlCommandTest {
+class GraphicsComposerAidlCommandV3Test : public GraphicsComposerAidlCommandTest {
protected:
void SetUp() override {
- GraphicsComposerAidlCommandTest::SetUp();
+ GraphicsComposerAidlTest::SetUp();
if (getInterfaceVersion() <= 2) {
GTEST_SKIP() << "Device interface version is expected to be >= 3";
}
}
- void TearDown() override {
- const auto errors = mReader.takeErrors();
- ASSERT_TRUE(mReader.takeErrors().empty());
- ASSERT_NO_FATAL_FAILURE(GraphicsComposerAidlTest::TearDown());
- }
};
-TEST_P(GraphicsComposerAidlBatchedCommandTest, CreateBatchedCommand) {
+TEST_P(GraphicsComposerAidlCommandV3Test, CreateBatchedCommand) {
+ if (!hasCapability(Capability::LAYER_LIFECYCLE_BATCH_COMMAND)) {
+ GTEST_SKIP() << "LAYER_LIFECYCLE_BATCH_COMMAND not supported by the implementation";
+ return;
+ }
+
auto& writer = getWriter(getPrimaryDisplayId());
int64_t layer = 5;
writer.setLayerLifecycleBatchCommandType(getPrimaryDisplayId(), layer,
@@ -2954,7 +2989,30 @@
ASSERT_TRUE(mReader.takeErrors().empty());
}
-TEST_P(GraphicsComposerAidlBatchedCommandTest, DestroyBatchedCommand) {
+TEST_P(GraphicsComposerAidlCommandV3Test, CreateBatchedCommand_BadDisplay) {
+ if (!hasCapability(Capability::LAYER_LIFECYCLE_BATCH_COMMAND)) {
+ GTEST_SKIP() << "LAYER_LIFECYCLE_BATCH_COMMAND not supported by the implementation";
+ return;
+ }
+
+ auto& writer = getWriter(getPrimaryDisplayId());
+ int64_t layer = 5;
+ writer.setLayerLifecycleBatchCommandType(getInvalidDisplayId(), layer,
+ LayerLifecycleBatchCommandType::CREATE);
+ writer.setNewBufferSlotCount(getPrimaryDisplayId(), layer, 1);
+ writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
+ VtsComposerClient::kNoFrameIntervalNs);
+ execute();
+ const auto errors = mReader.takeErrors();
+ ASSERT_TRUE(errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_BAD_DISPLAY);
+}
+
+TEST_P(GraphicsComposerAidlCommandV3Test, DestroyBatchedCommand) {
+ if (!hasCapability(Capability::LAYER_LIFECYCLE_BATCH_COMMAND)) {
+ GTEST_SKIP() << "LAYER_LIFECYCLE_BATCH_COMMAND not supported by the implementation";
+ return;
+ }
+
auto& writer = getWriter(getPrimaryDisplayId());
int64_t layer = 5;
writer.setLayerLifecycleBatchCommandType(getPrimaryDisplayId(), layer,
@@ -2972,10 +3030,42 @@
writer.setNewBufferSlotCount(getPrimaryDisplayId(), layer, 1);
execute();
+ const auto errors = mReader.takeErrors();
+ ASSERT_TRUE(errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_BAD_DISPLAY);
+}
+
+TEST_P(GraphicsComposerAidlCommandV3Test, DestroyBatchedCommand_BadDisplay) {
+ if (!hasCapability(Capability::LAYER_LIFECYCLE_BATCH_COMMAND)) {
+ GTEST_SKIP() << "LAYER_LIFECYCLE_BATCH_COMMAND not supported by the implementation";
+ return;
+ }
+
+ auto& writer = getWriter(getPrimaryDisplayId());
+ int64_t layer = 5;
+ writer.setLayerLifecycleBatchCommandType(getPrimaryDisplayId(), layer,
+ LayerLifecycleBatchCommandType::CREATE);
+ writer.setNewBufferSlotCount(getPrimaryDisplayId(), layer, 1);
+ writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
+ VtsComposerClient::kNoFrameIntervalNs);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerLifecycleBatchCommandType(getInvalidDisplayId(), layer,
+ LayerLifecycleBatchCommandType::DESTROY);
+ layer++;
+ writer.setLayerLifecycleBatchCommandType(getInvalidDisplayId(), layer,
+ LayerLifecycleBatchCommandType::CREATE);
+ writer.setNewBufferSlotCount(getPrimaryDisplayId(), layer, 1);
+
+ execute();
ASSERT_TRUE(mReader.takeErrors().empty());
}
-TEST_P(GraphicsComposerAidlBatchedCommandTest, NoCreateDestroyBatchedCommandIncorrectLayer) {
+TEST_P(GraphicsComposerAidlCommandV3Test, NoCreateDestroyBatchedCommandIncorrectLayer) {
+ if (!hasCapability(Capability::LAYER_LIFECYCLE_BATCH_COMMAND)) {
+ GTEST_SKIP() << "LAYER_LIFECYCLE_BATCH_COMMAND not supported by the implementation";
+ return;
+ }
+
auto& writer = getWriter(getPrimaryDisplayId());
int64_t layer = 5;
writer.setLayerLifecycleBatchCommandType(getPrimaryDisplayId(), layer,
@@ -2985,11 +3075,6 @@
ASSERT_TRUE(errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_BAD_LAYER);
}
-GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlBatchedCommandTest);
-INSTANTIATE_TEST_SUITE_P(
- PerInstance, GraphicsComposerAidlBatchedCommandTest,
- testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
- ::android::PrintInstanceNameToString);
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlCommandTest);
INSTANTIATE_TEST_SUITE_P(
PerInstance, GraphicsComposerAidlCommandTest,
@@ -3015,6 +3100,11 @@
PerInstance, GraphicsComposerAidlCommandV2Test,
testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
::android::PrintInstanceNameToString);
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlCommandV3Test);
+INSTANTIATE_TEST_SUITE_P(
+ PerInstance, GraphicsComposerAidlCommandV3Test,
+ testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
+ ::android::PrintInstanceNameToString);
} // namespace aidl::android::hardware::graphics::composer3::vts
int main(int argc, char** argv) {
diff --git a/health/2.0/README.md b/health/2.0/README.md
index 8a7c922..1c636c7 100644
--- a/health/2.0/README.md
+++ b/health/2.0/README.md
@@ -1,181 +1,7 @@
-# Implement the 2.1 HAL instead!
+# Deprecated.
-It is strongly recommended that you implement the 2.1 HAL directly. See
-`hardware/interfaces/health/2.1/README.md` for more details.
+Health HIDL HAL 2.0 is deprecated and subject to removal. Please
+implement the Health AIDL HAL instead.
-# Upgrading from Health 1.0 HAL
-
-1. Remove `android.hardware.health@1.0*` from `PRODUCT_PACKAGES`
- in `device/<manufacturer>/<device>/device.mk`
-
-1. If the device does not have a vendor-specific `libhealthd` AND does not
- implement storage-related APIs, just do the following:
-
- ```mk
- PRODUCT_PACKAGES += android.hardware.health@2.0-service
- ```
-
- Otherwise, continue to the next step.
-
-1. Create directory
- `device/<manufacturer>/<device>/health`
-
-1. Create `device/<manufacturer>/<device>/health/Android.bp`
- (or equivalent `device/<manufacturer>/<device>/health/Android.mk`)
-
- ```bp
- cc_binary {
- name: "android.hardware.health@2.0-service.<device>",
- init_rc: ["android.hardware.health@2.0-service.<device>.rc"],
- proprietary: true,
- relative_install_path: "hw",
- srcs: [
- "HealthService.cpp",
- ],
-
- cflags: [
- "-Wall",
- "-Werror",
- ],
-
- static_libs: [
- "android.hardware.health@2.0-impl",
- "android.hardware.health@1.0-convert",
- "libhealthservice",
- "libbatterymonitor",
- ],
-
- shared_libs: [
- "libbase",
- "libcutils",
- "libhidlbase",
- "libutils",
- "android.hardware.health@2.0",
- ],
-
- header_libs: ["libhealthd_headers"],
-
- overrides: [
- "healthd",
- ],
- }
- ```
-
- 1. (recommended) To remove `healthd` from the build, keep "overrides" section.
- 1. To keep `healthd` in the build, remove "overrides" section.
-
-1. Create `device/<manufacturer>/<device>/health/android.hardware.health@2.0-service.<device>.rc`
-
- ```rc
- service vendor.health-hal-2-0 /vendor/bin/hw/android.hardware.health@2.0-service.<device>
- class hal
- user system
- group system
- capabilities WAKE_ALARM
- file /dev/kmsg w
- ```
-
-1. Create `device/<manufacturer>/<device>/health/HealthService.cpp`:
-
- ```c++
- #include <health2/service.h>
- int main() { return health_service_main(); }
- ```
-
-1. `libhealthd` dependency:
-
- 1. If the device has a vendor-specific `libhealthd.<soc>`, add it to static_libs.
-
- 1. If the device does not have a vendor-specific `libhealthd`, add the following
- lines to `HealthService.cpp`:
-
- ```c++
- #include <healthd/healthd.h>
- void healthd_board_init(struct healthd_config*) {}
-
- int healthd_board_battery_update(struct android::BatteryProperties*) {
- // return 0 to log periodic polled battery status to kernel log
- return 0;
- }
- ```
-
-1. Storage related APIs:
-
- 1. If the device does not implement `IHealth.getDiskStats` and
- `IHealth.getStorageInfo`, add `libhealthstoragedefault` to `static_libs`.
-
- 1. If the device implements one of these two APIs, add and implement the
- following functions in `HealthService.cpp`:
-
- ```c++
- void get_storage_info(std::vector<struct StorageInfo>& info) {
- // ...
- }
- void get_disk_stats(std::vector<struct DiskStats>& stats) {
- // ...
- }
- ```
-
-1. Update necessary SELinux permissions. For example,
-
- ```
- # device/<manufacturer>/<device>/sepolicy/vendor/file_contexts
- /vendor/bin/hw/android\.hardware\.health@2\.0-service\.<device> u:object_r:hal_health_default_exec:s0
-
- # device/<manufacturer>/<device>/sepolicy/vendor/hal_health_default.te
- # Add device specific permissions to hal_health_default domain, especially
- # if a device-specific libhealthd is used and/or device-specific storage related
- # APIs are implemented.
- ```
-
-1. Implementing health HAL in recovery. The health HAL is used for battery
-status checks during OTA for non-A/B devices. If the health HAL is not
-implemented in recovery, `is_battery_ok()` will always return `true`.
-
- 1. If the device does not have a vendor-specific `libhealthd`, nothing needs to
- be done. A "backup" implementation is provided in
- `android.hardware.health@2.0-impl-default`, which is always installed to recovery
- image by default.
-
- 1. If the device does have a vendor-specific `libhealthd`, implement the following
- module and include it in `PRODUCT_PACKAGES` (replace `<device>` with appropriate
- strings):
-
- ```bp
- // Android.bp
- cc_library_shared {
- name: "android.hardware.health@2.0-impl-<device>",
- recovery_available: true,
- relative_install_path: "hw",
- static_libs: [
- "android.hardware.health@2.0-impl",
- "libhealthd.<device>"
- // Include the following or implement device-specific storage APIs
- "libhealthstoragedefault",
- ],
- srcs: [
- "HealthImpl.cpp",
- ],
- overrides: [
- "android.hardware.health@2.0-impl-default",
- ],
- }
- ```
-
- ```c++
- // HealthImpl.cpp
- #include <health2/Health.h>
- #include <healthd/healthd.h>
- using android::hardware::health::V2_0::IHealth;
- using android::hardware::health::V2_0::implementation::Health;
- extern "C" IHealth* HIDL_FETCH_IHealth(const char* name) {
- const static std::string providedInstance{"default"};
- if (providedInstance != name) return nullptr;
- return Health::initInstance(&gHealthdConfig).get();
- }
- ```
-
- ```mk
- # device.mk
- PRODUCT_PACKAGES += android.hardware.health@2.0-impl-<device>
- ```
+See [`hardware/interfaces/health/aidl/README.md`](../aidl/README.md) for
+details.
diff --git a/health/2.0/default/Android.bp b/health/2.0/default/Android.bp
deleted file mode 100644
index 73cd553..0000000
--- a/health/2.0/default/Android.bp
+++ /dev/null
@@ -1,72 +0,0 @@
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "hardware_interfaces_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["hardware_interfaces_license"],
-}
-
-cc_defaults {
- name: "android.hardware.health@2.0-impl_defaults",
-
- recovery_available: true,
- cflags: [
- "-Wall",
- "-Werror",
- ],
-
- shared_libs: [
- "libbase",
- "libhidlbase",
- "liblog",
- "libutils",
- "libcutils",
- "android.hardware.health@2.0",
- ],
-
- static_libs: [
- "libbatterymonitor",
- "android.hardware.health@1.0-convert",
- ],
-}
-
-// Helper library for implementing health HAL. It is recommended that a health
-// service or passthrough HAL link to this library.
-cc_library_static {
- name: "android.hardware.health@2.0-impl",
- defaults: ["android.hardware.health@2.0-impl_defaults"],
-
- vendor_available: true,
- srcs: [
- "Health.cpp",
- "healthd_common_adapter.cpp",
- ],
-
- whole_static_libs: [
- "libhealthloop",
- ],
-
- export_include_dirs: ["include"],
-}
-
-// Default passthrough implementation for recovery. Vendors can implement
-// android.hardware.health@2.0-impl-recovery-<device> to customize the behavior
-// of the HAL in recovery.
-// The implementation does NOT start the uevent loop for polling.
-cc_library_shared {
- name: "android.hardware.health@2.0-impl-default",
- defaults: ["android.hardware.health@2.0-impl_defaults"],
-
- recovery_available: true,
- relative_install_path: "hw",
-
- static_libs: [
- "android.hardware.health@2.0-impl",
- "libhealthstoragedefault",
- ],
-
- srcs: [
- "HealthImplDefault.cpp",
- ],
-}
diff --git a/health/2.0/default/Health.cpp b/health/2.0/default/Health.cpp
deleted file mode 100644
index 65eada8..0000000
--- a/health/2.0/default/Health.cpp
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_TAG "android.hardware.health@2.0-impl"
-#include <android-base/logging.h>
-
-#include <android-base/file.h>
-#include <android/hardware/health/2.0/types.h>
-#include <health2/Health.h>
-
-#include <hal_conversion.h>
-#include <hidl/HidlTransportSupport.h>
-
-using HealthInfo_1_0 = android::hardware::health::V1_0::HealthInfo;
-using android::hardware::health::V1_0::hal_conversion::convertFromHealthInfo;
-
-extern void healthd_battery_update_internal(bool);
-
-namespace android {
-namespace hardware {
-namespace health {
-namespace V2_0 {
-namespace implementation {
-
-sp<Health> Health::instance_;
-
-Health::Health(struct healthd_config* c) {
- // TODO(b/69268160): remove when libhealthd is removed.
- healthd_board_init(c);
- battery_monitor_ = std::make_unique<BatteryMonitor>();
- battery_monitor_->init(c);
-}
-
-// Methods from IHealth follow.
-Return<Result> Health::registerCallback(const sp<IHealthInfoCallback>& callback) {
- if (callback == nullptr) {
- return Result::SUCCESS;
- }
-
- {
- std::lock_guard<decltype(callbacks_lock_)> lock(callbacks_lock_);
- callbacks_.push_back(callback);
- // unlock
- }
-
- auto linkRet = callback->linkToDeath(this, 0u /* cookie */);
- if (!linkRet.withDefault(false)) {
- LOG(WARNING) << __func__ << "Cannot link to death: "
- << (linkRet.isOk() ? "linkToDeath returns false" : linkRet.description());
- // ignore the error
- }
-
- return updateAndNotify(callback);
-}
-
-bool Health::unregisterCallbackInternal(const sp<IBase>& callback) {
- if (callback == nullptr) return false;
-
- bool removed = false;
- std::lock_guard<decltype(callbacks_lock_)> lock(callbacks_lock_);
- for (auto it = callbacks_.begin(); it != callbacks_.end();) {
- if (interfacesEqual(*it, callback)) {
- it = callbacks_.erase(it);
- removed = true;
- } else {
- ++it;
- }
- }
- (void)callback->unlinkToDeath(this).isOk(); // ignore errors
- return removed;
-}
-
-Return<Result> Health::unregisterCallback(const sp<IHealthInfoCallback>& callback) {
- return unregisterCallbackInternal(callback) ? Result::SUCCESS : Result::NOT_FOUND;
-}
-
-template <typename T>
-void getProperty(const std::unique_ptr<BatteryMonitor>& monitor, int id, T defaultValue,
- const std::function<void(Result, T)>& callback) {
- struct BatteryProperty prop;
- T ret = defaultValue;
- Result result = Result::SUCCESS;
- status_t err = monitor->getProperty(static_cast<int>(id), &prop);
- if (err != OK) {
- LOG(DEBUG) << "getProperty(" << id << ")"
- << " fails: (" << err << ") " << strerror(-err);
- } else {
- ret = static_cast<T>(prop.valueInt64);
- }
- switch (err) {
- case OK:
- result = Result::SUCCESS;
- break;
- case NAME_NOT_FOUND:
- result = Result::NOT_SUPPORTED;
- break;
- default:
- result = Result::UNKNOWN;
- break;
- }
- callback(result, static_cast<T>(ret));
-}
-
-Return<void> Health::getChargeCounter(getChargeCounter_cb _hidl_cb) {
- getProperty<int32_t>(battery_monitor_, BATTERY_PROP_CHARGE_COUNTER, 0, _hidl_cb);
- return Void();
-}
-
-Return<void> Health::getCurrentNow(getCurrentNow_cb _hidl_cb) {
- getProperty<int32_t>(battery_monitor_, BATTERY_PROP_CURRENT_NOW, 0, _hidl_cb);
- return Void();
-}
-
-Return<void> Health::getCurrentAverage(getCurrentAverage_cb _hidl_cb) {
- getProperty<int32_t>(battery_monitor_, BATTERY_PROP_CURRENT_AVG, 0, _hidl_cb);
- return Void();
-}
-
-Return<void> Health::getCapacity(getCapacity_cb _hidl_cb) {
- getProperty<int32_t>(battery_monitor_, BATTERY_PROP_CAPACITY, 0, _hidl_cb);
- return Void();
-}
-
-Return<void> Health::getEnergyCounter(getEnergyCounter_cb _hidl_cb) {
- getProperty<int64_t>(battery_monitor_, BATTERY_PROP_ENERGY_COUNTER, 0, _hidl_cb);
- return Void();
-}
-
-Return<void> Health::getChargeStatus(getChargeStatus_cb _hidl_cb) {
- getProperty(battery_monitor_, BATTERY_PROP_BATTERY_STATUS, BatteryStatus::UNKNOWN, _hidl_cb);
- return Void();
-}
-
-Return<Result> Health::update() {
- if (!healthd_mode_ops || !healthd_mode_ops->battery_update) {
- LOG(WARNING) << "health@2.0: update: not initialized. "
- << "update() should not be called in charger";
- return Result::UNKNOWN;
- }
-
- // Retrieve all information and call healthd_mode_ops->battery_update, which calls
- // notifyListeners.
- battery_monitor_->updateValues();
- const HealthInfo_1_0& health_info = battery_monitor_->getHealthInfo_1_0();
- struct BatteryProperties props;
- convertFromHealthInfo(health_info, &props);
- bool log = (healthd_board_battery_update(&props) == 0);
- if (log) {
- battery_monitor_->logValues();
- }
- healthd_mode_ops->battery_update(&props);
- bool chargerOnline = battery_monitor_->isChargerOnline();
-
- // adjust uevent / wakealarm periods
- healthd_battery_update_internal(chargerOnline);
-
- return Result::SUCCESS;
-}
-
-Return<Result> Health::updateAndNotify(const sp<IHealthInfoCallback>& callback) {
- std::lock_guard<decltype(callbacks_lock_)> lock(callbacks_lock_);
- std::vector<sp<IHealthInfoCallback>> storedCallbacks{std::move(callbacks_)};
- callbacks_.clear();
- if (callback != nullptr) {
- callbacks_.push_back(callback);
- }
- Return<Result> result = update();
- callbacks_ = std::move(storedCallbacks);
- return result;
-}
-
-void Health::notifyListeners(HealthInfo* healthInfo) {
- std::vector<StorageInfo> info;
- get_storage_info(info);
-
- std::vector<DiskStats> stats;
- get_disk_stats(stats);
-
- int32_t currentAvg = 0;
-
- struct BatteryProperty prop;
- status_t ret = battery_monitor_->getProperty(BATTERY_PROP_CURRENT_AVG, &prop);
- if (ret == OK) {
- currentAvg = static_cast<int32_t>(prop.valueInt64);
- }
-
- healthInfo->batteryCurrentAverage = currentAvg;
- healthInfo->diskStats = stats;
- healthInfo->storageInfos = info;
-
- std::lock_guard<decltype(callbacks_lock_)> lock(callbacks_lock_);
- for (auto it = callbacks_.begin(); it != callbacks_.end();) {
- auto ret = (*it)->healthInfoChanged(*healthInfo);
- if (!ret.isOk() && ret.isDeadObject()) {
- it = callbacks_.erase(it);
- } else {
- ++it;
- }
- }
-}
-
-Return<void> Health::debug(const hidl_handle& handle, const hidl_vec<hidl_string>&) {
- if (handle != nullptr && handle->numFds >= 1) {
- int fd = handle->data[0];
- battery_monitor_->dumpState(fd);
-
- getHealthInfo([fd](auto res, const auto& info) {
- android::base::WriteStringToFd("\ngetHealthInfo -> ", fd);
- if (res == Result::SUCCESS) {
- android::base::WriteStringToFd(toString(info), fd);
- } else {
- android::base::WriteStringToFd(toString(res), fd);
- }
- android::base::WriteStringToFd("\n", fd);
- });
-
- fsync(fd);
- }
- return Void();
-}
-
-Return<void> Health::getStorageInfo(getStorageInfo_cb _hidl_cb) {
- std::vector<struct StorageInfo> info;
- get_storage_info(info);
- hidl_vec<struct StorageInfo> info_vec(info);
- if (!info.size()) {
- _hidl_cb(Result::NOT_SUPPORTED, info_vec);
- } else {
- _hidl_cb(Result::SUCCESS, info_vec);
- }
- return Void();
-}
-
-Return<void> Health::getDiskStats(getDiskStats_cb _hidl_cb) {
- std::vector<struct DiskStats> stats;
- get_disk_stats(stats);
- hidl_vec<struct DiskStats> stats_vec(stats);
- if (!stats.size()) {
- _hidl_cb(Result::NOT_SUPPORTED, stats_vec);
- } else {
- _hidl_cb(Result::SUCCESS, stats_vec);
- }
- return Void();
-}
-
-Return<void> Health::getHealthInfo(getHealthInfo_cb _hidl_cb) {
- using android::hardware::health::V1_0::hal_conversion::convertToHealthInfo;
-
- updateAndNotify(nullptr);
- HealthInfo healthInfo = battery_monitor_->getHealthInfo_2_0();
-
- std::vector<StorageInfo> info;
- get_storage_info(info);
-
- std::vector<DiskStats> stats;
- get_disk_stats(stats);
-
- int32_t currentAvg = 0;
-
- struct BatteryProperty prop;
- status_t ret = battery_monitor_->getProperty(BATTERY_PROP_CURRENT_AVG, &prop);
- if (ret == OK) {
- currentAvg = static_cast<int32_t>(prop.valueInt64);
- }
-
- healthInfo.batteryCurrentAverage = currentAvg;
- healthInfo.diskStats = stats;
- healthInfo.storageInfos = info;
-
- _hidl_cb(Result::SUCCESS, healthInfo);
- return Void();
-}
-
-void Health::serviceDied(uint64_t /* cookie */, const wp<IBase>& who) {
- (void)unregisterCallbackInternal(who.promote());
-}
-
-sp<IHealth> Health::initInstance(struct healthd_config* c) {
- if (instance_ == nullptr) {
- instance_ = new Health(c);
- }
- return instance_;
-}
-
-sp<Health> Health::getImplementation() {
- CHECK(instance_ != nullptr);
- return instance_;
-}
-
-} // namespace implementation
-} // namespace V2_0
-} // namespace health
-} // namespace hardware
-} // namespace android
diff --git a/health/2.0/default/HealthImplDefault.cpp b/health/2.0/default/HealthImplDefault.cpp
deleted file mode 100644
index 08fee9e..0000000
--- a/health/2.0/default/HealthImplDefault.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <health2/Health.h>
-#include <healthd/healthd.h>
-
-using android::hardware::health::V2_0::IHealth;
-using android::hardware::health::V2_0::implementation::Health;
-
-static struct healthd_config gHealthdConfig = {
- .energyCounter = nullptr,
- .boot_min_cap = 0,
- .screen_on = nullptr};
-
-void healthd_board_init(struct healthd_config*) {
- // use defaults
-}
-
-int healthd_board_battery_update(struct android::BatteryProperties*) {
- // return 0 to log periodic polled battery status to kernel log
- return 0;
-}
-
-void healthd_mode_default_impl_init(struct healthd_config*) {
- // noop
-}
-
-int healthd_mode_default_impl_preparetowait(void) {
- return -1;
-}
-
-void healthd_mode_default_impl_heartbeat(void) {
- // noop
-}
-
-void healthd_mode_default_impl_battery_update(struct android::BatteryProperties*) {
- // noop
-}
-
-static struct healthd_mode_ops healthd_mode_default_impl_ops = {
- .init = healthd_mode_default_impl_init,
- .preparetowait = healthd_mode_default_impl_preparetowait,
- .heartbeat = healthd_mode_default_impl_heartbeat,
- .battery_update = healthd_mode_default_impl_battery_update,
-};
-
-extern "C" IHealth* HIDL_FETCH_IHealth(const char* name) {
- const static std::string providedInstance{"backup"};
- healthd_mode_ops = &healthd_mode_default_impl_ops;
- if (providedInstance == name) {
- // use defaults
- // Health class stores static instance
- return Health::initInstance(&gHealthdConfig).get();
- }
- return nullptr;
-}
diff --git a/health/2.0/default/healthd_common_adapter.cpp b/health/2.0/default/healthd_common_adapter.cpp
deleted file mode 100644
index 0b5d869..0000000
--- a/health/2.0/default/healthd_common_adapter.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Support legacy functions in healthd/healthd.h using healthd_mode_ops.
-// New code should use HealthLoop directly instead.
-
-#include <memory>
-
-#include <cutils/klog.h>
-#include <health/HealthLoop.h>
-#include <health2/Health.h>
-#include <healthd/healthd.h>
-
-using android::hardware::health::HealthLoop;
-using android::hardware::health::V2_0::implementation::Health;
-
-struct healthd_mode_ops* healthd_mode_ops = nullptr;
-
-// Adapter of HealthLoop to use legacy healthd_mode_ops.
-class HealthLoopAdapter : public HealthLoop {
- public:
- // Expose internal functions, assuming clients calls them in the same thread
- // where StartLoop is called.
- int RegisterEvent(int fd, BoundFunction func, EventWakeup wakeup) {
- return HealthLoop::RegisterEvent(fd, func, wakeup);
- }
- void AdjustWakealarmPeriods(bool charger_online) {
- return HealthLoop::AdjustWakealarmPeriods(charger_online);
- }
- protected:
- void Init(healthd_config* config) override { healthd_mode_ops->init(config); }
- void Heartbeat() override { healthd_mode_ops->heartbeat(); }
- int PrepareToWait() override { return healthd_mode_ops->preparetowait(); }
- void ScheduleBatteryUpdate() override { Health::getImplementation()->update(); }
-};
-static std::unique_ptr<HealthLoopAdapter> health_loop;
-
-int healthd_register_event(int fd, void (*handler)(uint32_t), EventWakeup wakeup) {
- if (!health_loop) return -1;
-
- auto wrapped_handler = [handler](auto*, uint32_t epevents) { handler(epevents); };
- return health_loop->RegisterEvent(fd, wrapped_handler, wakeup);
-}
-
-void healthd_battery_update_internal(bool charger_online) {
- if (!health_loop) return;
- health_loop->AdjustWakealarmPeriods(charger_online);
-}
-
-int healthd_main() {
- if (!healthd_mode_ops) {
- KLOG_ERROR("healthd ops not set, exiting\n");
- exit(1);
- }
-
- health_loop = std::make_unique<HealthLoopAdapter>();
-
- int ret = health_loop->StartLoop();
-
- // Should not reach here. The following will exit().
- health_loop.reset();
-
- return ret;
-}
diff --git a/health/2.0/default/include/health2/Health.h b/health/2.0/default/include/health2/Health.h
deleted file mode 100644
index 6410474..0000000
--- a/health/2.0/default/include/health2/Health.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#ifndef ANDROID_HARDWARE_HEALTH_V2_0_HEALTH_H
-#define ANDROID_HARDWARE_HEALTH_V2_0_HEALTH_H
-
-#include <memory>
-#include <vector>
-
-#include <android/hardware/health/1.0/types.h>
-#include <android/hardware/health/2.0/IHealth.h>
-#include <healthd/BatteryMonitor.h>
-#include <hidl/Status.h>
-
-using android::hardware::health::V2_0::StorageInfo;
-using android::hardware::health::V2_0::DiskStats;
-
-void get_storage_info(std::vector<struct StorageInfo>& info);
-void get_disk_stats(std::vector<struct DiskStats>& stats);
-
-namespace android {
-namespace hardware {
-namespace health {
-namespace V2_0 {
-namespace implementation {
-
-using V1_0::BatteryStatus;
-
-using ::android::hidl::base::V1_0::IBase;
-
-struct Health : public IHealth, hidl_death_recipient {
- public:
- static sp<IHealth> initInstance(struct healthd_config* c);
- // Should only be called by implementation itself (-impl, -service).
- // Clients should not call this function. Instead, initInstance() initializes and returns the
- // global instance that has fewer functions.
- static sp<Health> getImplementation();
-
- Health(struct healthd_config* c);
-
- void notifyListeners(HealthInfo* info);
-
- // Methods from IHealth follow.
- Return<Result> registerCallback(const sp<IHealthInfoCallback>& callback) override;
- Return<Result> unregisterCallback(const sp<IHealthInfoCallback>& callback) override;
- Return<Result> update() override;
- Return<void> getChargeCounter(getChargeCounter_cb _hidl_cb) override;
- Return<void> getCurrentNow(getCurrentNow_cb _hidl_cb) override;
- Return<void> getCurrentAverage(getCurrentAverage_cb _hidl_cb) override;
- Return<void> getCapacity(getCapacity_cb _hidl_cb) override;
- Return<void> getEnergyCounter(getEnergyCounter_cb _hidl_cb) override;
- Return<void> getChargeStatus(getChargeStatus_cb _hidl_cb) override;
- Return<void> getStorageInfo(getStorageInfo_cb _hidl_cb) override;
- Return<void> getDiskStats(getDiskStats_cb _hidl_cb) override;
- Return<void> getHealthInfo(getHealthInfo_cb _hidl_cb) override;
-
- // Methods from ::android::hidl::base::V1_0::IBase follow.
- Return<void> debug(const hidl_handle& fd, const hidl_vec<hidl_string>& args) override;
-
- void serviceDied(uint64_t cookie, const wp<IBase>& /* who */) override;
-
- private:
- static sp<Health> instance_;
-
- std::recursive_mutex callbacks_lock_;
- std::vector<sp<IHealthInfoCallback>> callbacks_;
- std::unique_ptr<BatteryMonitor> battery_monitor_;
-
- bool unregisterCallbackInternal(const sp<IBase>& cb);
-
- // update() and only notify the given callback, but none of the other callbacks.
- // If cb is null, do not notify any callback at all.
- Return<Result> updateAndNotify(const sp<IHealthInfoCallback>& cb);
-};
-
-} // namespace implementation
-} // namespace V2_0
-} // namespace health
-} // namespace hardware
-} // namespace android
-
-#endif // ANDROID_HARDWARE_HEALTH_V2_0_HEALTH_H
diff --git a/health/2.0/utils/README.md b/health/2.0/utils/README.md
index c59b3f3..3fc8dab 100644
--- a/health/2.0/utils/README.md
+++ b/health/2.0/utils/README.md
@@ -6,25 +6,3 @@
calling `IHealth::getService()` directly.
Its Java equivalent can be found in `BatteryService.HealthServiceWrapper`.
-
-# libhealthservice
-
-Common code for all (hwbinder) services of the health HAL, including healthd and
-vendor health service `android.hardware.health@2.0-service(.<vendor>)`. `main()` in
-those binaries calls `health_service_main()` directly.
-
-# libhealthstoragedefault
-
-Default implementation for storage related APIs for (hwbinder) services of the
-health HAL. If an implementation of the health HAL do not wish to provide any
-storage info, include this library. Otherwise, it should implement the following
-two functions:
-
-```c++
-void get_storage_info(std::vector<struct StorageInfo>& info) {
- // ...
-}
-void get_disk_stats(std::vector<struct DiskStats>& stats) {
- // ...
-}
-```
diff --git a/health/2.0/utils/libhealthhalutils/HealthHalUtils.cpp b/health/2.0/utils/libhealthhalutils/HealthHalUtils.cpp
index 3c353e6..67f0ecc 100644
--- a/health/2.0/utils/libhealthhalutils/HealthHalUtils.cpp
+++ b/health/2.0/utils/libhealthhalutils/HealthHalUtils.cpp
@@ -24,34 +24,14 @@
namespace health {
namespace V2_0 {
+// Deprecated. Kept to minimize migration cost.
+// The function can be removed once Health 2.1 is removed
+// (i.e. compatibility_matrix.7.xml is the lowest supported level).
sp<IHealth> get_health_service() {
- // For the core and vendor variant, the "backup" instance points to healthd,
- // which is removed.
- // For the recovery variant, the "backup" instance has a different
- // meaning. It points to android.hardware.health@2.0-impl-default.recovery
- // which was assumed by OEMs to be always installed when a
- // vendor-specific libhealthd is not necessary. Hence, its behavior
- // is kept. See health/2.0/README.md.
- // android.hardware.health@2.0-impl-default.recovery, and subsequently the
- // special handling of recovery mode below, can be removed once health@2.1
- // is the minimum required version (i.e. compatibility matrix level 5 is the
- // minimum supported level). Health 2.1 requires OEMs to install the
+ // Health 2.1 requires OEMs to install the
// implementation to the recovery partition when it is necessary (i.e. on
// non-A/B devices, where IsBatteryOk() is needed in recovery).
- for (auto&& instanceName :
-#ifdef __ANDROID_RECOVERY__
- { "default", "backup" }
-#else
- {"default"}
-#endif
- ) {
- auto ret = IHealth::getService(instanceName);
- if (ret != nullptr) {
- return ret;
- }
- LOG(INFO) << "health: cannot get " << instanceName << " service";
- }
- return nullptr;
+ return IHealth::getService();
}
} // namespace V2_0
diff --git a/health/2.0/utils/libhealthservice/Android.bp b/health/2.0/utils/libhealthservice/Android.bp
deleted file mode 100644
index 8023692..0000000
--- a/health/2.0/utils/libhealthservice/Android.bp
+++ /dev/null
@@ -1,38 +0,0 @@
-// Reasonable defaults for android.hardware.health@2.0-service.<device>.
-// Vendor service can customize by implementing functions defined in
-// libhealthd and libhealthstoragedefault.
-
-
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "hardware_interfaces_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["hardware_interfaces_license"],
-}
-
-cc_library_static {
- name: "libhealthservice",
- vendor_available: true,
- srcs: ["HealthServiceCommon.cpp"],
-
- export_include_dirs: ["include"],
-
- cflags: [
- "-Wall",
- "-Werror",
- ],
- shared_libs: [
- "android.hardware.health@2.0",
- ],
- static_libs: [
- "android.hardware.health@2.0-impl",
- "android.hardware.health@1.0-convert",
- ],
- export_static_lib_headers: [
- "android.hardware.health@1.0-convert",
- ],
- header_libs: ["libhealthd_headers"],
- export_header_lib_headers: ["libhealthd_headers"],
-}
diff --git a/health/2.0/utils/libhealthservice/HealthServiceCommon.cpp b/health/2.0/utils/libhealthservice/HealthServiceCommon.cpp
deleted file mode 100644
index 039570a..0000000
--- a/health/2.0/utils/libhealthservice/HealthServiceCommon.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "health@2.0/"
-#include <android-base/logging.h>
-
-#include <android/hardware/health/1.0/types.h>
-#include <hal_conversion.h>
-#include <health2/Health.h>
-#include <health2/service.h>
-#include <healthd/healthd.h>
-#include <hidl/HidlTransportSupport.h>
-#include <hwbinder/IPCThreadState.h>
-
-using android::hardware::IPCThreadState;
-using android::hardware::configureRpcThreadpool;
-using android::hardware::handleTransportPoll;
-using android::hardware::setupTransportPolling;
-using android::hardware::health::V2_0::HealthInfo;
-using android::hardware::health::V1_0::hal_conversion::convertToHealthInfo;
-using android::hardware::health::V2_0::IHealth;
-using android::hardware::health::V2_0::implementation::Health;
-
-extern int healthd_main(void);
-
-static int gBinderFd = -1;
-static std::string gInstanceName;
-
-static void binder_event(uint32_t /*epevents*/) {
- if (gBinderFd >= 0) handleTransportPoll(gBinderFd);
-}
-
-void healthd_mode_service_2_0_init(struct healthd_config* config) {
- LOG(INFO) << LOG_TAG << gInstanceName << " Hal is starting up...";
-
- gBinderFd = setupTransportPolling();
-
- if (gBinderFd >= 0) {
- if (healthd_register_event(gBinderFd, binder_event))
- LOG(ERROR) << LOG_TAG << gInstanceName << ": Register for binder events failed";
- }
-
- android::sp<IHealth> service = Health::initInstance(config);
- CHECK_EQ(service->registerAsService(gInstanceName), android::OK)
- << LOG_TAG << gInstanceName << ": Failed to register HAL";
-
- LOG(INFO) << LOG_TAG << gInstanceName << ": Hal init done";
-}
-
-int healthd_mode_service_2_0_preparetowait(void) {
- IPCThreadState::self()->flushCommands();
- return -1;
-}
-
-void healthd_mode_service_2_0_heartbeat(void) {
- // noop
-}
-
-void healthd_mode_service_2_0_battery_update(struct android::BatteryProperties* prop) {
- HealthInfo info;
- convertToHealthInfo(prop, info.legacy);
- Health::getImplementation()->notifyListeners(&info);
-}
-
-static struct healthd_mode_ops healthd_mode_service_2_0_ops = {
- .init = healthd_mode_service_2_0_init,
- .preparetowait = healthd_mode_service_2_0_preparetowait,
- .heartbeat = healthd_mode_service_2_0_heartbeat,
- .battery_update = healthd_mode_service_2_0_battery_update,
-};
-
-int health_service_main(const char* instance) {
- gInstanceName = instance;
- if (gInstanceName.empty()) {
- gInstanceName = "default";
- }
- healthd_mode_ops = &healthd_mode_service_2_0_ops;
- LOG(INFO) << LOG_TAG << gInstanceName << ": Hal starting main loop...";
- return healthd_main();
-}
diff --git a/health/2.0/utils/libhealthstoragedefault/include/StorageHealthDefault.h b/health/2.0/utils/libhealthstoragedefault/include/StorageHealthDefault.h
deleted file mode 100644
index 85eb210..0000000
--- a/health/2.0/utils/libhealthstoragedefault/include/StorageHealthDefault.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef ANDROID_HARDWARE_HEALTH_V2_0_STORAGE_HEALTH_H
-#define ANDROID_HARDWARE_HEALTH_V2_0_STORAGE_HEALTH_H
-
-#include <android/hardware/health/2.0/types.h>
-
-using android::hardware::health::V2_0::StorageInfo;
-using android::hardware::health::V2_0::DiskStats;
-
-/*
- * Get storage information.
- */
-void get_storage_info(std::vector<struct StorageInfo>& info);
-
-/*
- * Get disk statistics.
- */
-void get_disk_stats(std::vector<struct DiskStats>& stats);
-
-#endif // ANDROID_HARDWARE_HEALTH_V2_0_STORAGE_HEALTH_H
diff --git a/media/bufferpool/aidl/Android.bp b/media/bufferpool/aidl/Android.bp
index 8e013e0..9dcc90e 100644
--- a/media/bufferpool/aidl/Android.bp
+++ b/media/bufferpool/aidl/Android.bp
@@ -26,6 +26,9 @@
vendor_available: true,
double_loadable: true,
srcs: ["android/hardware/media/bufferpool2/*.aidl"],
+ headers: [
+ "HardwareBuffer_aidl",
+ ],
imports: [
"android.hardware.common-V2",
"android.hardware.common.fmq-V1",
@@ -44,10 +47,13 @@
"//apex_available:platform",
"com.android.media.swcodec",
],
+ additional_shared_libraries: [
+ "libnativewindow",
+ ],
min_sdk_version: "29",
},
rust: {
- enabled: true,
+ enabled: false,
},
},
versions_with_info: [
@@ -59,6 +65,6 @@
],
},
],
- frozen: true,
+ frozen: false,
}
diff --git a/media/bufferpool/aidl/aidl_api/android.hardware.media.bufferpool2/current/android/hardware/media/bufferpool2/Buffer.aidl b/media/bufferpool/aidl/aidl_api/android.hardware.media.bufferpool2/current/android/hardware/media/bufferpool2/Buffer.aidl
index 4ea0bba..85a78ad 100644
--- a/media/bufferpool/aidl/aidl_api/android.hardware.media.bufferpool2/current/android/hardware/media/bufferpool2/Buffer.aidl
+++ b/media/bufferpool/aidl/aidl_api/android.hardware.media.bufferpool2/current/android/hardware/media/bufferpool2/Buffer.aidl
@@ -35,5 +35,6 @@
@VintfStability
parcelable Buffer {
int id;
- android.hardware.common.NativeHandle buffer;
+ @nullable android.hardware.common.NativeHandle buffer;
+ @nullable android.hardware.HardwareBuffer hwbBuffer;
}
diff --git a/media/bufferpool/aidl/android/hardware/media/bufferpool2/Buffer.aidl b/media/bufferpool/aidl/android/hardware/media/bufferpool2/Buffer.aidl
index 976f674..79b3f23 100644
--- a/media/bufferpool/aidl/android/hardware/media/bufferpool2/Buffer.aidl
+++ b/media/bufferpool/aidl/android/hardware/media/bufferpool2/Buffer.aidl
@@ -17,6 +17,7 @@
package android.hardware.media.bufferpool2;
import android.hardware.common.NativeHandle;
+import android.hardware.HardwareBuffer;
/**
* Generic buffer for fast recycling for media/stagefright.
@@ -26,10 +27,14 @@
* by a buffer pool, and are recycled to the buffer pool when they are
* no longer referenced by the clients.
*
+ * Initially all buffers in media HAL should be NativeHandle(actually native_handle_t).
+ * HardwareBuffer(actually AHardwareBuffer) for GraphicBuffer is added from V2.
+ *
* E.g. ion or gralloc buffer
*/
@VintfStability
parcelable Buffer {
int id;
- NativeHandle buffer;
+ @nullable NativeHandle buffer;
+ @nullable HardwareBuffer hwbBuffer;
}
diff --git a/media/bufferpool/aidl/default/Android.bp b/media/bufferpool/aidl/default/Android.bp
index 11a6163..4d12d63 100644
--- a/media/bufferpool/aidl/default/Android.bp
+++ b/media/bufferpool/aidl/default/Android.bp
@@ -33,15 +33,16 @@
"libcutils",
"libfmq",
"liblog",
+ "libnativewindow",
"libutils",
- "android.hardware.media.bufferpool2-V1-ndk",
+ "android.hardware.media.bufferpool2-V2-ndk",
],
static_libs: [
"libaidlcommonsupport",
],
export_shared_lib_headers: [
"libfmq",
- "android.hardware.media.bufferpool2-V1-ndk",
+ "android.hardware.media.bufferpool2-V2-ndk",
],
double_loadable: true,
cflags: [
diff --git a/media/bufferpool/aidl/default/BufferPoolClient.cpp b/media/bufferpool/aidl/default/BufferPoolClient.cpp
index e9777d8..ce4ad8e 100644
--- a/media/bufferpool/aidl/default/BufferPoolClient.cpp
+++ b/media/bufferpool/aidl/default/BufferPoolClient.cpp
@@ -297,7 +297,7 @@
mLastEvictCacheMs(::android::elapsedRealtime()) {
IAccessor::ConnectionInfo conInfo;
bool valid = false;
- if(accessor->connect(observer, &conInfo).isOk()) {
+ if (accessor && accessor->connect(observer, &conInfo).isOk()) {
auto channel = std::make_unique<BufferStatusChannel>(conInfo.toFmqDesc);
auto observer = std::make_unique<BufferInvalidationListener>(conInfo.fromFmqDesc);
@@ -757,7 +757,13 @@
return svcSpecific ? svcSpecific : ResultStatus::CRITICAL_ERROR;
}
if (results[0].getTag() == FetchResult::buffer) {
- *handle = ::android::dupFromAidl(results[0].get<FetchResult::buffer>().buffer);
+ if (results[0].get<FetchResult::buffer>().buffer.has_value()) {
+ *handle = ::android::dupFromAidl(results[0].get<FetchResult::buffer>().buffer.value());
+ } else {
+ // TODO: Support HardwareBuffer
+ ALOGW("handle nullptr");
+ *handle = nullptr;
+ }
return ResultStatus::OK;
}
return results[0].get<FetchResult::failure>();
diff --git a/media/bufferpool/aidl/default/tests/Android.bp b/media/bufferpool/aidl/default/tests/Android.bp
index 549af57..487ed4c 100644
--- a/media/bufferpool/aidl/default/tests/Android.bp
+++ b/media/bufferpool/aidl/default/tests/Android.bp
@@ -36,8 +36,9 @@
"libcutils",
"libfmq",
"liblog",
+ "libnativewindow",
"libutils",
- "android.hardware.media.bufferpool2-V1-ndk",
+ "android.hardware.media.bufferpool2-V2-ndk",
],
static_libs: [
"libaidlcommonsupport",
@@ -59,8 +60,9 @@
"libcutils",
"libfmq",
"liblog",
+ "libnativewindow",
"libutils",
- "android.hardware.media.bufferpool2-V1-ndk",
+ "android.hardware.media.bufferpool2-V2-ndk",
],
static_libs: [
"libaidlcommonsupport",
@@ -82,8 +84,9 @@
"libcutils",
"libfmq",
"liblog",
+ "libnativewindow",
"libutils",
- "android.hardware.media.bufferpool2-V1-ndk",
+ "android.hardware.media.bufferpool2-V2-ndk",
],
static_libs: [
"libaidlcommonsupport",
diff --git a/media/c2/aidl/Android.bp b/media/c2/aidl/Android.bp
index 3c0915d..2eaeb01 100644
--- a/media/c2/aidl/Android.bp
+++ b/media/c2/aidl/Android.bp
@@ -20,7 +20,10 @@
],
imports: [
"android.hardware.common-V2",
- "android.hardware.media.bufferpool2-V1",
+ "android.hardware.media.bufferpool2-V2",
+ ],
+ include_dirs: [
+ "frameworks/native/aidl/gui",
],
stability: "vintf",
backend: {
@@ -42,11 +45,8 @@
],
},
rust: {
- min_sdk_version: "31",
- enabled: true,
- additional_rustlibs: [
- "libnativewindow_rs",
- ],
+ // No users, and no rust implementation of android.os.Surface yet
+ enabled: false,
},
},
}
diff --git a/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IComponent.aidl b/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IComponent.aidl
index 7d58340..4439bc5 100644
--- a/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IComponent.aidl
+++ b/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IComponent.aidl
@@ -45,6 +45,8 @@
void reset();
void start();
void stop();
+ android.hardware.media.c2.IInputSurfaceConnection connectToInputSurface(in android.hardware.media.c2.IInputSurface inputSurface);
+ android.hardware.media.c2.IInputSink asInputSink();
parcelable BlockPool {
long blockPoolId;
android.hardware.media.c2.IConfigurable configurable;
diff --git a/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IComponentStore.aidl b/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IComponentStore.aidl
index d1b5915..d7a4706 100644
--- a/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IComponentStore.aidl
+++ b/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IComponentStore.aidl
@@ -41,6 +41,7 @@
android.hardware.media.bufferpool2.IClientManager getPoolClientManager();
android.hardware.media.c2.StructDescriptor[] getStructDescriptors(in int[] indices);
android.hardware.media.c2.IComponentStore.ComponentTraits[] listComponents();
+ android.hardware.media.c2.IInputSurface createInputSurface();
@VintfStability
parcelable ComponentTraits {
String name;
diff --git a/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IConfigurable.aidl b/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IConfigurable.aidl
index 32f5abd..04e776e 100644
--- a/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IConfigurable.aidl
+++ b/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IConfigurable.aidl
@@ -37,12 +37,23 @@
android.hardware.media.c2.IConfigurable.ConfigResult config(in android.hardware.media.c2.Params inParams, in boolean mayBlock);
int getId();
String getName();
- android.hardware.media.c2.Params query(in int[] indices, in boolean mayBlock);
+ android.hardware.media.c2.IConfigurable.QueryResult query(in int[] indices, in boolean mayBlock);
android.hardware.media.c2.ParamDescriptor[] querySupportedParams(in int start, in int count);
- android.hardware.media.c2.FieldSupportedValuesQueryResult[] querySupportedValues(in android.hardware.media.c2.FieldSupportedValuesQuery[] inFields, in boolean mayBlock);
+ android.hardware.media.c2.IConfigurable.QuerySupportedValuesResult querySupportedValues(in android.hardware.media.c2.FieldSupportedValuesQuery[] inFields, in boolean mayBlock);
@VintfStability
parcelable ConfigResult {
android.hardware.media.c2.Params params;
android.hardware.media.c2.SettingResult[] failures;
+ android.hardware.media.c2.Status status;
+ }
+ @VintfStability
+ parcelable QueryResult {
+ android.hardware.media.c2.Params params;
+ android.hardware.media.c2.Status status;
+ }
+ @VintfStability
+ parcelable QuerySupportedValuesResult {
+ android.hardware.media.c2.FieldSupportedValuesQueryResult[] values;
+ android.hardware.media.c2.Status status;
}
}
diff --git a/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IInputSink.aidl b/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IInputSink.aidl
new file mode 100644
index 0000000..e6ea4d5
--- /dev/null
+++ b/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IInputSink.aidl
@@ -0,0 +1,38 @@
+/*
+ * 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 FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.media.c2;
+@VintfStability
+interface IInputSink {
+ void queue(in android.hardware.media.c2.WorkBundle workBundle);
+}
diff --git a/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IInputSurface.aidl b/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IInputSurface.aidl
new file mode 100644
index 0000000..14455cb
--- /dev/null
+++ b/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IInputSurface.aidl
@@ -0,0 +1,40 @@
+/*
+ * 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 FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.media.c2;
+@VintfStability
+interface IInputSurface {
+ android.view.Surface getSurface();
+ android.hardware.media.c2.IConfigurable getConfigurable();
+ android.hardware.media.c2.IInputSurfaceConnection connect(in android.hardware.media.c2.IInputSink sink);
+}
diff --git a/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IInputSurfaceConnection.aidl b/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IInputSurfaceConnection.aidl
new file mode 100644
index 0000000..28fff65
--- /dev/null
+++ b/media/c2/aidl/aidl_api/android.hardware.media.c2/current/android/hardware/media/c2/IInputSurfaceConnection.aidl
@@ -0,0 +1,39 @@
+/*
+ * 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 FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.media.c2;
+@VintfStability
+interface IInputSurfaceConnection {
+ void disconnect();
+ void signalEndOfStream();
+}
diff --git a/media/c2/aidl/android/hardware/media/c2/IComponent.aidl b/media/c2/aidl/android/hardware/media/c2/IComponent.aidl
index fc923ab..ed2eaf4 100644
--- a/media/c2/aidl/android/hardware/media/c2/IComponent.aidl
+++ b/media/c2/aidl/android/hardware/media/c2/IComponent.aidl
@@ -21,6 +21,9 @@
import android.hardware.media.c2.IComponentInterface;
import android.hardware.media.c2.IConfigurable;
import android.hardware.media.c2.IGraphicBufferAllocator;
+import android.hardware.media.c2.IInputSink;
+import android.hardware.media.c2.IInputSurface;
+import android.hardware.media.c2.IInputSurfaceConnection;
import android.hardware.media.c2.WorkBundle;
import android.os.ParcelFileDescriptor;
@@ -308,4 +311,32 @@
* - `Status::CORRUPTED` - Some unknown error occurred.
*/
void stop();
+
+ /**
+ * Starts using an input surface.
+ *
+ * The component must be in running state.
+ *
+ * @param inputSurface Input surface to connect to.
+ * @return connection `IInputSurfaceConnection` object, which can be used to
+ * query and configure properties of the connection. This cannot be
+ * null.
+ * @throws ServiceSpecificException with one of the following values:
+ * - `Status::CANNOT_DO` - The component does not support an input surface.
+ * - `Status::BAD_STATE` - The component is not in running state.
+ * - `Status::DUPLICATE` - The component is already connected to an input surface.
+ * - `Status::REFUSED` - The input surface is already in use.
+ * - `Status::NO_MEMORY` - Not enough memory to start the component.
+ * - `Status::TIMED_OUT` - The operation cannot be finished in a timely manner.
+ * - `Status::CORRUPTED` - Some unknown error occurred.
+ */
+ IInputSurfaceConnection connectToInputSurface(in IInputSurface inputSurface);
+
+ /**
+ * Returns an @ref IInputSink instance that has the component as the
+ * underlying implementation.
+ *
+ * @return sink `IInputSink` instance.
+ */
+ IInputSink asInputSink();
}
diff --git a/media/c2/aidl/android/hardware/media/c2/IComponentStore.aidl b/media/c2/aidl/android/hardware/media/c2/IComponentStore.aidl
index 1435a7e..019405d 100644
--- a/media/c2/aidl/android/hardware/media/c2/IComponentStore.aidl
+++ b/media/c2/aidl/android/hardware/media/c2/IComponentStore.aidl
@@ -21,6 +21,7 @@
import android.hardware.media.c2.IComponentInterface;
import android.hardware.media.c2.IComponentListener;
import android.hardware.media.c2.IConfigurable;
+import android.hardware.media.c2.IInputSurface;
import android.hardware.media.c2.StructDescriptor;
/**
@@ -182,4 +183,16 @@
* - `Status::CORRUPTED` - Some unknown error occurred.
*/
ComponentTraits[] listComponents();
+
+ /**
+ * Creates a persistent input surface that can be used as an input surface
+ * for any IComponent instance
+ *
+ * @return IInputSurface A persistent input surface.
+ * @throws ServiceSpecificException with one of following values:
+ * - `Status::NO_MEMORY` - Not enough memory to complete this method.
+ * - `Status::TIMED_OUT` - The operation cannot be finished in a timely manner.
+ * - `Status::CORRUPTED` - Some unknown error occurred.
+ */
+ IInputSurface createInputSurface();
}
diff --git a/media/c2/aidl/android/hardware/media/c2/IConfigurable.aidl b/media/c2/aidl/android/hardware/media/c2/IConfigurable.aidl
index 7fdb825..1481c15 100644
--- a/media/c2/aidl/android/hardware/media/c2/IConfigurable.aidl
+++ b/media/c2/aidl/android/hardware/media/c2/IConfigurable.aidl
@@ -21,6 +21,7 @@
import android.hardware.media.c2.ParamDescriptor;
import android.hardware.media.c2.Params;
import android.hardware.media.c2.SettingResult;
+import android.hardware.media.c2.Status;
/**
* Generic configuration interface presented by all configurable Codec2 objects.
@@ -34,12 +35,42 @@
* Return parcelable for config() interface.
*
* This includes the successful config settings along with the failure reasons of
- * the specified setting.
+ * the specified setting. @p status is for the compatibility with HIDL interface.
+ * (The value is defined in Status.aidl, and possible values are enumerated
+ * in config() interface definition)
*/
@VintfStability
parcelable ConfigResult {
Params params;
SettingResult[] failures;
+ Status status;
+ }
+
+ /**
+ * Return parcelable for query() interface.
+ *
+ * @p params is the parameter descripion for queried configuration indices.
+ * @p status is for the compatibility with HIDL interface. (The value is defined in
+ * Status.aidl, and possible values are enumerated in query() interface definition)
+ */
+ @VintfStability
+ parcelable QueryResult {
+ Params params;
+ Status status;
+ }
+
+ /**
+ * Return parcelable for querySupportedValues() interface.
+ *
+ * @p values is the value descripion for queried configuration fields.
+ * @p status is for the compatibility with HIDL interface. (The value is defined in
+ * Status.aidl, and possible values are enumerated in querySupportedValues()
+ * interface definition)
+ */
+ @VintfStability
+ parcelable QuerySupportedValuesResult {
+ FieldSupportedValuesQueryResult[] values;
+ Status status;
}
/**
@@ -82,7 +113,8 @@
* @param mayBlock Whether this call may block or not.
* @return result of config. Params in the result should be in same order
* with @p inParams.
- * @throws ServiceSpecificException with one of the following values:
+ *
+ * Returned @p status will be one of the following.
* - `Status::NO_MEMORY` - Some supported parameters could not be updated
* successfully because they contained unsupported values.
* These are returned in @p failures.
@@ -146,17 +178,22 @@
*
* @param indices List of C2Param structure indices to query.
* @param mayBlock Whether this call may block or not.
- * @return Flattened representation of std::vector<C2Param> object.
- * Unsupported settings are skipped in the results. The order in @p indices
- * still be preserved except skipped settings.
- * @throws ServiceSpecificException with one of the following values:
+ * @return @p params is the flattened representation of std::vector<C2Param> object.
+ * Technically unsupported settings can be either skipped or invalidated.
+ * (Invalidated params will be skipped during unflattening to make these identical.)
+ * In the future we will want these to be invalidated to make it easier
+ * for the framework code.
+ *
+ * The order in @p indices still be preserved except skipped settings.
+ *
+ * Returned @p status will be one of the following.
* - `Status::NO_MEMORY` - Could not allocate memory for a supported parameter.
* - `Status::BLOCKING` - Querying some parameters requires blocking, but
* @p mayBlock is false.
* - `Status::TIMED_OUT` - The operation cannot be finished in a timely manner.
* - `Status::CORRUPTED` - Some unknown error occurred.
*/
- Params query(in int[] indices, in boolean mayBlock);
+ QueryResult query(in int[] indices, in boolean mayBlock);
/**
* Returns a list of supported parameters within a selected range of C2Param
@@ -197,9 +234,10 @@
*
* @param inFields List of field queries.
* @param mayBlock Whether this call may block or not.
- * @return List of supported values and results for the
+ * @return @p values is the list of supported values and results for the
* supplied queries.
- * @throws ServiceSpecificException with one of the following values:
+ *
+ * Returned @p status will be one of the following.
* - `Status::BLOCKING` - Querying some parameters requires blocking, but
* @p mayBlock is false.
* - `Status::NO_MEMORY` - Not enough memory to complete this method.
@@ -208,6 +246,6 @@
* - `Status::TIMED_OUT` - The operation cannot be finished in a timely manner.
* - `Status::CORRUPTED` - Some unknown error occurred.
*/
- FieldSupportedValuesQueryResult[] querySupportedValues(
+ QuerySupportedValuesResult querySupportedValues(
in FieldSupportedValuesQuery[] inFields, in boolean mayBlock);
}
diff --git a/media/c2/aidl/android/hardware/media/c2/IInputSink.aidl b/media/c2/aidl/android/hardware/media/c2/IInputSink.aidl
new file mode 100644
index 0000000..eb8ad3d
--- /dev/null
+++ b/media/c2/aidl/android/hardware/media/c2/IInputSink.aidl
@@ -0,0 +1,45 @@
+/*
+ * 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 android.hardware.media.c2;
+
+import android.hardware.media.c2.WorkBundle;
+
+/**
+ * An `IInputSink` is a receiver of work items.
+ *
+ * An @ref IComponent instance can present itself as an `IInputSink` via a thin
+ * wrapper.
+ *
+ * @sa IInputSurface, IComponent.
+ */
+@VintfStability
+interface IInputSink {
+ /**
+ * Feeds work to the sink.
+ *
+ * @param workBundle `WorkBundle` object containing a list of `Work` objects
+ * to queue to the component.
+ * @throws ServiceSpecificException with one of the following values:
+ * - `Status::BAD_INDEX` - Some component id in some `Worklet` is not valid.
+ * - `Status::CANNOT_DO` - Tunneling has not been set up for this sink, but some
+ * `Work` object contains tunneling information.
+ * - `Status::NO_MEMORY` - Not enough memory to queue @p workBundle.
+ * - `Status::TIMED_OUT` - The operation cannot be finished in a timely manner.
+ * - `Status::CORRUPTED` - Some unknown error occurred.
+ */
+ void queue(in WorkBundle workBundle);
+}
diff --git a/media/c2/aidl/android/hardware/media/c2/IInputSurface.aidl b/media/c2/aidl/android/hardware/media/c2/IInputSurface.aidl
new file mode 100644
index 0000000..77cb1fd
--- /dev/null
+++ b/media/c2/aidl/android/hardware/media/c2/IInputSurface.aidl
@@ -0,0 +1,68 @@
+/*
+ * 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 android.hardware.media.c2;
+
+import android.hardware.media.c2.IConfigurable;
+import android.hardware.media.c2.IInputSink;
+import android.hardware.media.c2.IInputSurfaceConnection;
+import android.view.Surface;
+
+/**
+ * Input surface for a Codec2 component.
+ *
+ * An <em>input surface</em> is an instance of `IInputSurface`, which may be
+ * created by calling IComponentStore::createInputSurface(). Once created, the
+ * client may
+ * 1. write data to it via the `NativeWindow` interface; and
+ * 2. use it as input to a Codec2 encoder.
+ *
+ * @sa IInputSurfaceConnection, IComponentStore::createInputSurface(),
+ * IComponent::connectToInputSurface().
+ */
+@VintfStability
+interface IInputSurface {
+ /**
+ * Returns the producer interface into the internal buffer queue.
+ *
+ * @return producer `Surface` instance(actually ANativeWindow). This must not
+ * be null.
+ */
+ Surface getSurface();
+
+ /**
+ * Returns the @ref IConfigurable instance associated to this input surface.
+ *
+ * @return configurable `IConfigurable` instance. This must not be null.
+ */
+ IConfigurable getConfigurable();
+
+ /**
+ * Connects the input surface to an input sink.
+ *
+ * This function is generally called from inside the implementation of
+ * IComponent::connectToInputSurface(), where @p sink is a thin wrapper of
+ * the component that consumes buffers from this surface.
+ *
+ * @param sink Input sink. See `IInputSink` for more information.
+ * @return connection `IInputSurfaceConnection` object. This must not be
+ * null if @p status is `OK`.
+ * @throws ServiceSpecificException with one of following values:
+ * - `Status::BAD_VALUE` - @p sink is invalid.
+ * - `Status::CORRUPTED` - Some unknown error occurred.
+ */
+ IInputSurfaceConnection connect(in IInputSink sink);
+}
diff --git a/media/c2/aidl/android/hardware/media/c2/IInputSurfaceConnection.aidl b/media/c2/aidl/android/hardware/media/c2/IInputSurfaceConnection.aidl
new file mode 100644
index 0000000..36524eb
--- /dev/null
+++ b/media/c2/aidl/android/hardware/media/c2/IInputSurfaceConnection.aidl
@@ -0,0 +1,41 @@
+/*
+ * 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 android.hardware.media.c2;
+
+/**
+ * Connection between an IInputSink and an IInpuSurface.
+ */
+@VintfStability
+interface IInputSurfaceConnection {
+ /**
+ * Destroys the connection between an input surface and a component.
+ *
+ * @throws ServiceSpecificException with one of following values:
+ * - `Status::BAD_STATE` - The component is not in running state.
+ * - `Status::NOT_FOUND` - The surface is not connected to a component.
+ * - `Status::CORRUPTED` - Some unknown error occurred.
+ */
+ void disconnect();
+
+ /**
+ * Signal the end of stream.
+
+ * @throws ServiceSpecificException with one of following values:
+ * - `Status::BAD_STATE` - The component is not in running state.
+ */
+ void signalEndOfStream();
+}
diff --git a/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp b/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp
index 4d997e6..8210ff0 100644
--- a/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp
+++ b/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp
@@ -296,12 +296,6 @@
res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
EXPECT_TRUE(res.no_timeout);
EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
- if (nci_version == NCI_VERSION_2 && res.args->last_data_.size() > 13 &&
- res.args->last_data_[13] == 0x00) {
- // Wait for CORE_CONN_CREDITS_NTF
- res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
- }
// Send an Error Data Packet
cmd = INVALID_COMMAND;
data = cmd;
@@ -360,13 +354,6 @@
res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
EXPECT_TRUE(res.no_timeout);
EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
- if (nci_version == NCI_VERSION_2 && res.args->last_data_.size() > 13 &&
- res.args->last_data_[13] == 0x00) {
- // Wait for CORE_CONN_CREDITS_NTF
- res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
- }
-
cmd = CORE_CONN_CREATE_CMD;
data = cmd;
EXPECT_EQ(data.size(), nfc_->write(data));
diff --git a/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/SessionHint.aidl b/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/SessionHint.aidl
index cb37719..df31618 100644
--- a/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/SessionHint.aidl
+++ b/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/SessionHint.aidl
@@ -41,4 +41,5 @@
POWER_EFFICIENCY = 4,
GPU_LOAD_UP = 5,
GPU_LOAD_DOWN = 6,
+ GPU_LOAD_RESET = 7,
}
diff --git a/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/SessionTag.aidl b/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/SessionTag.aidl
index 80848a4..862fbc5 100644
--- a/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/SessionTag.aidl
+++ b/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/SessionTag.aidl
@@ -38,4 +38,5 @@
SURFACEFLINGER,
HWUI,
GAME,
+ APP,
}
diff --git a/power/aidl/android/hardware/power/SessionHint.aidl b/power/aidl/android/hardware/power/SessionHint.aidl
index ae91061..1a8c505 100644
--- a/power/aidl/android/hardware/power/SessionHint.aidl
+++ b/power/aidl/android/hardware/power/SessionHint.aidl
@@ -65,4 +65,11 @@
* this hint session can reduce GPU resources and still meet the target duration.
*/
GPU_LOAD_DOWN = 6,
+
+ /**
+ * This hint indicates an upcoming GPU workload that is completely changed and
+ * unknown. It means that the hint session should reset GPU resources to a known
+ * baseline to prepare for an arbitrary load, and must wake up if inactive.
+ */
+ GPU_LOAD_RESET = 7,
}
diff --git a/power/aidl/android/hardware/power/SessionTag.aidl b/power/aidl/android/hardware/power/SessionTag.aidl
index c1d48e4..27bf3e3 100644
--- a/power/aidl/android/hardware/power/SessionTag.aidl
+++ b/power/aidl/android/hardware/power/SessionTag.aidl
@@ -30,12 +30,20 @@
SURFACEFLINGER,
/**
- * This tag is used to mark HWUI hint sessions.
+ * This tag is used to mark hint sessions created by HWUI.
*/
HWUI,
/**
- * This tag is used to mark Game hint sessions.
+ * This tag is used to mark hint sessions created by applications that are
+ * categorized as games.
*/
GAME,
+
+ /**
+ * This tag is used to mark the hint session is created by the application.
+ * If an applications is categorized as game, then GAME should be used
+ * instead.
+ */
+ APP,
}
diff --git a/power/aidl/vts/VtsHalPowerTargetTest.cpp b/power/aidl/vts/VtsHalPowerTargetTest.cpp
index 11d44b8..d8e73bf 100644
--- a/power/aidl/vts/VtsHalPowerTargetTest.cpp
+++ b/power/aidl/vts/VtsHalPowerTargetTest.cpp
@@ -93,8 +93,6 @@
const std::vector<int32_t> kEmptyTids = {};
-const std::vector<WorkDuration> kNoDurations = {};
-
const std::vector<WorkDuration> kDurationsWithZero = {
DurationWrapper(1000L, 1L),
DurationWrapper(0L, 2L),
diff --git a/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/RegistrationFailCause.aidl b/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/RegistrationFailCause.aidl
index 56f516d..fcc079e 100644
--- a/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/RegistrationFailCause.aidl
+++ b/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/RegistrationFailCause.aidl
@@ -50,7 +50,11 @@
ROAMING_NOT_ALLOWED = 13,
GPRS_SERVICES_NOT_ALLOWED_IN_PLMN = 14,
NO_SUITABLE_CELLS = 15,
+ /**
+ * @deprecated MSC_TEMPORARILY_NOT_REACHABLE value is wrong and should not be used. Use MSC_TEMP_NOT_REACHABLE instead.
+ */
MSC_TEMPORARILY_NOT_REACHABLE = 15,
+ MSC_TEMP_NOT_REACHABLE = 16,
NETWORK_FAILURE = 17,
MAC_FAILURE = 20,
SYNC_FAILURE = 21,
diff --git a/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/SecurityAlgorithm.aidl b/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/SecurityAlgorithm.aidl
index 1664501..c590d2b 100644
--- a/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/SecurityAlgorithm.aidl
+++ b/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/SecurityAlgorithm.aidl
@@ -57,6 +57,7 @@
NEA1 = 56,
NEA2 = 57,
NEA3 = 58,
+ IMS_NULL = 67,
SIP_NULL = 68,
AES_GCM = 69,
AES_GMAC = 70,
@@ -64,9 +65,8 @@
DES_EDE3_CBC = 72,
AES_EDE3_CBC = 73,
HMAC_SHA1_96 = 74,
- HMAC_SHA1_96_null = 75,
- HMAC_MD5_96 = 76,
- HMAC_MD5_96_null = 77,
+ HMAC_MD5_96 = 75,
+ SRTP_NULL = 86,
SRTP_AES_COUNTER = 87,
SRTP_AES_F8 = 88,
SRTP_HMAC_SHA1 = 89,
diff --git a/radio/aidl/aidl_api/android.hardware.radio.sim/current/android/hardware/radio/sim/CarrierInfo.aidl b/radio/aidl/aidl_api/android.hardware.radio.sim/current/android/hardware/radio/sim/CarrierInfo.aidl
index 5838959..7d4a54b 100644
--- a/radio/aidl/aidl_api/android.hardware.radio.sim/current/android/hardware/radio/sim/CarrierInfo.aidl
+++ b/radio/aidl/aidl_api/android.hardware.radio.sim/current/android/hardware/radio/sim/CarrierInfo.aidl
@@ -41,7 +41,7 @@
@nullable String gid1;
@nullable String gid2;
@nullable String imsiPrefix;
- @nullable List<android.hardware.radio.sim.Plmn> ephlmn;
+ @nullable List<android.hardware.radio.sim.Plmn> ehplmn;
@nullable String iccid;
@nullable String impi;
}
diff --git a/radio/aidl/android/hardware/radio/network/IRadioNetworkIndication.aidl b/radio/aidl/android/hardware/radio/network/IRadioNetworkIndication.aidl
index 9c2502d..da82b78 100644
--- a/radio/aidl/android/hardware/radio/network/IRadioNetworkIndication.aidl
+++ b/radio/aidl/android/hardware/radio/network/IRadioNetworkIndication.aidl
@@ -231,16 +231,24 @@
/*
* Indicates that a new ciphering or integrity algorithm was used for a particular voice,
- * signaling, or data connection attempt for a given PLMN and/or access network. Due to
- * power concerns, once a connection type has been reported on, follow-up reports about that
- * connection type are only generated if there is any change to the previously reported
- * encryption or integrity. Thus the AP is only to be notified when there is new information.
- * List is reset upon rebooting thus info about initial connections is always passed to the
- * AP after a reboot. List is also reset if the SIM is changed or if there has been a change
- * in the access network.
+ * signaling, or data connection for a given PLMN and/or access network. Due to power
+ * concerns, once a connection type has been reported on, follow-up reports about that
+ * connection type are only generated if there is any change to the most-recently reported
+ * encryption or integrity, or if the value of SecurityAlgorithmUpdate#isUnprotectedEmergency
+ * changes. A change only in cell ID should not trigger an update, as the design is intended
+ * to be agnostic to dual connectivity ("secondary serving cells").
*
- * Note: a change only in cell ID should not trigger an update, as the design is intended to
- * be agnostic to dual connectivity ("secondary serving cells").
+ * Sample scenario to further clarify "most-recently reported":
+ *
+ * 1. Modem reports user is connected to a null-ciphered 3G network.
+ * 2. User then moves and connects to a well-ciphered 5G network, and modem reports this.
+ * 3. User returns to original location and reconnects to the null-ciphered 3G network. Modem
+ * should report this as it's different than the most-recently reported data from step (2).
+ *
+ * State is reset when (1) RadioState is transitioned to ON from any other state (e.g. radio
+ * is turned on during device boot, or modem boot), and (2) when CardState is transitioned
+ * to PRESENT from any other state (e.g. when SIM is inserted), or (3) if there is a change in
+ * access network (PLMN).
*
* @param type Type of radio indication
* @param securityAlgorithmUpdate SecurityAlgorithmUpdate encapsulates details of security
diff --git a/radio/aidl/android/hardware/radio/network/RegistrationFailCause.aidl b/radio/aidl/android/hardware/radio/network/RegistrationFailCause.aidl
index 2955f96..11fd8c5 100644
--- a/radio/aidl/android/hardware/radio/network/RegistrationFailCause.aidl
+++ b/radio/aidl/android/hardware/radio/network/RegistrationFailCause.aidl
@@ -86,10 +86,15 @@
*/
NO_SUITABLE_CELLS = 15,
/**
- * 16 - MSC temporarily not reachable
+ * @deprecated MSC_TEMPORARILY_NOT_REACHABLE value is wrong and should not be used.
+ * Use MSC_TEMP_NOT_REACHABLE instead.
*/
MSC_TEMPORARILY_NOT_REACHABLE = 15,
/**
+ * 16 - MSC temporarily not reachable
+ */
+ MSC_TEMP_NOT_REACHABLE = 16,
+ /**
* 17 - Network Failure
*/
NETWORK_FAILURE = 17,
diff --git a/radio/aidl/android/hardware/radio/network/SecurityAlgorithm.aidl b/radio/aidl/android/hardware/radio/network/SecurityAlgorithm.aidl
index 71c654c..19feeef 100644
--- a/radio/aidl/android/hardware/radio/network/SecurityAlgorithm.aidl
+++ b/radio/aidl/android/hardware/radio/network/SecurityAlgorithm.aidl
@@ -59,7 +59,8 @@
NEA2 = 57,
NEA3 = 58,
- // SIP layer security (See 3GPP TS 33.203)
+ // IMS and SIP layer security (See 3GPP TS 33.203)
+ IMS_NULL = 67,
SIP_NULL = 68,
AES_GCM = 69,
AES_GMAC = 70,
@@ -67,16 +68,15 @@
DES_EDE3_CBC = 72,
AES_EDE3_CBC = 73,
HMAC_SHA1_96 = 74,
- HMAC_SHA1_96_null = 75,
- HMAC_MD5_96 = 76,
- HMAC_MD5_96_null = 77,
+ HMAC_MD5_96 = 75,
// RTP (see 3GPP TS 33.328)
+ SRTP_NULL = 86,
SRTP_AES_COUNTER = 87,
SRTP_AES_F8 = 88,
SRTP_HMAC_SHA1 = 89,
- // ePDG (3GPP TS 33.402)
+ // ePDG (3GPP TS 33.402) (reserved for future use)
ENCR_AES_GCM_16 = 99,
ENCR_AES_CBC = 100,
AUTH_HMAC_SHA2_256_128 = 101,
diff --git a/radio/aidl/android/hardware/radio/sim/CarrierInfo.aidl b/radio/aidl/android/hardware/radio/sim/CarrierInfo.aidl
index a890497..74fe31b 100644
--- a/radio/aidl/android/hardware/radio/sim/CarrierInfo.aidl
+++ b/radio/aidl/android/hardware/radio/sim/CarrierInfo.aidl
@@ -56,7 +56,7 @@
* Equivalent HPLMN of the SIM card of the Carrier.
*/
@nullable
- List<Plmn> ephlmn;
+ List<Plmn> ehplmn;
/**
* ICCID (Integrated Circuit Card Identification) of the SIM card.
*/
diff --git a/radio/aidl/compat/libradiocompat/CallbackManager.cpp b/radio/aidl/compat/libradiocompat/CallbackManager.cpp
index c2eaed1..96aaebc 100644
--- a/radio/aidl/compat/libradiocompat/CallbackManager.cpp
+++ b/radio/aidl/compat/libradiocompat/CallbackManager.cpp
@@ -53,6 +53,10 @@
return *mRadioResponse;
}
+RadioIndication& CallbackManager::indication() const {
+ return *mRadioIndication;
+}
+
void CallbackManager::setResponseFunctionsDelayed() {
std::unique_lock<std::mutex> lock(mDelayedSetterGuard);
mDelayedSetterDeadline = std::chrono::steady_clock::now() + kDelayedSetterDelay;
diff --git a/radio/aidl/compat/libradiocompat/include/libradiocompat/CallbackManager.h b/radio/aidl/compat/libradiocompat/include/libradiocompat/CallbackManager.h
index f1a7b49..34ab5d7 100644
--- a/radio/aidl/compat/libradiocompat/include/libradiocompat/CallbackManager.h
+++ b/radio/aidl/compat/libradiocompat/include/libradiocompat/CallbackManager.h
@@ -46,6 +46,7 @@
~CallbackManager();
RadioResponse& response() const;
+ RadioIndication& indication() const;
template <typename ResponseType, typename IndicationType>
void setResponseFunctions(const std::shared_ptr<ResponseType>& response,
diff --git a/radio/aidl/vts/radio_config_response.cpp b/radio/aidl/vts/radio_config_response.cpp
index dccbd0e..c532440 100644
--- a/radio/aidl/vts/radio_config_response.cpp
+++ b/radio/aidl/vts/radio_config_response.cpp
@@ -41,8 +41,9 @@
}
ndk::ScopedAStatus RadioConfigResponse::getSimultaneousCallingSupportResponse(
- const RadioResponseInfo& info, const std::vector<int32_t>& /* enabledLogicalSlots */) {
+ const RadioResponseInfo& info, const std::vector<int32_t>& enabledLogicalSlots) {
rspInfo = info;
+ currentEnabledLogicalSlots = enabledLogicalSlots;
parent_config.notify(info.serial);
return ndk::ScopedAStatus::ok();
}
diff --git a/radio/aidl/vts/radio_config_test.cpp b/radio/aidl/vts/radio_config_test.cpp
index f725136..6f18d18 100644
--- a/radio/aidl/vts/radio_config_test.cpp
+++ b/radio/aidl/vts/radio_config_test.cpp
@@ -150,10 +150,17 @@
ALOGI("getSimultaneousCallingSupport, rspInfo.error = %s\n",
toString(radioRsp_config->rspInfo.error).c_str());
+ // REQUEST_NOT_SUPPORTED is omitted here because users of the V3 HAL should implement this
+ // method and return at least an empty array
ASSERT_TRUE(CheckAnyOfErrors(
radioRsp_config->rspInfo.error,
{RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE, RadioError::INTERNAL_ERR,
- RadioError::MODEM_ERR, RadioError::REQUEST_NOT_SUPPORTED}));
+ RadioError::MODEM_ERR}));
+
+ if (radioRsp_config->rspInfo.error == RadioError ::NONE) {
+ // The size of enabledLogicalSLots should be 0 or a positive number:
+ EXPECT_GE(radioRsp_config->currentEnabledLogicalSlots.size(), 0);
+ }
}
/*
diff --git a/radio/aidl/vts/radio_config_utils.h b/radio/aidl/vts/radio_config_utils.h
index 9e809ff..84c74fc 100644
--- a/radio/aidl/vts/radio_config_utils.h
+++ b/radio/aidl/vts/radio_config_utils.h
@@ -39,6 +39,7 @@
PhoneCapability phoneCap;
bool modemReducedFeatureSet1;
std::vector<SimSlotStatus> simSlotStatus;
+ std::vector<int32_t> currentEnabledLogicalSlots;
virtual ndk::ScopedAStatus getSimSlotsStatusResponse(
const RadioResponseInfo& info, const std::vector<SimSlotStatus>& slotStatus) override;
diff --git a/radio/aidl/vts/radio_network_test.cpp b/radio/aidl/vts/radio_network_test.cpp
index 32b246a..2e218c0 100644
--- a/radio/aidl/vts/radio_network_test.cpp
+++ b/radio/aidl/vts/radio_network_test.cpp
@@ -1422,19 +1422,12 @@
EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_network->rspInfo.type);
EXPECT_EQ(serial, radioRsp_network->rspInfo.serial);
- if (cardStatus.cardState == CardStatus::STATE_ABSENT) {
- ASSERT_TRUE(CheckAnyOfErrors(
- radioRsp_network->rspInfo.error,
- {RadioError::NONE, RadioError::ILLEGAL_SIM_OR_ME, RadioError::INVALID_ARGUMENTS,
- RadioError::INVALID_STATE, RadioError::RADIO_NOT_AVAILABLE, RadioError::NO_MEMORY,
- RadioError::INTERNAL_ERR, RadioError::SYSTEM_ERR, RadioError::CANCELLED}));
- } else if (cardStatus.cardState == CardStatus::STATE_PRESENT) {
- ASSERT_TRUE(CheckAnyOfErrors(
- radioRsp_network->rspInfo.error,
- {RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE, RadioError::INVALID_ARGUMENTS,
- RadioError::INVALID_STATE, RadioError::NO_MEMORY, RadioError::INTERNAL_ERR,
- RadioError::SYSTEM_ERR, RadioError::CANCELLED}));
- }
+ ASSERT_TRUE(CheckAnyOfErrors(
+ radioRsp_network->rspInfo.error,
+ {RadioError::NONE, RadioError::ILLEGAL_SIM_OR_ME, RadioError::RADIO_NOT_AVAILABLE,
+ RadioError::INVALID_ARGUMENTS, RadioError::INVALID_STATE, RadioError::NO_MEMORY,
+ RadioError::INTERNAL_ERR, RadioError::SYSTEM_ERR, RadioError::CANCELLED,
+ RadioError::MODEM_ERR, RadioError::OPERATION_NOT_ALLOWED, RadioError::NO_RESOURCES}));
}
/*
diff --git a/secure_element/1.0/vts/functional/VtsHalSecureElementV1_0TargetTest.cpp b/secure_element/1.0/vts/functional/VtsHalSecureElementV1_0TargetTest.cpp
index 63c2eca..1623960 100644
--- a/secure_element/1.0/vts/functional/VtsHalSecureElementV1_0TargetTest.cpp
+++ b/secure_element/1.0/vts/functional/VtsHalSecureElementV1_0TargetTest.cpp
@@ -75,6 +75,7 @@
se_->init(se_cb_);
auto res = se_cb_->WaitForCallback(kCallbackNameOnStateChange);
EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.args);
EXPECT_TRUE(res.args->state_);
}
diff --git a/secure_element/1.1/vts/functional/VtsHalSecureElementV1_1TargetTest.cpp b/secure_element/1.1/vts/functional/VtsHalSecureElementV1_1TargetTest.cpp
index 234c33c..d7e4546 100644
--- a/secure_element/1.1/vts/functional/VtsHalSecureElementV1_1TargetTest.cpp
+++ b/secure_element/1.1/vts/functional/VtsHalSecureElementV1_1TargetTest.cpp
@@ -72,6 +72,7 @@
se_->init_1_1(se_cb_);
auto res = se_cb_->WaitForCallback(kCallbackNameOnStateChange);
EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.args);
EXPECT_TRUE(res.args->state_);
EXPECT_NE(res.args->reason_, "");
}
diff --git a/secure_element/1.2/vts/functional/VtsHalSecureElementV1_2TargetTest.cpp b/secure_element/1.2/vts/functional/VtsHalSecureElementV1_2TargetTest.cpp
index 66d581e..26b2ded 100644
--- a/secure_element/1.2/vts/functional/VtsHalSecureElementV1_2TargetTest.cpp
+++ b/secure_element/1.2/vts/functional/VtsHalSecureElementV1_2TargetTest.cpp
@@ -73,6 +73,7 @@
se_->init_1_1(se_cb_);
auto res = se_cb_->WaitForCallback(kCallbackNameOnStateChange);
EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.args);
EXPECT_TRUE(res.args->state_);
EXPECT_NE(res.args->reason_, "");
}
@@ -93,10 +94,12 @@
auto res = se_cb_->WaitForCallback(kCallbackNameOnStateChange);
EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.args);
EXPECT_FALSE(res.args->state_);
res = se_cb_->WaitForCallback(kCallbackNameOnStateChange);
EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.args);
EXPECT_TRUE(res.args->state_);
}
diff --git a/audio/aidl/vts/VtsHalAudioCoreTargetTest.xml b/secure_element/aidl/vts/AndroidTest.xml
similarity index 61%
copy from audio/aidl/vts/VtsHalAudioCoreTargetTest.xml
copy to secure_element/aidl/vts/AndroidTest.xml
index 9d3adc1..94dfa82 100644
--- a/audio/aidl/vts/VtsHalAudioCoreTargetTest.xml
+++ b/secure_element/aidl/vts/AndroidTest.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2023 The Android Open Source Project
+<!-- Copyright (C) 2024 The Android Open 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,26 +13,21 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<configuration description="Runs VtsHalAudioCoreTargetTest.">
+<configuration description="Runs VtsHalSecureElementTargetTest.">
<option name="test-suite-tag" value="apct" />
<option name="test-suite-tag" value="apct-native" />
+ <option name="config-descriptor:metadata" key="token" value="SECURE_ELEMENT_SIM_CARD" />
- <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
- <target_preparer class="com.android.tradefed.targetprep.StopServicesSetup"/>
-
- <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
- <option name="run-command" value="setprop vts.native_server.on 1"/>
- <option name="teardown-command" value="setprop vts.native_server.on 0"/>
+ <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer">
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
<option name="cleanup" value="true" />
- <option name="push" value="VtsHalAudioCoreTargetTest->/data/local/tmp/VtsHalAudioCoreTargetTest" />
+ <option name="push" value="VtsHalSecureElementTargetTest->/data/local/tmp/VtsHalSecureElementTargetTest" />
</target_preparer>
<test class="com.android.tradefed.testtype.GTest" >
<option name="native-test-device-path" value="/data/local/tmp" />
- <option name="module-name" value="VtsHalAudioCoreTargetTest" />
- <option name="native-test-timeout" value="10m" />
+ <option name="module-name" value="VtsHalSecureElementTargetTest" />
</test>
</configuration>
diff --git a/security/authgraph/aidl/android/hardware/security/authgraph/ExplicitKeyDiceCertChain.cddl b/security/authgraph/aidl/android/hardware/security/authgraph/ExplicitKeyDiceCertChain.cddl
index 3de5617..2d6c696 100644
--- a/security/authgraph/aidl/android/hardware/security/authgraph/ExplicitKeyDiceCertChain.cddl
+++ b/security/authgraph/aidl/android/hardware/security/authgraph/ExplicitKeyDiceCertChain.cddl
@@ -19,11 +19,10 @@
* DiceChainEntry
]
-DiceCertChainInitialPayload = {
- -4670552 : bstr .cbor PubKeyEd25519 /
- bstr .cbor PubKeyECDSA256 /
- bstr .cbor PubKeyECDSA384 ; subjectPublicKey
-}
+; Encoded in accordance with Core Deterministic Encoding Requirements [RFC 8949 s4.2.1]
+DiceCertChainInitialPayload = bstr .cbor PubKeyEd25519
+ / bstr .cbor PubKeyECDSA256
+ / bstr .cbor PubKeyECDSA384 ; subjectPublicKey
; INCLUDE generateCertificateRequestV2.cddl for: PubKeyEd25519, PubKeyECDSA256, PubKeyECDSA384,
; DiceChainEntry
diff --git a/security/authgraph/default/src/lib.rs b/security/authgraph/default/src/lib.rs
index 1f851b2..1d6ffb3 100644
--- a/security/authgraph/default/src/lib.rs
+++ b/security/authgraph/default/src/lib.rs
@@ -22,6 +22,7 @@
ta::{AuthGraphTa, Role},
};
use authgraph_hal::channel::SerializedChannel;
+use log::error;
use std::cell::RefCell;
use std::rc::Rc;
use std::sync::{mpsc, Mutex};
@@ -57,10 +58,23 @@
);
// Loop forever processing request messages.
loop {
- let req_data: Vec<u8> = in_rx.recv().expect("failed to receive next req");
+ let req_data: Vec<u8> = match in_rx.recv() {
+ Ok(data) => data,
+ Err(_) => {
+ error!("local TA failed to receive request!");
+ break;
+ }
+ };
let rsp_data = ta.process(&req_data);
- out_tx.send(rsp_data).expect("failed to send out rsp");
+ match out_tx.send(rsp_data) {
+ Ok(_) => {}
+ Err(_) => {
+ error!("local TA failed to send out response");
+ break;
+ }
+ }
}
+ error!("local TA terminating!");
});
Ok(Self {
channels: Mutex::new(Channels { in_tx, out_rx }),
diff --git a/security/keymint/aidl/vts/functional/KeyBlobUpgradeTest.cpp b/security/keymint/aidl/vts/functional/KeyBlobUpgradeTest.cpp
index 7ccd246..c2509b8 100644
--- a/security/keymint/aidl/vts/functional/KeyBlobUpgradeTest.cpp
+++ b/security/keymint/aidl/vts/functional/KeyBlobUpgradeTest.cpp
@@ -258,7 +258,8 @@
if (upgraded_keyblob.empty()) {
std::cerr << "Keyblob '" << name << "' did not require upgrade\n";
- EXPECT_TRUE(!expectUpgrade) << "Keyblob '" << name << "' unexpectedly upgraded";
+ EXPECT_FALSE(expectUpgrade)
+ << "Keyblob '" << name << "' unexpectedly left as-is";
} else {
// Ensure the old format keyblob is deleted (so any secure deletion data is
// cleaned up).
@@ -275,8 +276,7 @@
save_keyblob(subdir, name, upgraded_keyblob, key_characteristics);
// Cert file is left unchanged.
std::cerr << "Keyblob '" << name << "' upgraded\n";
- EXPECT_TRUE(expectUpgrade)
- << "Keyblob '" << name << "' unexpectedly left as-is";
+ EXPECT_TRUE(expectUpgrade) << "Keyblob '" << name << "' unexpectedly upgraded";
}
}
}
diff --git a/security/keymint/aidl/vts/functional/KeyMintTest.cpp b/security/keymint/aidl/vts/functional/KeyMintTest.cpp
index d4adab5..a2e20dc 100644
--- a/security/keymint/aidl/vts/functional/KeyMintTest.cpp
+++ b/security/keymint/aidl/vts/functional/KeyMintTest.cpp
@@ -8796,10 +8796,11 @@
} // namespace aidl::android::hardware::security::keymint::test
+using aidl::android::hardware::security::keymint::test::KeyMintAidlTestBase;
+
int main(int argc, char** argv) {
std::cout << "Testing ";
- auto halInstances =
- aidl::android::hardware::security::keymint::test::KeyMintAidlTestBase::build_params();
+ auto halInstances = KeyMintAidlTestBase::build_params();
std::cout << "HAL instances:\n";
for (auto& entry : halInstances) {
std::cout << " " << entry << '\n';
@@ -8809,12 +8810,10 @@
for (int i = 1; i < argc; ++i) {
if (argv[i][0] == '-') {
if (std::string(argv[i]) == "--arm_deleteAllKeys") {
- aidl::android::hardware::security::keymint::test::KeyMintAidlTestBase::
- arm_deleteAllKeys = true;
+ KeyMintAidlTestBase::arm_deleteAllKeys = true;
}
if (std::string(argv[i]) == "--dump_attestations") {
- aidl::android::hardware::security::keymint::test::KeyMintAidlTestBase::
- dump_Attestations = true;
+ KeyMintAidlTestBase::dump_Attestations = true;
} else {
std::cout << "NOT dumping attestations" << std::endl;
}
@@ -8829,8 +8828,7 @@
std::cerr << "Missing argument for --keyblob_dir\n";
return 1;
}
- aidl::android::hardware::security::keymint::test::KeyMintAidlTestBase::keyblob_dir =
- std::string(argv[i + 1]);
+ KeyMintAidlTestBase::keyblob_dir = std::string(argv[i + 1]);
++i;
}
if (std::string(argv[i]) == "--expect_upgrade") {
@@ -8839,11 +8837,17 @@
return 1;
}
std::string arg = argv[i + 1];
- aidl::android::hardware::security::keymint::test::KeyMintAidlTestBase::
- expect_upgrade =
- arg == "yes"
- ? true
- : (arg == "no" ? false : std::optional<bool>(std::nullopt));
+ KeyMintAidlTestBase::expect_upgrade =
+ arg == "yes" ? true
+ : (arg == "no" ? false : std::optional<bool>(std::nullopt));
+ if (KeyMintAidlTestBase::expect_upgrade.has_value()) {
+ std::cout << "expect_upgrade = "
+ << (KeyMintAidlTestBase::expect_upgrade.value() ? "true" : "false")
+ << std::endl;
+ } else {
+ std::cerr << "Error! Option --expect_upgrade " << arg << " unrecognized"
+ << std::endl;
+ }
++i;
}
}
diff --git a/security/rkp/README.md b/security/rkp/README.md
index 2180d0f..2d00b83 100644
--- a/security/rkp/README.md
+++ b/security/rkp/README.md
@@ -210,10 +210,10 @@
describes an RKP VM. If there are further certificates without the RKP VM
marker, then the chain does not describe an RKP VM.
- Implementations must include the first RPK VM marker as early as possible
+ Implementations must include the first RKP VM marker as early as possible
after the point of divergence between TEE and non-TEE components in the DICE
chain, prior to loading the Android Bootloader (ABL).
2. "widevine" or "keymint": If there are no certificates with the RKP VM
marker then it describes a TEE component.
3. None: Any component described by a DICE chain that does not match the above
- two categories.
\ No newline at end of file
+ two categories.
diff --git a/security/rkp/aidl/Android.bp b/security/rkp/aidl/Android.bp
index e9e2021..adc63f6 100644
--- a/security/rkp/aidl/Android.bp
+++ b/security/rkp/aidl/Android.bp
@@ -25,6 +25,9 @@
"//apex_available:platform",
"com.android.rkpd",
],
+ lint: {
+ baseline_filename: "lint-baseline.xml",
+ },
},
rust: {
enabled: true,
diff --git a/security/rkp/aidl/lint-baseline.xml b/security/rkp/aidl/lint-baseline.xml
index d25d383..8e98094 100644
--- a/security/rkp/aidl/lint-baseline.xml
+++ b/security/rkp/aidl/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-dev" type="baseline" dependencies="true" variant="all" version="8.0.0-dev">
+<issues format="6" by="lint 8.4.0-alpha01" type="baseline" client="" dependencies="true" name="" variant="all" version="8.4.0-alpha01">
<issue
id="NewApi"
@@ -7,8 +7,8 @@
errorLine1=" this.markVintfStability();"
errorLine2=" ~~~~~~~~~~~~~~~~~~">
<location
- file="out/.intermediates/hardware/interfaces/security/rkp/aidl/android.hardware.security.rkp-V1-java-source/gen/android/hardware/security/keymint/IRemotelyProvisionedComponent.java"
- line="50"
+ file="out/soong/.intermediates/hardware/interfaces/security/rkp/aidl/android.hardware.security.rkp-V1-java-source/gen/android/hardware/security/keymint/IRemotelyProvisionedComponent.java"
+ line="52"
column="12"/>
</issue>
@@ -18,8 +18,8 @@
errorLine1=" this.markVintfStability();"
errorLine2=" ~~~~~~~~~~~~~~~~~~">
<location
- file="out/.intermediates/hardware/interfaces/security/rkp/aidl/android.hardware.security.rkp-V2-java-source/gen/android/hardware/security/keymint/IRemotelyProvisionedComponent.java"
- line="50"
+ file="out/soong/.intermediates/hardware/interfaces/security/rkp/aidl/android.hardware.security.rkp-V2-java-source/gen/android/hardware/security/keymint/IRemotelyProvisionedComponent.java"
+ line="52"
column="12"/>
</issue>
@@ -29,8 +29,19 @@
errorLine1=" this.markVintfStability();"
errorLine2=" ~~~~~~~~~~~~~~~~~~">
<location
- file="out/.intermediates/hardware/interfaces/security/rkp/aidl/android.hardware.security.rkp-V3-java-source/gen/android/hardware/security/keymint/IRemotelyProvisionedComponent.java"
- line="495"
+ file="out/soong/.intermediates/hardware/interfaces/security/rkp/aidl/android.hardware.security.rkp-V3-java-source/gen/android/hardware/security/keymint/IRemotelyProvisionedComponent.java"
+ line="56"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 34 (current min is 33): `android.os.Binder#markVintfStability`"
+ errorLine1=" this.markVintfStability();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/soong/.intermediates/hardware/interfaces/security/rkp/aidl/android.hardware.security.rkp-V4-java-source/gen/android/hardware/security/keymint/IRemotelyProvisionedComponent.java"
+ line="257"
column="12"/>
</issue>
diff --git a/security/rkp/aidl/vts/functional/VtsRemotelyProvisionedComponentTests.cpp b/security/rkp/aidl/vts/functional/VtsRemotelyProvisionedComponentTests.cpp
index a1de93e..68b966c 100644
--- a/security/rkp/aidl/vts/functional/VtsRemotelyProvisionedComponentTests.cpp
+++ b/security/rkp/aidl/vts/functional/VtsRemotelyProvisionedComponentTests.cpp
@@ -402,7 +402,7 @@
for (auto& key : keysToSign_) {
bytevec privateKeyBlob;
auto status = provisionable_->generateEcdsaP256KeyPair(testMode, &key, &privateKeyBlob);
- ASSERT_TRUE(status.isOk()) << status.getMessage();
+ ASSERT_TRUE(status.isOk()) << status.getDescription();
vector<uint8_t> payload_value;
check_maced_pubkey(key, testMode, &payload_value);
@@ -447,7 +447,7 @@
auto status = provisionable_->generateCertificateRequest(
testMode, {} /* keysToSign */, testEekChain_.chain, challenge_, &deviceInfo,
&protectedData, &keysToSignMac);
- ASSERT_TRUE(status.isOk()) << status.getMessage();
+ ASSERT_TRUE(status.isOk()) << status.getDescription();
auto result = verifyProductionProtectedData(
deviceInfo, cppbor::Array(), keysToSignMac, protectedData, testEekChain_, eekId_,
@@ -472,7 +472,7 @@
auto status = provisionable_->generateCertificateRequest(
testMode, {} /* keysToSign */, testEekChain_.chain, challenge_, &deviceInfo,
&protectedData, &keysToSignMac);
- ASSERT_TRUE(status.isOk()) << status.getMessage();
+ ASSERT_TRUE(status.isOk()) << status.getDescription();
auto firstBcc = verifyProductionProtectedData(
deviceInfo, /*keysToSign=*/cppbor::Array(), keysToSignMac, protectedData, testEekChain_,
@@ -482,7 +482,7 @@
status = provisionable_->generateCertificateRequest(
testMode, {} /* keysToSign */, testEekChain_.chain, challenge_, &deviceInfo,
&protectedData, &keysToSignMac);
- ASSERT_TRUE(status.isOk()) << status.getMessage();
+ ASSERT_TRUE(status.isOk()) << status.getDescription();
auto secondBcc = verifyProductionProtectedData(
deviceInfo, /*keysToSign=*/cppbor::Array(), keysToSignMac, protectedData, testEekChain_,
@@ -532,7 +532,7 @@
auto status = provisionable_->generateCertificateRequest(
testMode, keysToSign_, testEekChain_.chain, challenge_, &deviceInfo, &protectedData,
&keysToSignMac);
- ASSERT_TRUE(status.isOk()) << status.getMessage();
+ ASSERT_TRUE(status.isOk()) << status.getDescription();
auto result = verifyProductionProtectedData(
deviceInfo, cborKeysToSign_, keysToSignMac, protectedData, testEekChain_, eekId_,
@@ -576,7 +576,7 @@
auto status = provisionable_->generateCertificateRequest(
testMode, {keyWithCorruptMac}, testEekChain_.chain, challenge_, &deviceInfo,
&protectedData, &keysToSignMac);
- ASSERT_FALSE(status.isOk()) << status.getMessage();
+ ASSERT_FALSE(status.isOk()) << status.getDescription();
EXPECT_EQ(status.getServiceSpecificError(), BnRemotelyProvisionedComponent::STATUS_INVALID_MAC);
}
@@ -596,7 +596,7 @@
auto status = provisionable_->generateCertificateRequest(
testMode, {keyWithCorruptMac}, getProdEekChain(rpcHardwareInfo.supportedEekCurve),
challenge_, &deviceInfo, &protectedData, &keysToSignMac);
- ASSERT_FALSE(status.isOk()) << status.getMessage();
+ ASSERT_FALSE(status.isOk()) << status.getDescription();
EXPECT_EQ(status.getServiceSpecificError(), BnRemotelyProvisionedComponent::STATUS_INVALID_MAC);
}
@@ -722,7 +722,7 @@
auto challenge = randomBytes(size);
auto status =
provisionable_->generateCertificateRequestV2({} /* keysToSign */, challenge, &csr);
- ASSERT_TRUE(status.isOk()) << status.getMessage();
+ ASSERT_TRUE(status.isOk()) << status.getDescription();
auto result = verifyProductionCsr(cppbor::Array(), csr, provisionable_.get(), challenge);
ASSERT_TRUE(result) << result.message();
@@ -743,7 +743,7 @@
SCOPED_TRACE(testing::Message() << "challenge[" << size << "]");
auto challenge = randomBytes(size);
auto status = provisionable_->generateCertificateRequestV2(keysToSign_, challenge, &csr);
- ASSERT_TRUE(status.isOk()) << status.getMessage();
+ ASSERT_TRUE(status.isOk()) << status.getDescription();
auto result = verifyProductionCsr(cborKeysToSign_, csr, provisionable_.get(), challenge);
ASSERT_TRUE(result) << result.message();
@@ -758,7 +758,7 @@
auto status = provisionable_->generateCertificateRequestV2(
/* keysToSign */ {}, randomBytes(MAX_CHALLENGE_SIZE + 1), &csr);
- EXPECT_FALSE(status.isOk()) << status.getMessage();
+ EXPECT_FALSE(status.isOk()) << status.getDescription();
EXPECT_EQ(status.getServiceSpecificError(), BnRemotelyProvisionedComponent::STATUS_FAILED);
}
@@ -773,13 +773,13 @@
bytevec csr;
auto status = provisionable_->generateCertificateRequestV2(keysToSign_, challenge_, &csr);
- ASSERT_TRUE(status.isOk()) << status.getMessage();
+ ASSERT_TRUE(status.isOk()) << status.getDescription();
auto firstCsr = verifyProductionCsr(cborKeysToSign_, csr, provisionable_.get(), challenge_);
ASSERT_TRUE(firstCsr) << firstCsr.message();
status = provisionable_->generateCertificateRequestV2(keysToSign_, challenge_, &csr);
- ASSERT_TRUE(status.isOk()) << status.getMessage();
+ ASSERT_TRUE(status.isOk()) << status.getDescription();
auto secondCsr = verifyProductionCsr(cborKeysToSign_, csr, provisionable_.get(), challenge_);
ASSERT_TRUE(secondCsr) << secondCsr.message();
@@ -797,7 +797,7 @@
bytevec csr;
auto status = provisionable_->generateCertificateRequestV2(keysToSign_, challenge_, &csr);
- ASSERT_TRUE(status.isOk()) << status.getMessage();
+ ASSERT_TRUE(status.isOk()) << status.getDescription();
auto result = verifyProductionCsr(cborKeysToSign_, csr, provisionable_.get(), challenge_);
ASSERT_TRUE(result) << result.message();
@@ -815,7 +815,7 @@
bytevec csr;
auto status =
provisionable_->generateCertificateRequestV2({keyWithCorruptMac}, challenge_, &csr);
- ASSERT_FALSE(status.isOk()) << status.getMessage();
+ ASSERT_FALSE(status.isOk()) << status.getDescription();
EXPECT_EQ(status.getServiceSpecificError(), BnRemotelyProvisionedComponent::STATUS_INVALID_MAC);
}
@@ -829,7 +829,7 @@
auto status = provisionable_->generateCertificateRequest(
false /* testMode */, {} /* keysToSign */, {} /* EEK chain */, challenge_, &deviceInfo,
&protectedData, &keysToSignMac);
- ASSERT_FALSE(status.isOk()) << status.getMessage();
+ ASSERT_FALSE(status.isOk()) << status.getDescription();
EXPECT_EQ(status.getServiceSpecificError(), BnRemotelyProvisionedComponent::STATUS_REMOVED);
}
@@ -843,7 +843,7 @@
auto status = provisionable_->generateCertificateRequest(
true /* testMode */, {} /* keysToSign */, {} /* EEK chain */, challenge_, &deviceInfo,
&protectedData, &keysToSignMac);
- ASSERT_FALSE(status.isOk()) << status.getMessage();
+ ASSERT_FALSE(status.isOk()) << status.getDescription();
EXPECT_EQ(status.getServiceSpecificError(), BnRemotelyProvisionedComponent::STATUS_REMOVED);
}
@@ -927,7 +927,7 @@
bytevec csr;
irpcStatus =
provisionable_->generateCertificateRequestV2({} /* keysToSign */, challenge_, &csr);
- ASSERT_TRUE(irpcStatus.isOk()) << irpcStatus.getMessage();
+ ASSERT_TRUE(irpcStatus.isOk()) << irpcStatus.getDescription();
auto result = verifyProductionCsr(cppbor::Array(), csr, provisionable_.get(), challenge_);
ASSERT_TRUE(result) << result.message();
diff --git a/security/secretkeeper/aidl/aidl_api/android.hardware.security.secretkeeper/current/android/hardware/security/secretkeeper/SecretId.aidl b/security/secretkeeper/aidl/aidl_api/android.hardware.security.secretkeeper/current/android/hardware/security/secretkeeper/SecretId.aidl
index 87d0233..9887066 100644
--- a/security/secretkeeper/aidl/aidl_api/android.hardware.security.secretkeeper/current/android/hardware/security/secretkeeper/SecretId.aidl
+++ b/security/secretkeeper/aidl/aidl_api/android.hardware.security.secretkeeper/current/android/hardware/security/secretkeeper/SecretId.aidl
@@ -35,5 +35,5 @@
/* @hide */
@VintfStability
parcelable SecretId {
- byte[] id;
+ byte[64] id;
}
diff --git a/security/secretkeeper/aidl/android/hardware/security/secretkeeper/ISecretkeeper.aidl b/security/secretkeeper/aidl/android/hardware/security/secretkeeper/ISecretkeeper.aidl
index 49c3446..b07dba8 100644
--- a/security/secretkeeper/aidl/android/hardware/security/secretkeeper/ISecretkeeper.aidl
+++ b/security/secretkeeper/aidl/android/hardware/security/secretkeeper/ISecretkeeper.aidl
@@ -39,9 +39,14 @@
/**
* Retrieve the instance of the `IAuthGraphKeyExchange` HAL that should be used for shared
- * session key establishment. These keys are used to perform encryption of messages as
+ * session key establishment. These keys are used to perform encryption of messages as
* described in SecretManagement.cddl, allowing the client and Secretkeeper to have a
- * cryptographically secure channel.
+ * cryptographically secure channel. In the key exchange protocol the client acts as P1
+ * (source) and Secretkeeper as P2 (sink). The interface returned here can be used to invoke
+ * methods on the sink.
+ *
+ * The client's identity is its DICE chain; Secretkeeper's identity is a
+ * per-boot key pair.
*/
IAuthGraphKeyExchange getAuthGraphKe();
@@ -56,8 +61,8 @@
* ProtectedRequestPacket & ProtectedResponsePacket using symmetric keys agreed between
* the client & service. This cryptographic protection is required because the messages are
* ferried via Android, which is allowed to be outside the TCB of clients (for example protected
- * Virtual Machines). For this, service (& client) must implement a key exchange protocol, which
- * is critical for establishing the secure channel.
+ * Virtual Machines). For this, service (& client) must implement the AuthGraph key exchange
+ * protocol to establish a secure channel between them.
*
* If an encrypted response cannot be generated, then a service-specific Binder error using one
* of the ERROR_ codes above will be returned.
diff --git a/security/secretkeeper/aidl/android/hardware/security/secretkeeper/SecretId.aidl b/security/secretkeeper/aidl/android/hardware/security/secretkeeper/SecretId.aidl
index bd982e7..b17917f 100644
--- a/security/secretkeeper/aidl/android/hardware/security/secretkeeper/SecretId.aidl
+++ b/security/secretkeeper/aidl/android/hardware/security/secretkeeper/SecretId.aidl
@@ -25,5 +25,5 @@
/**
* 64-byte identifier for a secret.
*/
- byte[] id;
+ byte[64] id;
}
diff --git a/security/secretkeeper/aidl/android/hardware/security/secretkeeper/SecretManagement.cddl b/security/secretkeeper/aidl/android/hardware/security/secretkeeper/SecretManagement.cddl
index 3d08078..6a824c9 100644
--- a/security/secretkeeper/aidl/android/hardware/security/secretkeeper/SecretManagement.cddl
+++ b/security/secretkeeper/aidl/android/hardware/security/secretkeeper/SecretManagement.cddl
@@ -3,10 +3,11 @@
; The input parameter to the `processSecretManagementRequest` operation in
; `ISecretkeeper.aidl` is always an encrypted request message, CBOR-encoded as a
; COSE_Encrypt0 object. The encryption uses the first of the keys agreed using
-; the associated AuthGraph instance, referred to as `KeySourceToSink`.
-ProtectedRequestPacket = CryptoPayload<RequestPacket, KeySourceToSink>
+; the associated AuthGraph instance, referred to as `KeySourceToSink`. Additionally,
+; an external aad is used - RequestSeqNum.
+ProtectedRequestPacket = CryptoPayload<RequestPacket, KeySourceToSink, RequestSeqNum>
-CryptoPayload<Payload, Key> = [ ; COSE_Encrypt0 (untagged), [RFC 9052 s5.2]
+CryptoPayload<Payload, Key, SeqNum> = [ ; COSE_Encrypt0 (untagged), [RFC 9052 s5.2]
protected: bstr .cbor {
1 : 3, ; Algorithm: AES-GCM mode w/ 256-bit key, 128-bit tag
4 : bstr ; key identifier set to session ID produced
@@ -17,7 +18,7 @@
},
ciphertext : bstr ; AES-GCM-256(Key, bstr .cbor Payload)
; AAD for the encryption is CBOR-serialized
- ; Enc_structure (RFC 9052 s5.3) with empty external_aad.
+ ; Enc_structure (RFC 9052 s5.3) with SeqNum as the external_aad.
]
; Once decrypted, the request packet is an encoded CBOR array holding:
@@ -58,10 +59,18 @@
SecretId = bstr .size 64 ; Unique identifier of the secret.
Secret = bstr .size 32 ; The secret value.
+; A monotonically incrementing number is associated with each RequestPacket to prevent replay
+; of messages within a session. This starts with 0 and is incremented (by 1) for each request
+; in a session. Secretkeeper implementation must maintain an expected RequestSeqNum for each
+; session (increasing it by 1 for each SecretManagement request received). This will be used in
+; in decryption (external_aad).
+RequestSeqNum = bstr .cbor uint ; Encoded in accordance with Core Deterministic Encoding
+ ; Requirements [RFC 8949 s4.2.1]
+
; The return value from a successful `processSecretManagementRequest` operation is a
; response message encrypted with the second of the keys agreed using the associated
; AuthGraph instance, referred to as `KeySinkToSource`.
-ProtectedResponsePacket = CryptoPayload<ResponsePacket, KeySinkToSource>
+ProtectedResponsePacket = CryptoPayload<ResponsePacket, KeySinkToSource, ResponseSeqNum>
; Once decrypted, the inner response message is encoded as a CBOR array holding:
; - An initial integer return code value.
@@ -82,7 +91,7 @@
; Requested Entry not found.
ErrorCode_EntryNotFound: 3,
; Error happened while serialization or deserialization.
- SerializationError: 4,
+ ErrorCode_SerializationError: 4,
; Indicates that Dice Policy matching did not succeed & hence access not granted.
ErrorCode_DicePolicyError: 5,
)
@@ -95,8 +104,13 @@
GetSecretResult,
)
-GetVersionResult = (version : uint)
+GetVersionResult = (1)
StoreSecretResult = ()
GetSecretResult = (secret : Secret)
+
+; Analogous to RequestSeqNum, Secretkeeper must maintain ResponseSeqNum for each session.
+; This will be input to the encryption (ProtectedResponsePacket) as external_aad.
+ResponseSeqNum = bstr .cbor uint ; Encoded in accordance with Core Deterministic Encoding
+ ; Requirements [RFC 8949 s4.2.1]
diff --git a/security/secretkeeper/aidl/vts/Android.bp b/security/secretkeeper/aidl/vts/Android.bp
index 7fc7a70..9d1701a 100644
--- a/security/secretkeeper/aidl/vts/Android.bp
+++ b/security/secretkeeper/aidl/vts/Android.bp
@@ -18,26 +18,65 @@
default_applicable_licenses: ["Android-Apache-2.0"],
}
+rust_library {
+ name: "libsecretkeeper_test",
+ crate_name: "secretkeeper_test",
+ srcs: ["lib.rs"],
+ rustlibs: [
+ "libciborium",
+ "libcoset",
+ "libdiced_open_dice",
+ "liblog_rust",
+ "libsecretkeeper_client",
+ ],
+}
+
rust_test {
name: "VtsSecretkeeperTargetTest",
srcs: ["secretkeeper_test_client.rs"],
+ defaults: [
+ "rdroidtest.defaults",
+ ],
test_suites: [
"general-tests",
"vts",
],
test_config: "AndroidTest.xml",
rustlibs: [
- "libsecretkeeper_comm_nostd",
- "libsecretkeeper_core_nostd",
"android.hardware.security.secretkeeper-V1-rust",
"libauthgraph_boringssl",
"libauthgraph_core",
- "libcoset",
"libauthgraph_vts_test",
"libbinder_rs",
+ "libciborium",
"libcoset",
+ "libdice_policy",
"liblog_rust",
- "liblogger",
+ "libsecretkeeper_client",
+ "libsecretkeeper_comm_nostd",
+ "libsecretkeeper_core_nostd",
+ "libsecretkeeper_test",
],
require_root: true,
}
+
+rust_binary {
+ name: "secretkeeper_cli",
+ srcs: ["secretkeeper_cli.rs"],
+ lints: "android",
+ rlibs: [
+ "android.hardware.security.secretkeeper-V1-rust",
+ "libanyhow",
+ "libauthgraph_boringssl",
+ "libauthgraph_core",
+ "libbinder_rs",
+ "libclap",
+ "libcoset",
+ "libdice_policy",
+ "libhex",
+ "liblog_rust",
+ "libsecretkeeper_client",
+ "libsecretkeeper_comm_nostd",
+ "libsecretkeeper_test",
+ ],
+}
diff --git a/security/secretkeeper/aidl/vts/dice_sample.rs b/security/secretkeeper/aidl/vts/dice_sample.rs
new file mode 100644
index 0000000..db532b1
--- /dev/null
+++ b/security/secretkeeper/aidl/vts/dice_sample.rs
@@ -0,0 +1,185 @@
+/*
+ * 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 module provides a set of sample DICE chains for testing purpose only. Note that this
+//! module duplicates a large chunk of code in libdiced_sample_inputs. We avoid modifying the
+//! latter for testing purposes because it is installed on device.
+
+use ciborium::{de, ser, value::Value};
+use core::ffi::CStr;
+use coset::{iana, Algorithm, AsCborValue, CoseKey, KeyOperation, KeyType, Label};
+use diced_open_dice::{
+ derive_cdi_private_key_seed, keypair_from_seed, retry_bcc_format_config_descriptor,
+ retry_bcc_main_flow, retry_dice_main_flow, Config, DiceArtifacts, DiceConfigValues, DiceError,
+ DiceMode, InputValues, OwnedDiceArtifacts, CDI_SIZE, HASH_SIZE, HIDDEN_SIZE,
+};
+use log::error;
+use secretkeeper_client::dice::OwnedDiceArtifactsWithExplicitKey;
+
+/// Sample UDS used to perform the root DICE flow by `make_sample_bcc_and_cdis`.
+const UDS: &[u8; CDI_SIZE] = &[
+ 0x65, 0x4f, 0xab, 0xa9, 0xa5, 0xad, 0x0f, 0x5e, 0x15, 0xc3, 0x12, 0xf7, 0x77, 0x45, 0xfa, 0x55,
+ 0x18, 0x6a, 0xa6, 0x34, 0xb6, 0x7c, 0x82, 0x7b, 0x89, 0x4c, 0xc5, 0x52, 0xd3, 0x27, 0x35, 0x8e,
+];
+
+const CODE_HASH_ABL: [u8; HASH_SIZE] = [
+ 0x16, 0x48, 0xf2, 0x55, 0x53, 0x23, 0xdd, 0x15, 0x2e, 0x83, 0x38, 0xc3, 0x64, 0x38, 0x63, 0x26,
+ 0x0f, 0xcf, 0x5b, 0xd1, 0x3a, 0xd3, 0x40, 0x3e, 0x23, 0xf8, 0x34, 0x4c, 0x6d, 0xa2, 0xbe, 0x25,
+ 0x1c, 0xb0, 0x29, 0xe8, 0xc3, 0xfb, 0xb8, 0x80, 0xdc, 0xb1, 0xd2, 0xb3, 0x91, 0x4d, 0xd3, 0xfb,
+ 0x01, 0x0f, 0xe4, 0xe9, 0x46, 0xa2, 0xc0, 0x26, 0x57, 0x5a, 0xba, 0x30, 0xf7, 0x15, 0x98, 0x14,
+];
+const AUTHORITY_HASH_ABL: [u8; HASH_SIZE] = [
+ 0xf9, 0x00, 0x9d, 0xc2, 0x59, 0x09, 0xe0, 0xb6, 0x98, 0xbd, 0xe3, 0x97, 0x4a, 0xcb, 0x3c, 0xe7,
+ 0x6b, 0x24, 0xc3, 0xe4, 0x98, 0xdd, 0xa9, 0x6a, 0x41, 0x59, 0x15, 0xb1, 0x23, 0xe6, 0xc8, 0xdf,
+ 0xfb, 0x52, 0xb4, 0x52, 0xc1, 0xb9, 0x61, 0xdd, 0xbc, 0x5b, 0x37, 0x0e, 0x12, 0x12, 0xb2, 0xfd,
+ 0xc1, 0x09, 0xb0, 0xcf, 0x33, 0x81, 0x4c, 0xc6, 0x29, 0x1b, 0x99, 0xea, 0xae, 0xfd, 0xaa, 0x0d,
+];
+const HIDDEN_ABL: [u8; HIDDEN_SIZE] = [
+ 0xa2, 0x01, 0xd0, 0xc0, 0xaa, 0x75, 0x3c, 0x06, 0x43, 0x98, 0x6c, 0xc3, 0x5a, 0xb5, 0x5f, 0x1f,
+ 0x0f, 0x92, 0x44, 0x3b, 0x0e, 0xd4, 0x29, 0x75, 0xe3, 0xdb, 0x36, 0xda, 0xc8, 0x07, 0x97, 0x4d,
+ 0xff, 0xbc, 0x6a, 0xa4, 0x8a, 0xef, 0xc4, 0x7f, 0xf8, 0x61, 0x7d, 0x51, 0x4d, 0x2f, 0xdf, 0x7e,
+ 0x8c, 0x3d, 0xa3, 0xfc, 0x63, 0xd4, 0xd4, 0x74, 0x8a, 0xc4, 0x14, 0x45, 0x83, 0x6b, 0x12, 0x7e,
+];
+const CODE_HASH_AVB: [u8; HASH_SIZE] = [
+ 0xa4, 0x0c, 0xcb, 0xc1, 0xbf, 0xfa, 0xcc, 0xfd, 0xeb, 0xf4, 0xfc, 0x43, 0x83, 0x7f, 0x46, 0x8d,
+ 0xd8, 0xd8, 0x14, 0xc1, 0x96, 0x14, 0x1f, 0x6e, 0xb3, 0xa0, 0xd9, 0x56, 0xb3, 0xbf, 0x2f, 0xfa,
+ 0x88, 0x70, 0x11, 0x07, 0x39, 0xa4, 0xd2, 0xa9, 0x6b, 0x18, 0x28, 0xe8, 0x29, 0x20, 0x49, 0x0f,
+ 0xbb, 0x8d, 0x08, 0x8c, 0xc6, 0x54, 0xe9, 0x71, 0xd2, 0x7e, 0xa4, 0xfe, 0x58, 0x7f, 0xd3, 0xc7,
+];
+const AUTHORITY_HASH_AVB: [u8; HASH_SIZE] = [
+ 0xb2, 0x69, 0x05, 0x48, 0x56, 0xb5, 0xfa, 0x55, 0x6f, 0xac, 0x56, 0xd9, 0x02, 0x35, 0x2b, 0xaa,
+ 0x4c, 0xba, 0x28, 0xdd, 0x82, 0x3a, 0x86, 0xf5, 0xd4, 0xc2, 0xf1, 0xf9, 0x35, 0x7d, 0xe4, 0x43,
+ 0x13, 0xbf, 0xfe, 0xd3, 0x36, 0xd8, 0x1c, 0x12, 0x78, 0x5c, 0x9c, 0x3e, 0xf6, 0x66, 0xef, 0xab,
+ 0x3d, 0x0f, 0x89, 0xa4, 0x6f, 0xc9, 0x72, 0xee, 0x73, 0x43, 0x02, 0x8a, 0xef, 0xbc, 0x05, 0x98,
+];
+const HIDDEN_AVB: [u8; HIDDEN_SIZE] = [
+ 0x5b, 0x3f, 0xc9, 0x6b, 0xe3, 0x95, 0x59, 0x40, 0x5e, 0x64, 0xe5, 0x64, 0x3f, 0xfd, 0x21, 0x09,
+ 0x9d, 0xf3, 0xcd, 0xc7, 0xa4, 0x2a, 0xe2, 0x97, 0xdd, 0xe2, 0x4f, 0xb0, 0x7d, 0x7e, 0xf5, 0x8e,
+ 0xd6, 0x4d, 0x84, 0x25, 0x54, 0x41, 0x3f, 0x8f, 0x78, 0x64, 0x1a, 0x51, 0x27, 0x9d, 0x55, 0x8a,
+ 0xe9, 0x90, 0x35, 0xab, 0x39, 0x80, 0x4b, 0x94, 0x40, 0x84, 0xa2, 0xfd, 0x73, 0xeb, 0x35, 0x7a,
+];
+const AUTHORITY_HASH_ANDROID: [u8; HASH_SIZE] = [
+ 0x04, 0x25, 0x5d, 0x60, 0x5f, 0x5c, 0x45, 0x0d, 0xf2, 0x9a, 0x6e, 0x99, 0x30, 0x03, 0xb8, 0xd6,
+ 0xe1, 0x99, 0x71, 0x1b, 0xf8, 0x44, 0xfa, 0xb5, 0x31, 0x79, 0x1c, 0x37, 0x68, 0x4e, 0x1d, 0xc0,
+ 0x24, 0x74, 0x68, 0xf8, 0x80, 0x20, 0x3e, 0x44, 0xb1, 0x43, 0xd2, 0x9c, 0xfc, 0x12, 0x9e, 0x77,
+ 0x0a, 0xde, 0x29, 0x24, 0xff, 0x2e, 0xfa, 0xc7, 0x10, 0xd5, 0x73, 0xd4, 0xc6, 0xdf, 0x62, 0x9f,
+];
+
+/// Encode the public key to CBOR Value. The input (raw 32 bytes) is wrapped into CoseKey.
+fn ed25519_public_key_to_cbor_value(public_key: &[u8]) -> Value {
+ let key = CoseKey {
+ kty: KeyType::Assigned(iana::KeyType::OKP),
+ alg: Some(Algorithm::Assigned(iana::Algorithm::EdDSA)),
+ key_ops: vec![KeyOperation::Assigned(iana::KeyOperation::Verify)].into_iter().collect(),
+ params: vec![
+ (
+ Label::Int(iana::Ec2KeyParameter::Crv as i64),
+ Value::from(iana::EllipticCurve::Ed25519 as u64),
+ ),
+ (Label::Int(iana::Ec2KeyParameter::X as i64), Value::Bytes(public_key.to_vec())),
+ ],
+ ..Default::default()
+ };
+ key.to_cbor_value().unwrap()
+}
+
+/// Makes a DICE chain (BCC) from the sample input.
+///
+/// The DICE chain is of the following format:
+/// public key derived from UDS -> ABL certificate -> AVB certificate -> Android certificate
+/// The `security_version` is included in the Android certificate.
+pub fn make_explicit_owned_dice(security_version: u64) -> OwnedDiceArtifactsWithExplicitKey {
+ let dice = make_sample_bcc_and_cdis(security_version);
+ OwnedDiceArtifactsWithExplicitKey::from_owned_artifacts(dice).unwrap()
+}
+
+fn make_sample_bcc_and_cdis(security_version: u64) -> OwnedDiceArtifacts {
+ let private_key_seed = derive_cdi_private_key_seed(UDS).unwrap();
+
+ // Gets the root public key in DICE chain (BCC).
+ let (public_key, _) = keypair_from_seed(private_key_seed.as_array()).unwrap();
+ let ed25519_public_key_value = ed25519_public_key_to_cbor_value(&public_key);
+
+ // Gets the ABL certificate to as the root certificate of DICE chain.
+ let config_values = DiceConfigValues {
+ component_name: Some(CStr::from_bytes_with_nul(b"ABL\0").unwrap()),
+ component_version: Some(1),
+ resettable: true,
+ ..Default::default()
+ };
+ let config_descriptor = retry_bcc_format_config_descriptor(&config_values).unwrap();
+ let input_values = InputValues::new(
+ CODE_HASH_ABL,
+ Config::Descriptor(config_descriptor.as_slice()),
+ AUTHORITY_HASH_ABL,
+ DiceMode::kDiceModeNormal,
+ HIDDEN_ABL,
+ );
+ let (cdi_values, cert) = retry_dice_main_flow(UDS, UDS, &input_values).unwrap();
+ let bcc_value =
+ Value::Array(vec![ed25519_public_key_value, de::from_reader(&cert[..]).unwrap()]);
+ let mut bcc: Vec<u8> = vec![];
+ ser::into_writer(&bcc_value, &mut bcc).unwrap();
+
+ // Appends AVB certificate to DICE chain.
+ let config_values = DiceConfigValues {
+ component_name: Some(CStr::from_bytes_with_nul(b"AVB\0").unwrap()),
+ component_version: Some(1),
+ resettable: true,
+ ..Default::default()
+ };
+ let config_descriptor = retry_bcc_format_config_descriptor(&config_values).unwrap();
+ let input_values = InputValues::new(
+ CODE_HASH_AVB,
+ Config::Descriptor(config_descriptor.as_slice()),
+ AUTHORITY_HASH_AVB,
+ DiceMode::kDiceModeNormal,
+ HIDDEN_AVB,
+ );
+ let dice_artifacts =
+ retry_bcc_main_flow(&cdi_values.cdi_attest, &cdi_values.cdi_seal, &bcc, &input_values)
+ .unwrap();
+
+ // Appends Android certificate to DICE chain.
+ let config_values = DiceConfigValues {
+ component_name: Some(CStr::from_bytes_with_nul(b"Android\0").unwrap()),
+ component_version: Some(12),
+ security_version: Some(security_version),
+ resettable: true,
+ ..Default::default()
+ };
+ let config_descriptor = retry_bcc_format_config_descriptor(&config_values).unwrap();
+ let input_values = InputValues::new(
+ [0u8; HASH_SIZE], // code_hash
+ Config::Descriptor(config_descriptor.as_slice()),
+ AUTHORITY_HASH_ANDROID,
+ DiceMode::kDiceModeNormal,
+ [0u8; HIDDEN_SIZE], // hidden
+ );
+ retry_bcc_main_flow(
+ dice_artifacts.cdi_attest(),
+ dice_artifacts.cdi_seal(),
+ dice_artifacts
+ .bcc()
+ .ok_or_else(|| {
+ error!("bcc is none");
+ DiceError::InvalidInput
+ })
+ .unwrap(),
+ &input_values,
+ )
+ .unwrap()
+}
diff --git a/security/secretkeeper/aidl/vts/lib.rs b/security/secretkeeper/aidl/vts/lib.rs
new file mode 100644
index 0000000..9f98165
--- /dev/null
+++ b/security/secretkeeper/aidl/vts/lib.rs
@@ -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.
+ */
+
+//! Test helper functions.
+
+pub mod dice_sample;
+
+// Constants for DICE map keys.
+
+/// Map key for authority hash.
+pub const AUTHORITY_HASH: i64 = -4670549;
+/// Map key for config descriptor.
+pub const CONFIG_DESC: i64 = -4670548;
+/// Map key for component name.
+pub const COMPONENT_NAME: i64 = -70002;
+/// Map key for component version.
+pub const COMPONENT_VERSION: i64 = -70003;
+/// Map key for security version.
+pub const SECURITY_VERSION: i64 = -70005;
+/// Map key for mode.
+pub const MODE: i64 = -4670551;
diff --git a/security/secretkeeper/aidl/vts/rustfmt.toml b/security/secretkeeper/aidl/vts/rustfmt.toml
new file mode 120000
index 0000000..ed2086b
--- /dev/null
+++ b/security/secretkeeper/aidl/vts/rustfmt.toml
@@ -0,0 +1 @@
+../../../../../../build/soong/scripts/rustfmt.toml
\ No newline at end of file
diff --git a/security/secretkeeper/aidl/vts/secretkeeper_cli.rs b/security/secretkeeper/aidl/vts/secretkeeper_cli.rs
new file mode 100644
index 0000000..5f08482
--- /dev/null
+++ b/security/secretkeeper/aidl/vts/secretkeeper_cli.rs
@@ -0,0 +1,347 @@
+/*
+ * 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.
+ */
+
+//! Command line test tool for interacting with Secretkeeper.
+
+use android_hardware_security_secretkeeper::aidl::android::hardware::security::secretkeeper::{
+ ISecretkeeper::ISecretkeeper, SecretId::SecretId,
+};
+use anyhow::{anyhow, bail, Context, Result};
+use authgraph_boringssl::BoringSha256;
+use authgraph_core::traits::Sha256;
+use clap::{Args, Parser, Subcommand};
+use coset::CborSerializable;
+use dice_policy::{ConstraintSpec, ConstraintType, DicePolicy, MissingAction};
+use secretkeeper_client::{dice::OwnedDiceArtifactsWithExplicitKey, SkSession};
+use secretkeeper_comm::data_types::{
+ error::SecretkeeperError,
+ packet::{ResponsePacket, ResponseType},
+ request::Request,
+ request_response_impl::{GetSecretRequest, GetSecretResponse, StoreSecretRequest},
+ response::Response,
+ {Id, Secret},
+};
+use secretkeeper_test::{
+ dice_sample::make_explicit_owned_dice, AUTHORITY_HASH, CONFIG_DESC, MODE, SECURITY_VERSION,
+};
+use std::io::Write;
+
+#[derive(Parser, Debug)]
+#[command(about = "Interact with Secretkeeper HAL")]
+#[command(version = "0.1")]
+#[command(propagate_version = true)]
+struct Cli {
+ #[command(subcommand)]
+ command: Command,
+
+ /// Secretkeeper instance to connect to.
+ #[arg(long, short)]
+ instance: Option<String>,
+
+ /// Security version in leaf DICE node.
+ #[clap(default_value_t = 100)]
+ #[arg(long, short = 'v')]
+ dice_version: u64,
+
+ /// Show hex versions of secrets and their IDs.
+ #[clap(default_value_t = false)]
+ #[arg(long, short = 'v')]
+ hex: bool,
+}
+
+#[derive(Subcommand, Debug)]
+enum Command {
+ /// Store a secret value.
+ Store(StoreArgs),
+ /// Get a secret value.
+ Get(GetArgs),
+ /// Delete a secret value.
+ Delete(DeleteArgs),
+ /// Delete all secret values.
+ DeleteAll(DeleteAllArgs),
+}
+
+#[derive(Args, Debug)]
+struct StoreArgs {
+ /// Identifier for the secret, as either a short (< 32 byte) string, or as 32 bytes of hex.
+ id: String,
+ /// Value to use as the secret value. If specified as 32 bytes of hex, the decoded value
+ /// will be used as-is; otherwise, a string (less than 31 bytes in length) will be encoded
+ /// as the secret.
+ value: String,
+}
+
+#[derive(Args, Debug)]
+struct GetArgs {
+ /// Identifier for the secret, as either a short (< 32 byte) string, or as 32 bytes of hex.
+ id: String,
+}
+
+#[derive(Args, Debug)]
+struct DeleteArgs {
+ /// Identifier for the secret, as either a short (< 32 byte) string, or as 32 bytes of hex.
+ id: String,
+}
+
+#[derive(Args, Debug)]
+struct DeleteAllArgs {
+ /// Confirm deletion of all secrets.
+ yes: bool,
+}
+
+const SECRETKEEPER_SERVICE: &str = "android.hardware.security.secretkeeper.ISecretkeeper";
+
+/// Secretkeeper client information.
+struct SkClient {
+ sk: binder::Strong<dyn ISecretkeeper>,
+ session: SkSession,
+ dice_artifacts: OwnedDiceArtifactsWithExplicitKey,
+}
+
+impl SkClient {
+ fn new(instance: &str, dice_artifacts: OwnedDiceArtifactsWithExplicitKey) -> Self {
+ let sk: binder::Strong<dyn ISecretkeeper> =
+ binder::get_interface(&format!("{SECRETKEEPER_SERVICE}/{instance}")).unwrap();
+ let session = SkSession::new(sk.clone(), &dice_artifacts).unwrap();
+ Self { sk, session, dice_artifacts }
+ }
+
+ fn secret_management_request(&mut self, req_data: &[u8]) -> Result<Vec<u8>> {
+ self.session
+ .secret_management_request(req_data)
+ .map_err(|e| anyhow!("secret management: {e:?}"))
+ }
+
+ /// Construct a sealing policy on the DICE chain with constraints:
+ /// 1. `ExactMatch` on `AUTHORITY_HASH` (non-optional).
+ /// 2. `ExactMatch` on `MODE` (non-optional).
+ /// 3. `GreaterOrEqual` on `SECURITY_VERSION` (optional).
+ fn sealing_policy(&self) -> Result<Vec<u8>> {
+ let dice =
+ self.dice_artifacts.explicit_key_dice_chain().context("extract explicit DICE chain")?;
+
+ let constraint_spec = [
+ ConstraintSpec::new(
+ ConstraintType::ExactMatch,
+ vec![AUTHORITY_HASH],
+ MissingAction::Fail,
+ ),
+ ConstraintSpec::new(ConstraintType::ExactMatch, vec![MODE], MissingAction::Fail),
+ ConstraintSpec::new(
+ ConstraintType::GreaterOrEqual,
+ vec![CONFIG_DESC, SECURITY_VERSION],
+ MissingAction::Ignore,
+ ),
+ ];
+ DicePolicy::from_dice_chain(dice, &constraint_spec)
+ .unwrap()
+ .to_vec()
+ .context("serialize DICE policy")
+ }
+
+ fn store(&mut self, id: &Id, secret: &Secret) -> Result<()> {
+ let store_request = StoreSecretRequest {
+ id: id.clone(),
+ secret: secret.clone(),
+ sealing_policy: self.sealing_policy().context("build sealing policy")?,
+ };
+ let store_request =
+ store_request.serialize_to_packet().to_vec().context("serialize StoreSecretRequest")?;
+
+ let store_response = self.secret_management_request(&store_request)?;
+ let store_response =
+ ResponsePacket::from_slice(&store_response).context("deserialize ResponsePacket")?;
+ let response_type = store_response.response_type().unwrap();
+ if response_type == ResponseType::Success {
+ Ok(())
+ } else {
+ let err = *SecretkeeperError::deserialize_from_packet(store_response).unwrap();
+ Err(anyhow!("STORE failed: {err:?}"))
+ }
+ }
+
+ fn get(&mut self, id: &Id) -> Result<Option<Secret>> {
+ let get_request = GetSecretRequest { id: id.clone(), updated_sealing_policy: None }
+ .serialize_to_packet()
+ .to_vec()
+ .context("serialize GetSecretRequest")?;
+
+ let get_response = self.secret_management_request(&get_request).context("secret mgmt")?;
+ let get_response =
+ ResponsePacket::from_slice(&get_response).context("deserialize ResponsePacket")?;
+
+ if get_response.response_type().unwrap() == ResponseType::Success {
+ let get_response = *GetSecretResponse::deserialize_from_packet(get_response).unwrap();
+ Ok(Some(Secret(get_response.secret.0)))
+ } else {
+ // Only expect a not-found failure.
+ let err = *SecretkeeperError::deserialize_from_packet(get_response).unwrap();
+ if err == SecretkeeperError::EntryNotFound {
+ Ok(None)
+ } else {
+ Err(anyhow!("GET failed: {err:?}"))
+ }
+ }
+ }
+
+ /// Helper method to delete secrets.
+ fn delete(&self, ids: &[&Id]) -> Result<()> {
+ let ids: Vec<SecretId> = ids.iter().map(|id| SecretId { id: id.0 }).collect();
+ self.sk.deleteIds(&ids).context("deleteIds")
+ }
+
+ /// Helper method to delete everything.
+ fn delete_all(&self) -> Result<()> {
+ self.sk.deleteAll().context("deleteAll")
+ }
+}
+
+/// Convert a string input into an `Id`. Input can be 64 bytes of hex, or a string
+/// that will be hashed to give the `Id` value. Returns the `Id` and a display string.
+fn string_to_id(s: &str, show_hex: bool) -> (Id, String) {
+ if let Ok(data) = hex::decode(s) {
+ if data.len() == 64 {
+ // Assume something that parses as 64 bytes of hex is it.
+ return (Id(data.try_into().unwrap()), s.to_string().to_lowercase());
+ }
+ }
+ // Create a secret ID by repeating the SHA-256 hash of the string twice.
+ let hash = BoringSha256.compute_sha256(s.as_bytes()).unwrap();
+ let mut id = Id([0; 64]);
+ id.0[..32].copy_from_slice(&hash);
+ id.0[32..].copy_from_slice(&hash);
+ if show_hex {
+ let hex_id = hex::encode(&id.0);
+ (id, format!("'{s}' (as {hex_id})"))
+ } else {
+ (id, format!("'{s}'"))
+ }
+}
+
+/// Convert a string input into a `Secret`. Input can be 32 bytes of hex, or a short string
+/// that will be encoded as the `Secret` value. Returns the `Secret` and a display string.
+fn value_to_secret(s: &str, show_hex: bool) -> Result<(Secret, String)> {
+ if let Ok(data) = hex::decode(s) {
+ if data.len() == 32 {
+ // Assume something that parses as 32 bytes of hex is it.
+ return Ok((Secret(data.try_into().unwrap()), s.to_string().to_lowercase()));
+ }
+ }
+ let data = s.as_bytes();
+ if data.len() > 31 {
+ return Err(anyhow!("secret too long"));
+ }
+ let mut secret = Secret([0; 32]);
+ secret.0[0] = data.len() as u8;
+ secret.0[1..1 + data.len()].copy_from_slice(data);
+ Ok(if show_hex {
+ let hex_secret = hex::encode(&secret.0);
+ (secret, format!("'{s}' (as {hex_secret})"))
+ } else {
+ (secret, format!("'{s}'"))
+ })
+}
+
+/// Convert a `Secret` into a displayable string. If the secret looks like an encoded
+/// string, show that, otherwise show the value in hex.
+fn secret_to_value_display(secret: &Secret, show_hex: bool) -> String {
+ let hex = hex::encode(&secret.0);
+ secret_to_value(secret)
+ .map(|s| if show_hex { format!("'{s}' (from {hex})") } else { format!("'{s}'") })
+ .unwrap_or_else(|_e| format!("{hex}"))
+}
+
+/// Attempt to convert a `Secret` back to a string.
+fn secret_to_value(secret: &Secret) -> Result<String> {
+ let len = secret.0[0] as usize;
+ if len > 31 {
+ return Err(anyhow!("too long"));
+ }
+ std::str::from_utf8(&secret.0[1..1 + len]).map(|s| s.to_string()).context("not UTF-8 string")
+}
+
+fn main() -> Result<()> {
+ let cli = Cli::parse();
+
+ // Figure out which Secretkeeper instance is desired, and connect to it.
+ let instance = if let Some(instance) = &cli.instance {
+ // Explicitly specified.
+ instance.clone()
+ } else {
+ // If there's only one instance, use that.
+ let instances: Vec<String> = binder::get_declared_instances(SECRETKEEPER_SERVICE)
+ .unwrap_or_default()
+ .into_iter()
+ .collect();
+ match instances.len() {
+ 0 => bail!("No Secretkeeper instances available on device!"),
+ 1 => instances[0].clone(),
+ _ => {
+ bail!(
+ concat!(
+ "Multiple Secretkeeper instances available on device: {}\n",
+ "Use --instance <instance> to specify one."
+ ),
+ instances.join(", ")
+ );
+ }
+ }
+ };
+ let dice = make_explicit_owned_dice(cli.dice_version);
+ let mut sk_client = SkClient::new(&instance, dice);
+
+ match cli.command {
+ Command::Get(args) => {
+ let (id, display_id) = string_to_id(&args.id, cli.hex);
+ print!("GET key {display_id}: ");
+ match sk_client.get(&id).context("GET") {
+ Ok(None) => println!("not found"),
+ Ok(Some(s)) => println!("{}", secret_to_value_display(&s, cli.hex)),
+ Err(e) => {
+ println!("failed!");
+ return Err(e);
+ }
+ }
+ }
+ Command::Store(args) => {
+ let (id, display_id) = string_to_id(&args.id, cli.hex);
+ let (secret, display_secret) = value_to_secret(&args.value, cli.hex)?;
+ println!("STORE key {display_id}: {display_secret}");
+ sk_client.store(&id, &secret).context("STORE")?;
+ }
+ Command::Delete(args) => {
+ let (id, display_id) = string_to_id(&args.id, cli.hex);
+ println!("DELETE key {display_id}");
+ sk_client.delete(&[&id]).context("DELETE")?;
+ }
+ Command::DeleteAll(args) => {
+ if !args.yes {
+ // Request confirmation.
+ println!("Confirm delete all secrets: [y/N]");
+ let _ = std::io::stdout().flush();
+ let mut input = String::new();
+ std::io::stdin().read_line(&mut input)?;
+ let c = input.chars().next();
+ if c != Some('y') && c != Some('Y') {
+ bail!("DELETE_ALL not confirmed");
+ }
+ }
+ println!("DELETE_ALL");
+ sk_client.delete_all().context("DELETE_ALL")?;
+ }
+ }
+ Ok(())
+}
diff --git a/security/secretkeeper/aidl/vts/secretkeeper_test_client.rs b/security/secretkeeper/aidl/vts/secretkeeper_test_client.rs
index 6a70d02..8c33f04 100644
--- a/security/secretkeeper/aidl/vts/secretkeeper_test_client.rs
+++ b/security/secretkeeper/aidl/vts/secretkeeper_test_client.rs
@@ -14,39 +14,33 @@
* limitations under the License.
*/
-#![cfg(test)]
-
use android_hardware_security_secretkeeper::aidl::android::hardware::security::secretkeeper::ISecretkeeper::ISecretkeeper;
use android_hardware_security_secretkeeper::aidl::android::hardware::security::secretkeeper::SecretId::SecretId;
use authgraph_vts_test as ag_vts;
use authgraph_boringssl as boring;
use authgraph_core::key;
-use binder::StatusCode;
use coset::{CborSerializable, CoseEncrypt0};
-use log::{info, warn};
+use dice_policy::{ConstraintSpec, ConstraintType, DicePolicy, MissingAction};
+use rdroidtest::{ignore_if, rdroidtest};
+use secretkeeper_client::dice::OwnedDiceArtifactsWithExplicitKey;
+use secretkeeper_client::SkSession;
use secretkeeper_core::cipher;
use secretkeeper_comm::data_types::error::SecretkeeperError;
use secretkeeper_comm::data_types::request::Request;
use secretkeeper_comm::data_types::request_response_impl::{
GetVersionRequest, GetVersionResponse, GetSecretRequest, GetSecretResponse, StoreSecretRequest,
StoreSecretResponse };
-use secretkeeper_comm::data_types::{Id, Secret};
+use secretkeeper_comm::data_types::{Id, Secret, SeqNum};
use secretkeeper_comm::data_types::response::Response;
use secretkeeper_comm::data_types::packet::{ResponsePacket, ResponseType};
+use secretkeeper_test::{
+ AUTHORITY_HASH, MODE, CONFIG_DESC, SECURITY_VERSION,
+ dice_sample::make_explicit_owned_dice
+};
const SECRETKEEPER_SERVICE: &str = "android.hardware.security.secretkeeper.ISecretkeeper";
-const SECRETKEEPER_INSTANCES: [&'static str; 2] = ["nonsecure", "default"];
const CURRENT_VERSION: u64 = 1;
-// TODO(b/291238565): This will change once libdice_policy switches to Explicit-key DiceCertChain
-// This is generated by patching libdice_policy such that it dumps an example dice chain &
-// a policy, such that the former matches the latter.
-const HYPOTHETICAL_DICE_POLICY: [u8; 43] = [
- 0x83, 0x01, 0x81, 0x83, 0x01, 0x80, 0xA1, 0x01, 0x00, 0x82, 0x83, 0x01, 0x81, 0x01, 0x73, 0x74,
- 0x65, 0x73, 0x74, 0x69, 0x6E, 0x67, 0x5F, 0x64, 0x69, 0x63, 0x65, 0x5F, 0x70, 0x6F, 0x6C, 0x69,
- 0x63, 0x79, 0x83, 0x02, 0x82, 0x03, 0x18, 0x64, 0x19, 0xE9, 0x75,
-];
-
// Random bytes (of ID_SIZE/SECRET_SIZE) generated for tests.
const ID_EXAMPLE: Id = Id([
0xF1, 0xB2, 0xED, 0x3B, 0xD1, 0xBD, 0xF0, 0x7D, 0xE1, 0xF0, 0x01, 0xFC, 0x61, 0x71, 0xD3, 0x42,
@@ -71,49 +65,25 @@
0x06, 0xAC, 0x36, 0x8B, 0x3C, 0x95, 0x50, 0x16, 0x67, 0x71, 0x65, 0x26, 0xEB, 0xD0, 0xC3, 0x98,
]);
-fn get_connection() -> Option<(binder::Strong<dyn ISecretkeeper>, String)> {
- // Initialize logging (which is OK to call multiple times).
- logger::init(logger::Config::default().with_min_level(log::Level::Debug));
-
- // TODO: replace this with a parameterized set of tests that run for each available instance of
- // ISecretkeeper (rather than having a fixed set of instance names to look for).
- for instance in &SECRETKEEPER_INSTANCES {
- let name = format!("{SECRETKEEPER_SERVICE}/{instance}");
- match binder::get_interface(&name) {
- Ok(sk) => {
- info!("Running test against /{instance}");
- return Some((sk, name));
- }
- Err(StatusCode::NAME_NOT_FOUND) => {
- info!("No /{instance} instance of ISecretkeeper present");
- }
- Err(e) => {
- panic!("unexpected error while fetching connection to Secretkeeper {:?}", e);
- }
- }
- }
- None
+fn get_instances() -> Vec<(String, String)> {
+ // Determine which instances are available.
+ binder::get_declared_instances(SECRETKEEPER_SERVICE)
+ .unwrap_or_default()
+ .into_iter()
+ .map(|v| (v.clone(), v))
+ .collect()
}
-/// Macro to perform test setup. Invokes `return` if no Secretkeeper instance available.
-macro_rules! setup_client {
- {} => {
- match SkClient::new() {
- Some(sk) => sk,
- None => {
- warn!("Secretkeeper HAL is unavailable, skipping test");
- return;
- }
- }
- }
+fn get_connection(instance: &str) -> binder::Strong<dyn ISecretkeeper> {
+ let name = format!("{SECRETKEEPER_SERVICE}/{instance}");
+ binder::get_interface(&name).unwrap()
}
/// Secretkeeper client information.
struct SkClient {
sk: binder::Strong<dyn ISecretkeeper>,
- name: String,
- aes_keys: [key::AesKey; 2],
- session_id: Vec<u8>,
+ session: SkSession,
+ dice_artifacts: OwnedDiceArtifactsWithExplicitKey,
}
impl Drop for SkClient {
@@ -124,66 +94,101 @@
}
impl SkClient {
- fn new() -> Option<Self> {
- let (sk, name) = get_connection()?;
- let (aes_keys, session_id) = authgraph_key_exchange(sk.clone());
- Some(Self { sk, name, aes_keys, session_id })
+ /// Create an `SkClient` using the default `OwnedDiceArtifactsWithExplicitKey` for identity.
+ fn new(instance: &str) -> Self {
+ let default_dice = make_explicit_owned_dice(/*Security version in a node */ 5);
+ Self::with_identity(instance, default_dice)
}
- /// Wrapper around `ISecretkeeper::processSecretManagementRequest` that handles
+ /// Create an `SkClient` using the given `OwnedDiceArtifactsWithExplicitKey` for identity.
+ fn with_identity(instance: &str, dice_artifacts: OwnedDiceArtifactsWithExplicitKey) -> Self {
+ let sk = get_connection(instance);
+ Self {
+ sk: sk.clone(),
+ session: SkSession::new(sk, &dice_artifacts).unwrap(),
+ dice_artifacts,
+ }
+ }
+
+ /// This method is wrapper that use `SkSession::secret_management_request` which handles
/// encryption and decryption.
- fn secret_management_request(&self, req_data: &[u8]) -> Vec<u8> {
+ fn secret_management_request(&mut self, req_data: &[u8]) -> Result<Vec<u8>, Error> {
+ Ok(self.session.secret_management_request(req_data)?)
+ }
+
+ /// Unlike the method [`secret_management_request`], this method directly uses
+ /// `cipher::encrypt_message` & `cipher::decrypt_message`, allowing finer control of request
+ /// & response aad.
+ fn secret_management_request_custom_aad(
+ &self,
+ req_data: &[u8],
+ req_aad: &[u8],
+ expected_res_aad: &[u8],
+ ) -> Result<Vec<u8>, Error> {
let aes_gcm = boring::BoringAes;
let rng = boring::BoringRng;
- let request_bytes =
- cipher::encrypt_message(&aes_gcm, &rng, &self.aes_keys[0], &self.session_id, &req_data)
- .unwrap();
+ let request_bytes = cipher::encrypt_message(
+ &aes_gcm,
+ &rng,
+ self.session.encryption_key(),
+ self.session.session_id(),
+ &req_data,
+ req_aad,
+ )
+ .map_err(|e| secretkeeper_client::Error::CipherError(e))?;
- let response_bytes = self.sk.processSecretManagementRequest(&request_bytes).unwrap();
+ // Binder call!
+ let response_bytes = self.sk.processSecretManagementRequest(&request_bytes)?;
- let response_encrypt0 = CoseEncrypt0::from_slice(&response_bytes).unwrap();
- cipher::decrypt_message(&aes_gcm, &self.aes_keys[1], &response_encrypt0).unwrap()
+ let response_encrypt0 = CoseEncrypt0::from_slice(&response_bytes)?;
+ Ok(cipher::decrypt_message(
+ &aes_gcm,
+ self.session.decryption_key(),
+ &response_encrypt0,
+ expected_res_aad,
+ )
+ .map_err(|e| secretkeeper_client::Error::CipherError(e))?)
}
- /// Helper method to store a secret.
- fn store(&self, id: &Id, secret: &Secret) {
- let store_request = StoreSecretRequest {
- id: id.clone(),
- secret: secret.clone(),
- sealing_policy: HYPOTHETICAL_DICE_POLICY.to_vec(),
- };
- let store_request = store_request.serialize_to_packet().to_vec().unwrap();
+ /// Helper method to store a secret. This uses the default compatible sealing_policy on
+ /// dice_chain.
+ fn store(&mut self, id: &Id, secret: &Secret) -> Result<(), Error> {
+ let sealing_policy = sealing_policy(
+ self.dice_artifacts.explicit_key_dice_chain().ok_or(Error::UnexpectedError)?,
+ );
+ let store_request =
+ StoreSecretRequest { id: id.clone(), secret: secret.clone(), sealing_policy };
+ let store_request = store_request.serialize_to_packet().to_vec()?;
- let store_response = self.secret_management_request(&store_request);
- let store_response = ResponsePacket::from_slice(&store_response).unwrap();
+ let store_response = self.secret_management_request(&store_request)?;
+ let store_response = ResponsePacket::from_slice(&store_response)?;
- assert_eq!(store_response.response_type().unwrap(), ResponseType::Success);
+ assert_eq!(store_response.response_type()?, ResponseType::Success);
// Really just checking that the response is indeed StoreSecretResponse
- let _ = StoreSecretResponse::deserialize_from_packet(store_response).unwrap();
+ let _ = StoreSecretResponse::deserialize_from_packet(store_response)?;
+ Ok(())
}
/// Helper method to get a secret.
- fn get(&self, id: &Id) -> Option<Secret> {
+ fn get(&mut self, id: &Id) -> Result<Secret, Error> {
let get_request = GetSecretRequest { id: id.clone(), updated_sealing_policy: None };
- let get_request = get_request.serialize_to_packet().to_vec().unwrap();
+ let get_request = get_request.serialize_to_packet().to_vec()?;
- let get_response = self.secret_management_request(&get_request);
- let get_response = ResponsePacket::from_slice(&get_response).unwrap();
+ let get_response = self.secret_management_request(&get_request)?;
+ let get_response = ResponsePacket::from_slice(&get_response)?;
- if get_response.response_type().unwrap() == ResponseType::Success {
- let get_response = *GetSecretResponse::deserialize_from_packet(get_response).unwrap();
- Some(Secret(get_response.secret.0))
+ if get_response.response_type()? == ResponseType::Success {
+ let get_response = *GetSecretResponse::deserialize_from_packet(get_response)?;
+ Ok(Secret(get_response.secret.0))
} else {
- // Only expect a not-found failure.
- let err = *SecretkeeperError::deserialize_from_packet(get_response).unwrap();
- assert_eq!(err, SecretkeeperError::EntryNotFound);
- None
+ let err = *SecretkeeperError::deserialize_from_packet(get_response)?;
+ Err(Error::SecretkeeperError(err))
}
}
/// Helper method to delete secrets.
fn delete(&self, ids: &[&Id]) {
- let ids: Vec<SecretId> = ids.iter().map(|id| SecretId { id: id.0.to_vec() }).collect();
+ let ids: Vec<SecretId> = ids.iter().map(|id| SecretId { id: id.0 }).collect();
self.sk.deleteIds(&ids).unwrap();
}
@@ -193,6 +198,69 @@
}
}
+#[derive(Debug)]
+enum Error {
+ // Errors from Secretkeeper API errors. These are thrown by core SecretManagement and
+ // not visible without decryption.
+ SecretkeeperError(SecretkeeperError),
+ InfraError(secretkeeper_client::Error),
+ UnexpectedError,
+}
+
+impl From<secretkeeper_client::Error> for Error {
+ fn from(e: secretkeeper_client::Error) -> Self {
+ Self::InfraError(e)
+ }
+}
+
+impl From<SecretkeeperError> for Error {
+ fn from(e: SecretkeeperError) -> Self {
+ Self::SecretkeeperError(e)
+ }
+}
+
+impl From<coset::CoseError> for Error {
+ fn from(e: coset::CoseError) -> Self {
+ Self::InfraError(secretkeeper_client::Error::from(e))
+ }
+}
+
+impl From<binder::Status> for Error {
+ fn from(s: binder::Status) -> Self {
+ Self::InfraError(secretkeeper_client::Error::from(s))
+ }
+}
+
+impl From<secretkeeper_comm::data_types::error::Error> for Error {
+ fn from(e: secretkeeper_comm::data_types::error::Error) -> Self {
+ Self::InfraError(secretkeeper_client::Error::from(e))
+ }
+}
+
+// Assert that the error is EntryNotFound
+fn assert_entry_not_found(res: Result<Secret, Error>) {
+ assert!(matches!(res.unwrap_err(), Error::SecretkeeperError(SecretkeeperError::EntryNotFound)))
+}
+
+/// Construct a sealing policy on the dice chain. This method uses the following set of
+/// constraints which are compatible with sample DICE chains used in VTS.
+/// 1. ExactMatch on AUTHORITY_HASH (non-optional).
+/// 2. ExactMatch on MODE (non-optional).
+/// 3. GreaterOrEqual on SECURITY_VERSION (optional).
+fn sealing_policy(dice: &[u8]) -> Vec<u8> {
+ let constraint_spec = [
+ ConstraintSpec::new(ConstraintType::ExactMatch, vec![AUTHORITY_HASH], MissingAction::Fail),
+ ConstraintSpec::new(ConstraintType::ExactMatch, vec![MODE], MissingAction::Fail),
+ ConstraintSpec::new(
+ ConstraintType::GreaterOrEqual,
+ vec![CONFIG_DESC, SECURITY_VERSION],
+ MissingAction::Ignore,
+ ),
+ ];
+
+ DicePolicy::from_dice_chain(dice, &constraint_spec).unwrap().to_vec().unwrap()
+}
+
/// Perform AuthGraph key exchange, returning the session keys and session ID.
fn authgraph_key_exchange(sk: binder::Strong<dyn ISecretkeeper>) -> ([key::AesKey; 2], Vec<u8>) {
let sink = sk.getAuthGraphKe().expect("failed to get AuthGraph");
@@ -200,47 +268,29 @@
ag_vts::sink::test_mainline(&mut source, sink)
}
-/// Test that the AuthGraph instance returned by SecretKeeper correctly performs
-/// mainline key exchange against a local source implementation.
-#[test]
-fn authgraph_mainline() {
- let (sk, _) = match get_connection() {
- Some(sk) => sk,
- None => {
- warn!("Secretkeeper HAL is unavailable, skipping test");
- return;
- }
- };
+// Test that the AuthGraph instance returned by SecretKeeper correctly performs
+// mainline key exchange against a local source implementation.
+#[rdroidtest(get_instances())]
+fn authgraph_mainline(instance: String) {
+ let sk = get_connection(&instance);
let (_aes_keys, _session_id) = authgraph_key_exchange(sk);
}
-/// Test that the AuthGraph instance returned by SecretKeeper correctly rejects
-/// a corrupted session ID signature.
-#[test]
-fn authgraph_corrupt_sig() {
- let (sk, _) = match get_connection() {
- Some(sk) => sk,
- None => {
- warn!("Secretkeeper HAL is unavailable, skipping test");
- return;
- }
- };
+// Test that the AuthGraph instance returned by SecretKeeper correctly rejects
+// a corrupted session ID signature.
+#[rdroidtest(get_instances())]
+fn authgraph_corrupt_sig(instance: String) {
+ let sk = get_connection(&instance);
let sink = sk.getAuthGraphKe().expect("failed to get AuthGraph");
let mut source = ag_vts::test_ag_participant().expect("failed to create a local source");
ag_vts::sink::test_corrupt_sig(&mut source, sink);
}
-/// Test that the AuthGraph instance returned by SecretKeeper correctly detects
-/// when corrupted keys are returned to it.
-#[test]
-fn authgraph_corrupt_keys() {
- let (sk, _) = match get_connection() {
- Some(sk) => sk,
- None => {
- warn!("Secretkeeper HAL is unavailable, skipping test");
- return;
- }
- };
+// Test that the AuthGraph instance returned by SecretKeeper correctly detects
+// when corrupted keys are returned to it.
+#[rdroidtest(get_instances())]
+fn authgraph_corrupt_keys(instance: String) {
+ let sk = get_connection(&instance);
let sink = sk.getAuthGraphKe().expect("failed to get AuthGraph");
let mut source = ag_vts::test_ag_participant().expect("failed to create a local source");
ag_vts::sink::test_corrupt_keys(&mut source, sink);
@@ -249,15 +299,15 @@
// TODO(b/2797757): Add tests that match different HAL defined objects (like request/response)
// with expected bytes.
-#[test]
-fn secret_management_get_version() {
- let sk_client = setup_client!();
+#[rdroidtest(get_instances())]
+fn secret_management_get_version(instance: String) {
+ let mut sk_client = SkClient::new(&instance);
let request = GetVersionRequest {};
let request_packet = request.serialize_to_packet();
let request_bytes = request_packet.to_vec().unwrap();
- let response_bytes = sk_client.secret_management_request(&request_bytes);
+ let response_bytes = sk_client.secret_management_request(&request_bytes).unwrap();
let response_packet = ResponsePacket::from_slice(&response_bytes).unwrap();
assert_eq!(response_packet.response_type().unwrap(), ResponseType::Success);
@@ -266,9 +316,9 @@
assert_eq!(get_version_response.version, CURRENT_VERSION);
}
-#[test]
-fn secret_management_malformed_request() {
- let sk_client = setup_client!();
+#[rdroidtest(get_instances())]
+fn secret_management_malformed_request(instance: String) {
+ let mut sk_client = SkClient::new(&instance);
let request = GetVersionRequest {};
let request_packet = request.serialize_to_packet();
@@ -277,7 +327,7 @@
// Deform the request
request_bytes[0] = !request_bytes[0];
- let response_bytes = sk_client.secret_management_request(&request_bytes);
+ let response_bytes = sk_client.secret_management_request(&request_bytes).unwrap();
let response_packet = ResponsePacket::from_slice(&response_bytes).unwrap();
assert_eq!(response_packet.response_type().unwrap(), ResponseType::Error);
@@ -285,107 +335,231 @@
assert_eq!(err, SecretkeeperError::RequestMalformed);
}
-#[test]
-fn secret_management_store_get_secret_found() {
- let sk_client = setup_client!();
+#[rdroidtest(get_instances())]
+fn secret_management_store_get_secret_found(instance: String) {
+ let mut sk_client = SkClient::new(&instance);
- sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE);
+ sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE).unwrap();
// Get the secret that was just stored
- assert_eq!(sk_client.get(&ID_EXAMPLE), Some(SECRET_EXAMPLE));
+ assert_eq!(sk_client.get(&ID_EXAMPLE).unwrap(), SECRET_EXAMPLE);
}
-#[test]
-fn secret_management_store_get_secret_not_found() {
- let sk_client = setup_client!();
+#[rdroidtest(get_instances())]
+fn secret_management_store_get_secret_not_found(instance: String) {
+ let mut sk_client = SkClient::new(&instance);
// Store a secret (corresponding to an id).
- sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE);
+ sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE).unwrap();
// Get the secret that was never stored
- assert_eq!(sk_client.get(&ID_NOT_STORED), None);
+ assert_entry_not_found(sk_client.get(&ID_NOT_STORED));
}
-#[test]
-fn secretkeeper_store_delete_ids() {
- let sk_client = setup_client!();
+#[rdroidtest(get_instances())]
+fn secretkeeper_store_delete_ids(instance: String) {
+ let mut sk_client = SkClient::new(&instance);
- sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE);
- sk_client.store(&ID_EXAMPLE_2, &SECRET_EXAMPLE);
+ sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE).unwrap();
+ sk_client.store(&ID_EXAMPLE_2, &SECRET_EXAMPLE).unwrap();
sk_client.delete(&[&ID_EXAMPLE]);
-
- assert_eq!(sk_client.get(&ID_EXAMPLE), None);
- assert_eq!(sk_client.get(&ID_EXAMPLE_2), Some(SECRET_EXAMPLE));
+ assert_entry_not_found(sk_client.get(&ID_EXAMPLE));
+ assert_eq!(sk_client.get(&ID_EXAMPLE_2).unwrap(), SECRET_EXAMPLE);
sk_client.delete(&[&ID_EXAMPLE_2]);
- assert_eq!(sk_client.get(&ID_EXAMPLE), None);
- assert_eq!(sk_client.get(&ID_EXAMPLE_2), None);
+ assert_entry_not_found(sk_client.get(&ID_EXAMPLE));
+ assert_entry_not_found(sk_client.get(&ID_EXAMPLE_2));
}
-#[test]
-fn secretkeeper_store_delete_multiple_ids() {
- let sk_client = setup_client!();
+#[rdroidtest(get_instances())]
+fn secretkeeper_store_delete_multiple_ids(instance: String) {
+ let mut sk_client = SkClient::new(&instance);
- sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE);
- sk_client.store(&ID_EXAMPLE_2, &SECRET_EXAMPLE);
+ sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE).unwrap();
+ sk_client.store(&ID_EXAMPLE_2, &SECRET_EXAMPLE).unwrap();
sk_client.delete(&[&ID_EXAMPLE, &ID_EXAMPLE_2]);
- assert_eq!(sk_client.get(&ID_EXAMPLE), None);
- assert_eq!(sk_client.get(&ID_EXAMPLE_2), None);
+ assert_entry_not_found(sk_client.get(&ID_EXAMPLE));
+ assert_entry_not_found(sk_client.get(&ID_EXAMPLE_2));
}
+#[rdroidtest(get_instances())]
+fn secretkeeper_store_delete_duplicate_ids(instance: String) {
+ let mut sk_client = SkClient::new(&instance);
-#[test]
-fn secretkeeper_store_delete_duplicate_ids() {
- let sk_client = setup_client!();
-
- sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE);
- sk_client.store(&ID_EXAMPLE_2, &SECRET_EXAMPLE);
+ sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE).unwrap();
+ sk_client.store(&ID_EXAMPLE_2, &SECRET_EXAMPLE).unwrap();
// Delete the same secret twice.
sk_client.delete(&[&ID_EXAMPLE, &ID_EXAMPLE]);
- assert_eq!(sk_client.get(&ID_EXAMPLE), None);
- assert_eq!(sk_client.get(&ID_EXAMPLE_2), Some(SECRET_EXAMPLE));
+ assert_entry_not_found(sk_client.get(&ID_EXAMPLE));
+ assert_eq!(sk_client.get(&ID_EXAMPLE_2).unwrap(), SECRET_EXAMPLE);
}
-#[test]
-fn secretkeeper_store_delete_nonexistent() {
- let sk_client = setup_client!();
+#[rdroidtest(get_instances())]
+fn secretkeeper_store_delete_nonexistent(instance: String) {
+ let mut sk_client = SkClient::new(&instance);
- sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE);
- sk_client.store(&ID_EXAMPLE_2, &SECRET_EXAMPLE);
+ sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE).unwrap();
+ sk_client.store(&ID_EXAMPLE_2, &SECRET_EXAMPLE).unwrap();
sk_client.delete(&[&ID_NOT_STORED]);
- assert_eq!(sk_client.get(&ID_EXAMPLE), Some(SECRET_EXAMPLE));
- assert_eq!(sk_client.get(&ID_EXAMPLE_2), Some(SECRET_EXAMPLE));
- assert_eq!(sk_client.get(&ID_NOT_STORED), None);
+ assert_eq!(sk_client.get(&ID_EXAMPLE).unwrap(), SECRET_EXAMPLE);
+ assert_eq!(sk_client.get(&ID_EXAMPLE_2).unwrap(), SECRET_EXAMPLE);
+ assert_entry_not_found(sk_client.get(&ID_NOT_STORED));
}
-#[test]
-fn secretkeeper_store_delete_all() {
- let sk_client = setup_client!();
+// Don't run deleteAll() on a secure device, as it might affect real secrets.
+#[rdroidtest(get_instances())]
+#[ignore_if(|p| p != "nonsecure")]
+fn secretkeeper_store_delete_all(instance: String) {
+ let mut sk_client = SkClient::new(&instance);
- if sk_client.name != "nonsecure" {
- // Don't run deleteAll() on a secure device, as it might affect
- // real secrets.
- warn!("skipping deleteAll test due to real impl");
- return;
- }
-
- sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE);
- sk_client.store(&ID_EXAMPLE_2, &SECRET_EXAMPLE);
+ sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE).unwrap();
+ sk_client.store(&ID_EXAMPLE_2, &SECRET_EXAMPLE).unwrap();
sk_client.delete_all();
- assert_eq!(sk_client.get(&ID_EXAMPLE), None);
- assert_eq!(sk_client.get(&ID_EXAMPLE_2), None);
+ assert_entry_not_found(sk_client.get(&ID_EXAMPLE));
+ assert_entry_not_found(sk_client.get(&ID_EXAMPLE_2));
// Store a new secret (corresponding to an id).
- sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE);
+ sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE).unwrap();
// Get the restored secret.
- assert_eq!(sk_client.get(&ID_EXAMPLE), Some(SECRET_EXAMPLE));
+ assert_eq!(sk_client.get(&ID_EXAMPLE).unwrap(), SECRET_EXAMPLE);
// (Try to) Get the secret that was never stored
- assert_eq!(sk_client.get(&ID_NOT_STORED), None);
+ assert_entry_not_found(sk_client.get(&ID_NOT_STORED));
}
+
+// This test checks that Secretkeeper uses the expected [`RequestSeqNum`] as aad while
+// decrypting requests and the responses are encrypted with correct [`ResponseSeqNum`] for the
+// first few messages.
+#[rdroidtest(get_instances())]
+fn secret_management_replay_protection_seq_num(instance: String) {
+ let dice_chain = make_explicit_owned_dice(/*Security version in a node */ 5);
+ let sealing_policy = sealing_policy(dice_chain.explicit_key_dice_chain().unwrap());
+ let sk_client = SkClient::with_identity(&instance, dice_chain);
+ // Construct encoded request packets for the test
+ let (req_1, req_2, req_3) = construct_secret_management_requests(sealing_policy);
+
+ // Lets now construct the seq_numbers(in request & expected in response)
+ let mut seq_a = SeqNum::new();
+ let [seq_0, seq_1, seq_2] = std::array::from_fn(|_| seq_a.get_then_increment().unwrap());
+
+ // Check first request/response is successful
+ let res = ResponsePacket::from_slice(
+ &sk_client.secret_management_request_custom_aad(&req_1, &seq_0, &seq_0).unwrap(),
+ )
+ .unwrap();
+ assert_eq!(res.response_type().unwrap(), ResponseType::Success);
+
+ // Check 2nd request/response is successful
+ let res = ResponsePacket::from_slice(
+ &sk_client.secret_management_request_custom_aad(&req_2, &seq_1, &seq_1).unwrap(),
+ )
+ .unwrap();
+ assert_eq!(res.response_type().unwrap(), ResponseType::Success);
+
+ // Check 3rd request/response is successful
+ let res = ResponsePacket::from_slice(
+ &sk_client.secret_management_request_custom_aad(&req_3, &seq_2, &seq_2).unwrap(),
+ )
+ .unwrap();
+ assert_eq!(res.response_type().unwrap(), ResponseType::Success);
+}
+
+// This test checks that Secretkeeper uses fresh [`RequestSeqNum`] & [`ResponseSeqNum`]
+// for new sessions.
+#[rdroidtest(get_instances())]
+fn secret_management_replay_protection_seq_num_per_session(instance: String) {
+ let dice_chain = make_explicit_owned_dice(/*Security version in a node */ 5);
+ let sealing_policy = sealing_policy(dice_chain.explicit_key_dice_chain().unwrap());
+ let sk_client = SkClient::with_identity(&instance, dice_chain);
+
+ // Construct encoded request packets for the test
+ let (req_1, _, _) = construct_secret_management_requests(sealing_policy);
+
+ // Lets now construct the seq_number (in request & expected in response)
+ let mut seq_a = SeqNum::new();
+ let seq_0 = seq_a.get_then_increment().unwrap();
+ // Check first request/response is successful
+ let res = ResponsePacket::from_slice(
+ &sk_client.secret_management_request_custom_aad(&req_1, &seq_0, &seq_0).unwrap(),
+ )
+ .unwrap();
+ assert_eq!(res.response_type().unwrap(), ResponseType::Success);
+
+ // Start another session
+ let sk_client_diff = SkClient::new(&instance);
+ // Check first request/response is with seq_0 is successful
+ let res = ResponsePacket::from_slice(
+ &sk_client_diff.secret_management_request_custom_aad(&req_1, &seq_0, &seq_0).unwrap(),
+ )
+ .unwrap();
+ assert_eq!(res.response_type().unwrap(), ResponseType::Success);
+}
+
+// This test checks that Secretkeeper rejects requests with out of order [`RequestSeqNum`]
+// TODO(b/317416663): This test fails, when HAL is not present in the device. Refactor to fix this.
+#[rdroidtest(get_instances())]
+fn secret_management_replay_protection_out_of_seq_req_not_accepted(instance: String) {
+ let dice_chain = make_explicit_owned_dice(/*Security version in a node */ 5);
+ let sealing_policy = sealing_policy(dice_chain.explicit_key_dice_chain().unwrap());
+ let sk_client = SkClient::with_identity(&instance, dice_chain);
+
+ // Construct encoded request packets for the test
+ let (req_1, req_2, _) = construct_secret_management_requests(sealing_policy);
+
+ // Lets now construct the seq_numbers(in request & expected in response)
+ let mut seq_a = SeqNum::new();
+ let [seq_0, seq_1, seq_2] = std::array::from_fn(|_| seq_a.get_then_increment().unwrap());
+
+ // Assume First request/response is successful
+ sk_client.secret_management_request_custom_aad(&req_1, &seq_0, &seq_0).unwrap();
+
+ // Check 2nd request/response with skipped seq_num in request is a binder error
+ let res = sk_client
+ .secret_management_request_custom_aad(&req_2, /*Skipping seq_1*/ &seq_2, &seq_1);
+ let err = res.expect_err("Out of Seq messages accepted!");
+ // Incorrect sequence numbers lead to failed decryption. The resultant error should be
+ // thrown in clear text & wrapped in Binder errors.
+ assert!(matches!(err, Error::InfraError(secretkeeper_client::Error::BinderStatus(_e))));
+}
+
+// This test checks DICE policy based access control of Secretkeeper.
+#[rdroidtest(get_instances())]
+fn secret_management_policy_gate(instance: String) {
+ let dice_chain = make_explicit_owned_dice(/*Security version in a node */ 100);
+ let mut sk_client = SkClient::with_identity(&instance, dice_chain);
+ sk_client.store(&ID_EXAMPLE, &SECRET_EXAMPLE).unwrap();
+
+ // Start a session with higher security_version & get the stored secret.
+ let dice_chain_upgraded = make_explicit_owned_dice(/*Security version in a node */ 101);
+ let mut sk_client_upgraded = SkClient::with_identity(&instance, dice_chain_upgraded);
+ assert_eq!(sk_client_upgraded.get(&ID_EXAMPLE).unwrap(), SECRET_EXAMPLE);
+
+ // Start a session with lower security_version (This should be denied access to the secret).
+ let dice_chain_downgraded = make_explicit_owned_dice(/*Security version in a node */ 99);
+ let mut sk_client_downgraded = SkClient::with_identity(&instance, dice_chain_downgraded);
+ assert!(matches!(
+ sk_client_downgraded.get(&ID_EXAMPLE).unwrap_err(),
+ Error::SecretkeeperError(SecretkeeperError::DicePolicyError)
+ ));
+}
+
+// Helper method that constructs 3 SecretManagement requests. Callers would usually not care about
+// what each of the request concretely is.
+fn construct_secret_management_requests(sealing_policy: Vec<u8>) -> (Vec<u8>, Vec<u8>, Vec<u8>) {
+ let version_request = GetVersionRequest {};
+ let version_request = version_request.serialize_to_packet().to_vec().unwrap();
+ let store_request =
+ StoreSecretRequest { id: ID_EXAMPLE, secret: SECRET_EXAMPLE, sealing_policy };
+ let store_request = store_request.serialize_to_packet().to_vec().unwrap();
+ let get_request = GetSecretRequest { id: ID_EXAMPLE, updated_sealing_policy: None };
+ let get_request = get_request.serialize_to_packet().to_vec().unwrap();
+ (version_request, store_request, get_request)
+}
+
+rdroidtest::test_main!();
diff --git a/security/secretkeeper/default/Android.bp b/security/secretkeeper/default/Android.bp
index 08cc67a..d8ccb63 100644
--- a/security/secretkeeper/default/Android.bp
+++ b/security/secretkeeper/default/Android.bp
@@ -18,6 +18,29 @@
default_applicable_licenses: ["Android-Apache-2.0"],
}
+rust_library {
+ name: "libsecretkeeper_nonsecure",
+ crate_name: "secretkeeper_nonsecure",
+ srcs: [
+ "src/lib.rs",
+ ],
+ vendor_available: true,
+ defaults: [
+ "authgraph_use_latest_hal_aidl_rust",
+ ],
+ rustlibs: [
+ "android.hardware.security.secretkeeper-V1-rust",
+ "libauthgraph_boringssl",
+ "libauthgraph_core",
+ "libauthgraph_hal",
+ "libbinder_rs",
+ "libcoset",
+ "liblog_rust",
+ "libsecretkeeper_core_nostd",
+ "libsecretkeeper_comm_nostd",
+ ],
+}
+
rust_binary {
name: "android.hardware.security.secretkeeper-service.nonsecure",
relative_install_path: "hw",
@@ -30,20 +53,34 @@
rustlibs: [
"android.hardware.security.secretkeeper-V1-rust",
"libandroid_logger",
- "libauthgraph_boringssl",
- "libauthgraph_core",
- "libauthgraph_hal",
"libbinder_rs",
"liblog_rust",
- "libsecretkeeper_comm_nostd",
- "libsecretkeeper_core_nostd",
"libsecretkeeper_hal",
+ "libsecretkeeper_nonsecure",
],
srcs: [
"src/main.rs",
],
}
+rust_fuzz {
+ name: "android.hardware.security.secretkeeper-service.nonsecure_fuzzer",
+ rustlibs: [
+ "libsecretkeeper_hal",
+ "libsecretkeeper_nonsecure",
+ "libbinder_random_parcel_rs",
+ "libbinder_rs",
+ ],
+ srcs: ["src/fuzzer.rs"],
+ fuzz_config: {
+ cc: [
+ "alanstokes@google.com",
+ "drysdale@google.com",
+ "shikhapanwar@google.com",
+ ],
+ },
+}
+
prebuilt_etc {
name: "secretkeeper.rc",
src: "secretkeeper.rc",
diff --git a/security/secretkeeper/default/src/fuzzer.rs b/security/secretkeeper/default/src/fuzzer.rs
new file mode 100644
index 0000000..914ebe6
--- /dev/null
+++ b/security/secretkeeper/default/src/fuzzer.rs
@@ -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.
+ */
+
+#![allow(missing_docs)]
+#![no_main]
+extern crate libfuzzer_sys;
+
+use binder_random_parcel_rs::fuzz_service;
+use libfuzzer_sys::fuzz_target;
+use secretkeeper_hal::SecretkeeperService;
+use secretkeeper_nonsecure::{AuthGraphChannel, LocalTa, SecretkeeperChannel};
+use std::sync::{Arc, Mutex};
+
+fuzz_target!(|data: &[u8]| {
+ let ta = Arc::new(Mutex::new(LocalTa::new()));
+ let ag_channel = AuthGraphChannel(ta.clone());
+ let sk_channel = SecretkeeperChannel(ta.clone());
+
+ let service = SecretkeeperService::new_as_binder(sk_channel, ag_channel);
+ fuzz_service(&mut service.as_binder(), data);
+});
diff --git a/security/secretkeeper/default/src/lib.rs b/security/secretkeeper/default/src/lib.rs
new file mode 100644
index 0000000..eb7817c
--- /dev/null
+++ b/security/secretkeeper/default/src/lib.rs
@@ -0,0 +1,136 @@
+/*
+ * 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.
+ */
+
+//! Non-secure implementation of a local Secretkeeper TA.
+
+use authgraph_boringssl as boring;
+use authgraph_core::keyexchange::{AuthGraphParticipant, MAX_OPENED_SESSIONS};
+use authgraph_core::ta::{AuthGraphTa, Role};
+use authgraph_hal::channel::SerializedChannel;
+use log::error;
+use secretkeeper_core::ta::SecretkeeperTa;
+use std::cell::RefCell;
+use std::rc::Rc;
+use std::sync::mpsc;
+use std::sync::{Arc, Mutex};
+
+mod store;
+
+/// Implementation of the Secrekeeper TA that runs locally in-process (and which is therefore
+/// insecure).
+pub struct LocalTa {
+ in_tx: mpsc::Sender<Vec<u8>>,
+ out_rx: mpsc::Receiver<Vec<u8>>,
+}
+
+/// Prefix byte for messages intended for the AuthGraph TA.
+const AG_MESSAGE_PREFIX: u8 = 0x00;
+/// Prefix byte for messages intended for the Secretkeeper TA.
+const SK_MESSAGE_PREFIX: u8 = 0x01;
+
+impl LocalTa {
+ /// Create a new instance.
+ pub fn new() -> Self {
+ // Create a pair of channels to communicate with the TA thread.
+ let (in_tx, in_rx) = mpsc::channel();
+ let (out_tx, out_rx) = mpsc::channel();
+
+ // The TA code expects to run single threaded, so spawn a thread to run it in.
+ std::thread::spawn(move || {
+ let mut crypto_impls = boring::crypto_trait_impls();
+ let storage_impl = Box::new(store::InMemoryStore::default());
+ let sk_ta = Rc::new(RefCell::new(
+ SecretkeeperTa::new(
+ &mut crypto_impls,
+ storage_impl,
+ coset::iana::EllipticCurve::Ed25519,
+ )
+ .expect("Failed to create local Secretkeeper TA"),
+ ));
+ let mut ag_ta = AuthGraphTa::new(
+ AuthGraphParticipant::new(crypto_impls, sk_ta.clone(), MAX_OPENED_SESSIONS)
+ .expect("Failed to create local AuthGraph TA"),
+ Role::Sink,
+ );
+
+ // Loop forever processing request messages.
+ loop {
+ let req_data: Vec<u8> = match in_rx.recv() {
+ Ok(data) => data,
+ Err(_) => {
+ error!("local TA failed to receive request!");
+ break;
+ }
+ };
+ let rsp_data = match req_data[0] {
+ AG_MESSAGE_PREFIX => ag_ta.process(&req_data[1..]),
+ SK_MESSAGE_PREFIX => {
+ // It's safe to `borrow_mut()` because this code is not a callback
+ // from AuthGraph (the only other holder of an `Rc`), and so there
+ // can be no live `borrow()`s in this (single) thread.
+ sk_ta.borrow_mut().process(&req_data[1..])
+ }
+ prefix => panic!("unexpected messageprefix {prefix}!"),
+ };
+ match out_tx.send(rsp_data) {
+ Ok(_) => {}
+ Err(_) => {
+ error!("local TA failed to send out response");
+ break;
+ }
+ }
+ }
+ error!("local TA terminating!");
+ });
+ Self { in_tx, out_rx }
+ }
+
+ fn execute_for(&mut self, prefix: u8, req_data: &[u8]) -> Vec<u8> {
+ let mut prefixed_req = Vec::with_capacity(req_data.len() + 1);
+ prefixed_req.push(prefix);
+ prefixed_req.extend_from_slice(req_data);
+ self.in_tx
+ .send(prefixed_req)
+ .expect("failed to send in request");
+ self.out_rx.recv().expect("failed to receive response")
+ }
+}
+
+pub struct AuthGraphChannel(pub Arc<Mutex<LocalTa>>);
+
+impl SerializedChannel for AuthGraphChannel {
+ const MAX_SIZE: usize = usize::MAX;
+ fn execute(&self, req_data: &[u8]) -> binder::Result<Vec<u8>> {
+ Ok(self
+ .0
+ .lock()
+ .unwrap()
+ .execute_for(AG_MESSAGE_PREFIX, req_data))
+ }
+}
+
+pub struct SecretkeeperChannel(pub Arc<Mutex<LocalTa>>);
+
+impl SerializedChannel for SecretkeeperChannel {
+ const MAX_SIZE: usize = usize::MAX;
+ fn execute(&self, req_data: &[u8]) -> binder::Result<Vec<u8>> {
+ Ok(self
+ .0
+ .lock()
+ .unwrap()
+ .execute_for(SK_MESSAGE_PREFIX, req_data))
+ }
+}
diff --git a/security/secretkeeper/default/src/main.rs b/security/secretkeeper/default/src/main.rs
index c8c1521..436f9a7 100644
--- a/security/secretkeeper/default/src/main.rs
+++ b/security/secretkeeper/default/src/main.rs
@@ -15,112 +15,14 @@
*/
//! Non-secure implementation of the Secretkeeper HAL.
-mod store;
-use authgraph_boringssl as boring;
-use authgraph_core::keyexchange::{AuthGraphParticipant, MAX_OPENED_SESSIONS};
-use authgraph_core::ta::{AuthGraphTa, Role};
-use authgraph_hal::channel::SerializedChannel;
use log::{error, info, Level};
-use secretkeeper_core::ta::SecretkeeperTa;
use secretkeeper_hal::SecretkeeperService;
-use std::sync::Arc;
-use std::sync::Mutex;
-use store::InMemoryStore;
-
+use secretkeeper_nonsecure::{AuthGraphChannel, SecretkeeperChannel, LocalTa};
+use std::sync::{Arc, Mutex};
use android_hardware_security_secretkeeper::aidl::android::hardware::security::secretkeeper::ISecretkeeper::{
BpSecretkeeper, ISecretkeeper,
};
-use std::cell::RefCell;
-use std::rc::Rc;
-use std::sync::mpsc;
-
-/// Implementation of the Secrekeeper TA that runs locally in-process (and which is therefore
-/// insecure).
-pub struct LocalTa {
- in_tx: mpsc::Sender<Vec<u8>>,
- out_rx: mpsc::Receiver<Vec<u8>>,
-}
-
-/// Prefix byte for messages intended for the AuthGraph TA.
-const AG_MESSAGE_PREFIX: u8 = 0x00;
-/// Prefix byte for messages intended for the Secretkeeper TA.
-const SK_MESSAGE_PREFIX: u8 = 0x01;
-
-impl LocalTa {
- /// Create a new instance.
- pub fn new() -> Self {
- // Create a pair of channels to communicate with the TA thread.
- let (in_tx, in_rx) = mpsc::channel();
- let (out_tx, out_rx) = mpsc::channel();
-
- // The TA code expects to run single threaded, so spawn a thread to run it in.
- std::thread::spawn(move || {
- let mut crypto_impls = boring::crypto_trait_impls();
- let storage_impl = Box::new(InMemoryStore::default());
- let sk_ta = Rc::new(RefCell::new(
- SecretkeeperTa::new(&mut crypto_impls, storage_impl)
- .expect("Failed to create local Secretkeeper TA"),
- ));
- let mut ag_ta = AuthGraphTa::new(
- AuthGraphParticipant::new(crypto_impls, sk_ta.clone(), MAX_OPENED_SESSIONS)
- .expect("Failed to create local AuthGraph TA"),
- Role::Sink,
- );
-
- // Loop forever processing request messages.
- loop {
- let req_data: Vec<u8> = in_rx.recv().expect("failed to receive next req");
- let rsp_data = match req_data[0] {
- AG_MESSAGE_PREFIX => ag_ta.process(&req_data[1..]),
- SK_MESSAGE_PREFIX => {
- // It's safe to `borrow_mut()` because this code is not a callback
- // from AuthGraph (the only other holder of an `Rc`), and so there
- // can be no live `borrow()`s in this (single) thread.
- sk_ta.borrow_mut().process(&req_data[1..])
- }
- prefix => panic!("unexpected messageprefix {prefix}!"),
- };
- out_tx.send(rsp_data).expect("failed to send out rsp");
- }
- });
- Self { in_tx, out_rx }
- }
-
- fn execute_for(&mut self, prefix: u8, req_data: &[u8]) -> Vec<u8> {
- let mut prefixed_req = Vec::with_capacity(req_data.len() + 1);
- prefixed_req.push(prefix);
- prefixed_req.extend_from_slice(req_data);
- self.in_tx
- .send(prefixed_req)
- .expect("failed to send in request");
- self.out_rx.recv().expect("failed to receive response")
- }
-}
-
-pub struct AuthGraphChannel(Arc<Mutex<LocalTa>>);
-impl SerializedChannel for AuthGraphChannel {
- const MAX_SIZE: usize = usize::MAX;
- fn execute(&self, req_data: &[u8]) -> binder::Result<Vec<u8>> {
- Ok(self
- .0
- .lock()
- .unwrap()
- .execute_for(AG_MESSAGE_PREFIX, req_data))
- }
-}
-
-pub struct SecretkeeperChannel(Arc<Mutex<LocalTa>>);
-impl SerializedChannel for SecretkeeperChannel {
- const MAX_SIZE: usize = usize::MAX;
- fn execute(&self, req_data: &[u8]) -> binder::Result<Vec<u8>> {
- Ok(self
- .0
- .lock()
- .unwrap()
- .execute_for(SK_MESSAGE_PREFIX, req_data))
- }
-}
fn main() {
// Initialize Android logging.
diff --git a/security/secretkeeper/default/src/store.rs b/security/secretkeeper/default/src/store.rs
index a7fb3b7..6c7dba1 100644
--- a/security/secretkeeper/default/src/store.rs
+++ b/security/secretkeeper/default/src/store.rs
@@ -13,12 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
+//! In-memory store for nonsecure Secretkeeper.
+
use secretkeeper_comm::data_types::error::Error;
use secretkeeper_core::store::KeyValueStore;
use std::collections::HashMap;
-/// An in-memory implementation of KeyValueStore. Please note that this is entirely for
-/// testing purposes. Refer to the documentation of `PolicyGatedStorage` & Secretkeeper HAL for
+/// An in-memory implementation of [`KeyValueStore`]. Please note that this is entirely for testing
+/// purposes. Refer to the documentation of `PolicyGatedStorage` and Secretkeeper HAL for
/// persistence requirements.
#[derive(Default)]
pub struct InMemoryStore(HashMap<Vec<u8>, Vec<u8>>);
diff --git a/sensors/aidl/default/multihal/Android.bp b/sensors/aidl/default/multihal/Android.bp
index a20d6d7..40cb2d9 100644
--- a/sensors/aidl/default/multihal/Android.bp
+++ b/sensors/aidl/default/multihal/Android.bp
@@ -45,11 +45,6 @@
"HalProxyAidl.cpp",
"ConvertUtils.cpp",
],
- visibility: [
- ":__subpackages__",
- "//hardware/interfaces/sensors/aidl/multihal:__subpackages__",
- "//hardware/interfaces/tests/extension/sensors:__subpackages__",
- ],
static_libs: [
"android.hardware.sensors@1.0-convert",
"android.hardware.sensors@2.X-multihal",
diff --git a/tetheroffload/aidl/Android.bp b/tetheroffload/aidl/Android.bp
index 6de27c3..e091c5b 100644
--- a/tetheroffload/aidl/Android.bp
+++ b/tetheroffload/aidl/Android.bp
@@ -18,6 +18,9 @@
],
min_sdk_version: "30",
enabled: true,
+ lint: {
+ baseline_filename: "lint-baseline.xml",
+ },
},
ndk: {
apps_enabled: false,
diff --git a/tetheroffload/aidl/lint-baseline.xml b/tetheroffload/aidl/lint-baseline.xml
new file mode 100644
index 0000000..62924b1
--- /dev/null
+++ b/tetheroffload/aidl/lint-baseline.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.4.0-alpha01" type="baseline" client="" dependencies="true" name="" variant="all" version="8.4.0-alpha01">
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 30): `android.os.Binder#markVintfStability`"
+ errorLine1=" this.markVintfStability();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/soong/.intermediates/hardware/interfaces/tetheroffload/aidl/android.hardware.tetheroffload-V1-java-source/gen/android/hardware/tetheroffload/IOffload.java"
+ line="64"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 30): `android.os.Binder#markVintfStability`"
+ errorLine1=" this.markVintfStability();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/soong/.intermediates/hardware/interfaces/tetheroffload/aidl/android.hardware.tetheroffload-V1-java-source/gen/android/hardware/tetheroffload/ITetheringOffloadCallback.java"
+ line="45"
+ column="12"/>
+ </issue>
+
+</issues>
\ No newline at end of file
diff --git a/tetheroffload/config/1.0/Android.bp b/tetheroffload/config/1.0/Android.bp
index 116c9b6..b5c4185 100644
--- a/tetheroffload/config/1.0/Android.bp
+++ b/tetheroffload/config/1.0/Android.bp
@@ -19,4 +19,8 @@
"android.hidl.base@1.0",
],
gen_java: true,
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.tethering",
+ ],
}
diff --git a/tetheroffload/control/1.0/Android.bp b/tetheroffload/control/1.0/Android.bp
index acb5ee8..6589ee2 100644
--- a/tetheroffload/control/1.0/Android.bp
+++ b/tetheroffload/control/1.0/Android.bp
@@ -21,4 +21,8 @@
"android.hidl.base@1.0",
],
gen_java: true,
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.tethering",
+ ],
}
diff --git a/thermal/aidl/aidl_api/android.hardware.thermal/current/android/hardware/thermal/CoolingDevice.aidl b/thermal/aidl/aidl_api/android.hardware.thermal/current/android/hardware/thermal/CoolingDevice.aidl
index dff3c4c..7e1aed7 100644
--- a/thermal/aidl/aidl_api/android.hardware.thermal/current/android/hardware/thermal/CoolingDevice.aidl
+++ b/thermal/aidl/aidl_api/android.hardware.thermal/current/android/hardware/thermal/CoolingDevice.aidl
@@ -38,4 +38,7 @@
android.hardware.thermal.CoolingType type;
String name;
long value;
+ long powerLimitMw;
+ long powerMw;
+ long timeWindowMs;
}
diff --git a/thermal/aidl/aidl_api/android.hardware.thermal/current/android/hardware/thermal/ICoolingDeviceChangedCallback.aidl b/thermal/aidl/aidl_api/android.hardware.thermal/current/android/hardware/thermal/ICoolingDeviceChangedCallback.aidl
new file mode 100644
index 0000000..ea75b1c
--- /dev/null
+++ b/thermal/aidl/aidl_api/android.hardware.thermal/current/android/hardware/thermal/ICoolingDeviceChangedCallback.aidl
@@ -0,0 +1,39 @@
+/*
+ * 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 FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.thermal;
+/* @hide */
+@VintfStability
+interface ICoolingDeviceChangedCallback {
+ oneway void notifyCoolingDeviceChanged(in android.hardware.thermal.CoolingDevice coolingDevice);
+}
diff --git a/thermal/aidl/aidl_api/android.hardware.thermal/current/android/hardware/thermal/IThermal.aidl b/thermal/aidl/aidl_api/android.hardware.thermal/current/android/hardware/thermal/IThermal.aidl
index c9b6cab..904496c 100644
--- a/thermal/aidl/aidl_api/android.hardware.thermal/current/android/hardware/thermal/IThermal.aidl
+++ b/thermal/aidl/aidl_api/android.hardware.thermal/current/android/hardware/thermal/IThermal.aidl
@@ -44,4 +44,6 @@
void registerThermalChangedCallback(in android.hardware.thermal.IThermalChangedCallback callback);
void registerThermalChangedCallbackWithType(in android.hardware.thermal.IThermalChangedCallback callback, in android.hardware.thermal.TemperatureType type);
void unregisterThermalChangedCallback(in android.hardware.thermal.IThermalChangedCallback callback);
+ void registerCoolingDeviceChangedCallbackWithType(in android.hardware.thermal.ICoolingDeviceChangedCallback callback, in android.hardware.thermal.CoolingType type);
+ void unregisterCoolingDeviceChangedCallback(in android.hardware.thermal.ICoolingDeviceChangedCallback callback);
}
diff --git a/thermal/aidl/android/hardware/thermal/CoolingDevice.aidl b/thermal/aidl/android/hardware/thermal/CoolingDevice.aidl
index 0c5c17d..406733b 100644
--- a/thermal/aidl/android/hardware/thermal/CoolingDevice.aidl
+++ b/thermal/aidl/android/hardware/thermal/CoolingDevice.aidl
@@ -40,4 +40,16 @@
* means deeper throttling.
*/
long value;
+ /**
+ * Power budget (mW) of the cooling device.
+ */
+ long powerLimitMw;
+ /**
+ * Target cooling device's AVG power for the last time_window_ms.
+ */
+ long powerMw;
+ /**
+ * The time window (millisecond) to calculate the power consumption
+ */
+ long timeWindowMs;
}
diff --git a/thermal/aidl/android/hardware/thermal/ICoolingDeviceChangedCallback.aidl b/thermal/aidl/android/hardware/thermal/ICoolingDeviceChangedCallback.aidl
new file mode 100644
index 0000000..e6bb9fe
--- /dev/null
+++ b/thermal/aidl/android/hardware/thermal/ICoolingDeviceChangedCallback.aidl
@@ -0,0 +1,36 @@
+/*
+ * 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 android.hardware.thermal;
+
+import android.hardware.thermal.CoolingDevice;
+import android.hardware.thermal.Temperature;
+
+/**
+ * ICoolingDeviceChangedCallback send cooling device change notification to clients.
+ * @hide
+ */
+@VintfStability
+interface ICoolingDeviceChangedCallback {
+ /**
+ * Send a cooling device change event to all ThermalHAL
+ * cooling device event listeners.
+ *
+ * @param cooling_device The cooling device information associated with the
+ * change event.
+ */
+ oneway void notifyCoolingDeviceChanged(in CoolingDevice coolingDevice);
+}
diff --git a/thermal/aidl/android/hardware/thermal/IThermal.aidl b/thermal/aidl/android/hardware/thermal/IThermal.aidl
index c94edcd..4aa4090 100644
--- a/thermal/aidl/android/hardware/thermal/IThermal.aidl
+++ b/thermal/aidl/android/hardware/thermal/IThermal.aidl
@@ -18,6 +18,7 @@
import android.hardware.thermal.CoolingDevice;
import android.hardware.thermal.CoolingType;
+import android.hardware.thermal.ICoolingDeviceChangedCallback;
import android.hardware.thermal.IThermalChangedCallback;
import android.hardware.thermal.Temperature;
import android.hardware.thermal.TemperatureThreshold;
@@ -188,4 +189,40 @@
* getMessage() must be populated with human-readable error message.
*/
void unregisterThermalChangedCallback(in IThermalChangedCallback callback);
+
+ /**
+ * Register an ICoolingDeviceChangedCallback for a given CoolingType, used by
+ * the Thermal HAL to receive CDEV events when cooling device status
+ * changed.
+ * Multiple registrations with different ICoolingDeviceChangedCallback must be allowed.
+ * Multiple registrations with same ICoolingDeviceChangedCallback is not allowed, client
+ * should unregister the given ICoolingDeviceChangedCallback first.
+ *
+ * @param callback the ICoolingChangedCallback to use for receiving
+ * cooling device events. If nullptr callback is given, the status code will be
+ * STATUS_BAD_VALUE and the operation will fail.
+ * @param type the type to be filtered.
+ *
+ * @throws EX_ILLEGAL_ARGUMENT If the callback is given nullptr or already registered. And the
+ * getMessage() must be populated with human-readable error message.
+ * @throws EX_ILLEGAL_STATE If the Thermal HAL is not initialized successfully. And the
+ * getMessage() must be populated with human-readable error message.
+ */
+ void registerCoolingDeviceChangedCallbackWithType(
+ in ICoolingDeviceChangedCallback callback, in CoolingType type);
+
+ /**
+ * Unregister an ICoolingDeviceChangedCallback, used by the Thermal HAL
+ * to receive CDEV events when cooling device status changed.
+ *
+ * @param callback the ICoolingDeviceChangedCallback to use for receiving
+ * cooling device events. if nullptr callback is given, the status code will be
+ * STATUS_BAD_VALUE and the operation will fail.
+ *
+ * @throws EX_ILLEGAL_ARGUMENT If the callback is given nullptr or not previously registered.
+ * And the getMessage() must be populated with human-readable error message.
+ * @throws EX_ILLEGAL_STATE If the Thermal HAL is not initialized successfully. And the
+ * getMessage() must be populated with human-readable error message.
+ */
+ void unregisterCoolingDeviceChangedCallback(in ICoolingDeviceChangedCallback callback);
}
diff --git a/thermal/aidl/default/Thermal.cpp b/thermal/aidl/default/Thermal.cpp
index f643d22..41d0be8 100644
--- a/thermal/aidl/default/Thermal.cpp
+++ b/thermal/aidl/default/Thermal.cpp
@@ -142,4 +142,53 @@
return ScopedAStatus::ok();
}
+ScopedAStatus Thermal::registerCoolingDeviceChangedCallbackWithType(
+ const std::shared_ptr<ICoolingDeviceChangedCallback>& in_callback, CoolingType in_type) {
+ LOG(VERBOSE) << __func__ << " ICoolingDeviceChangedCallback: " << in_callback
+ << ", CoolingType: " << static_cast<int32_t>(in_type);
+ if (in_callback == nullptr) {
+ return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+ "Invalid nullptr callback");
+ }
+ {
+ std::lock_guard<std::mutex> _lock(cdev_callback_mutex_);
+ if (std::any_of(cdev_callbacks_.begin(), cdev_callbacks_.end(),
+ [&](const std::shared_ptr<ICoolingDeviceChangedCallback>& c) {
+ return interfacesEqual(c, in_callback);
+ })) {
+ return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+ "Callback already registered");
+ }
+ cdev_callbacks_.push_back(in_callback);
+ }
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus Thermal::unregisterCoolingDeviceChangedCallback(
+ const std::shared_ptr<ICoolingDeviceChangedCallback>& in_callback) {
+ LOG(VERBOSE) << __func__ << " ICoolingDeviceChangedCallback: " << in_callback;
+ if (in_callback == nullptr) {
+ return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+ "Invalid nullptr callback");
+ }
+ {
+ std::lock_guard<std::mutex> _lock(cdev_callback_mutex_);
+ bool removed = false;
+ cdev_callbacks_.erase(
+ std::remove_if(cdev_callbacks_.begin(), cdev_callbacks_.end(),
+ [&](const std::shared_ptr<ICoolingDeviceChangedCallback>& c) {
+ if (interfacesEqual(c, in_callback)) {
+ removed = true;
+ return true;
+ }
+ return false;
+ }),
+ cdev_callbacks_.end());
+ if (!removed) {
+ return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+ "Callback wasn't registered");
+ }
+ }
+ return ScopedAStatus::ok();
+}
} // namespace aidl::android::hardware::thermal::impl::example
diff --git a/thermal/aidl/default/Thermal.h b/thermal/aidl/default/Thermal.h
index 8885e63..d3d8874 100644
--- a/thermal/aidl/default/Thermal.h
+++ b/thermal/aidl/default/Thermal.h
@@ -46,6 +46,7 @@
ndk::ScopedAStatus registerThermalChangedCallback(
const std::shared_ptr<IThermalChangedCallback>& in_callback) override;
+
ndk::ScopedAStatus registerThermalChangedCallbackWithType(
const std::shared_ptr<IThermalChangedCallback>& in_callback,
TemperatureType in_type) override;
@@ -53,9 +54,18 @@
ndk::ScopedAStatus unregisterThermalChangedCallback(
const std::shared_ptr<IThermalChangedCallback>& in_callback) override;
+ ndk::ScopedAStatus registerCoolingDeviceChangedCallbackWithType(
+ const std::shared_ptr<ICoolingDeviceChangedCallback>& in_callback,
+ CoolingType in_type) override;
+
+ ndk::ScopedAStatus unregisterCoolingDeviceChangedCallback(
+ const std::shared_ptr<ICoolingDeviceChangedCallback>& in_callback) override;
+
private:
std::mutex thermal_callback_mutex_;
std::vector<std::shared_ptr<IThermalChangedCallback>> thermal_callbacks_;
+ std::mutex cdev_callback_mutex_;
+ std::vector<std::shared_ptr<ICoolingDeviceChangedCallback>> cdev_callbacks_;
};
} // namespace example
diff --git a/thermal/aidl/vts/VtsHalThermalTargetTest.cpp b/thermal/aidl/vts/VtsHalThermalTargetTest.cpp
index 4b0eb65..403c6c8 100644
--- a/thermal/aidl/vts/VtsHalThermalTargetTest.cpp
+++ b/thermal/aidl/vts/VtsHalThermalTargetTest.cpp
@@ -26,6 +26,7 @@
#include <aidl/Gtest.h>
#include <aidl/Vintf.h>
+#include <aidl/android/hardware/thermal/BnCoolingDeviceChangedCallback.h>
#include <aidl/android/hardware/thermal/BnThermal.h>
#include <aidl/android/hardware/thermal/BnThermalChangedCallback.h>
#include <android-base/logging.h>
@@ -59,6 +60,15 @@
.throttlingStatus = ThrottlingSeverity::CRITICAL,
};
+static const CoolingDevice kCoolingDevice = {
+ .type = CoolingType::CPU,
+ .name = "test cooling device",
+ .value = 1,
+ .powerLimitMw = 300,
+ .powerMw = 500,
+ .timeWindowMs = 7000,
+};
+
// Callback class for receiving thermal event notifications from main class
class ThermalCallback : public BnThermalChangedCallback {
public:
@@ -85,6 +95,33 @@
bool mInvoke = false;
};
+// Callback class for receiving cooling device event notifications from main class
+class CoolingDeviceCallback : public BnCoolingDeviceChangedCallback {
+ public:
+ ndk::ScopedAStatus notifyCoolingDeviceChanged(const CoolingDevice&) override {
+ {
+ std::lock_guard<std::mutex> lock(mMutex);
+ mInvoke = true;
+ }
+ mNotifyCoolingDeviceChanged.notify_all();
+ return ndk::ScopedAStatus::ok();
+ }
+
+ template <typename R, typename P>
+ [[nodiscard]] bool waitForCallback(std::chrono::duration<R, P> duration) {
+ std::unique_lock<std::mutex> lock(mMutex);
+ bool r = mNotifyCoolingDeviceChanged.wait_for(lock, duration,
+ [this] { return this->mInvoke; });
+ mInvoke = false;
+ return r;
+ }
+
+ private:
+ std::mutex mMutex;
+ std::condition_variable mNotifyCoolingDeviceChanged;
+ bool mInvoke = false;
+};
+
// The main test class for THERMAL HIDL HAL.
class ThermalAidlTest : public testing::TestWithParam<std::string> {
public:
@@ -97,19 +134,42 @@
ASSERT_NE(mThermalCallback, nullptr);
::ndk::ScopedAStatus status = mThermal->registerThermalChangedCallback(mThermalCallback);
ASSERT_TRUE(status.isOk()) << status.getMessage();
+
+ auto ret = mThermal->getInterfaceVersion(&thermal_version);
+ ASSERT_TRUE(ret.isOk()) << ret;
+ if (thermal_version > 1) {
+ mCoolingDeviceCallback = ndk::SharedRefBase::make<CoolingDeviceCallback>();
+ ASSERT_NE(mCoolingDeviceCallback, nullptr);
+ status = mThermal->registerCoolingDeviceChangedCallbackWithType(mCoolingDeviceCallback,
+ kCoolingDevice.type);
+ ASSERT_TRUE(status.isOk()) << status.getMessage();
+ }
}
void TearDown() override {
::ndk::ScopedAStatus status = mThermal->unregisterThermalChangedCallback(mThermalCallback);
ASSERT_TRUE(status.isOk()) << status.getMessage();
+
// Expect to fail if unregister again
status = mThermal->unregisterThermalChangedCallback(mThermalCallback);
ASSERT_EQ(EX_ILLEGAL_ARGUMENT, status.getExceptionCode());
+
+ auto ret = mThermal->getInterfaceVersion(&thermal_version);
+ ASSERT_TRUE(ret.isOk()) << ret;
+ if (thermal_version > 1) {
+ status = mThermal->unregisterCoolingDeviceChangedCallback(mCoolingDeviceCallback);
+ ASSERT_TRUE(status.isOk()) << status.getMessage();
+ status = mThermal->unregisterCoolingDeviceChangedCallback(mCoolingDeviceCallback);
+ ASSERT_EQ(EX_ILLEGAL_ARGUMENT, status.getExceptionCode());
+ }
}
+ // Stores thermal version
+ int32_t thermal_version;
protected:
std::shared_ptr<IThermal> mThermal;
std::shared_ptr<ThermalCallback> mThermalCallback;
+ std::shared_ptr<CoolingDeviceCallback> mCoolingDeviceCallback;
};
// Test ThermalChangedCallback::notifyThrottling().
@@ -121,6 +181,21 @@
ASSERT_TRUE(thermalCallback->waitForCallback(200ms));
}
+// Test CoolingDeviceChangedCallback::notifyCoolingDeviceChanged().
+// This just calls into and back from our local CoolingDeviceChangedCallback impl.
+TEST_P(ThermalAidlTest, NotifyCoolingDeviceChangedTest) {
+ auto ret = mThermal->getInterfaceVersion(&thermal_version);
+ ASSERT_TRUE(ret.isOk()) << ret;
+ if (thermal_version < 2) {
+ return;
+ }
+ std::shared_ptr<CoolingDeviceCallback> cdevCallback =
+ ndk::SharedRefBase::make<CoolingDeviceCallback>();
+ ::ndk::ScopedAStatus status = cdevCallback->notifyCoolingDeviceChanged(kCoolingDevice);
+ ASSERT_TRUE(status.isOk()) << status.getMessage();
+ ASSERT_TRUE(cdevCallback->waitForCallback(200ms));
+}
+
// Test Thermal->registerThermalChangedCallback.
TEST_P(ThermalAidlTest, RegisterThermalChangedCallbackTest) {
// Expect to fail with same callback
@@ -169,6 +244,37 @@
|| status.getExceptionCode() == EX_NULL_POINTER);
}
+// Test Thermal->registerCoolingDeviceChangedCallbackWithType.
+TEST_P(ThermalAidlTest, RegisterCoolingDeviceChangedCallbackWithTypeTest) {
+ auto ret = mThermal->getInterfaceVersion(&thermal_version);
+ ASSERT_TRUE(ret.isOk()) << ret;
+ if (thermal_version < 2) {
+ return;
+ }
+
+ // Expect to fail with same callback
+ ::ndk::ScopedAStatus status = mThermal->registerCoolingDeviceChangedCallbackWithType(
+ mCoolingDeviceCallback, CoolingType::CPU);
+ ASSERT_EQ(EX_ILLEGAL_ARGUMENT, status.getExceptionCode());
+ // Expect to fail with null callback
+ status = mThermal->registerCoolingDeviceChangedCallbackWithType(nullptr, CoolingType::CPU);
+ ASSERT_TRUE(status.getExceptionCode() == EX_ILLEGAL_ARGUMENT ||
+ status.getExceptionCode() == EX_NULL_POINTER);
+ std::shared_ptr<CoolingDeviceCallback> localCoolingDeviceCallback =
+ ndk::SharedRefBase::make<CoolingDeviceCallback>();
+ // Expect to succeed with different callback
+ status = mThermal->registerCoolingDeviceChangedCallbackWithType(localCoolingDeviceCallback,
+ CoolingType::CPU);
+ ASSERT_TRUE(status.isOk()) << status.getMessage();
+ // Remove the local callback
+ status = mThermal->unregisterCoolingDeviceChangedCallback(localCoolingDeviceCallback);
+ ASSERT_TRUE(status.isOk()) << status.getMessage();
+ // Expect to fail with null callback
+ status = mThermal->unregisterCoolingDeviceChangedCallback(nullptr);
+ ASSERT_TRUE(status.getExceptionCode() == EX_ILLEGAL_ARGUMENT ||
+ status.getExceptionCode() == EX_NULL_POINTER);
+}
+
// Test Thermal->getCurrentTemperatures().
TEST_P(ThermalAidlTest, TemperatureTest) {
std::vector<Temperature> ret;
diff --git a/threadnetwork/aidl/vts/VtsHalThreadNetworkTargetTest.cpp b/threadnetwork/aidl/vts/VtsHalThreadNetworkTargetTest.cpp
index 5925b54..2f71b2f 100644
--- a/threadnetwork/aidl/vts/VtsHalThreadNetworkTargetTest.cpp
+++ b/threadnetwork/aidl/vts/VtsHalThreadNetworkTargetTest.cpp
@@ -87,11 +87,16 @@
}
TEST_P(ThreadNetworkAidl, Reset) {
+ ndk::ScopedAStatus status;
std::shared_ptr<ThreadChipCallback> callback =
ndk::SharedRefBase::make<ThreadChipCallback>([](auto /* data */) {});
EXPECT_TRUE(thread_chip->open(callback).isOk());
- EXPECT_TRUE(thread_chip->hardwareReset().isOk());
+ status = thread_chip->hardwareReset();
+ EXPECT_TRUE(status.isOk() || (status.getExceptionCode() == EX_UNSUPPORTED_OPERATION));
+ if (status.getExceptionCode() == EX_UNSUPPORTED_OPERATION) {
+ GTEST_SKIP() << "Hardware reset is not supported";
+ }
}
TEST_P(ThreadNetworkAidl, SendSpinelFrame) {
diff --git a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp
index fccd2ed..3d60e89 100644
--- a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp
+++ b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp
@@ -35,6 +35,7 @@
ASSERT_TRUE(mFrontendTests.setFrontendCallback());
ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
+ mFrontendTests.setDemux(demux);
mFilterTests.setDemux(demux);
ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.config1_0.type,
filterConf.config1_0.bufferSize));
diff --git a/tv/tuner/aidl/vts/functional/Android.bp b/tv/tuner/aidl/vts/functional/Android.bp
index 513007b..09e63fc 100644
--- a/tv/tuner/aidl/vts/functional/Android.bp
+++ b/tv/tuner/aidl/vts/functional/Android.bp
@@ -37,6 +37,7 @@
"FrontendTests.cpp",
"LnbTests.cpp",
"VtsHalTvTunerTargetTest.cpp",
+ "utils/IpStreamer.cpp",
],
generated_headers: [
"tuner_testing_dynamic_configuration_V1_0_enums",
diff --git a/tv/tuner/aidl/vts/functional/FrontendTests.cpp b/tv/tuner/aidl/vts/functional/FrontendTests.cpp
index b0f614e..b7b0185 100644
--- a/tv/tuner/aidl/vts/functional/FrontendTests.cpp
+++ b/tv/tuner/aidl/vts/functional/FrontendTests.cpp
@@ -475,6 +475,10 @@
<< "FrontendConfig does not match the frontend info of the given id.";
mIsSoftwareFe = config.isSoftwareFe;
+ std::unique_ptr<IpStreamer> ipThread = std::make_unique<IpStreamer>();
+ if (config.type == FrontendType::IPTV) {
+ ipThread->startIpStream();
+ }
if (mIsSoftwareFe && testWithDemux) {
if (getDvrTests()->openDvrInDemux(mDvrConfig.type, mDvrConfig.bufferSize) != success()) {
ALOGW("[vts] Software frontend dvr configure openDvr failed.");
@@ -494,6 +498,9 @@
getDvrTests()->startDvrPlayback();
}
mFrontendCallback->tuneTestOnLock(mFrontend, config.settings);
+ if (config.type == FrontendType::IPTV) {
+ ipThread->stopIpStream();
+ }
return AssertionResult(true);
}
diff --git a/tv/tuner/aidl/vts/functional/FrontendTests.h b/tv/tuner/aidl/vts/functional/FrontendTests.h
index 1746c8e..9c2ffc0 100644
--- a/tv/tuner/aidl/vts/functional/FrontendTests.h
+++ b/tv/tuner/aidl/vts/functional/FrontendTests.h
@@ -27,6 +27,7 @@
#include "DvrTests.h"
#include "VtsHalTvTunerTestConfigurations.h"
+#include "utils/IpStreamer.h"
#define WAIT_TIMEOUT 3000000000
#define INVALID_ID -1
diff --git a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.cpp b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.cpp
index 3664b6c..671d079 100644
--- a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.cpp
+++ b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.cpp
@@ -48,6 +48,7 @@
ASSERT_TRUE(mFrontendTests.setFrontendCallback());
ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
+ mFrontendTests.setDemux(demux);
mFilterTests.setDemux(demux);
ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
@@ -683,6 +684,10 @@
if (!live.hasFrontendConnection) {
return;
}
+ // Do not execute tests for IPTV Frontend
+ if (frontendMap[live.frontendId].type == FrontendType::IPTV) {
+ return;
+ }
auto live_configs = generateLiveConfigurations();
for (auto& configuration : live_configs) {
live = configuration;
@@ -779,6 +784,10 @@
if (!live.hasFrontendConnection) {
return;
}
+ // Do not execute tests for IPTV Frontend
+ if (frontendMap[live.frontendId].type == FrontendType::IPTV) {
+ return;
+ }
// TODO use parameterized tests
auto live_configs = generateLiveConfigurations();
for (auto& configuration : live_configs) {
@@ -793,6 +802,10 @@
if (!live.hasFrontendConnection) {
return;
}
+ // Do not execute tests for IPTV Frontend
+ if (frontendMap[live.frontendId].type == FrontendType::IPTV) {
+ return;
+ }
auto live_configs = generateLiveConfigurations();
for (auto& configuration : live_configs) {
live = configuration;
@@ -808,6 +821,10 @@
if (!live.hasFrontendConnection) {
return;
}
+ // Do not execute tests for IPTV Frontend
+ if (frontendMap[live.frontendId].type == FrontendType::IPTV) {
+ return;
+ }
// TODO use parameterized tests
auto live_configs = generateLiveConfigurations();
for (auto& configuration : live_configs) {
@@ -1111,6 +1128,10 @@
if (!record.support) {
return;
}
+ // Do not execute tests for IPTV Frontend
+ if (frontendMap[live.frontendId].type == FrontendType::IPTV) {
+ return;
+ }
auto record_configs = generateRecordConfigurations();
for (auto& configuration : record_configs) {
record = configuration;
@@ -1125,6 +1146,10 @@
if (!record.support) {
return;
}
+ // Do not execute tests for IPTV Frontend
+ if (frontendMap[live.frontendId].type == FrontendType::IPTV) {
+ return;
+ }
auto record_configs = generateRecordConfigurations();
for (auto& configuration : record_configs) {
record = configuration;
@@ -1157,6 +1182,10 @@
if (!record.support) {
return;
}
+ // Do not execute tests for IPTV Frontend
+ if (frontendMap[live.frontendId].type == FrontendType::IPTV) {
+ return;
+ }
auto record_configs = generateRecordConfigurations();
for (auto& configuration : record_configs) {
record = configuration;
@@ -1194,9 +1223,17 @@
if (!scan.hasFrontendConnection) {
return;
}
+ // Blind scan is not applicable for IPTV frontend
+ if (frontendMap[live.frontendId].type == FrontendType::IPTV) {
+ return;
+ }
vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
for (auto& configuration : scan_configs) {
scan = configuration;
+ // Skip test if the frontend implementation doesn't support blind scan
+ if (!frontendMap[scan.frontendId].supportBlindScan) {
+ continue;
+ }
mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND);
}
}
@@ -1218,9 +1255,17 @@
if (!scan.hasFrontendConnection) {
return;
}
+ // Blind scan is not application for IPTV frontend
+ if (frontendMap[live.frontendId].type == FrontendType::IPTV) {
+ return;
+ }
vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
for (auto& configuration : scan_configs) {
scan = configuration;
+ // Skip test if the frontend implementation doesn't support blind scan
+ if (!frontendMap[scan.frontendId].supportBlindScan) {
+ continue;
+ }
mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND);
}
}
@@ -1242,6 +1287,10 @@
TEST_P(TunerFrontendAidlTest, getHardwareInfo) {
description("Test Frontend get hardware info");
+ // Do not execute tests for IPTV Frontend
+ if (frontendMap[live.frontendId].type == FrontendType::IPTV) {
+ return;
+ }
if (!live.hasFrontendConnection) {
return;
}
@@ -1289,6 +1338,10 @@
if (!live.hasFrontendConnection) {
return;
}
+ // Do not execute tests for IPTV Frontend
+ if (frontendMap[live.frontendId].type == FrontendType::IPTV) {
+ return;
+ }
auto live_configs = generateLiveConfigurations();
for (auto& configuration : live_configs) {
live = configuration;
@@ -1316,6 +1369,10 @@
if (!live.hasFrontendConnection) {
return;
}
+ // Do not execute tests for IPTV Frontend
+ if (frontendMap[live.frontendId].type == FrontendType::IPTV) {
+ return;
+ }
auto live_configs = generateLiveConfigurations();
for (auto& configuration : live_configs) {
live = configuration;
@@ -1345,6 +1402,10 @@
if (!live.hasFrontendConnection) {
return;
}
+ // Do not execute tests for IPTV Frontend
+ if (frontendMap[live.frontendId].type == FrontendType::IPTV) {
+ return;
+ }
auto live_configs = generateLiveConfigurations();
for (auto& configuration : live_configs) {
live = configuration;
@@ -1358,6 +1419,10 @@
if (!descrambling.support) {
return;
}
+ // Do not execute tests for IPTV Frontend
+ if (frontendMap[live.frontendId].type == FrontendType::IPTV) {
+ return;
+ }
vector<DescramblingHardwareConnections> descrambling_configs =
generateDescramblingConfigurations();
if (descrambling_configs.empty()) {
@@ -1394,6 +1459,10 @@
if (!descrambling.support) {
return;
}
+ // Do not execute tests for IPTV Frontend
+ if (frontendMap[live.frontendId].type == FrontendType::IPTV) {
+ return;
+ }
vector<DescramblingHardwareConnections> descrambling_configs =
generateDescramblingConfigurations();
if (descrambling_configs.empty()) {
diff --git a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTestConfigurations.h b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTestConfigurations.h
index 516cb62..5c13ed0 100644
--- a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTestConfigurations.h
+++ b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTestConfigurations.h
@@ -612,6 +612,7 @@
frontendMap[defaultFeId].isSoftwareFe = true;
frontendMap[defaultFeId].canConnectToCiCam = true;
frontendMap[defaultFeId].ciCamId = 0;
+ frontendMap[defaultFeId].supportBlindScan = true;
FrontendDvbtSettings dvbt;
dvbt.transmissionMode = FrontendDvbtTransmissionMode::MODE_8K_E;
frontendMap[defaultFeId].settings.set<FrontendSettings::Tag::dvbt>(dvbt);
diff --git a/tv/tuner/aidl/vts/functional/utils/IpStreamer.cpp b/tv/tuner/aidl/vts/functional/utils/IpStreamer.cpp
new file mode 100644
index 0000000..02b2633
--- /dev/null
+++ b/tv/tuner/aidl/vts/functional/utils/IpStreamer.cpp
@@ -0,0 +1,57 @@
+#include "IpStreamer.h"
+
+IpStreamer::IpStreamer() {}
+
+IpStreamer::~IpStreamer() {}
+
+void IpStreamer::startIpStream() {
+ ALOGI("Starting IP Stream thread");
+ mFp = fopen(mFilePath.c_str(), "rb");
+ if (mFp == nullptr) {
+ ALOGE("Failed to open file at path: %s", mFilePath.c_str());
+ return;
+ }
+ mIpStreamerThread = std::thread(&IpStreamer::ipStreamThreadLoop, this, mFp);
+}
+
+void IpStreamer::stopIpStream() {
+ ALOGI("Stopping IP Stream thread");
+ close(mSockfd);
+ if (mFp != nullptr) fclose(mFp);
+ if (mIpStreamerThread.joinable()) {
+ mIpStreamerThread.join();
+ }
+}
+
+void IpStreamer::ipStreamThreadLoop(FILE* fp) {
+ mSockfd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (mSockfd < 0) {
+ ALOGE("IpStreamer::ipStreamThreadLoop: Socket creation failed (%s)", strerror(errno));
+ exit(1);
+ }
+
+ if (mFp == NULL) {
+ ALOGE("IpStreamer::ipStreamThreadLoop: Cannot open file %s: (%s)", mFilePath.c_str(),
+ strerror(errno));
+ exit(1);
+ }
+
+ struct sockaddr_in destaddr;
+ memset(&destaddr, 0, sizeof(destaddr));
+ destaddr.sin_family = mIsIpV4 ? AF_INET : AF_INET6;
+ destaddr.sin_port = htons(mPort);
+ destaddr.sin_addr.s_addr = inet_addr(mIpAddress.c_str());
+
+ char buf[mBufferSize];
+ int n;
+ while (1) {
+ if (fp == nullptr) break;
+ n = fread(buf, 1, mBufferSize, fp);
+ ALOGI("IpStreamer::ipStreamThreadLoop: Bytes read from fread(): %d\n", n);
+ if (n <= 0) {
+ break;
+ }
+ sendto(mSockfd, buf, n, 0, (struct sockaddr*)&destaddr, sizeof(destaddr));
+ sleep(mSleepTime);
+ }
+}
diff --git a/tv/tuner/aidl/vts/functional/utils/IpStreamer.h b/tv/tuner/aidl/vts/functional/utils/IpStreamer.h
new file mode 100644
index 0000000..8ac2ddb
--- /dev/null
+++ b/tv/tuner/aidl/vts/functional/utils/IpStreamer.h
@@ -0,0 +1,48 @@
+#pragma once
+
+#include <arpa/inet.h>
+#include <errno.h>
+#include <log/log.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <string>
+#include <thread>
+
+/**
+ * IP Streamer class to send TS data to a specified socket for testing IPTV frontend functions
+ * e.g. tuning and playback.
+ */
+
+class IpStreamer {
+ public:
+ // Constructor for IP Streamer object
+ IpStreamer();
+
+ // Destructor for IP Streamer object
+ ~IpStreamer();
+
+ // Starts a thread to read data from a socket
+ void startIpStream();
+
+ // Stops the reading thread started by startIpStream
+ void stopIpStream();
+
+ // Thread function that consumes data from a socket
+ void ipStreamThreadLoop(FILE* fp);
+
+ std::string getFilePath() { return mFilePath; };
+
+ private:
+ int mSockfd = -1;
+ FILE* mFp = nullptr;
+ bool mIsIpV4 = true; // By default, set to IPV4
+ int mPort = 12345; // default port
+ int mBufferSize = 188; // bytes
+ int mSleepTime = 1; // second
+ std::string mIpAddress = "127.0.0.1"; // default IP address
+ std::string mFilePath = "/data/local/tmp/segment000000.ts"; // default path for TS file
+ std::thread mIpStreamerThread;
+};
\ No newline at end of file
diff --git a/tv/tuner/config/TunerTestingConfigAidlReaderV1_0.h b/tv/tuner/config/TunerTestingConfigAidlReaderV1_0.h
index 9517520..5ffb38f 100644
--- a/tv/tuner/config/TunerTestingConfigAidlReaderV1_0.h
+++ b/tv/tuner/config/TunerTestingConfigAidlReaderV1_0.h
@@ -114,6 +114,7 @@
FrontendSettings settings;
vector<FrontendStatusType> tuneStatusTypes;
vector<FrontendStatus> expectTuneStatuses;
+ bool supportBlindScan;
};
struct FilterConfig {
@@ -354,6 +355,11 @@
} else {
hasHwFe = true;
}
+ if (feConfig.hasSupportBlindScan()) {
+ frontendMap[id].supportBlindScan = feConfig.getSupportBlindScan();
+ } else {
+ frontendMap[id].supportBlindScan = true;
+ }
// TODO: b/182519645 complete the tune status config
frontendMap[id].tuneStatusTypes = types;
frontendMap[id].expectTuneStatuses = statuses;
diff --git a/tv/tuner/config/api/current.txt b/tv/tuner/config/api/current.txt
index dbd3486..ff2df90 100644
--- a/tv/tuner/config/api/current.txt
+++ b/tv/tuner/config/api/current.txt
@@ -369,6 +369,7 @@
method @Nullable public android.media.tuner.testing.configuration.V1_0.IsdbsFrontendSettings getIsdbsFrontendSettings_optional();
method @Nullable public android.media.tuner.testing.configuration.V1_0.IsdbtFrontendSettings getIsdbtFrontendSettings_optional();
method @Nullable public java.math.BigInteger getRemoveOutputPid();
+ method @Nullable public boolean getSupportBlindScan();
method @Nullable public android.media.tuner.testing.configuration.V1_0.FrontendTypeEnum getType();
method public void setAtscFrontendSettings_optional(@Nullable android.media.tuner.testing.configuration.V1_0.AtscFrontendSettings);
method public void setConnectToCicamId(@Nullable java.math.BigInteger);
@@ -381,6 +382,7 @@
method public void setIsdbsFrontendSettings_optional(@Nullable android.media.tuner.testing.configuration.V1_0.IsdbsFrontendSettings);
method public void setIsdbtFrontendSettings_optional(@Nullable android.media.tuner.testing.configuration.V1_0.IsdbtFrontendSettings);
method public void setRemoveOutputPid(@Nullable java.math.BigInteger);
+ method public void setSupportBlindScan(@Nullable boolean);
method public void setType(@Nullable android.media.tuner.testing.configuration.V1_0.FrontendTypeEnum);
}
diff --git a/tv/tuner/config/tuner_testing_dynamic_configuration.xsd b/tv/tuner/config/tuner_testing_dynamic_configuration.xsd
index c51ac51..eafaca9 100644
--- a/tv/tuner/config/tuner_testing_dynamic_configuration.xsd
+++ b/tv/tuner/config/tuner_testing_dynamic_configuration.xsd
@@ -162,6 +162,7 @@
<xs:attribute name="connectToCicamId" type="xs:nonNegativeInteger" use="optional"/>
<xs:attribute name="removeOutputPid" type="xs:nonNegativeInteger" use="optional"/>
<xs:attribute name="endFrequency" type="xs:nonNegativeInteger" use="optional"/>
+ <xs:attribute name="supportBlindScan" type="xs:boolean" use="optional"/>
</xs:complexType>
<!-- FILTER SESSION -->
diff --git a/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl b/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
index 21951b6..58919d1 100644
--- a/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
+++ b/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
@@ -46,6 +46,7 @@
CCC_SUPPORTED_MAX_RANGING_SESSION_NUMBER = 0xA8,
CCC_SUPPORTED_MIN_UWB_INITIATION_TIME_MS = 0xA9,
CCC_PRIORITIZED_CHANNEL_LIST = 0xAA,
+ CCC_SUPPORTED_UWBS_MAX_PPM = 0xAB,
RADAR_SUPPORT = 0xB0,
SUPPORTED_AOA_RESULT_REQ_ANTENNA_INTERLEAVING = 0xE3,
SUPPORTED_MIN_RANGING_INTERVAL_MS = 0xE4,
diff --git a/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl b/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
index 2141b5a..4df45b6 100644
--- a/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
+++ b/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
@@ -154,6 +154,11 @@
*/
CCC_PRIORITIZED_CHANNEL_LIST = 0xAA,
+ /**
+ * Short (2-octet) value to indicate the UWBS Max Clock Skew PPM value.
+ */
+ CCC_SUPPORTED_UWBS_MAX_PPM = 0xAB,
+
/*********************************************
* RADAR specific
********************************************/
diff --git a/uwb/aidl/default/src/uwb_chip.rs b/uwb/aidl/default/src/uwb_chip.rs
index d749147..d1c3c67 100644
--- a/uwb/aidl/default/src/uwb_chip.rs
+++ b/uwb/aidl/default/src/uwb_chip.rs
@@ -61,6 +61,20 @@
callbacks.as_binder().unlink_to_death(death_recipient)?;
token.cancel();
handle.await.unwrap();
+ let packet: UciControlPacket = DeviceResetCmdBuilder {
+ reset_config: ResetConfig::UwbsReset,
+ }
+ .build()
+ .into();
+ // DeviceResetCmd need to be send to reset the device to stop all running
+ // activities on UWBS.
+ let packet_vec: Vec<UciControlPacketHal> = packet.into();
+ for hal_packet in packet_vec.into_iter() {
+ serial
+ .write(&hal_packet.to_vec())
+ .map(|written| written as i32)
+ .map_err(|_| binder::StatusCode::UNKNOWN_ERROR)?;
+ }
consume_device_reset_rsp_and_ntf(
&mut serial
.try_clone()
@@ -238,21 +252,7 @@
let mut state = self.state.lock().await;
- if let State::Opened { ref mut serial, .. } = *state {
- let packet: UciControlPacket = DeviceResetCmdBuilder {
- reset_config: ResetConfig::UwbsReset,
- }
- .build()
- .into();
- // DeviceResetCmd need to be send to reset the device to stop all running
- // activities on UWBS.
- let packet_vec: Vec<UciControlPacketHal> = packet.into();
- for hal_packet in packet_vec.into_iter() {
- serial
- .write(&hal_packet.to_vec())
- .map(|written| written as i32)
- .map_err(|_| binder::StatusCode::UNKNOWN_ERROR)?;
- }
+ if let State::Opened { .. } = *state {
state.close().await
} else {
Err(binder::ExceptionCode::ILLEGAL_STATE.into())
diff --git a/wifi/1.0/Android.bp b/wifi/1.0/Android.bp
index 94f8462..21a5d15 100644
--- a/wifi/1.0/Android.bp
+++ b/wifi/1.0/Android.bp
@@ -33,4 +33,8 @@
],
gen_java: true,
gen_java_constants: true,
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.wifi",
+ ],
}
diff --git a/wifi/1.1/Android.bp b/wifi/1.1/Android.bp
index 7b4116a..b5e4105 100644
--- a/wifi/1.1/Android.bp
+++ b/wifi/1.1/Android.bp
@@ -21,4 +21,8 @@
"android.hidl.base@1.0",
],
gen_java: true,
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.wifi",
+ ],
}
diff --git a/wifi/1.2/Android.bp b/wifi/1.2/Android.bp
index f0edb81..83b156e 100644
--- a/wifi/1.2/Android.bp
+++ b/wifi/1.2/Android.bp
@@ -27,4 +27,8 @@
"android.hidl.base@1.0",
],
gen_java: true,
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.wifi",
+ ],
}
diff --git a/wifi/1.3/Android.bp b/wifi/1.3/Android.bp
index 030d7f6..2ba612e 100644
--- a/wifi/1.3/Android.bp
+++ b/wifi/1.3/Android.bp
@@ -25,4 +25,8 @@
"android.hidl.base@1.0",
],
gen_java: true,
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.wifi",
+ ],
}
diff --git a/wifi/1.4/Android.bp b/wifi/1.4/Android.bp
index 1523f79..48578f8 100644
--- a/wifi/1.4/Android.bp
+++ b/wifi/1.4/Android.bp
@@ -30,4 +30,8 @@
"android.hidl.base@1.0",
],
gen_java: true,
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.wifi",
+ ],
}
diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttCapabilities.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttCapabilities.aidl
index 83f3f7e..6c64084 100644
--- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttCapabilities.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttCapabilities.aidl
@@ -42,8 +42,9 @@
android.hardware.wifi.RttPreamble preambleSupport;
android.hardware.wifi.RttBw bwSupport;
byte mcVersion;
- android.hardware.wifi.RttPreamble azPreambleSupport;
- android.hardware.wifi.RttBw azBwSupport;
+ int azPreambleSupport;
+ int azBwSupport;
boolean ntbInitiatorSupported;
boolean ntbResponderSupported;
+ @nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
}
diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttConfig.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttConfig.aidl
index b53ff9b..3613616 100644
--- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttConfig.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttConfig.aidl
@@ -50,4 +50,5 @@
android.hardware.wifi.RttBw bw;
long ntbMinMeasurementTime;
long ntbMaxMeasurementTime;
+ @nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
}
diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttResult.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttResult.aidl
index 9c6ad26..13202ba 100644
--- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttResult.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttResult.aidl
@@ -63,4 +63,7 @@
byte r2iTxLtfRepetitionCount;
long ntbMinMeasurementTime;
long ntbMaxMeasurementTime;
+ byte numTxSpatialStreams;
+ byte numRxSpatialStreams;
+ @nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
}
diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtCapabilities.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtCapabilities.aidl
index d6ed62e..75f3e83 100644
--- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtCapabilities.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtCapabilities.aidl
@@ -38,8 +38,8 @@
boolean isTwtResponderSupported;
boolean isBroadcastTwtSupported;
boolean isFlexibleTwtScheduleSupported;
- int minWakeDurationMicros;
- int maxWakeDurationMicros;
- long minWakeIntervalMicros;
- long maxWakeIntervalMicros;
+ int minWakeDurationUs;
+ int maxWakeDurationUs;
+ long minWakeIntervalUs;
+ long maxWakeIntervalUs;
}
diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtRequest.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtRequest.aidl
index 06c7ae2..1e1c39a 100644
--- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtRequest.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtRequest.aidl
@@ -35,8 +35,8 @@
@VintfStability
parcelable TwtRequest {
int mloLinkId;
- int minWakeDurationMicros;
- int maxWakeDurationMicros;
- long minWakeIntervalMicros;
- long maxWakeIntervalMicros;
+ int minWakeDurationUs;
+ int maxWakeDurationUs;
+ long minWakeIntervalUs;
+ long maxWakeIntervalUs;
}
diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtSession.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtSession.aidl
index 4e5ca44..0b88d8e 100644
--- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtSession.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtSession.aidl
@@ -36,8 +36,8 @@
parcelable TwtSession {
int sessionId;
int mloLinkId;
- int wakeDurationMicros;
- long wakeIntervalMicros;
+ int wakeDurationUs;
+ long wakeIntervalUs;
android.hardware.wifi.TwtSession.TwtNegotiationType negotiationType;
boolean isTriggerEnabled;
boolean isAnnounced;
diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtSessionStats.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtSessionStats.aidl
index 528444a..f62b614 100644
--- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtSessionStats.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/TwtSessionStats.aidl
@@ -38,6 +38,6 @@
int avgRxPktCount;
int avgTxPktSize;
int avgRxPktSize;
- int avgEospDurationMicros;
+ int avgEospDurationUs;
int eospCount;
}
diff --git a/wifi/aidl/android/hardware/wifi/RttCapabilities.aidl b/wifi/aidl/android/hardware/wifi/RttCapabilities.aidl
index c4b7d24..c193924 100644
--- a/wifi/aidl/android/hardware/wifi/RttCapabilities.aidl
+++ b/wifi/aidl/android/hardware/wifi/RttCapabilities.aidl
@@ -18,6 +18,7 @@
import android.hardware.wifi.RttBw;
import android.hardware.wifi.RttPreamble;
+import android.hardware.wifi.common.OuiKeyedData;
/**
* RTT Capabilities.
@@ -64,12 +65,12 @@
* Bit mask indicating what preamble is supported by IEEE 802.11az initiator.
* Combination of |RttPreamble| values.
*/
- RttPreamble azPreambleSupport;
+ int azPreambleSupport;
/**
* Bit mask indicating what BW is supported by IEEE 802.11az initiator.
* Combination of |RttBw| values.
*/
- RttBw azBwSupport;
+ int azBwSupport;
/**
* Whether the initiator supports IEEE 802.11az Non-Trigger-based (non-TB) measurement.
*/
@@ -78,4 +79,9 @@
* Whether IEEE 802.11az Non-Trigger-based (non-TB) responder mode is supported.
*/
boolean ntbResponderSupported;
+ /**
+ * Optional vendor-specific parameters. Null value indicates
+ * that no vendor data is provided.
+ */
+ @nullable OuiKeyedData[] vendorData;
}
diff --git a/wifi/aidl/android/hardware/wifi/RttConfig.aidl b/wifi/aidl/android/hardware/wifi/RttConfig.aidl
index 7b18708..496ffd2 100644
--- a/wifi/aidl/android/hardware/wifi/RttConfig.aidl
+++ b/wifi/aidl/android/hardware/wifi/RttConfig.aidl
@@ -21,6 +21,7 @@
import android.hardware.wifi.RttPreamble;
import android.hardware.wifi.RttType;
import android.hardware.wifi.WifiChannelInfo;
+import android.hardware.wifi.common.OuiKeyedData;
/**
* RTT configuration.
@@ -134,4 +135,9 @@
* Reference: IEEE Std 802.11az-2022 spec, section 9.4.2.298 Ranging Parameters element.
*/
long ntbMaxMeasurementTime;
+ /**
+ * Optional vendor-specific parameters. Null value indicates
+ * that no vendor data is provided.
+ */
+ @nullable OuiKeyedData[] vendorData;
}
diff --git a/wifi/aidl/android/hardware/wifi/RttResult.aidl b/wifi/aidl/android/hardware/wifi/RttResult.aidl
index ab9abb5..2f9aefe 100644
--- a/wifi/aidl/android/hardware/wifi/RttResult.aidl
+++ b/wifi/aidl/android/hardware/wifi/RttResult.aidl
@@ -21,6 +21,7 @@
import android.hardware.wifi.RttType;
import android.hardware.wifi.WifiInformationElement;
import android.hardware.wifi.WifiRateInfo;
+import android.hardware.wifi.common.OuiKeyedData;
/**
* RTT results.
@@ -148,11 +149,15 @@
/**
* Multiple transmissions of HE-LTF symbols in an HE (I2R) Ranging NDP. An HE-LTF repetition
* value of 1 indicates no repetitions.
+ *
+ * Note: A required field for IEEE 802.11az result.
*/
byte i2rTxLtfRepetitionCount;
/**
* Multiple transmissions of HE-LTF symbols in an HE (R2I) Ranging NDP. An HE-LTF repetition
* value of 1 indicates no repetitions.
+ *
+ * Note: A required field for IEEE 802.11az result.
*/
byte r2iTxLtfRepetitionCount;
/**
@@ -168,6 +173,8 @@
* |RttResult.timestamp|.
*
* Reference: IEEE Std 802.11az-2022 spec, section 9.4.2.298 Ranging Parameters element.
+ *
+ * Note: A required field for IEEE 802.11az result.
*/
long ntbMinMeasurementTime;
/**
@@ -183,6 +190,27 @@
* non-TB ranging negotiation.
*
* Reference: IEEE Std 802.11az-2022 spec, section 9.4.2.298 Ranging Parameters element.
+ *
+ * Note: A required field for IEEE 802.11az result.
*/
long ntbMaxMeasurementTime;
+ /**
+ * Number of transmit space-time streams used. Value is in the range 1 to 8.
+ *
+ * Note: Maximum limit is ultimately defined by the number of antennas that can be supported.
+ * A required field for IEEE 802.11az result.
+ */
+ byte numTxSpatialStreams;
+ /**
+ * Number of receive space-time streams used. Value is in the range 1 to 8.
+ *
+ * Note: Maximum limit is ultimately defined by the number of antennas that can be supported.
+ * A required field for IEEE 802.11az result.
+ */
+ byte numRxSpatialStreams;
+ /**
+ * Optional vendor-specific parameters. Null value indicates
+ * that no vendor data is provided.
+ */
+ @nullable OuiKeyedData[] vendorData;
}
diff --git a/wifi/aidl/android/hardware/wifi/TwtCapabilities.aidl b/wifi/aidl/android/hardware/wifi/TwtCapabilities.aidl
index 4012c3e..28d16f0 100644
--- a/wifi/aidl/android/hardware/wifi/TwtCapabilities.aidl
+++ b/wifi/aidl/android/hardware/wifi/TwtCapabilities.aidl
@@ -18,6 +18,14 @@
/**
* Target Wake Time (TWT) Capabilities supported.
+ *
+ * TWT allows Wi-Fi stations to manage activity in a network by scheduling to operate at different
+ * times. This minimizes the contention and reduces the required amount of time that a station
+ * utilizing a power management mode needs to be awake.
+ *
+ * IEEE 802.11ax standard defines two modes of TWT operation:
+ * - Individual TWT (default mode of operation if TWT requester is supported)
+ * - Broadcast TWT
*/
@VintfStability
parcelable TwtCapabilities {
@@ -40,17 +48,17 @@
/**
* Minimum TWT wake duration in microseconds.
*/
- int minWakeDurationMicros;
+ int minWakeDurationUs;
/**
* Maximum TWT wake duration in microseconds.
*/
- int maxWakeDurationMicros;
+ int maxWakeDurationUs;
/**
* Minimum TWT wake interval in microseconds.
*/
- long minWakeIntervalMicros;
+ long minWakeIntervalUs;
/**
* Maximum TWT wake interval in microseconds.
*/
- long maxWakeIntervalMicros;
+ long maxWakeIntervalUs;
}
diff --git a/wifi/aidl/android/hardware/wifi/TwtRequest.aidl b/wifi/aidl/android/hardware/wifi/TwtRequest.aidl
index b063da3..6964a39 100644
--- a/wifi/aidl/android/hardware/wifi/TwtRequest.aidl
+++ b/wifi/aidl/android/hardware/wifi/TwtRequest.aidl
@@ -28,17 +28,23 @@
/**
* Minimum TWT wake duration in microseconds.
*/
- int minWakeDurationMicros;
+ int minWakeDurationUs;
/**
* Maximum TWT wake duration in microseconds.
+ *
+ * As per IEEE 802.11ax spec, section 9.4.2.199 TWT element, the maximum wake duration is
+ * 65280 microseconds.
*/
- int maxWakeDurationMicros;
+ int maxWakeDurationUs;
/**
* Minimum TWT wake interval in microseconds.
*/
- long minWakeIntervalMicros;
+ long minWakeIntervalUs;
/**
* Maximum TWT wake interval in microseconds.
+ *
+ * As per IEEE 802.11ax spec, section 9.4.2.199 TWT element, the maximum wake interval is
+ * 65535 * 2^31 microseconds.
*/
- long maxWakeIntervalMicros;
+ long maxWakeIntervalUs;
}
diff --git a/wifi/aidl/android/hardware/wifi/TwtSession.aidl b/wifi/aidl/android/hardware/wifi/TwtSession.aidl
index 6b780f8..2d7e819 100644
--- a/wifi/aidl/android/hardware/wifi/TwtSession.aidl
+++ b/wifi/aidl/android/hardware/wifi/TwtSession.aidl
@@ -41,12 +41,12 @@
/**
* TWT service period in microseconds.
*/
- int wakeDurationMicros;
+ int wakeDurationUs;
/**
* Time interval in microseconds between two successive TWT service periods.
*/
- long wakeIntervalMicros;
+ long wakeIntervalUs;
/**
* TWT negotiation type.
diff --git a/wifi/aidl/android/hardware/wifi/TwtSessionStats.aidl b/wifi/aidl/android/hardware/wifi/TwtSessionStats.aidl
index e2e2d12..ba70426 100644
--- a/wifi/aidl/android/hardware/wifi/TwtSessionStats.aidl
+++ b/wifi/aidl/android/hardware/wifi/TwtSessionStats.aidl
@@ -44,7 +44,7 @@
/**
* Average End of Service period in microseconds.
*/
- int avgEospDurationMicros;
+ int avgEospDurationUs;
/**
* Count of early terminations.
diff --git a/wifi/aidl/default/aidl_struct_util.cpp b/wifi/aidl/default/aidl_struct_util.cpp
index 7e7929d..0f0c77e 100644
--- a/wifi/aidl/default/aidl_struct_util.cpp
+++ b/wifi/aidl/default/aidl_struct_util.cpp
@@ -2886,8 +2886,8 @@
aidl_capabilities->bwSupport = convertLegacyRttBwBitmapToAidl(legacy_capabilities.bw_support);
aidl_capabilities->mcVersion = legacy_capabilities.mc_version;
// Initialize 11az parameters to default
- aidl_capabilities->azPreambleSupport = RttPreamble::INVALID;
- aidl_capabilities->azBwSupport = RttBw::BW_UNSPECIFIED;
+ aidl_capabilities->azPreambleSupport = (int)RttPreamble::INVALID;
+ aidl_capabilities->azBwSupport = (int)RttBw::BW_UNSPECIFIED;
aidl_capabilities->ntbInitiatorSupported = false;
aidl_capabilities->ntbResponderSupported = false;
return true;
@@ -2912,9 +2912,9 @@
convertLegacyRttBwBitmapToAidl(legacy_capabilities_v3.rtt_capab.bw_support);
aidl_capabilities->mcVersion = legacy_capabilities_v3.rtt_capab.mc_version;
aidl_capabilities->azPreambleSupport =
- convertLegacyRttPreambleBitmapToAidl(legacy_capabilities_v3.az_preamble_support);
+ (int)convertLegacyRttPreambleBitmapToAidl(legacy_capabilities_v3.az_preamble_support);
aidl_capabilities->azBwSupport =
- convertLegacyRttBwBitmapToAidl(legacy_capabilities_v3.az_bw_support);
+ (int)convertLegacyRttBwBitmapToAidl(legacy_capabilities_v3.az_bw_support);
aidl_capabilities->ntbInitiatorSupported = legacy_capabilities_v3.ntb_initiator_supported;
aidl_capabilities->ntbResponderSupported = legacy_capabilities_v3.ntb_responder_supported;
return true;
@@ -2995,6 +2995,8 @@
aidl_result.r2iTxLtfRepetitionCount = 0;
aidl_result.ntbMinMeasurementTime = 0;
aidl_result.ntbMaxMeasurementTime = 0;
+ aidl_result.numTxSpatialStreams = 0;
+ aidl_result.numRxSpatialStreams = 0;
aidl_results->push_back(aidl_result);
}
return true;
@@ -3019,6 +3021,8 @@
aidl_result.r2iTxLtfRepetitionCount = 0;
aidl_result.ntbMinMeasurementTime = 0;
aidl_result.ntbMaxMeasurementTime = 0;
+ aidl_result.numTxSpatialStreams = 0;
+ aidl_result.numRxSpatialStreams = 0;
aidl_results->push_back(aidl_result);
}
return true;
@@ -3044,6 +3048,8 @@
aidl_result.r2iTxLtfRepetitionCount = legacy_result->r2i_tx_ltf_repetition_count;
aidl_result.ntbMinMeasurementTime = legacy_result->ntb_min_measurement_time;
aidl_result.ntbMaxMeasurementTime = legacy_result->ntb_max_measurement_time;
+ aidl_result.numTxSpatialStreams = legacy_result->num_tx_sts;
+ aidl_result.numRxSpatialStreams = legacy_result->num_rx_sts;
aidl_results->push_back(aidl_result);
}
return true;
@@ -3587,13 +3593,13 @@
if (legacy_twt_capabs.min_wake_duration_micros > legacy_twt_capabs.max_wake_duration_micros) {
return false;
}
- aidl_twt_capabs->minWakeDurationMicros = legacy_twt_capabs.min_wake_duration_micros;
- aidl_twt_capabs->maxWakeDurationMicros = legacy_twt_capabs.max_wake_duration_micros;
+ aidl_twt_capabs->minWakeDurationUs = legacy_twt_capabs.min_wake_duration_micros;
+ aidl_twt_capabs->maxWakeDurationUs = legacy_twt_capabs.max_wake_duration_micros;
if (legacy_twt_capabs.min_wake_interval_micros > legacy_twt_capabs.max_wake_interval_micros) {
return false;
}
- aidl_twt_capabs->minWakeIntervalMicros = legacy_twt_capabs.min_wake_interval_micros;
- aidl_twt_capabs->maxWakeIntervalMicros = legacy_twt_capabs.max_wake_interval_micros;
+ aidl_twt_capabs->minWakeIntervalUs = legacy_twt_capabs.min_wake_interval_micros;
+ aidl_twt_capabs->maxWakeIntervalUs = legacy_twt_capabs.max_wake_interval_micros;
return true;
}
@@ -3603,16 +3609,16 @@
return false;
}
legacy_twt_request->mlo_link_id = aidl_twt_request.mloLinkId;
- if (aidl_twt_request.minWakeDurationMicros > aidl_twt_request.maxWakeDurationMicros) {
+ if (aidl_twt_request.minWakeDurationUs > aidl_twt_request.maxWakeDurationUs) {
return false;
}
- legacy_twt_request->min_wake_duration_micros = aidl_twt_request.minWakeDurationMicros;
- legacy_twt_request->max_wake_duration_micros = aidl_twt_request.maxWakeDurationMicros;
- if (aidl_twt_request.minWakeIntervalMicros > aidl_twt_request.maxWakeIntervalMicros) {
+ legacy_twt_request->min_wake_duration_micros = aidl_twt_request.minWakeDurationUs;
+ legacy_twt_request->max_wake_duration_micros = aidl_twt_request.maxWakeDurationUs;
+ if (aidl_twt_request.minWakeIntervalUs > aidl_twt_request.maxWakeIntervalUs) {
return false;
}
- legacy_twt_request->min_wake_interval_micros = aidl_twt_request.minWakeIntervalMicros;
- legacy_twt_request->max_wake_interval_micros = aidl_twt_request.maxWakeIntervalMicros;
+ legacy_twt_request->min_wake_interval_micros = aidl_twt_request.minWakeIntervalUs;
+ legacy_twt_request->max_wake_interval_micros = aidl_twt_request.maxWakeIntervalUs;
return true;
}
@@ -3664,8 +3670,8 @@
aidl_twt_session->sessionId = twt_session.session_id;
aidl_twt_session->mloLinkId = twt_session.mlo_link_id;
- aidl_twt_session->wakeDurationMicros = twt_session.wake_duration_micros;
- aidl_twt_session->wakeIntervalMicros = twt_session.wake_interval_micros;
+ aidl_twt_session->wakeDurationUs = twt_session.wake_duration_micros;
+ aidl_twt_session->wakeIntervalUs = twt_session.wake_interval_micros;
switch (twt_session.negotiation_type) {
case WIFI_TWT_NEGO_TYPE_INDIVIDUAL:
aidl_twt_session->negotiationType = TwtSession::TwtNegotiationType::INDIVIDUAL;
@@ -3696,7 +3702,7 @@
aidl_twt_stats->avgRxPktCount = twt_stats.avg_pkt_num_rx;
aidl_twt_stats->avgTxPktSize = twt_stats.avg_tx_pkt_size;
aidl_twt_stats->avgRxPktSize = twt_stats.avg_rx_pkt_size;
- aidl_twt_stats->avgEospDurationMicros = twt_stats.avg_eosp_dur_us;
+ aidl_twt_stats->avgEospDurationUs = twt_stats.avg_eosp_dur_us;
aidl_twt_stats->eospCount = twt_stats.eosp_count;
return true;
diff --git a/wifi/aidl/vts/functional/wifi_sta_iface_aidl_test.cpp b/wifi/aidl/vts/functional/wifi_sta_iface_aidl_test.cpp
index 1ea1237..f09a26b 100644
--- a/wifi/aidl/vts/functional/wifi_sta_iface_aidl_test.cpp
+++ b/wifi/aidl/vts/functional/wifi_sta_iface_aidl_test.cpp
@@ -69,18 +69,9 @@
std::shared_ptr<IWifiStaIface> wifi_sta_iface_;
- // Checks if the MdnsOffloadManagerService is installed.
- bool isMdnsOffloadServicePresent() {
- int status =
- // --query-flags MATCH_SYSTEM_ONLY(1048576) will only return matched service
- // installed on system or system_ext partition. The MdnsOffloadManagerService should
- // be installed on system_ext partition.
- // NOLINTNEXTLINE(cert-env33-c)
- system("pm query-services --query-flags 1048576"
- " com.android.tv.mdnsoffloadmanager/"
- "com.android.tv.mdnsoffloadmanager.MdnsOffloadManagerService"
- " | egrep -q mdnsoffloadmanager");
- return status == 0;
+ // Checks if the mDNS Offload is supported by any NIC.
+ bool isMdnsOffloadPresentInNIC() {
+ return testing::deviceSupportsFeature("android.hardware.mdns_offload");
}
// Detected panel TV device by using ro.oem.key1 property.
@@ -146,7 +137,7 @@
TEST_P(WifiStaIfaceAidlTest, CheckApfIsSupported) {
// Flat panel TV devices that support MDNS offload do not have to implement APF if the WiFi
// chipset does not have sufficient RAM to do so.
- if (isPanelTvDevice() && isMdnsOffloadServicePresent()) {
+ if (isPanelTvDevice() && isMdnsOffloadPresentInNIC()) {
GTEST_SKIP() << "Panel TV supports mDNS offload. It is not required to support APF";
}
int vendor_api_level = property_get_int32("ro.vendor.api_level", 0);
diff --git a/wifi/hostapd/1.0/Android.bp b/wifi/hostapd/1.0/Android.bp
index afcd45c..b9a84d6 100644
--- a/wifi/hostapd/1.0/Android.bp
+++ b/wifi/hostapd/1.0/Android.bp
@@ -21,4 +21,8 @@
"android.hidl.base@1.0",
],
gen_java: true,
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.wifi",
+ ],
}
diff --git a/wifi/hostapd/1.1/Android.bp b/wifi/hostapd/1.1/Android.bp
index f5f2fbe..c90b68d 100644
--- a/wifi/hostapd/1.1/Android.bp
+++ b/wifi/hostapd/1.1/Android.bp
@@ -22,4 +22,8 @@
"android.hidl.base@1.0",
],
gen_java: true,
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.wifi",
+ ],
}
diff --git a/wifi/hostapd/1.2/Android.bp b/wifi/hostapd/1.2/Android.bp
index 4ca41aa..c8bf2f8 100644
--- a/wifi/hostapd/1.2/Android.bp
+++ b/wifi/hostapd/1.2/Android.bp
@@ -23,4 +23,8 @@
"android.hidl.base@1.0",
],
gen_java: true,
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.wifi",
+ ],
}
diff --git a/wifi/hostapd/aidl/Android.bp b/wifi/hostapd/aidl/Android.bp
index cdc94bb..e5d492a 100644
--- a/wifi/hostapd/aidl/Android.bp
+++ b/wifi/hostapd/aidl/Android.bp
@@ -39,6 +39,9 @@
"com.android.wifi",
],
min_sdk_version: "30",
+ lint: {
+ baseline_filename: "lint-baseline.xml",
+ },
},
ndk: {
gen_trace: true,
diff --git a/wifi/hostapd/aidl/lint-baseline.xml b/wifi/hostapd/aidl/lint-baseline.xml
index 657622e..99231fc 100644
--- a/wifi/hostapd/aidl/lint-baseline.xml
+++ b/wifi/hostapd/aidl/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-dev" type="baseline" dependencies="true" variant="all" version="8.0.0-dev">
+<issues format="6" by="lint 8.4.0-alpha01" type="baseline" client="" dependencies="true" name="" variant="all" version="8.4.0-alpha01">
<issue
id="NewApi"
@@ -7,8 +7,8 @@
errorLine1=" this.markVintfStability();"
errorLine2=" ~~~~~~~~~~~~~~~~~~">
<location
- file="out/.intermediates/hardware/interfaces/wifi/hostapd/aidl/android.hardware.wifi.hostapd-V1-java-source/gen/android/hardware/wifi/hostapd/IHostapd.java"
- line="55"
+ file="out/soong/.intermediates/hardware/interfaces/wifi/hostapd/aidl/android.hardware.wifi.hostapd-V1-java-source/gen/android/hardware/wifi/hostapd/IHostapd.java"
+ line="57"
column="12"/>
</issue>
@@ -18,8 +18,8 @@
errorLine1=" this.markVintfStability();"
errorLine2=" ~~~~~~~~~~~~~~~~~~">
<location
- file="out/.intermediates/hardware/interfaces/wifi/hostapd/aidl/android.hardware.wifi.hostapd-V1-java-source/gen/android/hardware/wifi/hostapd/IHostapdCallback.java"
- line="46"
+ file="out/soong/.intermediates/hardware/interfaces/wifi/hostapd/aidl/android.hardware.wifi.hostapd-V1-java-source/gen/android/hardware/wifi/hostapd/IHostapdCallback.java"
+ line="48"
column="12"/>
</issue>
@@ -29,8 +29,8 @@
errorLine1=" this.markVintfStability();"
errorLine2=" ~~~~~~~~~~~~~~~~~~">
<location
- file="out/.intermediates/hardware/interfaces/wifi/hostapd/aidl/android.hardware.wifi.hostapd-V2-java-source/gen/android/hardware/wifi/hostapd/IHostapd.java"
- line="117"
+ file="out/soong/.intermediates/hardware/interfaces/wifi/hostapd/aidl/android.hardware.wifi.hostapd-V2-java-source/gen/android/hardware/wifi/hostapd/IHostapd.java"
+ line="119"
column="12"/>
</issue>
@@ -40,8 +40,8 @@
errorLine1=" this.markVintfStability();"
errorLine2=" ~~~~~~~~~~~~~~~~~~">
<location
- file="out/.intermediates/hardware/interfaces/wifi/hostapd/aidl/android.hardware.wifi.hostapd-V2-java-source/gen/android/hardware/wifi/hostapd/IHostapdCallback.java"
- line="62"
+ file="out/soong/.intermediates/hardware/interfaces/wifi/hostapd/aidl/android.hardware.wifi.hostapd-V2-java-source/gen/android/hardware/wifi/hostapd/IHostapdCallback.java"
+ line="64"
column="12"/>
</issue>
diff --git a/wifi/netlinkinterceptor/aidl/default/InterceptorRelay.h b/wifi/netlinkinterceptor/aidl/default/InterceptorRelay.h
index 0178c90..915b5ff 100644
--- a/wifi/netlinkinterceptor/aidl/default/InterceptorRelay.h
+++ b/wifi/netlinkinterceptor/aidl/default/InterceptorRelay.h
@@ -18,6 +18,7 @@
#include <libnl++/Socket.h>
+#include <atomic>
#include <mutex>
#include <thread>
diff --git a/wifi/supplicant/1.0/Android.bp b/wifi/supplicant/1.0/Android.bp
index 66e9353..89a0907 100644
--- a/wifi/supplicant/1.0/Android.bp
+++ b/wifi/supplicant/1.0/Android.bp
@@ -31,4 +31,8 @@
"android.hidl.base@1.0",
],
gen_java: true,
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.wifi",
+ ],
}
diff --git a/wifi/supplicant/1.1/Android.bp b/wifi/supplicant/1.1/Android.bp
index c624374..f925671 100644
--- a/wifi/supplicant/1.1/Android.bp
+++ b/wifi/supplicant/1.1/Android.bp
@@ -23,4 +23,8 @@
"android.hidl.base@1.0",
],
gen_java: true,
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.wifi",
+ ],
}
diff --git a/wifi/supplicant/1.2/Android.bp b/wifi/supplicant/1.2/Android.bp
index d5d937f..f61d9b9 100644
--- a/wifi/supplicant/1.2/Android.bp
+++ b/wifi/supplicant/1.2/Android.bp
@@ -26,4 +26,8 @@
"android.hidl.base@1.0",
],
gen_java: true,
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.wifi",
+ ],
}
diff --git a/wifi/supplicant/1.3/Android.bp b/wifi/supplicant/1.3/Android.bp
index fbe7f75..173a1ef 100644
--- a/wifi/supplicant/1.3/Android.bp
+++ b/wifi/supplicant/1.3/Android.bp
@@ -27,4 +27,8 @@
"android.hidl.base@1.0",
],
gen_java: true,
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.wifi",
+ ],
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
index 0729646..0b068e0 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
@@ -35,13 +35,22 @@
@VintfStability
interface ISupplicantP2pIface {
void addBonjourService(in byte[] query, in byte[] response);
+ /**
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use createGroupOwner.
+ */
void addGroup(in boolean persistent, in int persistentNetworkId);
+ /**
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use addGroupWithConfigurationParams.
+ */
void addGroupWithConfig(in byte[] ssid, in String pskPassphrase, in boolean persistent, in int freq, in byte[] peerAddress, in boolean joinExistingGroup);
@PropagateAllowBlocking android.hardware.wifi.supplicant.ISupplicantP2pNetwork addNetwork();
void addUpnpService(in int version, in String serviceName);
void cancelConnect();
void cancelServiceDiscovery(in long identifier);
void cancelWps(in String groupIfName);
+ /**
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use configureExtListenWithParams.
+ */
void configureExtListen(in int periodInMillis, in int intervalInMillis);
/**
* @deprecated This method is deprecated from AIDL v3, newer HALs should use connectWithParams.
@@ -111,4 +120,7 @@
void configureEapolIpAddressAllocationParams(in int ipAddressGo, in int ipAddressMask, in int ipAddressStart, in int ipAddressEnd);
String connectWithParams(in android.hardware.wifi.supplicant.P2pConnectInfo connectInfo);
void findWithParams(in android.hardware.wifi.supplicant.P2pDiscoveryInfo discoveryInfo);
+ void configureExtListenWithParams(in android.hardware.wifi.supplicant.P2pExtListenInfo extListenInfo);
+ void addGroupWithConfigurationParams(in android.hardware.wifi.supplicant.P2pAddGroupConfigurationParams groupConfigurationParams);
+ void createGroupOwner(in android.hardware.wifi.supplicant.P2pCreateGroupOwnerInfo groupOwnerInfo);
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl
index 851e851..65ad4c1 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl
@@ -35,17 +35,23 @@
@VintfStability
interface ISupplicantP2pIfaceCallback {
/**
- * @deprecated This callback is deprecated from AIDL v2, newer HAL should call onDeviceFoundWithParams.
+ * @deprecated This callback is deprecated from AIDL v3, newer HAL should call onDeviceFoundWithParams.
*/
oneway void onDeviceFound(in byte[] srcAddress, in byte[] p2pDeviceAddress, in byte[] primaryDeviceType, in String deviceName, in android.hardware.wifi.supplicant.WpsConfigMethods configMethods, in byte deviceCapabilities, in android.hardware.wifi.supplicant.P2pGroupCapabilityMask groupCapabilities, in byte[] wfdDeviceInfo);
oneway void onDeviceLost(in byte[] p2pDeviceAddress);
oneway void onFindStopped();
oneway void onGoNegotiationCompleted(in android.hardware.wifi.supplicant.P2pStatusCode status);
+ /**
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use onGoNegotiationRequestWithParams.
+ */
oneway void onGoNegotiationRequest(in byte[] srcAddress, in android.hardware.wifi.supplicant.WpsDevPasswordId passwordId);
oneway void onGroupFormationFailure(in String failureReason);
oneway void onGroupFormationSuccess();
oneway void onGroupRemoved(in String groupIfname, in boolean isGroupOwner);
oneway void onGroupStarted(in String groupIfname, in boolean isGroupOwner, in byte[] ssid, in int frequency, in byte[] psk, in String passphrase, in byte[] goDeviceAddress, in boolean isPersistent);
+ /**
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use onInvitationReceivedWithParams.
+ */
oneway void onInvitationReceived(in byte[] srcAddress, in byte[] goDeviceAddress, in byte[] bssid, in int persistentNetworkId, in int operatingFrequency);
oneway void onInvitationResult(in byte[] bssid, in android.hardware.wifi.supplicant.P2pStatusCode status);
/**
@@ -72,4 +78,6 @@
oneway void onPeerClientDisconnected(in android.hardware.wifi.supplicant.P2pPeerClientDisconnectedEventParams clientDisconnectedEventParams);
oneway void onProvisionDiscoveryCompletedEvent(in android.hardware.wifi.supplicant.P2pProvisionDiscoveryCompletedEventParams provisionDiscoveryCompletedEventParams);
oneway void onDeviceFoundWithParams(in android.hardware.wifi.supplicant.P2pDeviceFoundEventParams deviceFoundEventParams);
+ oneway void onGoNegotiationRequestWithParams(in android.hardware.wifi.supplicant.P2pGoNegotiationReqEventParams params);
+ oneway void onInvitationReceivedWithParams(in android.hardware.wifi.supplicant.P2pInvitationEventParams params);
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
index 898c2d4..9fa8f56 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
@@ -54,7 +54,7 @@
oneway void onExtRadioWorkTimeout(in int id);
oneway void onHs20DeauthImminentNotice(in byte[] bssid, in int reasonCode, in int reAuthDelayInSec, in String url);
/**
- * @deprecated No longer in use.
+ * @deprecated This callback is deprecated from AIDL v3.
*/
oneway void onHs20IconQueryDone(in byte[] bssid, in String fileName, in byte[] data);
oneway void onHs20SubscriptionRemediation(in byte[] bssid, in android.hardware.wifi.supplicant.OsuMethod osuMethod, in String url);
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/KeyMgmtMask.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/KeyMgmtMask.aidl
index 35d51bc..06c22cb 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/KeyMgmtMask.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/KeyMgmtMask.aidl
@@ -51,4 +51,5 @@
WAPI_CERT = (1 << 13) /* 8192 */,
FILS_SHA256 = (1 << 18) /* 262144 */,
FILS_SHA384 = (1 << 19) /* 524288 */,
+ PASN = (1 << 25) /* 33554432 */,
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pAddGroupConfigurationParams.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pAddGroupConfigurationParams.aidl
new file mode 100644
index 0000000..ff73f84
--- /dev/null
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pAddGroupConfigurationParams.aidl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.wifi.supplicant;
+@VintfStability
+parcelable P2pAddGroupConfigurationParams {
+ byte[] ssid;
+ String passphrase;
+ boolean isPersistent;
+ int frequencyMHzOrBand;
+ byte[6] goInterfaceAddress;
+ boolean joinExistingGroup;
+ int keyMgmtMask;
+ @nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
+}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pCreateGroupOwnerInfo.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pCreateGroupOwnerInfo.aidl
new file mode 100644
index 0000000..4451fb5
--- /dev/null
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pCreateGroupOwnerInfo.aidl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.wifi.supplicant;
+@VintfStability
+parcelable P2pCreateGroupOwnerInfo {
+ boolean persistent;
+ int persistentNetworkId;
+ @nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
+}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pExtListenInfo.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pExtListenInfo.aidl
new file mode 100644
index 0000000..b4d8e9d
--- /dev/null
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pExtListenInfo.aidl
@@ -0,0 +1,40 @@
+/**
+ * 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 FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.wifi.supplicant;
+@VintfStability
+parcelable P2pExtListenInfo {
+ int periodMs;
+ int intervalMs;
+ @nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
+}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pGoNegotiationReqEventParams.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pGoNegotiationReqEventParams.aidl
new file mode 100644
index 0000000..ba10b3e
--- /dev/null
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pGoNegotiationReqEventParams.aidl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.wifi.supplicant;
+@VintfStability
+parcelable P2pGoNegotiationReqEventParams {
+ byte[6] srcAddress;
+ android.hardware.wifi.supplicant.WpsDevPasswordId passwordId;
+ @nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
+}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pInvitationEventParams.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pInvitationEventParams.aidl
new file mode 100644
index 0000000..541ee4f
--- /dev/null
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pInvitationEventParams.aidl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.wifi.supplicant;
+@VintfStability
+parcelable P2pInvitationEventParams {
+ byte[6] srcAddress;
+ byte[6] goDeviceAddress;
+ byte[6] bssid;
+ int persistentNetworkId;
+ int operatingFrequencyMHz;
+ @nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
+}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl
index 0ff0653..46366cc 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl
@@ -37,7 +37,7 @@
byte[6] p2pDeviceAddress;
boolean isRequest;
android.hardware.wifi.supplicant.P2pProvDiscStatusCode status;
- android.hardware.wifi.supplicant.WpsConfigMethods configMethods;
+ int configMethods;
String generatedPin;
String groupInterfaceName;
@nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
index 983ed15..1230793 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
@@ -22,8 +22,11 @@
import android.hardware.wifi.supplicant.ISupplicantP2pNetwork;
import android.hardware.wifi.supplicant.IfaceType;
import android.hardware.wifi.supplicant.MiracastMode;
+import android.hardware.wifi.supplicant.P2pAddGroupConfigurationParams;
import android.hardware.wifi.supplicant.P2pConnectInfo;
+import android.hardware.wifi.supplicant.P2pCreateGroupOwnerInfo;
import android.hardware.wifi.supplicant.P2pDiscoveryInfo;
+import android.hardware.wifi.supplicant.P2pExtListenInfo;
import android.hardware.wifi.supplicant.P2pFrameTypeMask;
import android.hardware.wifi.supplicant.P2pGroupCapabilityMask;
import android.hardware.wifi.supplicant.WpsConfigMethods;
@@ -51,6 +54,9 @@
* negotiation with a specific peer). This is also known as autonomous
* group owner. Optional |persistentNetworkId| may be used to specify
* restart of a persistent group.
+ * <p>
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use
+ * createGroupOwner.
*
* @param persistent Used to request a persistent group to be formed.
* @param persistentNetworkId Used to specify the restart of a persistent
@@ -73,6 +79,9 @@
* whose network name and group owner's MAC address matches the specified SSID
* and peer address without WPS process. If peerAddress is 00:00:00:00:00:00, the first found
* group whose network name matches the specified SSID is joined.
+ * <p>
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use
+ * addGroupWithConfigurationParams.
*
* @param ssid The SSID of this group.
* @param pskPassphrase The passphrase of this group.
@@ -165,6 +174,9 @@
* (with interval obviously having to be larger than or equal to duration).
* If the P2P module is not idle at the time the Extended Listen Timing
* timeout occurs, the Listen State operation must be skipped.
+ * <p>
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use
+ * configureExtListenWithParams.
*
* @param periodInMillis Period in milliseconds.
* @param intervalInMillis Interval in milliseconds.
@@ -882,4 +894,48 @@
* |SupplicantStatusCode.FAILURE_IFACE_DISABLED|
*/
void findWithParams(in P2pDiscoveryInfo discoveryInfo);
+
+ /**
+ * Configure Extended Listen Timing.
+ *
+ * If enabled, listen state must be entered every |intervalMs| for at
+ * least |periodMs|. Both values have acceptable range of 1-65535
+ * (note that the interval must be larger than or equal to the duration).
+ * If the P2P module is not idle at the time the Extended Listen Timing
+ * timeout occurs, the Listen State operation must be skipped.
+ *
+ * @param extListenInfo Parameters to configure extended listening timing.
+ * @throws ServiceSpecificException with one of the following values:
+ * |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
+ * |SupplicantStatusCode.FAILURE_UNKNOWN|,
+ * |SupplicantStatusCode.FAILURE_IFACE_INVALID|
+ */
+ void configureExtListenWithParams(in P2pExtListenInfo extListenInfo);
+
+ /**
+ * Set up a P2P group owner or join a group as a group client with the
+ * specified configuration. The group configurations required to establish
+ * a connection(SSID, password, channel, etc) are shared out of band.
+ * So the connection process doesn't require a P2P provision discovery or
+ * invitation message exchange.
+ *
+ * @param groupConfigurationParams Parameters associated with this add group operation.
+ * @throws ServiceSpecificException with one of the following values:
+ * |SupplicantStatusCode.FAILURE_UNKNOWN|,
+ * |SupplicantStatusCode.FAILURE_IFACE_INVALID|
+ */
+ void addGroupWithConfigurationParams(
+ in P2pAddGroupConfigurationParams groupConfigurationParams);
+
+ /**
+ * Set up a P2P group owner on this device. This is also known as autonomous
+ * group owner. The connection process requires P2P provision discovery
+ * message or invitation message exchange.
+ *
+ * @param groupOwnerInfo Parameters associated with this create group owner operation.
+ * @throws ServiceSpecificException with one of the following values:
+ * |SupplicantStatusCode.FAILURE_UNKNOWN|,
+ * |SupplicantStatusCode.FAILURE_IFACE_INVALID|
+ */
+ void createGroupOwner(in P2pCreateGroupOwnerInfo groupOwnerInfo);
}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl
index 11cd867..44a5465 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl
@@ -17,8 +17,10 @@
package android.hardware.wifi.supplicant;
import android.hardware.wifi.supplicant.P2pDeviceFoundEventParams;
+import android.hardware.wifi.supplicant.P2pGoNegotiationReqEventParams;
import android.hardware.wifi.supplicant.P2pGroupCapabilityMask;
import android.hardware.wifi.supplicant.P2pGroupStartedEventParams;
+import android.hardware.wifi.supplicant.P2pInvitationEventParams;
import android.hardware.wifi.supplicant.P2pPeerClientDisconnectedEventParams;
import android.hardware.wifi.supplicant.P2pPeerClientJoinedEventParams;
import android.hardware.wifi.supplicant.P2pProvDiscStatusCode;
@@ -40,7 +42,7 @@
/**
* Used to indicate that a P2P device has been found.
* <p>
- * @deprecated This callback is deprecated from AIDL v2, newer HAL should call
+ * @deprecated This callback is deprecated from AIDL v3, newer HAL should call
* onDeviceFoundWithParams.
*
* @param srcAddress MAC address of the device found. This must either
@@ -88,6 +90,10 @@
* @param srcAddress MAC address of the device that initiated the GO
* negotiation request.
* @param passwordId Type of password.
+ *
+ * <p>
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use
+ * onGoNegotiationRequestWithParams.
*/
void onGoNegotiationRequest(in byte[] srcAddress, in WpsDevPasswordId passwordId);
@@ -135,6 +141,9 @@
* @param bssid Bssid of the group.
* @param persistentNetworkId Persistent network Id of the group.
* @param operatingFrequency Frequency on which the invitation was received.
+ * <p>
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use
+ * onInvitationReceivedWithParams.
*/
void onInvitationReceived(in byte[] srcAddress, in byte[] goDeviceAddress, in byte[] bssid,
in int persistentNetworkId, in int operatingFrequency);
@@ -302,4 +311,18 @@
* @param deviceFoundEventParams Parameters associated with the device found event.
*/
void onDeviceFoundWithParams(in P2pDeviceFoundEventParams deviceFoundEventParams);
+
+ /**
+ * Used to indicate the reception of a P2P Group Owner negotiation request.
+ *
+ * @param params Parameters associated with the GO negotiation request event.
+ */
+ void onGoNegotiationRequestWithParams(in P2pGoNegotiationReqEventParams params);
+
+ /**
+ * Used to indicate the reception of a P2P invitation.
+ *
+ * @param params Parameters associated with the invitation request event.
+ */
+ void onInvitationReceivedWithParams(in P2pInvitationEventParams params);
}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
index 58893eb..172fcda 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
@@ -198,7 +198,7 @@
/**
* Used to indicate the result of Hotspot 2.0 Icon query.
*
- * @deprecated No longer in use.
+ * @deprecated This callback is deprecated from AIDL v3.
*
* @param bssid BSSID of the access point.
* @param fileName Name of the file that was requested.
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/KeyMgmtMask.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/KeyMgmtMask.aidl
index f0c3345..8758645 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/KeyMgmtMask.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/KeyMgmtMask.aidl
@@ -71,4 +71,8 @@
* FILS shared key authentication with sha-384
*/
FILS_SHA384 = 1 << 19,
+ /**
+ * Pre-Association Security Negotiation (PASN) Key management
+ */
+ PASN = 1 << 25,
}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pAddGroupConfigurationParams.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pAddGroupConfigurationParams.aidl
new file mode 100644
index 0000000..15f2733
--- /dev/null
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pAddGroupConfigurationParams.aidl
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.wifi.supplicant;
+
+import android.hardware.wifi.common.OuiKeyedData;
+import android.hardware.wifi.supplicant.KeyMgmtMask;
+
+/**
+ * Request parameters used for |ISupplicantP2pIface.addGroupWithConfigurationParams|
+ */
+@VintfStability
+parcelable P2pAddGroupConfigurationParams {
+ /** The SSID of the group. */
+ byte[] ssid;
+
+ /** The passphrase used to secure the group. */
+ String passphrase;
+
+ /** Whether this group is persisted. Only applied on the group owner side */
+ boolean isPersistent;
+
+ /**
+ * The required frequency or band of the group.
+ * Only applied on the group owner side.
+ * The following values are supported:
+ * 0: automatic channel selection,
+ * 2: for 2.4GHz channels
+ * 5: for 5GHz channels
+ * 6: for 6GHz channels
+ * specific frequency in MHz, i.e., 2412, 5500, etc.
+ * If an invalid band or unsupported frequency are specified,
+ * |ISupplicantP2pIface.addGroupWithConfigurationParams| fails
+ */
+ int frequencyMHzOrBand;
+
+ /**
+ * The MAC Address of the P2P interface of the Peer GO device.
+ * This field is valid only for the group client side.
+ * If the MAC is "00:00:00:00:00:00", the device must try to find a peer GO device
+ * whose network name matches the specified SSID.
+ */
+ byte[6] goInterfaceAddress;
+
+ /*
+ * True if join a group as a group client; false to create a group as a group owner
+ */
+ boolean joinExistingGroup;
+
+ /**
+ * The authentication Key management mask for the connection. Combination of |KeyMgmtMask|
+ * values. The supported authentication key management types are WPA_PSK, SAE and PASN.
+ *
+ */
+ int keyMgmtMask;
+
+ /**
+ * Optional vendor-specific parameters. Null value indicates
+ * that no vendor data is provided.
+ */
+ @nullable OuiKeyedData[] vendorData;
+}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pCreateGroupOwnerInfo.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pCreateGroupOwnerInfo.aidl
new file mode 100644
index 0000000..51e6ed9
--- /dev/null
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pCreateGroupOwnerInfo.aidl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.wifi.supplicant;
+
+import android.hardware.wifi.common.OuiKeyedData;
+
+/**
+ * Parameters used for |ISupplicantP2pIface.createGroupOwner|
+ */
+@VintfStability
+parcelable P2pCreateGroupOwnerInfo {
+ /**
+ * Used to request a persistent group to be formed.
+ */
+ boolean persistent;
+
+ /**
+ * Optional parameter. Used to specify the restart of a persistent
+ * group. Set to UINT32_MAX for a non-persistent group.
+ */
+ int persistentNetworkId;
+
+ /**
+ * Optional vendor-specific parameters. Null value indicates
+ * that no vendor data is provided.
+ */
+ @nullable OuiKeyedData[] vendorData;
+}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pExtListenInfo.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pExtListenInfo.aidl
new file mode 100644
index 0000000..1086c94
--- /dev/null
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pExtListenInfo.aidl
@@ -0,0 +1,39 @@
+/**
+ * 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 android.hardware.wifi.supplicant;
+
+import android.hardware.wifi.common.OuiKeyedData;
+
+/**
+ * Parameters used to configure the P2P Extended Listen Interval.
+ */
+@VintfStability
+parcelable P2pExtListenInfo {
+ /**
+ * Period in milliseconds.
+ */
+ int periodMs;
+ /**
+ * Interval in milliseconds.
+ */
+ int intervalMs;
+ /**
+ * Optional vendor-specific parameters. Null value indicates
+ * that no vendor data is provided.
+ */
+ @nullable OuiKeyedData[] vendorData;
+}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pGoNegotiationReqEventParams.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pGoNegotiationReqEventParams.aidl
new file mode 100644
index 0000000..3480734
--- /dev/null
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pGoNegotiationReqEventParams.aidl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.wifi.supplicant;
+
+import android.hardware.wifi.common.OuiKeyedData;
+import android.hardware.wifi.supplicant.WpsDevPasswordId;
+
+/**
+ * Parameters used for |ISupplicantP2pIfaceCallback.onGoNegotiationRequestWithParams|
+ */
+@VintfStability
+parcelable P2pGoNegotiationReqEventParams {
+ /**
+ * MAC address of the device that sent the Go negotiation request.
+ */
+ byte[6] srcAddress;
+
+ /**
+ * Type of password.
+ */
+ WpsDevPasswordId passwordId;
+
+ /**
+ * Optional vendor-specific parameters. Null value indicates
+ * that no vendor data is provided.
+ */
+ @nullable OuiKeyedData[] vendorData;
+}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pInvitationEventParams.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pInvitationEventParams.aidl
new file mode 100644
index 0000000..4295c40
--- /dev/null
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pInvitationEventParams.aidl
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.wifi.supplicant;
+
+import android.hardware.wifi.common.OuiKeyedData;
+
+/**
+ * Parameters used for |ISupplicantP2pIfaceCallback.onInvitationReceivedWithParams|
+ */
+@VintfStability
+parcelable P2pInvitationEventParams {
+ /**
+ * MAC address of the device that sent the invitation.
+ */
+ byte[6] srcAddress;
+
+ /**
+ * P2P device MAC Address of the group owner.
+ */
+ byte[6] goDeviceAddress;
+
+ /**
+ * BSSID of the group.
+ */
+ byte[6] bssid;
+
+ /**
+ * Persistent network ID of the group.
+ */
+ int persistentNetworkId;
+
+ /**
+ * Frequency on which the invitation was received.
+ */
+ int operatingFrequencyMHz;
+
+ /**
+ * Optional vendor-specific parameters. Null value indicates
+ * that no vendor data is provided.
+ */
+ @nullable OuiKeyedData[] vendorData;
+}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl
index b559216..05152a9 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl
@@ -18,7 +18,6 @@
import android.hardware.wifi.common.OuiKeyedData;
import android.hardware.wifi.supplicant.P2pProvDiscStatusCode;
-import android.hardware.wifi.supplicant.WpsConfigMethods;
/**
* Parameters passed as a part of P2P provision discovery frame notification.
@@ -34,8 +33,8 @@
boolean isRequest;
/** Status of the provision discovery */
P2pProvDiscStatusCode status;
- /** Mask of WPS configuration methods supported */
- WpsConfigMethods configMethods;
+ /** Mask of |WpsConfigMethods| indicating the supported methods */
+ int configMethods;
/** 8-digit pin generated */
String generatedPin;
/**
diff --git a/wifi/supplicant/aidl/vts/functional/supplicant_p2p_iface_aidl_test.cpp b/wifi/supplicant/aidl/vts/functional/supplicant_p2p_iface_aidl_test.cpp
index 3f96414..2d6823f 100644
--- a/wifi/supplicant/aidl/vts/functional/supplicant_p2p_iface_aidl_test.cpp
+++ b/wifi/supplicant/aidl/vts/functional/supplicant_p2p_iface_aidl_test.cpp
@@ -37,8 +37,10 @@
using aidl::android::hardware::wifi::supplicant::MiracastMode;
using aidl::android::hardware::wifi::supplicant::P2pDeviceFoundEventParams;
using aidl::android::hardware::wifi::supplicant::P2pFrameTypeMask;
+using aidl::android::hardware::wifi::supplicant::P2pGoNegotiationReqEventParams;
using aidl::android::hardware::wifi::supplicant::P2pGroupCapabilityMask;
using aidl::android::hardware::wifi::supplicant::P2pGroupStartedEventParams;
+using aidl::android::hardware::wifi::supplicant::P2pInvitationEventParams;
using aidl::android::hardware::wifi::supplicant::P2pPeerClientDisconnectedEventParams;
using aidl::android::hardware::wifi::supplicant::P2pPeerClientJoinedEventParams;
using aidl::android::hardware::wifi::supplicant::P2pProvDiscStatusCode;
@@ -204,6 +206,14 @@
const P2pDeviceFoundEventParams& /* deviceFoundEventParams */) override {
return ndk::ScopedAStatus::ok();
}
+ ::ndk::ScopedAStatus onGoNegotiationRequestWithParams(
+ const P2pGoNegotiationReqEventParams& /* goNegotiationReqEventParams */) override {
+ return ndk::ScopedAStatus::ok();
+ }
+ ::ndk::ScopedAStatus onInvitationReceivedWithParams(
+ const P2pInvitationEventParams& /* invitationEventParams */) override {
+ return ndk::ScopedAStatus::ok();
+ }
};
class SupplicantP2pIfaceAidlTest : public testing::TestWithParam<std::string> {