Merge "wifi: clear TWT internal callbacks" into main
diff --git a/audio/aidl/default/CapEngineConfigXmlConverter.cpp b/audio/aidl/default/CapEngineConfigXmlConverter.cpp
index 20fbca4..14d27f2 100644
--- a/audio/aidl/default/CapEngineConfigXmlConverter.cpp
+++ b/audio/aidl/default/CapEngineConfigXmlConverter.cpp
@@ -52,6 +52,7 @@
static constexpr const char* gOutputDevicesParameter = "selected_output_devices";
static constexpr const char* gOutputDeviceAddressParameter = "device_address";
static constexpr const char* gStrategyPrefix = "vx_";
+static constexpr const char* gLegacyStrategyPrefix = "STRATEGY_";
static constexpr const char* gLegacyOutputDevicePrefix = "AUDIO_DEVICE_OUT_";
static constexpr const char* gLegacyInputDevicePrefix = "AUDIO_DEVICE_IN_";
static constexpr const char* gLegacyStreamPrefix = "AUDIO_STREAM_";
@@ -159,6 +160,17 @@
}
return strategyId;
}
+ pos = stringToken.find(gLegacyStrategyPrefix);
+ if (pos != std::string::npos) {
+ std::string legacyStrategyIdLiteral = stringToken.substr(pos);
+ const auto legacyStrategies = getLegacyProductStrategyMap();
+ if (const auto& it = legacyStrategies.find(legacyStrategyIdLiteral);
+ it != legacyStrategies.end()) {
+ return it->second;
+ }
+ LOG(ERROR) << "Invalid legacy strategy " << stringToken << " from path " << path;
+ return unexpected(BAD_VALUE);
+ }
}
return unexpected(BAD_VALUE);
}
diff --git a/audio/aidl/default/EngineConfigXmlConverter.cpp b/audio/aidl/default/EngineConfigXmlConverter.cpp
index d945b17..78deb64 100644
--- a/audio/aidl/default/EngineConfigXmlConverter.cpp
+++ b/audio/aidl/default/EngineConfigXmlConverter.cpp
@@ -59,20 +59,6 @@
static constexpr char kCapEngineConfigFileName[] =
"/parameter-framework/Settings/Policy/PolicyConfigurableDomains.xml";
-void EngineConfigXmlConverter::initProductStrategyMap() {
-#define STRATEGY_ENTRY(name) {"STRATEGY_" #name, static_cast<int>(AudioProductStrategyType::name)}
-
- mProductStrategyMap = {STRATEGY_ENTRY(MEDIA),
- STRATEGY_ENTRY(PHONE),
- STRATEGY_ENTRY(SONIFICATION),
- STRATEGY_ENTRY(SONIFICATION_RESPECTFUL),
- STRATEGY_ENTRY(DTMF),
- STRATEGY_ENTRY(ENFORCED_AUDIBLE),
- STRATEGY_ENTRY(TRANSMITTED_THROUGH_SPEAKER),
- STRATEGY_ENTRY(ACCESSIBILITY)};
-#undef STRATEGY_ENTRY
-}
-
ConversionResult<int> EngineConfigXmlConverter::convertProductStrategyNameToAidl(
const std::string& xsdcProductStrategyName) {
const auto [it, success] = mProductStrategyMap.insert(
@@ -242,7 +228,7 @@
}
void EngineConfigXmlConverter::init() {
- initProductStrategyMap();
+ mProductStrategyMap = getLegacyProductStrategyMap();
if (getXsdcConfig()->hasProductStrategies()) {
mAidlEngineConfig.productStrategies = VALUE_OR_FATAL(
(convertWrappedCollectionToAidl<eng_xsd::ProductStrategies,
diff --git a/audio/aidl/default/Stream.cpp b/audio/aidl/default/Stream.cpp
index 4525f6a..c138095 100644
--- a/audio/aidl/default/Stream.cpp
+++ b/audio/aidl/default/Stream.cpp
@@ -704,44 +704,7 @@
LOG(ERROR) << __func__ << ": Worker start error: " << mWorker->getError();
return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
}
- if (auto flags = getContext().getFlags();
- (flags.getTag() == AudioIoFlags::Tag::input &&
- isBitPositionFlagSet(flags.template get<AudioIoFlags::Tag::input>(),
- AudioInputFlags::FAST)) ||
- (flags.getTag() == AudioIoFlags::Tag::output &&
- (isBitPositionFlagSet(flags.template get<AudioIoFlags::Tag::output>(),
- AudioOutputFlags::FAST) ||
- isBitPositionFlagSet(flags.template get<AudioIoFlags::Tag::output>(),
- AudioOutputFlags::SPATIALIZER)))) {
- // FAST workers should be run with a SCHED_FIFO scheduler, however the host process
- // might be lacking the capability to request it, thus a failure to set is not an error.
- pid_t workerTid = mWorker->getTid();
- if (workerTid > 0) {
- constexpr int32_t kRTPriorityMin = 1; // SchedulingPolicyService.PRIORITY_MIN (Java).
- constexpr int32_t kRTPriorityMax = 3; // SchedulingPolicyService.PRIORITY_MAX (Java).
- int priorityBoost = kRTPriorityMax;
- if (flags.getTag() == AudioIoFlags::Tag::output &&
- isBitPositionFlagSet(flags.template get<AudioIoFlags::Tag::output>(),
- AudioOutputFlags::SPATIALIZER)) {
- const int32_t sptPrio =
- property_get_int32("audio.spatializer.priority", kRTPriorityMin);
- if (sptPrio >= kRTPriorityMin && sptPrio <= kRTPriorityMax) {
- priorityBoost = sptPrio;
- } else {
- LOG(WARNING) << __func__ << ": invalid spatializer priority: " << sptPrio;
- return ndk::ScopedAStatus::ok();
- }
- }
- struct sched_param param = {
- .sched_priority = priorityBoost,
- };
- if (sched_setscheduler(workerTid, SCHED_FIFO | SCHED_RESET_ON_FORK, ¶m) != 0) {
- PLOG(WARNING) << __func__ << ": failed to set FIFO scheduler and priority";
- }
- } else {
- LOG(WARNING) << __func__ << ": invalid worker tid: " << workerTid;
- }
- }
+ setWorkerThreadPriority(mWorker->getTid());
getContext().getCommandMQ()->setErrorHandler(
fmqErrorHandler<StreamContext::CommandMQ::Error>("CommandMQ"));
getContext().getReplyMQ()->setErrorHandler(
@@ -830,6 +793,42 @@
}
}
+void StreamCommonImpl::setWorkerThreadPriority(pid_t workerTid) {
+ // FAST workers should be run with a SCHED_FIFO scheduler, however the host process
+ // might be lacking the capability to request it, thus a failure to set is not an error.
+ if (auto flags = getContext().getFlags();
+ (flags.getTag() == AudioIoFlags::Tag::input &&
+ isBitPositionFlagSet(flags.template get<AudioIoFlags::Tag::input>(),
+ AudioInputFlags::FAST)) ||
+ (flags.getTag() == AudioIoFlags::Tag::output &&
+ (isBitPositionFlagSet(flags.template get<AudioIoFlags::Tag::output>(),
+ AudioOutputFlags::FAST) ||
+ isBitPositionFlagSet(flags.template get<AudioIoFlags::Tag::output>(),
+ AudioOutputFlags::SPATIALIZER)))) {
+ constexpr int32_t kRTPriorityMin = 1; // SchedulingPolicyService.PRIORITY_MIN (Java).
+ constexpr int32_t kRTPriorityMax = 3; // SchedulingPolicyService.PRIORITY_MAX (Java).
+ int priorityBoost = kRTPriorityMax;
+ if (flags.getTag() == AudioIoFlags::Tag::output &&
+ isBitPositionFlagSet(flags.template get<AudioIoFlags::Tag::output>(),
+ AudioOutputFlags::SPATIALIZER)) {
+ const int32_t sptPrio =
+ property_get_int32("audio.spatializer.priority", kRTPriorityMin);
+ if (sptPrio >= kRTPriorityMin && sptPrio <= kRTPriorityMax) {
+ priorityBoost = sptPrio;
+ } else {
+ LOG(WARNING) << __func__ << ": invalid spatializer priority: " << sptPrio;
+ return;
+ }
+ }
+ struct sched_param param = {
+ .sched_priority = priorityBoost,
+ };
+ if (sched_setscheduler(workerTid, SCHED_FIFO | SCHED_RESET_ON_FORK, ¶m) != 0) {
+ PLOG(WARNING) << __func__ << ": failed to set FIFO scheduler and priority";
+ }
+ }
+}
+
void StreamCommonImpl::stopAndJoinWorker() {
stopWorker();
LOG(DEBUG) << __func__ << ": joining the worker thread...";
diff --git a/audio/aidl/default/XsdcConversion.cpp b/audio/aidl/default/XsdcConversion.cpp
index b42d7f5..5845903 100644
--- a/audio/aidl/default/XsdcConversion.cpp
+++ b/audio/aidl/default/XsdcConversion.cpp
@@ -816,4 +816,23 @@
}
return aidlCurvePoint;
}
+
+/**
+ * The hard coded id must be in sync with policy.h definition of legacy strategy ids.
+ */
+std::unordered_map<std::string, int> getLegacyProductStrategyMap() {
+#define STRATEGY_ENTRY(name, id) {"STRATEGY_" #name, static_cast<int>(id)}
+
+ return {STRATEGY_ENTRY(MEDIA, 5),
+ STRATEGY_ENTRY(PHONE, 0),
+ STRATEGY_ENTRY(SONIFICATION, 1),
+ STRATEGY_ENTRY(SONIFICATION_RESPECTFUL, 4),
+ STRATEGY_ENTRY(DTMF, 6),
+ STRATEGY_ENTRY(ENFORCED_AUDIBLE, 2),
+ STRATEGY_ENTRY(CALL_ASSISTANT, 7),
+ STRATEGY_ENTRY(TRANSMITTED_THROUGH_SPEAKER,8),
+ STRATEGY_ENTRY(ACCESSIBILITY, 3)};
+#undef STRATEGY_ENTRY
+}
+
} // namespace aidl::android::hardware::audio::core::internal
diff --git a/audio/aidl/default/alsa/StreamAlsa.cpp b/audio/aidl/default/alsa/StreamAlsa.cpp
index c77bfca..114c4c0 100644
--- a/audio/aidl/default/alsa/StreamAlsa.cpp
+++ b/audio/aidl/default/alsa/StreamAlsa.cpp
@@ -23,9 +23,12 @@
#include <Utils.h>
#include <audio_utils/clock.h>
#include <error/expected_utils.h>
+#include <media/AidlConversionCppNdk.h>
#include "core-impl/StreamAlsa.h"
+using aidl::android::hardware::audio::common::getChannelCount;
+
namespace aidl::android::hardware::audio::core {
StreamAlsa::StreamAlsa(StreamContext* context, const Metadata& metadata, int readWriteRetries)
@@ -41,6 +44,34 @@
cleanupWorker();
}
+::android::NBAIO_Format StreamAlsa::getPipeFormat() const {
+ const audio_format_t audioFormat = VALUE_OR_FATAL(
+ aidl2legacy_AudioFormatDescription_audio_format_t(getContext().getFormat()));
+ const int channelCount = getChannelCount(getContext().getChannelLayout());
+ return ::android::Format_from_SR_C(getContext().getSampleRate(), channelCount, audioFormat);
+}
+
+::android::sp<::android::MonoPipe> StreamAlsa::makeSink(bool writeCanBlock) {
+ const ::android::NBAIO_Format format = getPipeFormat();
+ auto sink = ::android::sp<::android::MonoPipe>::make(mBufferSizeFrames, format, writeCanBlock);
+ const ::android::NBAIO_Format offers[1] = {format};
+ size_t numCounterOffers = 0;
+ ssize_t index = sink->negotiate(offers, 1, nullptr, numCounterOffers);
+ LOG_IF(FATAL, index != 0) << __func__ << ": Negotiation for the sink failed, index = " << index;
+ return sink;
+}
+
+::android::sp<::android::MonoPipeReader> StreamAlsa::makeSource(::android::MonoPipe* pipe) {
+ const ::android::NBAIO_Format format = getPipeFormat();
+ const ::android::NBAIO_Format offers[1] = {format};
+ auto source = ::android::sp<::android::MonoPipeReader>::make(pipe);
+ size_t numCounterOffers = 0;
+ ssize_t index = source->negotiate(offers, 1, nullptr, numCounterOffers);
+ LOG_IF(FATAL, index != 0) << __func__
+ << ": Negotiation for the source failed, index = " << index;
+ return source;
+}
+
::android::status_t StreamAlsa::init() {
return mConfig.has_value() ? ::android::OK : ::android::NO_INIT;
}
@@ -64,7 +95,7 @@
}
::android::status_t StreamAlsa::standby() {
- mAlsaDeviceProxies.clear();
+ teardownIo();
return ::android::OK;
}
@@ -74,6 +105,8 @@
return ::android::OK;
}
decltype(mAlsaDeviceProxies) alsaDeviceProxies;
+ decltype(mSources) sources;
+ decltype(mSinks) sinks;
for (const auto& device : getDeviceProfiles()) {
if ((device.direction == PCM_OUT && mIsInput) ||
(device.direction == PCM_IN && !mIsInput)) {
@@ -95,11 +128,29 @@
return ::android::NO_INIT;
}
alsaDeviceProxies.push_back(std::move(proxy));
+ auto sink = makeSink(mIsInput); // Do not block the writer when it is on our thread.
+ if (sink != nullptr) {
+ sinks.push_back(sink);
+ } else {
+ return ::android::NO_INIT;
+ }
+ if (auto source = makeSource(sink.get()); source != nullptr) {
+ sources.push_back(source);
+ } else {
+ return ::android::NO_INIT;
+ }
}
if (alsaDeviceProxies.empty()) {
return ::android::NO_INIT;
}
mAlsaDeviceProxies = std::move(alsaDeviceProxies);
+ mSources = std::move(sources);
+ mSinks = std::move(sinks);
+ mIoThreadIsRunning = true;
+ for (size_t i = 0; i < mAlsaDeviceProxies.size(); ++i) {
+ mIoThreads.emplace_back(mIsInput ? &StreamAlsa::inputIoThread : &StreamAlsa::outputIoThread,
+ this, i);
+ }
return ::android::OK;
}
@@ -112,15 +163,30 @@
const size_t bytesToTransfer = frameCount * mFrameSizeBytes;
unsigned maxLatency = 0;
if (mIsInput) {
- // For input case, only support single device.
- proxy_read_with_retries(mAlsaDeviceProxies[0].get(), buffer, bytesToTransfer,
- mReadWriteRetries);
- maxLatency = proxy_get_latency(mAlsaDeviceProxies[0].get());
+ const size_t i = 0; // For the input case, only support a single device.
+ LOG(VERBOSE) << __func__ << ": reading from sink " << i;
+ ssize_t framesRead = mSources[i]->read(buffer, frameCount);
+ LOG_IF(FATAL, framesRead < 0) << "Error reading from the pipe: " << framesRead;
+ if (ssize_t framesMissing = static_cast<ssize_t>(frameCount) - framesRead;
+ framesMissing > 0) {
+ LOG(WARNING) << __func__ << ": incomplete data received, inserting " << framesMissing
+ << " frames of silence";
+ memset(static_cast<char*>(buffer) + framesRead * mFrameSizeBytes, 0,
+ framesMissing * mFrameSizeBytes);
+ }
+ maxLatency = proxy_get_latency(mAlsaDeviceProxies[i].get());
} else {
alsa::applyGain(buffer, mGain, bytesToTransfer, mConfig.value().format, mConfig->channels);
- for (auto& proxy : mAlsaDeviceProxies) {
- proxy_write_with_retries(proxy.get(), buffer, bytesToTransfer, mReadWriteRetries);
- maxLatency = std::max(maxLatency, proxy_get_latency(proxy.get()));
+ for (size_t i = 0; i < mAlsaDeviceProxies.size(); ++i) {
+ LOG(VERBOSE) << __func__ << ": writing into sink " << i;
+ ssize_t framesWritten = mSinks[i]->write(buffer, frameCount);
+ LOG_IF(FATAL, framesWritten < 0) << "Error writing into the pipe: " << framesWritten;
+ if (ssize_t framesLost = static_cast<ssize_t>(frameCount) - framesWritten;
+ framesLost > 0) {
+ LOG(WARNING) << __func__ << ": sink " << i << " incomplete data sent, dropping "
+ << framesLost << " frames";
+ }
+ maxLatency = std::max(maxLatency, proxy_get_latency(mAlsaDeviceProxies[i].get()));
}
}
*actualFrameCount = frameCount;
@@ -164,7 +230,7 @@
}
void StreamAlsa::shutdown() {
- mAlsaDeviceProxies.clear();
+ teardownIo();
}
ndk::ScopedAStatus StreamAlsa::setGain(float gain) {
@@ -172,4 +238,80 @@
return ndk::ScopedAStatus::ok();
}
+void StreamAlsa::inputIoThread(size_t idx) {
+#if defined(__ANDROID__)
+ setWorkerThreadPriority(pthread_gettid_np(pthread_self()));
+ const std::string threadName = (std::string("in_") + std::to_string(idx)).substr(0, 15);
+ pthread_setname_np(pthread_self(), threadName.c_str());
+#endif
+ const size_t bufferSize = mBufferSizeFrames * mFrameSizeBytes;
+ std::vector<char> buffer(bufferSize);
+ while (mIoThreadIsRunning) {
+ if (int ret = proxy_read_with_retries(mAlsaDeviceProxies[idx].get(), &buffer[0], bufferSize,
+ mReadWriteRetries);
+ ret == 0) {
+ size_t bufferFramesWritten = 0;
+ while (bufferFramesWritten < mBufferSizeFrames) {
+ if (!mIoThreadIsRunning) return;
+ ssize_t framesWrittenOrError =
+ mSinks[idx]->write(&buffer[0], mBufferSizeFrames - bufferFramesWritten);
+ if (framesWrittenOrError >= 0) {
+ bufferFramesWritten += framesWrittenOrError;
+ } else {
+ LOG(WARNING) << __func__ << "[" << idx
+ << "]: Error while writing into the pipe: "
+ << framesWrittenOrError;
+ }
+ }
+ } else {
+ // Errors when the stream is being stopped are expected.
+ LOG_IF(WARNING, mIoThreadIsRunning)
+ << __func__ << "[" << idx << "]: Error reading from ALSA: " << ret;
+ }
+ }
+}
+
+void StreamAlsa::outputIoThread(size_t idx) {
+#if defined(__ANDROID__)
+ setWorkerThreadPriority(pthread_gettid_np(pthread_self()));
+ const std::string threadName = (std::string("out_") + std::to_string(idx)).substr(0, 15);
+ pthread_setname_np(pthread_self(), threadName.c_str());
+#endif
+ const size_t bufferSize = mBufferSizeFrames * mFrameSizeBytes;
+ std::vector<char> buffer(bufferSize);
+ while (mIoThreadIsRunning) {
+ ssize_t framesRead = mSources[idx]->read(&buffer[0], mBufferSizeFrames);
+ if (framesRead > 0) {
+ int ret = proxy_write_with_retries(mAlsaDeviceProxies[idx].get(), &buffer[0],
+ framesRead * mFrameSizeBytes, mReadWriteRetries);
+ // Errors when the stream is being stopped are expected.
+ LOG_IF(WARNING, ret != 0 && mIoThreadIsRunning)
+ << __func__ << "[" << idx << "]: Error writing into ALSA: " << ret;
+ }
+ }
+}
+
+void StreamAlsa::teardownIo() {
+ mIoThreadIsRunning = false;
+ if (mIsInput) {
+ LOG(DEBUG) << __func__ << ": shutting down pipes";
+ for (auto& sink : mSinks) {
+ sink->shutdown(true);
+ }
+ }
+ LOG(DEBUG) << __func__ << ": stopping PCM streams";
+ for (const auto& proxy : mAlsaDeviceProxies) {
+ proxy_stop(proxy.get());
+ }
+ LOG(DEBUG) << __func__ << ": joining threads";
+ for (auto& thread : mIoThreads) {
+ if (thread.joinable()) thread.join();
+ }
+ mIoThreads.clear();
+ LOG(DEBUG) << __func__ << ": closing PCM devices";
+ mAlsaDeviceProxies.clear();
+ mSources.clear();
+ mSinks.clear();
+}
+
} // namespace aidl::android::hardware::audio::core
diff --git a/audio/aidl/default/alsa/Utils.h b/audio/aidl/default/alsa/Utils.h
index a97ea10..53dcfd0 100644
--- a/audio/aidl/default/alsa/Utils.h
+++ b/audio/aidl/default/alsa/Utils.h
@@ -48,8 +48,8 @@
public:
DeviceProxy(); // Constructs a "null" proxy.
explicit DeviceProxy(const DeviceProfile& deviceProfile);
- alsa_device_profile* getProfile() { return mProfile.get(); }
- alsa_device_proxy* get() { return mProxy.get(); }
+ alsa_device_profile* getProfile() const { return mProfile.get(); }
+ alsa_device_proxy* get() const { return mProxy.get(); }
private:
static void alsaProxyDeleter(alsa_device_proxy* proxy);
diff --git a/audio/aidl/default/include/core-impl/Stream.h b/audio/aidl/default/include/core-impl/Stream.h
index 8297fc5..304f9b7 100644
--- a/audio/aidl/default/include/core-impl/Stream.h
+++ b/audio/aidl/default/include/core-impl/Stream.h
@@ -475,6 +475,7 @@
// the destructor in order to stop and join the worker thread in the case when the client
// has not called 'IStreamCommon::close' method.
void cleanupWorker();
+ void setWorkerThreadPriority(pid_t workerTid);
void stopAndJoinWorker();
void stopWorker();
diff --git a/audio/aidl/default/include/core-impl/StreamAlsa.h b/audio/aidl/default/include/core-impl/StreamAlsa.h
index 8bdf208..7e0f0ac 100644
--- a/audio/aidl/default/include/core-impl/StreamAlsa.h
+++ b/audio/aidl/default/include/core-impl/StreamAlsa.h
@@ -16,9 +16,14 @@
#pragma once
+#include <atomic>
#include <optional>
+#include <thread>
#include <vector>
+#include <media/nbaio/MonoPipe.h>
+#include <media/nbaio/MonoPipeReader.h>
+
#include "Stream.h"
#include "alsa/Utils.h"
@@ -57,11 +62,24 @@
const bool mIsInput;
const std::optional<struct pcm_config> mConfig;
const int mReadWriteRetries;
- // All fields below are only used on the worker thread.
- std::vector<alsa::DeviceProxy> mAlsaDeviceProxies;
private:
+ ::android::NBAIO_Format getPipeFormat() const;
+ ::android::sp<::android::MonoPipe> makeSink(bool writeCanBlock);
+ ::android::sp<::android::MonoPipeReader> makeSource(::android::MonoPipe* pipe);
+ void inputIoThread(size_t idx);
+ void outputIoThread(size_t idx);
+ void teardownIo();
+
std::atomic<float> mGain = 1.0;
+
+ // All fields below are only used on the worker thread.
+ std::vector<alsa::DeviceProxy> mAlsaDeviceProxies;
+ // Only 'libnbaio_mono' is vendor-accessible, thus no access to the multi-reader Pipe.
+ std::vector<::android::sp<::android::MonoPipe>> mSinks;
+ std::vector<::android::sp<::android::MonoPipeReader>> mSources;
+ std::vector<std::thread> mIoThreads;
+ std::atomic<bool> mIoThreadIsRunning = false; // used by all threads
};
} // namespace aidl::android::hardware::audio::core
diff --git a/audio/aidl/default/include/core-impl/XsdcConversion.h b/audio/aidl/default/include/core-impl/XsdcConversion.h
index f00206b..b298eee 100644
--- a/audio/aidl/default/include/core-impl/XsdcConversion.h
+++ b/audio/aidl/default/include/core-impl/XsdcConversion.h
@@ -64,4 +64,5 @@
const engineconfiguration::Stream& xsdStreamType);
ConversionResult<int32_t> convertAudioFlagsToAidl(
const std::vector<engineconfiguration::FlagType>& xsdcFlagTypeVec);
+std::unordered_map<std::string, int> getLegacyProductStrategyMap();
} // namespace aidl::android::hardware::audio::core::internal
diff --git a/audio/aidl/vts/EffectHelper.h b/audio/aidl/vts/EffectHelper.h
index 754a08f..5c75e48 100644
--- a/audio/aidl/vts/EffectHelper.h
+++ b/audio/aidl/vts/EffectHelper.h
@@ -520,9 +520,10 @@
<< "The input(buffer) size must be greater than or equal to nPointFFT";
bufferMag.resize(binOffsets.size());
std::vector<float> fftInput(nPointFFT);
- PFFFT_Setup* inputHandle = pffft_new_setup(nPointFFT, PFFFT_REAL);
+ pffft::detail::PFFFT_Setup* inputHandle =
+ pffft_new_setup(nPointFFT, pffft::detail::PFFFT_REAL);
pffft_transform_ordered(inputHandle, buffer.data(), fftInput.data(), nullptr,
- PFFFT_FORWARD);
+ pffft::detail::PFFFT_FORWARD);
pffft_destroy_setup(inputHandle);
for (size_t i = 0; i < binOffsets.size(); i++) {
size_t k = binOffsets[i];
diff --git a/audio/aidl/vts/VtsHalDynamicsProcessingTest.cpp b/audio/aidl/vts/VtsHalDynamicsProcessingTest.cpp
index 09b6621..70790c4 100644
--- a/audio/aidl/vts/VtsHalDynamicsProcessingTest.cpp
+++ b/audio/aidl/vts/VtsHalDynamicsProcessingTest.cpp
@@ -506,6 +506,27 @@
limiterConfigList.push_back(cfg);
}
+DynamicsProcessing::MbcBandConfig createMbcBandConfig(int channel, int band, float cutoffFreqHz,
+ float attackTimeMs, float releaseTimeMs,
+ float ratio, float thresholdDb,
+ float kneeWidthDb, float noiseGate,
+ float expanderRatio, float preGainDb,
+ float postGainDb) {
+ return DynamicsProcessing::MbcBandConfig{.channel = channel,
+ .band = band,
+ .enable = true,
+ .cutoffFrequencyHz = cutoffFreqHz,
+ .attackTimeMs = attackTimeMs,
+ .releaseTimeMs = releaseTimeMs,
+ .ratio = ratio,
+ .thresholdDb = thresholdDb,
+ .kneeWidthDb = kneeWidthDb,
+ .noiseGateThresholdDb = noiseGate,
+ .expanderRatio = expanderRatio,
+ .preGainDb = preGainDb,
+ .postGainDb = postGainDb};
+}
+
/**
* Test DynamicsProcessing Engine Configuration
*/
@@ -818,7 +839,7 @@
fillLimiterConfig(mLimiterConfigList, i, true, kDefaultLinkerGroup, kDefaultAttackTime,
kDefaultReleaseTime, kDefaultRatio, threshold, kDefaultPostGain);
}
- EXPECT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
+ ASSERT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
if (!isAllParamsValid()) {
continue;
}
@@ -827,7 +848,7 @@
EXPECT_NEAR(mInputDb, outputDb, kToleranceDb);
} else {
float calculatedThreshold = 0;
- EXPECT_NO_FATAL_FAILURE(computeThreshold(kDefaultRatio, outputDb, calculatedThreshold));
+ ASSERT_NO_FATAL_FAILURE(computeThreshold(kDefaultRatio, outputDb, calculatedThreshold));
ASSERT_GT(calculatedThreshold, previousThreshold);
previousThreshold = calculatedThreshold;
}
@@ -844,7 +865,7 @@
fillLimiterConfig(mLimiterConfigList, i, true, kDefaultLinkerGroup, kDefaultAttackTime,
kDefaultReleaseTime, ratio, kDefaultThreshold, kDefaultPostGain);
}
- EXPECT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
+ ASSERT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
if (!isAllParamsValid()) {
continue;
}
@@ -854,7 +875,7 @@
EXPECT_NEAR(mInputDb, outputDb, kToleranceDb);
} else {
float calculatedRatio = 0;
- EXPECT_NO_FATAL_FAILURE(computeRatio(kDefaultThreshold, outputDb, calculatedRatio));
+ ASSERT_NO_FATAL_FAILURE(computeRatio(kDefaultThreshold, outputDb, calculatedRatio));
ASSERT_GT(calculatedRatio, previousRatio);
previousRatio = calculatedRatio;
}
@@ -870,7 +891,7 @@
fillLimiterConfig(mLimiterConfigList, i, true, kDefaultLinkerGroup, kDefaultAttackTime,
kDefaultReleaseTime, kDefaultRatio, -1, postGainDb);
}
- EXPECT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
+ ASSERT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
if (!isAllParamsValid()) {
continue;
}
@@ -891,7 +912,7 @@
5 /*attack time*/, 5 /*release time*/, 10 /*ratio*/,
-10 /*threshold*/, 5 /*postgain*/);
}
- EXPECT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
+ ASSERT_NO_FATAL_FAILURE(setLimiterParamsAndProcess(mInput, output));
if (!isAllParamsValid()) {
continue;
}
@@ -1150,25 +1171,21 @@
void fillMbcBandConfig(std::vector<DynamicsProcessing::MbcBandConfig>& cfgs,
const TestParamsMbcBandConfig& params) {
- const std::vector<std::pair<int, float>> cutOffFreqs = std::get<MBC_BAND_CUTOFF_FREQ>(params);
- const std::array<float, MBC_ADD_MAX_NUM> additional = std::get<MBC_BAND_ADDITIONAL>(params);
- int bandCount = cutOffFreqs.size();
- cfgs.resize(bandCount);
- for (int i = 0; i < bandCount; i++) {
- cfgs[i] = DynamicsProcessing::MbcBandConfig{
- .channel = std::get<MBC_BAND_CHANNEL>(params),
- .band = cutOffFreqs[i].first,
- .enable = true /*Mbc Band Enable*/,
- .cutoffFrequencyHz = cutOffFreqs[i].second,
- .attackTimeMs = additional[MBC_ADD_ATTACK_TIME],
- .releaseTimeMs = additional[MBC_ADD_RELEASE_TIME],
- .ratio = additional[MBC_ADD_RATIO],
- .thresholdDb = additional[MBC_ADD_THRESHOLD],
- .kneeWidthDb = additional[MBC_ADD_KNEE_WIDTH],
- .noiseGateThresholdDb = additional[MBC_ADD_NOISE_GATE_THRESHOLD],
- .expanderRatio = additional[MBC_ADD_EXPENDER_RATIO],
- .preGainDb = additional[MBC_ADD_PRE_GAIN],
- .postGainDb = additional[MBC_ADD_POST_GAIN]};
+ const auto& cutOffFreqs = std::get<MBC_BAND_CUTOFF_FREQ>(params);
+ const auto& additional = std::get<MBC_BAND_ADDITIONAL>(params);
+
+ cfgs.resize(cutOffFreqs.size());
+
+ for (size_t i = 0; i < cutOffFreqs.size(); ++i) {
+ cfgs[i] = createMbcBandConfig(std::get<MBC_BAND_CHANNEL>(params),
+ cutOffFreqs[i].first, // band channel
+ cutOffFreqs[i].second, // band cutoff frequency
+ additional[MBC_ADD_ATTACK_TIME],
+ additional[MBC_ADD_RELEASE_TIME], additional[MBC_ADD_RATIO],
+ additional[MBC_ADD_THRESHOLD], additional[MBC_ADD_KNEE_WIDTH],
+ additional[MBC_ADD_NOISE_GATE_THRESHOLD],
+ additional[MBC_ADD_EXPENDER_RATIO],
+ additional[MBC_ADD_PRE_GAIN], additional[MBC_ADD_POST_GAIN]);
}
}
@@ -1222,6 +1239,189 @@
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingTestMbcBandConfig);
+class DynamicsProcessingMbcBandConfigDataTest
+ : public ::testing::TestWithParam<std::pair<std::shared_ptr<IFactory>, Descriptor>>,
+ public DynamicsProcessingTestHelper {
+ public:
+ DynamicsProcessingMbcBandConfigDataTest()
+ : DynamicsProcessingTestHelper(GetParam(), AudioChannelLayout::LAYOUT_MONO) {
+ mInput.resize(kFrameCount * mChannelCount);
+ mBinOffsets.resize(mTestFrequencies.size());
+ }
+
+ void SetUp() override {
+ SetUpDynamicsProcessingEffect();
+ SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
+ ASSERT_NO_FATAL_FAILURE(generateSineWave(mTestFrequencies, mInput, 1.0, kSamplingFrequency,
+ mChannelLayout));
+ mInputDb = calculateDb(mInput);
+ }
+
+ void TearDown() override { TearDownDynamicsProcessingEffect(); }
+
+ void setMbcParamsAndProcess(std::vector<float>& output) {
+ for (int i = 0; i < mChannelCount; i++) {
+ mChannelConfig.push_back(DynamicsProcessing::ChannelConfig(i, true));
+ }
+ mEngineConfigPreset.mbcStage.bandCount = mCfgs.size();
+ addEngineConfig(mEngineConfigPreset);
+ addMbcChannelConfig(mChannelConfig);
+ addMbcBandConfigs(mCfgs);
+
+ if (isAllParamsValid()) {
+ ASSERT_NO_FATAL_FAILURE(SetAndGetDynamicsProcessingParameters());
+ ASSERT_NO_FATAL_FAILURE(
+ processAndWriteToOutput(mInput, output, mEffect, &mOpenEffectReturn));
+ }
+ }
+
+ void fillMbcBandConfig(std::vector<DynamicsProcessing::MbcBandConfig>& cfgs, int channelIndex,
+ float threshold, float ratio, float noiseGate, float expanderRatio,
+ int bandIndex, int cutoffFreqHz, float preGain, float postGain) {
+ cfgs.push_back(createMbcBandConfig(channelIndex, bandIndex,
+ static_cast<float>(cutoffFreqHz), kDefaultAttackTime,
+ kDefaultReleaseTime, ratio, threshold, kDefaultKneeWidth,
+ noiseGate, expanderRatio, preGain, postGain));
+ }
+
+ void getMagnitudeValue(const std::vector<float>& output, std::vector<float>& bufferMag) {
+ std::vector<float> subOutput(output.begin() + kStartIndex, output.end());
+ EXPECT_NO_FATAL_FAILURE(
+ calculateMagnitudeMono(bufferMag, subOutput, mBinOffsets, kNPointFFT));
+ }
+
+ void validateOutput(const std::vector<float>& output, float threshold, float ratio,
+ size_t bandIndex) {
+ std::vector<float> outputMag(mBinOffsets.size());
+ EXPECT_NO_FATAL_FAILURE(getMagnitudeValue(output, outputMag));
+ if (threshold >= mInputDb || ratio == 1) {
+ std::vector<float> inputMag(mBinOffsets.size());
+ EXPECT_NO_FATAL_FAILURE(getMagnitudeValue(mInput, inputMag));
+ for (size_t i = 0; i < inputMag.size(); i++) {
+ EXPECT_NEAR(calculateDb({inputMag[i] / mNormalizingFactor}),
+ calculateDb({outputMag[i] / mNormalizingFactor}), kToleranceDb);
+ }
+ } else {
+ // Current band's magnitude is less than the other band's magnitude
+ EXPECT_LT(outputMag[bandIndex], outputMag[bandIndex ^ 1]);
+ }
+ }
+
+ void analyseMultiBandOutput(float threshold, float ratio) {
+ std::vector<float> output(mInput.size());
+ roundToFreqCenteredToFftBin(mTestFrequencies, mBinOffsets, kBinWidth);
+ std::vector<int> cutoffFreqHz = {200 /*0th band cutoff*/, 2000 /*1st band cutoff*/};
+ // Set MBC values for two bands
+ for (size_t i = 0; i < cutoffFreqHz.size(); i++) {
+ for (int channelIndex = 0; channelIndex < mChannelCount; channelIndex++) {
+ fillMbcBandConfig(mCfgs, channelIndex, threshold, ratio, kDefaultNoiseGateDb,
+ kDefaultExpanderRatio, i, cutoffFreqHz[i], kDefaultPreGainDb,
+ kDefaultPostGainDb);
+ fillMbcBandConfig(mCfgs, channelIndex, kDefaultThresholdDb, kDefaultRatio,
+ kDefaultNoiseGateDb, kDefaultExpanderRatio, i ^ 1,
+ cutoffFreqHz[i ^ 1], kDefaultPreGainDb, kDefaultPostGainDb);
+ }
+ ASSERT_NO_FATAL_FAILURE(setMbcParamsAndProcess(output));
+
+ if (isAllParamsValid()) {
+ ASSERT_NO_FATAL_FAILURE(validateOutput(output, threshold, ratio, i));
+ }
+ cleanUpMbcConfig();
+ }
+ }
+
+ void cleanUpMbcConfig() {
+ CleanUp();
+ mCfgs.clear();
+ mChannelConfig.clear();
+ }
+
+ static constexpr int kNPointFFT = 1024;
+ static constexpr float kToleranceDb = 0.5;
+ static constexpr float kDefaultPostGainDb = 0;
+ static constexpr float kDefaultPreGainDb = 0;
+ static constexpr float kDefaultAttackTime = 0;
+ static constexpr float kDefaultReleaseTime = 0;
+ static constexpr float kDefaultKneeWidth = 0;
+ static constexpr float kDefaultThresholdDb = 0;
+ static constexpr float kDefaultNoiseGateDb = -10;
+ static constexpr float kDefaultExpanderRatio = 1;
+ static constexpr float kDefaultRatio = 1;
+ static constexpr float kBinWidth = (float)kSamplingFrequency / kNPointFFT;
+ // Full scale sine wave with 100 Hz and 1000 Hz frequency is -6 dB
+ static constexpr float kFullScaleDb = -6;
+ std::vector<int> mTestFrequencies = {100, 1000};
+ // Calculating normalizing factor by dividing the number of FFT points by half and the number of
+ // test frequencies. The normalization accounts for the FFT splitting the signal into positive
+ // and negative frequencies. Additionally, during multi-tone input generation, sample values are
+ // normalized to the range [-1, 1] by dividing them by the number of test frequencies.
+ float mNormalizingFactor = (kNPointFFT / (2 * mTestFrequencies.size()));
+ std::vector<DynamicsProcessing::MbcBandConfig> mCfgs;
+ std::vector<DynamicsProcessing::ChannelConfig> mChannelConfig;
+ std::vector<int> mBinOffsets;
+ std::vector<float> mInput;
+ float mInputDb;
+};
+
+TEST_P(DynamicsProcessingMbcBandConfigDataTest, IncreasingThreshold) {
+ float ratio = 20;
+ std::vector<float> thresholdValues = {-200, -100, 0, 100, 200};
+
+ for (float threshold : thresholdValues) {
+ cleanUpMbcConfig();
+ ASSERT_NO_FATAL_FAILURE(analyseMultiBandOutput(threshold, ratio));
+ }
+}
+
+TEST_P(DynamicsProcessingMbcBandConfigDataTest, IncreasingRatio) {
+ float threshold = -20;
+ std::vector<float> ratioValues = {1, 10, 20, 30, 40, 50};
+
+ for (float ratio : ratioValues) {
+ cleanUpMbcConfig();
+ ASSERT_NO_FATAL_FAILURE(analyseMultiBandOutput(threshold, ratio));
+ }
+}
+
+TEST_P(DynamicsProcessingMbcBandConfigDataTest, IncreasingPostGain) {
+ std::vector<float> postGainDbValues = {-55, -30, 0, 30, 55};
+ std::vector<float> output(mInput.size());
+ for (float postGainDb : postGainDbValues) {
+ float amplitude = 1.0 / (pow(10, postGainDb / 20));
+ ASSERT_NO_FATAL_FAILURE(generateSineWave(mTestFrequencies, mInput, amplitude,
+ kSamplingFrequency, mChannelLayout));
+ mInputDb = calculateDb(mInput);
+ EXPECT_NEAR(mInputDb, kFullScaleDb - postGainDb, kToleranceDb);
+ cleanUpMbcConfig();
+ for (int i = 0; i < mChannelCount; i++) {
+ fillMbcBandConfig(mCfgs, i, kDefaultThresholdDb, kDefaultRatio, kDefaultNoiseGateDb,
+ kDefaultExpanderRatio, 0 /*band index*/, 2000 /*cutoffFrequency*/,
+ kDefaultPreGainDb, postGainDb);
+ }
+ EXPECT_NO_FATAL_FAILURE(setMbcParamsAndProcess(output));
+ if (!isAllParamsValid()) {
+ continue;
+ }
+ float outputDb = calculateDb(output, kStartIndex);
+ EXPECT_NEAR(outputDb, mInputDb + postGainDb, kToleranceDb)
+ << "PostGain: " << postGainDb << ", OutputDb: " << outputDb;
+ }
+}
+
+INSTANTIATE_TEST_SUITE_P(DynamicsProcessingTest, DynamicsProcessingMbcBandConfigDataTest,
+ testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
+ IFactory::descriptor, getEffectTypeUuidDynamicsProcessing())),
+ [](const auto& info) {
+ auto descriptor = info.param;
+ std::string name = getPrefix(descriptor.second);
+ std::replace_if(
+ name.begin(), name.end(),
+ [](const char c) { return !std::isalnum(c); }, '_');
+ return name;
+ });
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DynamicsProcessingMbcBandConfigDataTest);
+
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
::testing::UnitTest::GetInstance()->listeners().Append(new TestExecutionTracer());
diff --git a/audio/effect/all-versions/vts/functional/VtsHalAudioEffectTargetTest.cpp b/audio/effect/all-versions/vts/functional/VtsHalAudioEffectTargetTest.cpp
index ff84f9d..d093ffe 100644
--- a/audio/effect/all-versions/vts/functional/VtsHalAudioEffectTargetTest.cpp
+++ b/audio/effect/all-versions/vts/functional/VtsHalAudioEffectTargetTest.cpp
@@ -39,6 +39,7 @@
#include <gtest/gtest.h>
#include <hidl/GtestPrinter.h>
#include <hidl/ServiceManagement.h>
+#include <hwbinder/IPCThreadState.h>
using ::android::sp;
using ::android::hardware::hidl_handle;
@@ -205,6 +206,11 @@
void TearDown() override {
effect.clear();
effectsFactory.clear();
+ // Ensure all pending binder transactions are completed before proceeding.
+ android::hardware::IPCThreadState::self()->flushCommands();
+ // Add a delay to allow the binder destruction to propagate and ensure
+ // the remote objects are properly cleaned up.
+ usleep(100 * 1000);
}
protected:
diff --git a/audio/policy/1.0/vts/functional/Android.bp b/audio/policy/1.0/vts/functional/Android.bp
index c2335e4..ccdd771 100644
--- a/audio/policy/1.0/vts/functional/Android.bp
+++ b/audio/policy/1.0/vts/functional/Android.bp
@@ -10,6 +10,11 @@
cc_test {
name: "VtsHalAudioPolicyV1_0TargetTest",
+ defaults: [
+ "latest_android_hardware_audio_common_ndk_static",
+ "latest_android_hardware_audio_core_ndk_static",
+ "latest_android_media_audio_common_types_ndk_static",
+ ],
srcs: [
"ValidateEngineConfiguration.cpp",
],
@@ -17,6 +22,7 @@
"libxml2",
"liblog",
"libmedia_helper",
+ "libaidlvintf_gtest_helper",
"libaudiopolicycapengine_config",
"libaudiopolicycomponents",
"libaudiopolicyengine_config",
@@ -33,6 +39,8 @@
],
shared_libs: [
"libaudiofoundation",
+ "libbinder_ndk",
+ "libvintf",
],
// Use test_config for vts suite.
// TODO(b/146104851): Add auto-gen rules and remove it.
diff --git a/audio/policy/1.0/vts/functional/ValidateEngineConfiguration.cpp b/audio/policy/1.0/vts/functional/ValidateEngineConfiguration.cpp
index 5741fa9..0472174 100644
--- a/audio/policy/1.0/vts/functional/ValidateEngineConfiguration.cpp
+++ b/audio/policy/1.0/vts/functional/ValidateEngineConfiguration.cpp
@@ -16,6 +16,9 @@
#include <EngineConfig.h>
#include <ParameterManagerWrapper.h>
+#include <aidl/Vintf.h>
+#include <aidl/android/hardware/audio/core/IConfig.h>
+#include <android/binder_manager.h>
#include <gtest/gtest.h>
@@ -34,12 +37,30 @@
static const std::string configurableConfig =
"parameter-framework/ParameterFrameworkConfigurationPolicy.xml";
+static bool deviceUsesAidlHal() {
+ using aidl::android::hardware::audio::core::IConfig;
+
+ const auto configName = android::getAidlHalInstanceNames(IConfig::descriptor);
+ if (!configName.empty()) {
+ ndk::SpAIBinder binder =
+ ndk::SpAIBinder(AServiceManager_waitForService(configName[0].c_str()));
+ if (binder != nullptr) {
+ std::shared_ptr<IConfig> configItf = IConfig::fromBinder(binder);
+ return configItf != nullptr;
+ }
+ }
+ return false;
+}
+
/**
* @brief TEST to ensure the audio policy engine configuration file is validating schemas.
* Note: this configuration file is not mandatory, an hardcoded fallback is provided, so
* it does not fail if not found.
*/
TEST(ValidateConfiguration, audioPolicyEngineConfiguration) {
+ if (deviceUsesAidlHal()) {
+ GTEST_SKIP() << "Device uses AIDL HAL, n-op.";
+ }
RecordProperty("description",
"Verify that the audio policy engine configuration file "
"is valid according to the schemas");
@@ -48,11 +69,12 @@
}
/**
- * @brief deviceUsesConfigurableEngine checks if the configuration file for
- * the engine presents on the device AND
- * for the configurable engine (aka Parameter-Framework top configuration file) presents.
+ * @brief deviceUsesHidlConfigurableEngine checks if there is no AIDL HAL,
+ * AND the configuration file for the engine presents on the device
+ * AND for the configurable engine (aka Parameter-Framework top configuration file) presents.
*/
-static bool deviceUsesConfigurableEngine() {
+static bool deviceUsesHidlConfigurableEngine() {
+ if (deviceUsesAidlHal()) return false;
return android::hardware::audio::common::test::utility::validateXmlMultipleLocations<true>(
"", "", "", config.c_str(), android::audio_get_configuration_paths(),
schema.c_str()) &&
@@ -62,8 +84,8 @@
}
TEST(ValidateConfiguration, audioPolicyEngineConfigurable) {
- if (!deviceUsesConfigurableEngine()) {
- GTEST_SKIP() << "Device using legacy engine without parameter-framework, n-op.";
+ if (!deviceUsesHidlConfigurableEngine()) {
+ GTEST_SKIP() << "Device uses AIDL HAL or legacy engine without parameter-framework, n-op.";
}
RecordProperty("description",
"Verify that the audio policy engine PFW configuration files "
@@ -78,7 +100,8 @@
ASSERT_EQ(result.nbSkippedElement, 0) << "skipped %zu elements " << result.nbSkippedElement;
std::unique_ptr<android::audio_policy::ParameterManagerWrapper> policyParameterMgr(
- new android::audio_policy::ParameterManagerWrapper(validateSchema, schemasUri));
+ new android::audio_policy::ParameterManagerWrapper(
+ true /*useLegacyConfigurationFile*/, validateSchema, schemasUri));
ASSERT_NE(nullptr, policyParameterMgr) << "failed to create Audio Policy Engine PFW";
// Load the criterion types and criteria
diff --git a/automotive/can/1.0/default/libnetdevice/can.cpp b/automotive/can/1.0/default/libnetdevice/can.cpp
index 9cf0253..32d899b 100644
--- a/automotive/can/1.0/default/libnetdevice/can.cpp
+++ b/automotive/can/1.0/default/libnetdevice/can.cpp
@@ -80,7 +80,7 @@
{
auto linkinfo = req.addNested(IFLA_LINKINFO);
- req.addBuffer(IFLA_INFO_KIND, "can");
+ req.add(IFLA_INFO_KIND, "can");
{
auto infodata = req.addNested(IFLA_INFO_DATA);
/* For CAN FD, it would require to add IFLA_CAN_DATA_BITTIMING
diff --git a/automotive/can/1.0/default/libnetdevice/include/libnetdevice/libnetdevice.h b/automotive/can/1.0/default/libnetdevice/include/libnetdevice/libnetdevice.h
index 15ff491..04d1e0a 100644
--- a/automotive/can/1.0/default/libnetdevice/include/libnetdevice/libnetdevice.h
+++ b/automotive/can/1.0/default/libnetdevice/include/libnetdevice/libnetdevice.h
@@ -161,6 +161,15 @@
bool del(std::string_view dev);
/**
+ * Rename interface.
+ *
+ * \param from the name of the interface to rename from
+ * \param to the name of the interface to rename to
+ * \return true in case of success, false otherwise
+ */
+bool rename(std::string_view from, std::string_view to);
+
+/**
* Fetches interface's hardware address.
*
* \param ifname Interface name
diff --git a/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp b/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp
index 9bb1a57..f149c45 100644
--- a/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp
+++ b/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp
@@ -126,6 +126,10 @@
req->ifa_prefixlen = prefixlen;
req->ifa_flags = IFA_F_SECONDARY;
req->ifa_index = nametoindex(ifname);
+ if (req->ifa_index == 0) {
+ LOG(ERROR) << "Interface " << ifname << " doesn't exist";
+ return false;
+ }
auto addrn = inetAddr(addr);
req.add(IFLA_ADDRESS, addrn);
@@ -141,7 +145,7 @@
{
auto linkinfo = req.addNested(IFLA_LINKINFO);
- req.addBuffer(IFLA_INFO_KIND, type);
+ req.add(IFLA_INFO_KIND, type);
}
nl::Socket sock(NETLINK_ROUTE);
@@ -156,6 +160,20 @@
return sock.send(req) && sock.receiveAck(req);
}
+bool rename(std::string_view from, std::string_view to) {
+ nl::MessageFactory<ifinfomsg> req(RTM_SETLINK);
+ req.add(IFLA_IFNAME, to);
+
+ req->ifi_index = nametoindex(from);
+ if (req->ifi_index == 0) {
+ LOG(ERROR) << "Interface " << from << " doesn't exist";
+ return false;
+ }
+
+ nl::Socket sock(NETLINK_ROUTE);
+ return sock.send(req) && sock.receiveAck(req);
+}
+
std::optional<hwaddr_t> getHwAddr(std::string_view ifname) {
auto ifr = ifreqs::fromName(ifname);
if (!ifreqs::send(SIOCGIFHWADDR, ifr)) return std::nullopt;
diff --git a/automotive/can/1.0/default/libnetdevice/vlan.cpp b/automotive/can/1.0/default/libnetdevice/vlan.cpp
index e5b5a61..570545e 100644
--- a/automotive/can/1.0/default/libnetdevice/vlan.cpp
+++ b/automotive/can/1.0/default/libnetdevice/vlan.cpp
@@ -39,7 +39,7 @@
{
auto linkinfo = req.addNested(IFLA_LINKINFO);
- req.addBuffer(IFLA_INFO_KIND, "vlan");
+ req.add(IFLA_INFO_KIND, "vlan");
{
auto linkinfo = req.addNested(IFLA_INFO_DATA);
diff --git a/automotive/can/1.0/default/libnl++/include/libnl++/MessageFactory.h b/automotive/can/1.0/default/libnl++/include/libnl++/MessageFactory.h
index f65f055..058b2cb 100644
--- a/automotive/can/1.0/default/libnl++/include/libnl++/MessageFactory.h
+++ b/automotive/can/1.0/default/libnl++/include/libnl++/MessageFactory.h
@@ -23,6 +23,7 @@
#include <linux/netlink.h>
#include <string>
+#include <type_traits>
namespace android::nl {
@@ -109,25 +110,21 @@
*/
template <class A>
void add(nlattrtype_t type, const A& attr) {
- addInternal(type, &attr, sizeof(attr));
+ static_assert(std::is_pod_v<A>, "POD type required");
+ add(type, &attr, sizeof(attr));
}
- // It will always send the last null character, otherwise use addBuffer
- // variant instead
template <>
void add(nlattrtype_t type, const std::string& s) {
- addInternal(type, s.c_str(), s.size() + 1);
+ add(type, s.c_str(), s.size());
}
- void addBuffer(nlattrtype_t type, const std::string_view& s) {
- addInternal(type, s.data(), s.size());
- }
+ void add(nlattrtype_t type, std::string_view s) { add(type, s.data(), s.size()); }
/** Guard class to frame nested attributes. \see addNested(nlattrtype_t). */
class [[nodiscard]] NestedGuard {
public:
- NestedGuard(MessageFactory& req, nlattrtype_t type)
- : mReq(req), mAttr(req.addInternal(type)) {}
+ NestedGuard(MessageFactory& req, nlattrtype_t type) : mReq(req), mAttr(req.add(type)) {}
~NestedGuard() { closeNested(&mReq.mMessage.header, mAttr); }
private:
@@ -148,7 +145,7 @@
* MessageFactory<ifinfomsg> req(RTM_NEWLINK, NLM_F_REQUEST);
* {
* auto linkinfo = req.addNested(IFLA_LINKINFO);
- * req.addBuffer(IFLA_INFO_KIND, "can");
+ * req.add(IFLA_INFO_KIND, "can");
* {
* auto infodata = req.addNested(IFLA_INFO_DATA);
* req.add(IFLA_CAN_BITTIMING, bitTimingStruct);
@@ -164,7 +161,7 @@
Message mMessage = {};
bool mIsGood = true;
- nlattr* addInternal(nlattrtype_t type, const void* data = nullptr, size_t len = 0) {
+ nlattr* add(nlattrtype_t type, const void* data = nullptr, size_t len = 0) {
if (!mIsGood) return nullptr;
auto attr = MessageFactoryBase::add(&mMessage.header, sizeof(mMessage), type, data, len);
if (attr == nullptr) mIsGood = false;
diff --git a/automotive/vehicle/2.0/default/tests/RecurrentTimer_test.cpp b/automotive/vehicle/2.0/default/tests/RecurrentTimer_test.cpp
index 2e59dbf..ade6f2d 100644
--- a/automotive/vehicle/2.0/default/tests/RecurrentTimer_test.cpp
+++ b/automotive/vehicle/2.0/default/tests/RecurrentTimer_test.cpp
@@ -39,37 +39,37 @@
counterRef.get()++;
});
- timer.registerRecurrentEvent(milliseconds(1), 0xdead);
- std::this_thread::sleep_for(milliseconds(100));
- // This test is unstable, so set the tolerance to 50.
- ASSERT_EQ_WITH_TOLERANCE(100, counter.load(), 50);
+ timer.registerRecurrentEvent(milliseconds(100), 0xdead);
+ std::this_thread::sleep_for(milliseconds(1000));
+ // This test is unstable, so set the tolerance to 5.
+ ASSERT_EQ_WITH_TOLERANCE(10, counter.load(), 5);
}
TEST(RecurrentTimerTest, multipleIntervals) {
- std::atomic<int64_t> counter1ms { 0L };
- std::atomic<int64_t> counter5ms { 0L };
- auto counter1msRef = std::ref(counter1ms);
- auto counter5msRef = std::ref(counter5ms);
+ std::atomic<int64_t> counter100ms { 0L };
+ std::atomic<int64_t> counter50ms { 0L };
+ auto counter100msRef = std::ref(counter100ms);
+ auto counter50msRef = std::ref(counter50ms);
RecurrentTimer timer(
- [&counter1msRef, &counter5msRef](const std::vector<int32_t>& cookies) {
+ [&counter100msRef, &counter50msRef](const std::vector<int32_t>& cookies) {
for (int32_t cookie : cookies) {
if (cookie == 0xdead) {
- counter1msRef.get()++;
+ counter100msRef.get()++;
} else if (cookie == 0xbeef) {
- counter5msRef.get()++;
+ counter50msRef.get()++;
} else {
FAIL();
}
}
});
- timer.registerRecurrentEvent(milliseconds(1), 0xdead);
- timer.registerRecurrentEvent(milliseconds(5), 0xbeef);
+ timer.registerRecurrentEvent(milliseconds(100), 0xdead);
+ timer.registerRecurrentEvent(milliseconds(50), 0xbeef);
- std::this_thread::sleep_for(milliseconds(100));
- // This test is unstable, so set the tolerance to 50.
- ASSERT_EQ_WITH_TOLERANCE(100, counter1ms.load(), 50);
- ASSERT_EQ_WITH_TOLERANCE(20, counter5ms.load(), 10);
+ std::this_thread::sleep_for(milliseconds(1000));
+ // This test is unstable, so set the tolerance to 5.
+ ASSERT_EQ_WITH_TOLERANCE(10, counter100ms.load(), 5);
+ ASSERT_EQ_WITH_TOLERANCE(20, counter50ms.load(), 10);
}
} // anonymous namespace
diff --git a/automotive/vehicle/aidl/aidl_test/Android.bp b/automotive/vehicle/aidl/aidl_test/Android.bp
index a87af02..d3ce307 100644
--- a/automotive/vehicle/aidl/aidl_test/Android.bp
+++ b/automotive/vehicle/aidl/aidl_test/Android.bp
@@ -43,6 +43,10 @@
team: "trendy_team_aaos_carframework_triage",
srcs: ["VehiclePropertyAnnotationCppTest.cpp"],
header_libs: ["IVehicleGeneratedHeaders-V4"],
+ static_libs: [
+ "libgtest",
+ "libgmock",
+ ],
defaults: ["VehicleHalInterfaceDefaults"],
test_suites: ["general-tests"],
}
diff --git a/automotive/vehicle/aidl/aidl_test/VehiclePropertyAnnotationCppTest.cpp b/automotive/vehicle/aidl/aidl_test/VehiclePropertyAnnotationCppTest.cpp
index a4bbbe8..2aad2b6 100644
--- a/automotive/vehicle/aidl/aidl_test/VehiclePropertyAnnotationCppTest.cpp
+++ b/automotive/vehicle/aidl/aidl_test/VehiclePropertyAnnotationCppTest.cpp
@@ -15,16 +15,20 @@
*/
#include <AccessForVehicleProperty.h>
+#include <AnnotationsForVehicleProperty.h>
#include <ChangeModeForVehicleProperty.h>
#include <aidl/android/hardware/automotive/vehicle/VehicleProperty.h>
+#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <unordered_set>
namespace aidl_vehicle = ::aidl::android::hardware::automotive::vehicle;
using aidl_vehicle::AccessForVehicleProperty;
+using aidl_vehicle::AnnotationsForVehicleProperty;
using aidl_vehicle::ChangeModeForVehicleProperty;
using aidl_vehicle::VehicleProperty;
+using testing::IsEmpty;
namespace {
template<class T>
@@ -54,3 +58,11 @@
<< "Outdated annotation-generated AIDL files. Please run "
<< "generate_annotation_enums.py to update.";
}
+
+TEST(VehiclePropertyAnnotationCppTest, testAnnotations) {
+ for (const auto& [propertyId, annotations] : AnnotationsForVehicleProperty) {
+ ASSERT_THAT(annotations, Not(IsEmpty()))
+ << "annotations set for property: " << aidl_vehicle::toString(propertyId)
+ << " must not be empty";
+ }
+}
diff --git a/automotive/vehicle/aidl/aidl_test/VehiclePropertyAnnotationJavaTest.java b/automotive/vehicle/aidl/aidl_test/VehiclePropertyAnnotationJavaTest.java
index ef49299..8aab7ad 100644
--- a/automotive/vehicle/aidl/aidl_test/VehiclePropertyAnnotationJavaTest.java
+++ b/automotive/vehicle/aidl/aidl_test/VehiclePropertyAnnotationJavaTest.java
@@ -57,4 +57,15 @@
.that(doesAnnotationMapContainsAllProps(AccessForVehicleProperty.values))
.isTrue();
}
+
+ @Test
+ @SmallTest
+ public void testAnnotations() {
+ for (int propertyId : AnnotationsForVehicleProperty.values.keySet()) {
+ assertWithMessage("annotations set for property: "
+ + VehicleProperty.$.toString(propertyId) + " must not be empty")
+ .that(AnnotationsForVehicleProperty.values.get(propertyId))
+ .isNotEmpty();
+ }
+ }
}
\ No newline at end of file
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 da73b03..2867aa2 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
@@ -153,7 +153,7 @@
"VehicleOilLevel"
],
"data_enum": "VehicleOilLevel",
- "description": "Engine oil level"
+ "description": "Engine oil level\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleOilLevel are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Temperature of engine oil",
@@ -218,7 +218,7 @@
{
"name": "Tire pressure",
"value": 392168201,
- "description": "Tire pressure\nEach tire is identified by its areaConfig.areaId config and its minFloatValue\/maxFloatValue are used to store OEM recommended pressure range.\nThe minFloatValue and maxFloatValue in VehicleAreaConfig must be defined.\nThe minFloatValue in the areaConfig data represents the lower bound of the recommended tire pressure.\nThe maxFloatValue in the areaConfig data represents the upper bound of the recommended tire pressure.\nFor example:\nThe following areaConfig indicates the recommended tire pressure of the left_front tire is from 200.0 KILOPASCAL to 240.0 KILOPASCAL. .areaConfigs = { VehicleAreaConfig { .areaId = VehicleAreaWheel::LEFT_FRONT, .minFloatValue = 200.0, .maxFloatValue = 240.0, } }\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minFloatValue. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxFloatValue. For example, if the recommended tire pressure of left_front tire is from 200.0 KILOPASCAL to 240.0 KILOPASCAL, {@code getMinMaxSupportedValue} for [propId=TIRE_PRESSURE, areaId=VehicleAreaWheel::LEFT_FRONT] must return a {@code MinMaxSupportedValueResult} with OK status, 200.0 as minSupportedValue, 240.0 as maxSupportedValue. At boot, minFloatValue is equal to minSupportedValue, maxFloatValue is equal to maxSupportedValue."
+ "description": "Tire pressure\nEach tire is identified by its areaConfig.areaId config and its minFloatValue\/maxFloatValue are used to store OEM recommended pressure range.\nThe minFloatValue and maxFloatValue in VehicleAreaConfig must be defined.\nThe minFloatValue in the areaConfig data represents the lower bound of the recommended tire pressure.\nThe maxFloatValue in the areaConfig data represents the upper bound of the recommended tire pressure.\nFor example:\nThe following areaConfig indicates the recommended tire pressure of the left_front tire is from 200.0 KILOPASCAL to 240.0 KILOPASCAL. .areaConfigs = { VehicleAreaConfig { .areaId = VehicleAreaWheel::LEFT_FRONT, .minFloatValue = 200.0, .maxFloatValue = 240.0, } }\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minFloatValue. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxFloatValue. For example, if the recommended tire pressure of left_front tire is from 200.0 KILOPASCAL to 240.0 KILOPASCAL, {@code getMinMaxSupportedValue} for [propId=TIRE_PRESSURE, areaId=VehicleAreaWheel::LEFT_FRONT] must return a {@code MinMaxSupportedValueResult} with OK status, 200.0 as minSupportedValue, 240.0 as maxSupportedValue. At boot, minFloatValue is equal to minSupportedValue, maxFloatValue is equal to maxSupportedValue."
},
{
"name": "Critically low tire pressure",
@@ -248,7 +248,7 @@
{
"name": "VEHICLE_PASSIVE_SUSPENSION_HEIGHT",
"value": 390071059,
- "description": "Vehicle Passive Suspension Height in mm.\nThis property must communicate the real-time suspension displacement of the vehicle relative to its neutral position, given in mm. In other words, the displacement of the suspension at any given point in time relative to the suspension's position when the vehicle is on a flat surface with no passengers or cargo. When the suspension is compressed in comparison to the neutral position, the value should be negative. When the suspension is decompressed in comparison to the neutral position, the value should be positive.\nExamples for further clarity: 1) Suppose the user is driving on a smooth flat surface, and all wheels are currently compressed by 2 cm in comparison to the default suspension height. In this scenario, this property must be set to -20 for all wheels. 2) Suppose the user drives over a pothole. While the front left wheel is over the pothole, it's decompressed by 3 cm in comparison to the rest of the wheels, or 1 cm in comparison to the default suspension height. All the others are still compressed by 2 cm. In this scenario, this property must be set to -20 for all wheels except for the front left, which must be set to 10.\nHasSupportedValueInfo.hasMinSupportedValue and HasSupportedValueInfo.hasMaxSupportedValue must be true for all areas.\nMinMaxSupportedValueResult.minSupportedValue represents the lower bound of the suspension height for the wheel at the specified area ID.\nMinMaxSupportedValueResult.maxSupportedValue represents the upper bound of the suspension height for the wheel at the specified area ID."
+ "description": "Vehicle Passive Suspension Height in mm.\nThis property must communicate the real-time suspension displacement of the vehicle relative to its neutral position, given in mm. In other words, the displacement of the suspension at any given point in time relative to the suspension's position when the vehicle is on a flat surface with no passengers or cargo. When the suspension is compressed in comparison to the neutral position, the value should be negative. When the suspension is decompressed in comparison to the neutral position, the value should be positive.\nExamples for further clarity: 1) Suppose the user is driving on a smooth flat surface, and all wheels are currently compressed by 2 cm in comparison to the default suspension height. In this scenario, this property must be set to -20 for all wheels. 2) Suppose the user drives over a pothole. While the front left wheel is over the pothole, it's decompressed by 3 cm in comparison to the rest of the wheels, or 1 cm in comparison to the default suspension height. All the others are still compressed by 2 cm. In this scenario, this property must be set to -20 for all wheels except for the front left, which must be set to 10.\n{@code minInt32Value} and {@code maxInt32Value} in {@code VehicleAreaConfig} must be specified for all supported area IDs.\n{@code minInt32Value} represents the lower bound of the suspension height for the wheel at the specified area ID.\n{@code maxInt32Value} represents the upper bound of the suspension height for the wheel at the specified area ID.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the specified area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue."
},
{
"name": "ENGINE_IDLE_AUTO_STOP_ENABLED",
@@ -262,7 +262,7 @@
"ImpactSensorLocation"
],
"data_enum": "ImpactSensorLocation",
- "description": "Impact detected.\nBit flag property to relay information on whether an impact has occurred on a particular side of the vehicle as described through the ImpactSensorLocation enum. As a bit flag property, this property can be set to multiple ORed together values of the enum when necessary.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all bit flags of ImpactSensorLocation are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code getSupportedValuesList} must return a {@code SupportedValuesListResult} that contains supported values unless all bit flags of ImpactSensorLocation are supported. At boot, supportedEnumValues is equal to the supported values list."
+ "description": "Impact detected.\nBit flag property to relay information on whether an impact has occurred on a particular side of the vehicle as described through the ImpactSensorLocation enum. As a bit flag property, this property can be set to multiple ORed together values of the enum when necessary.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all bit flags of ImpactSensorLocation are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Vehicle horn engaged.",
@@ -276,7 +276,7 @@
"VehicleGear"
],
"data_enum": "VehicleGear",
- "description": "Currently selected gear\nThis is the gear selected by the user.\nValues in the config array must represent the list of supported gears for this vehicle at boot time. For example, config array for an automatic transmission must contain {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_PARK, GEAR_DRIVE, GEAR_1, GEAR_2,...} and for manual transmission the list must contain {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_1, GEAR_2,...}\nIn the case of an automatic transmission vehicle that allows the driver to select specific gears on demand (i.e. \"manual mode\"), GEAR_SELECTION's value must be set to the specific gear selected by the driver instead of simply GEAR_DRIVE.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesList} for [GEAR_SELECTION, areaId=0] must return a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}. The supportedValues must represent the list of supported gears for this vehicle. For example, for an automatic transmission, the list can be {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_PARK, GEAR_DRIVE, GEAR_1, GEAR_2,...} and for manual transmission it can be {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_1, GEAR_2,...}. In the case of an automatic transmission vehicle that allows the driver to select specific gears on demand (i.e. \"manual mode\"), the GEAR_SELECTION property value must be set to the specific gear selected by the driver instead of simply GEAR_DRIVE. At boot, the config array's values are equal to the supported values list."
+ "description": "Currently selected gear\nThis is the gear selected by the user.\nValues in the config array must represent the list of supported gears for this vehicle at boot time. For example, config array for an automatic transmission must contain {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_PARK, GEAR_DRIVE, GEAR_1, GEAR_2,...} and for manual transmission the list must contain {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_1, GEAR_2,...}\nIn the case of an automatic transmission vehicle that allows the driver to select specific gears on demand (i.e. \"manual mode\"), GEAR_SELECTION's value must be set to the specific gear selected by the driver instead of simply GEAR_DRIVE.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesList} for [GEAR_SELECTION, areaId=0] must return a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}. The supportedValues must represent the list of supported gears for this vehicle. For example, for an automatic transmission, the list can be {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_PARK, GEAR_DRIVE, GEAR_1, GEAR_2,...} and for manual transmission it can be {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_1, GEAR_2,...}. In the case of an automatic transmission vehicle that allows the driver to select specific gears on demand (i.e. \"manual mode\"), the GEAR_SELECTION property value must be set to the specific gear selected by the driver instead of simply GEAR_DRIVE. At boot, the config array's values are equal to the supported values list."
},
{
"name": "CURRENT_GEAR",
@@ -285,7 +285,7 @@
"VehicleGear"
],
"data_enum": "VehicleGear",
- "description": "Current gear. In non-manual case, selected gear may not match the current gear. For example, if the selected gear is GEAR_DRIVE, the current gear will be one of GEAR_1, GEAR_2 etc, which reflects the actual gear the transmission is currently running in.\nValues in the config array must represent the list of supported gears for this vehicle at boot time. For example, config array for an automatic transmission must contain {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_PARK, GEAR_1, GEAR_2,...} and for manual transmission the list must contain {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_1, GEAR_2,...}. This list need not be the same as that of the supported gears reported in GEAR_SELECTION.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesList} for [GEAR_SELECTION, areaId=0] must return a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}. The supported values list must represent the list of supported gears for this vehicle. For example, for an automatic transmission, this list can be {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_PARK, GEAR_1, GEAR_2,...} and for manual transmission the list can be {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_1, GEAR_2,...}. This list need not be the same as that of the supported gears reported in GEAR_SELECTION. At boot, the config array's values are equal to the supported values list."
+ "description": "Current gear. In non-manual case, selected gear may not match the current gear. For example, if the selected gear is GEAR_DRIVE, the current gear will be one of GEAR_1, GEAR_2 etc, which reflects the actual gear the transmission is currently running in.\nValues in the config array must represent the list of supported gears for this vehicle at boot time. For example, config array for an automatic transmission must contain {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_PARK, GEAR_1, GEAR_2,...} and for manual transmission the list must contain {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_1, GEAR_2,...}. This list need not be the same as that of the supported gears reported in GEAR_SELECTION.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesList} for [GEAR_SELECTION, areaId=0] must return a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}. The supported values list must represent the list of supported gears for this vehicle. For example, for an automatic transmission, this list can be {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_PARK, GEAR_1, GEAR_2,...} and for manual transmission the list can be {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_1, GEAR_2,...}. This list need not be the same as that of the supported gears reported in GEAR_SELECTION. At boot, the config array's values are equal to the supported values list."
},
{
"name": "Parking brake state.",
@@ -300,7 +300,7 @@
{
"name": "EV_BRAKE_REGENERATION_LEVEL",
"value": 289408012,
- "description": "Regenerative braking level of a electronic vehicle\nThe minInt32Value and maxInt32Value in VehicleAreaConfig must be defined. All values between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the setting for no regenerative braking, must be 0.\nThe maxInt32Value indicates the setting for the maximum amount of energy regenerated from braking.\nAll values between min and max supported value must be supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for global area ID(0) {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is a more granular form of EV_REGENERATIVE_BRAKING_STATE. It allows the user to set a more specific level of regenerative braking if the states in EvRegenerativeBrakingState are not granular enough for the OEM.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Regenerative braking level of a electronic vehicle\nThe minInt32Value and maxInt32Value in VehicleAreaConfig must be defined. All values between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the setting for no regenerative braking, must be 0.\nThe maxInt32Value indicates the setting for the maximum amount of energy regenerated from braking.\nAll values between min and max supported value must be supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for global area ID(0) {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is a more granular form of EV_REGENERATIVE_BRAKING_STATE. It allows the user to set a more specific level of regenerative braking if the states in EvRegenerativeBrakingState are not granular enough for the OEM.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Warning for fuel low level.",
@@ -328,7 +328,7 @@
"VehicleIgnitionState"
],
"data_enum": "VehicleIgnitionState",
- "description": "Represents ignition state"
+ "description": "Represents ignition state\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleIgnitionState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "ABS is active",
@@ -347,7 +347,7 @@
"EvStoppingMode"
],
"data_enum": "EvStoppingMode",
- "description": "Represents property for the current stopping mode of the vehicle.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues must be defined unless all enum values of EvStoppingMode are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): For the global area ID (0), {@code getSupportedValuesList} must return a {@code SupportedValuesListResult} that contains supported values unless all enum values of EvStoppingMode are supported. At boot, supportedEnumValues is equal to the supported values list.\nThe EvStoppingMode enum may be extended to include more states in the future.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Represents property for the current stopping mode of the vehicle.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues must be defined unless all enum values of EvStoppingMode are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nThe EvStoppingMode enum may be extended to include more states in the future.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "ELECTRONIC_STABILITY_CONTROL_ENABLED",
@@ -362,7 +362,7 @@
"ErrorState"
],
"data_enum": "ElectronicStabilityControlState",
- "description": "Electronic Stability Control (ESC) state.\nReturns the current state of ESC. This property must always return a valid state defined in ElectronicStabilityControlState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both ElectronicStabilityControlState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): For the global area ID (0), {@code getSupportedValuesList} must return a {@code SupportedValuesListResult} that contains supported values unless all states of both ElectronicStabilityControlState (including OTHER, which is not recommended) and ErrorState are supported. At boot, supportedEnumValues is equal to the supported values list."
+ "description": "Electronic Stability Control (ESC) state.\nReturns the current state of ESC. This property must always return a valid state defined in ElectronicStabilityControlState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both ElectronicStabilityControlState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Turn signal light state.",
@@ -371,7 +371,7 @@
"VehicleTurnSignal"
],
"data_enum": "VehicleTurnSignal",
- "description": "Turn signal light state.\nThis property must communicate the actual state of the turn signal lights.\nExamples: 1) Left turn signal light is currently pulsing, right turn signal light is currently off. This property must return VehicleTurnSignal.LEFT while the light is on during the pulse, and VehicleTurnSignal.NONE when it is off during the pulse. 2) Right turn signal light is currently pulsing, left turn signal light is currently off. This property must return VehicleTurnSignal.RIGHT while the light is on during the pulse, and VehicleTurnSignal.NONE when it is off during the pulse. 3) Both turn signal lights are currently pulsing (e.g. when hazard lights switch is on). This property must return VehicleTurnSignal.LEFT | VehicleTurnSignal.RIGHT while the lights are on during the pulse, and VehicleTurnSignal.NONE when they are off during the pulse.\nNote that this property uses VehicleTurnSignal as a bit flag, unlike TURN_SIGNAL_SWITCH, which uses it like a regular enum. This means this property can support ORed together values in VehicleTurnSignal.\nThis is different from the function of TURN_SIGNAL_SWITCH, which must communicate the state of the turn signal lever\/switch.\nThis property is a replacement to the TURN_SIGNAL_STATE property, which is now deprecated."
+ "description": "Turn signal light state.\nThis property must communicate the actual state of the turn signal lights.\nExamples: 1) Left turn signal light is currently pulsing, right turn signal light is currently off. This property must return VehicleTurnSignal.LEFT while the light is on during the pulse, and VehicleTurnSignal.NONE when it is off during the pulse. 2) Right turn signal light is currently pulsing, left turn signal light is currently off. This property must return VehicleTurnSignal.RIGHT while the light is on during the pulse, and VehicleTurnSignal.NONE when it is off during the pulse. 3) Both turn signal lights are currently pulsing (e.g. when hazard lights switch is on). This property must return VehicleTurnSignal.LEFT | VehicleTurnSignal.RIGHT while the lights are on during the pulse, and VehicleTurnSignal.NONE when they are off during the pulse.\nNote that this property uses VehicleTurnSignal as a bit flag, unlike TURN_SIGNAL_SWITCH, which uses it like a regular enum. This means this property can support ORed together values in VehicleTurnSignal.\nThis is different from the function of TURN_SIGNAL_SWITCH, which must communicate the state of the turn signal lever\/switch.\nThis property is a replacement to the TURN_SIGNAL_STATE property, which is now deprecated.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined to list all supported combinations of VehicleTurnSignal unless all combinations are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Turn signal switch.",
@@ -380,12 +380,12 @@
"VehicleTurnSignal"
],
"data_enum": "VehicleTurnSignal",
- "description": "Turn signal switch.\nThis property must communicate the state of the turn signal lever\/switch. This is different from the function of TURN_SIGNAL_LIGHT_STATE, which must communicate the actual state of the turn signal lights.\nNote that this property uses VehicleTurnSignal as a regular enum, unlike TURN_SIGNAL_LIGHT_STATE, which uses it like a bit flag. This means this property cannot support ORed together values in VehicleTurnSignal.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Turn signal switch.\nThis property must communicate the state of the turn signal lever\/switch. This is different from the function of TURN_SIGNAL_LIGHT_STATE, which must communicate the actual state of the turn signal lights.\nNote that this property uses VehicleTurnSignal as a regular enum, unlike TURN_SIGNAL_LIGHT_STATE, which uses it like a bit flag. This means this property cannot support ORed together values in VehicleTurnSignal.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleTurnSignal are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Fan speed setting",
"value": 356517120,
- "description": "Fan speed setting\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the lowest fan speed.\nThe maxInt32Value indicates the highest fan speed.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the specific area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Fan speed setting\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the lowest fan speed.\nThe maxInt32Value indicates the highest fan speed.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the specific area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Fan direction setting",
@@ -404,7 +404,7 @@
{
"name": "HVAC_TEMPERATURE_SET",
"value": 358614275,
- "description": "HVAC target temperature set in Celsius.\nThe minFloatValue and maxFloatValue in VehicleAreaConfig must be defined.\nThe minFloatValue indicates the minimum temperature setting in Celsius.\nThe maxFloatValue indicates the maximum temperature setting in Celsius.\nIf all the values between minFloatValue and maxFloatValue are not supported, the configArray can be used to list the valid temperature values that can be set. It also describes a lookup table to convert the temperature from Celsius to Fahrenheit and vice versa for this vehicle. The configArray must be defined if standard unit conversion is not supported on this vehicle.\nThe configArray is set as follows: configArray[0] = [the lower bound of the supported temperature in Celsius] * 10. configArray[1] = [the upper bound of the supported temperature in Celsius] * 10. configArray[2] = [the increment in Celsius] * 10. configArray[3] = [the lower bound of the supported temperature in Fahrenheit] * 10. configArray[4] = [the upper bound of the supported temperature in Fahrenheit] * 10. configArray[5] = [the increment in Fahrenheit] * 10.\nThe minFloatValue and maxFloatValue in VehicleAreaConfig must be equal to configArray[0] and configArray[1] respectively.\nFor example, if the vehicle supports temperature values as: [16.0, 16.5, 17.0 ,..., 28.0] in Celsius [60.5, 61.5, 62.5 ,..., 84.5] in Fahrenheit The configArray should be configArray = {160, 280, 5, 605, 845, 10}.\nIdeally, the ratio of the Celsius increment to the Fahrenheit increment should be as close to the actual ratio of 1 degree Celsius to 1.8 degrees Fahrenheit.\nThere must be a one to one mapping of all Celsius values to Fahrenheit values defined by the configArray. The configArray will be used by clients to convert this property's temperature from Celsius to Fahrenheit. Also, it will let clients know what Celsius value to set the property to achieve their desired Fahreneheit value for the system. If the ECU does not have a one to one mapping of all Celsius values to Fahrenheit values, then the config array should only define the list of Celsius and Fahrenheit values that do have a one to one mapping.\nFor example, if the ECU supports Celsius values from 16 to 28 and Fahrenheit values from 60 to 85 both with an increment of 1, then one possible configArray would be {160, 280, 10, 600, 840, 20}. In this case, 85 would not be a supported temperature.\nAny value set in between a valid value should be rounded to the closest valid value.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the specific area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minFloatValue. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxFloatValue. If not all the values between minSupportedValue and maxSupportedValue are supported, {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} for the specified area ID. At boot, supportedValuesList must be equal to what is described in config array. At boot, minFloatValue is equal to minSupportedValue, maxFloatValue is equal to maxSupportedValue.\nIt is highly recommended that the OEM also implement the HVAC_TEMPERATURE_VALUE_SUGGESTION vehicle property because it provides applications a simple method for determining temperature values that can be set for this vehicle and for converting values between Celsius and Fahrenheit.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "HVAC target temperature set in Celsius.\nThe minFloatValue and maxFloatValue in VehicleAreaConfig must be defined.\nThe minFloatValue indicates the minimum temperature setting in Celsius.\nThe maxFloatValue indicates the maximum temperature setting in Celsius.\nIf all the values between minFloatValue and maxFloatValue are not supported, the configArray can be used to list the valid temperature values that can be set. It also describes a lookup table to convert the temperature from Celsius to Fahrenheit and vice versa for this vehicle. The configArray must be defined if standard unit conversion is not supported on this vehicle.\nThe configArray is set as follows: configArray[0] = [the lower bound of the supported temperature in Celsius] * 10. configArray[1] = [the upper bound of the supported temperature in Celsius] * 10. configArray[2] = [the increment in Celsius] * 10. configArray[3] = [the lower bound of the supported temperature in Fahrenheit] * 10. configArray[4] = [the upper bound of the supported temperature in Fahrenheit] * 10. configArray[5] = [the increment in Fahrenheit] * 10.\nThe minFloatValue and maxFloatValue in VehicleAreaConfig must be equal to configArray[0] and configArray[1] respectively.\nFor example, if the vehicle supports temperature values as: [16.0, 16.5, 17.0 ,..., 28.0] in Celsius [60.5, 61.5, 62.5 ,..., 84.5] in Fahrenheit The configArray should be configArray = {160, 280, 5, 605, 845, 10}.\nIdeally, the ratio of the Celsius increment to the Fahrenheit increment should be as close to the actual ratio of 1 degree Celsius to 1.8 degrees Fahrenheit.\nThere must be a one to one mapping of all Celsius values to Fahrenheit values defined by the configArray. The configArray will be used by clients to convert this property's temperature from Celsius to Fahrenheit. Also, it will let clients know what Celsius value to set the property to achieve their desired Fahreneheit value for the system. If the ECU does not have a one to one mapping of all Celsius values to Fahrenheit values, then the config array should only define the list of Celsius and Fahrenheit values that do have a one to one mapping.\nFor example, if the ECU supports Celsius values from 16 to 28 and Fahrenheit values from 60 to 85 both with an increment of 1, then one possible configArray would be {160, 280, 10, 600, 840, 20}. In this case, 85 would not be a supported temperature.\nAny value set in between a valid value should be rounded to the closest valid value.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the specific area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minFloatValue. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxFloatValue. If not all the values between minSupportedValue and maxSupportedValue are supported, {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true} for the specified area ID. At boot, supportedValuesList must be equal to what is described in config array. At boot, minFloatValue is equal to minSupportedValue, maxFloatValue is equal to maxSupportedValue.\nIt is highly recommended that the OEM also implement the HVAC_TEMPERATURE_VALUE_SUGGESTION vehicle property because it provides applications a simple method for determining temperature values that can be set for this vehicle and for converting values between Celsius and Fahrenheit.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "HVAC_DEFROSTER",
@@ -444,17 +444,17 @@
{
"name": "Seat heating\/cooling",
"value": 356517131,
- "description": "Seat heating\/cooling\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value must be 0, unless the vehicle supports seat cooling as well. In this case, minInt32Value indicates the maximum seat temperature cooling setting.\nThe maxInt32Value indicates the maximum seat temperature heating setting.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the specified area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit, but in a specified range of relative temperature settings.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seat heating\/cooling\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value must be 0, unless the vehicle supports seat cooling as well. In this case, minInt32Value indicates the maximum seat temperature cooling setting.\nThe maxInt32Value indicates the maximum seat temperature heating setting.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the specified area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit, but in a specified range of relative temperature settings.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Side Mirror Heat",
"value": 339739916,
- "description": "Side Mirror Heat\nIncreasing values denote higher heating levels for side mirrors.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value in the config data MUST be zero and indicates no heating.\nThe maxInt32Value in the config data represents the maximum heating level.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the specified area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative heating settings.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Side Mirror Heat\nIncreasing values denote higher heating levels for side mirrors.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value in the config data MUST be zero and indicates no heating.\nThe maxInt32Value in the config data represents the maximum heating level.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the specified area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative heating settings.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Steering Wheel Heating\/Cooling",
"value": 289408269,
- "description": "Steering Wheel Heating\/Cooling\nSets the amount of heating\/cooling for the steering wheel.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value should be 0, unless the vehicle supports steering wheel cooling as well. In such a case, the minInt32Value indicates the maximum steering wheel cooling setting.\nThe maxInt32Value indicates the maximum steering wheel heating setting.\nIf {@code HasSupportedValueInfo} is not null for the global area ID (0): {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of heating settings.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Steering Wheel Heating\/Cooling\nSets the amount of heating\/cooling for the steering wheel.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value should be 0, unless the vehicle supports steering wheel cooling as well. In such a case, the minInt32Value indicates the maximum steering wheel cooling setting.\nThe maxInt32Value indicates the maximum steering wheel heating setting.\nIf {@code HasSupportedValueInfo} is not null for the global area ID (0): {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of heating settings.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Temperature units for display",
@@ -463,7 +463,7 @@
"VehicleUnit"
],
"data_enum": "VehicleUnit",
- "description": "Temperature units for display\nIndicates whether the vehicle is displaying temperature to the user as Celsius or Fahrenheit.\nVehiclePropConfig.configArray is used to indicate the supported temperature display units.\nFor example: configArray[0] = CELSIUS configArray[1] = FAHRENHEIT\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesLists} for [HVAC_TEMPERATURE_DISPLAY_UNITS, areaId=0] must return a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}, e.g. [CELSIUS, FAHRENHEIT]. At boot, the values in the config array are equal to the supported values list.\nThis parameter MAY be used for displaying any HVAC temperature in the system. Values must be one of VehicleUnit.CELSIUS or VehicleUnit.FAHRENHEIT Note that internally, all temperatures are represented in floating point Celsius.\nIf updating HVAC_TEMPERATURE_DISPLAY_UNITS affects the values of other *_DISPLAY_UNITS properties, then their values must be updated and communicated to the AAOS framework as well.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Temperature units for display\nIndicates whether the vehicle is displaying temperature to the user as Celsius or Fahrenheit.\nVehiclePropConfig.configArray is used to indicate the supported temperature display units.\nFor example: configArray[0] = CELSIUS configArray[1] = FAHRENHEIT\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesLists} for [HVAC_TEMPERATURE_DISPLAY_UNITS, areaId=0] must return a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}, e.g. [CELSIUS, FAHRENHEIT]. At boot, the values in the config array are equal to the supported values list.\nThis parameter MAY be used for displaying any HVAC temperature in the system. Values must be one of VehicleUnit.CELSIUS or VehicleUnit.FAHRENHEIT Note that internally, all temperatures are represented in floating point Celsius.\nIf updating HVAC_TEMPERATURE_DISPLAY_UNITS affects the values of other *_DISPLAY_UNITS properties, then their values must be updated and communicated to the AAOS framework as well.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Actual fan speed",
@@ -492,7 +492,7 @@
{
"name": "Seat ventilation",
"value": 356517139,
- "description": "Seat ventilation\nThe minInt32Value and maxInt32Value in VehicleAreaConfig must be defined.\nAll integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value must be 0.\nThe maxInt32Value indicates the maximum ventilation setting available for the seat.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the specified area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in the specified range of ventilation settings.\nUsed by HVAC apps and Assistant to enable, change, or read state of seat ventilation. This is different than seating cooling. It can be on at the same time as cooling, or not.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seat ventilation\nThe minInt32Value and maxInt32Value in VehicleAreaConfig must be defined.\nAll integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value must be 0.\nThe maxInt32Value indicates the maximum ventilation setting available for the seat.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the specified area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in the specified range of ventilation settings.\nUsed by HVAC apps and Assistant to enable, change, or read state of seat ventilation. This is different than seating cooling. It can be on at the same time as cooling, or not.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Electric defrosters' status",
@@ -511,7 +511,7 @@
"VehicleUnit"
],
"data_enum": "VehicleUnit",
- "description": "Distance units for display\nIndicates which units the car is using to display distances to the user. Eg. Mile, Meter Kilometer.\nDistance units are defined in VehicleUnit. VehiclePropConfig.configArray is used to indicate the supported distance display units. For example: configArray[0] = METER configArray[1] = KILOMETER configArray[2] = MILE\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesLists} for [DISTANCE_DISPLAY_UNITS, areaId=0] must returns a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}, e.g. [METER, KILOMETER, MILE]. At boot, the values in the config array are equal to the supported values list.\nIf updating DISTANCE_DISPLAY_UNITS affects the values of other *_DISPLAY_UNITS properties, then their values must be updated and communicated to the AAOS framework as well.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Distance units for display\nIndicates which units the car is using to display distances to the user. Eg. Mile, Meter Kilometer.\nDistance units are defined in VehicleUnit. VehiclePropConfig.configArray is used to indicate the supported distance display units. For example: configArray[0] = METER configArray[1] = KILOMETER configArray[2] = MILE\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesLists} for [DISTANCE_DISPLAY_UNITS, areaId=0] must returns a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}, e.g. [METER, KILOMETER, MILE]. At boot, the values in the config array are equal to the supported values list.\nIf updating DISTANCE_DISPLAY_UNITS affects the values of other *_DISPLAY_UNITS properties, then their values must be updated and communicated to the AAOS framework as well.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Fuel volume units for display",
@@ -520,7 +520,7 @@
"VehicleUnit"
],
"data_enum": "VehicleUnit",
- "description": "Fuel volume units for display\nIndicates which units the car is using to display fuel volume to the user. Eg. Liter or Gallon.\nVehiclePropConfig.configArray is used to indicate the supported fuel volume display units. Volume units are defined in VehicleUnit. For example: configArray[0] = LITER configArray[1] = GALLON\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesLists} for [FUEL_VOLUME_DISPLAY_UNITS, areaId=0] must return a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}, e.g. [LITER, GALLON]. At boot, the values in the config array are equal to the supported values list.\nIf updating FUEL_VOLUME_DISPLAY_UNITS affects the values of other *_DISPLAY_UNITS properties, then their values must be updated and communicated to the AAOS framework as well.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Fuel volume units for display\nIndicates which units the car is using to display fuel volume to the user. Eg. Liter or Gallon.\nVehiclePropConfig.configArray is used to indicate the supported fuel volume display units. Volume units are defined in VehicleUnit. For example: configArray[0] = LITER configArray[1] = GALLON\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesLists} for [FUEL_VOLUME_DISPLAY_UNITS, areaId=0] must return a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}, e.g. [LITER, GALLON]. At boot, the values in the config array are equal to the supported values list.\nIf updating FUEL_VOLUME_DISPLAY_UNITS affects the values of other *_DISPLAY_UNITS properties, then their values must be updated and communicated to the AAOS framework as well.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "TIRE_PRESSURE_DISPLAY_UNITS",
@@ -529,7 +529,7 @@
"VehicleUnit"
],
"data_enum": "VehicleUnit",
- "description": "Tire pressure units for display\nIndicates which units the car is using to display tire pressure to the user. Eg. PSI, Bar or Kilopascal.\nVehiclePropConfig.configArray is used to indicate the supported pressure display units. Pressure units are defined in VehicleUnit. For example: configArray[0] = KILOPASCAL configArray[1] = PSI configArray[2] = BAR\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesLists} for [TIRE_PRESSURE_DISPLAY_UNITS, areaId=0] must return a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}, e.g. [KILOPASCAL, PSI, BAR]. At boot, the values in the config array are equal to the supported values list.\nIf updating TIRE_PRESSURE_DISPLAY_UNITS affects the values of other *_DISPLAY_UNITS properties, then their values must be updated and communicated to the AAOS framework as well.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Tire pressure units for display\nIndicates which units the car is using to display tire pressure to the user. Eg. PSI, Bar or Kilopascal.\nVehiclePropConfig.configArray is used to indicate the supported pressure display units. Pressure units are defined in VehicleUnit. For example: configArray[0] = KILOPASCAL configArray[1] = PSI configArray[2] = BAR\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesLists} for [TIRE_PRESSURE_DISPLAY_UNITS, areaId=0] must return a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}, e.g. [KILOPASCAL, PSI, BAR]. At boot, the values in the config array are equal to the supported values list.\nIf updating TIRE_PRESSURE_DISPLAY_UNITS affects the values of other *_DISPLAY_UNITS properties, then their values must be updated and communicated to the AAOS framework as well.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "EV battery units for display",
@@ -538,7 +538,7 @@
"VehicleUnit"
],
"data_enum": "VehicleUnit",
- "description": "EV battery units for display\nIndicates which units the car is using to display EV battery information to the user. Eg. watt-hours(Wh), kilowatt-hours(kWh) or ampere-hours(Ah).\nVehiclePropConfig.configArray is used to indicate the supported electrical energy units. Electrical energy units are defined in VehicleUnit. For example: configArray[0] = WATT_HOUR configArray[1] = AMPERE_HOURS configArray[2] = KILOWATT_HOUR\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesLists} for [EV_BATTERY_DISPLAY_UNITS, areaId=0] must return a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}, e.g. [WATT_HOUR, AMPERE_HOURS, KILOWATT_HOUR]. At boot, the values in the config array are equal to the supported values list.\nIf updating EV_BATTERY_DISPLAY_UNITS affects the values of other *_DISPLAY_UNITS properties, then their values must be updated and communicated to the AAOS framework as well.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "EV battery units for display\nIndicates which units the car is using to display EV battery information to the user. Eg. watt-hours(Wh), kilowatt-hours(kWh) or ampere-hours(Ah).\nVehiclePropConfig.configArray is used to indicate the supported electrical energy units. Electrical energy units are defined in VehicleUnit. For example: configArray[0] = WATT_HOUR configArray[1] = AMPERE_HOURS configArray[2] = KILOWATT_HOUR\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesLists} for [EV_BATTERY_DISPLAY_UNITS, areaId=0] must return a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}, e.g. [WATT_HOUR, AMPERE_HOURS, KILOWATT_HOUR]. At boot, the values in the config array are equal to the supported values list.\nIf updating EV_BATTERY_DISPLAY_UNITS affects the values of other *_DISPLAY_UNITS properties, then their values must be updated and communicated to the AAOS framework as well.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME",
@@ -552,7 +552,7 @@
"VehicleUnit"
],
"data_enum": "VehicleUnit",
- "description": "Speed units for display\nIndicates type of units the car is using to display speed to user. Eg. m\/s, km\/h, or mph.\nVehiclePropConfig.configArray is used to indicate the supported speed display units. Pressure units are defined in VehicleUnit. For example: configArray[0] = METER_PER_SEC configArray[1] = MILES_PER_HOUR configArray[2] = KILOMETERS_PER_HOUR\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesLists} for [VEHICLE_SPEED_DISPLAY_UNITS, areaId=0] must return a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}, e.g. [METER_PER_SEC, MILES_PER_HOUR, KILOMETERS_PER_HOUR]. At boot, the values in the config array are equal to the supported values list.\nIf updating VEHICLE_SPEED_DISPLAY_UNITS affects the values of other *_DISPLAY_UNITS properties, then their values must be updated and communicated to the AAOS framework as well.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Speed units for display\nIndicates type of units the car is using to display speed to user. Eg. m\/s, km\/h, or mph.\nVehiclePropConfig.configArray is used to indicate the supported speed display units. Pressure units are defined in VehicleUnit. For example: configArray[0] = METER_PER_SEC configArray[1] = MILES_PER_HOUR configArray[2] = KILOMETERS_PER_HOUR\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID (0) must be {@code true}. {@code getSupportedValuesLists} for [VEHICLE_SPEED_DISPLAY_UNITS, areaId=0] must return a {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}, e.g. [METER_PER_SEC, MILES_PER_HOUR, KILOMETERS_PER_HOUR]. At boot, the values in the config array are equal to the supported values list.\nIf updating VEHICLE_SPEED_DISPLAY_UNITS affects the values of other *_DISPLAY_UNITS properties, then their values must be updated and communicated to the AAOS framework as well.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "EXTERNAL_CAR_TIME",
@@ -645,12 +645,12 @@
{
"name": "Door position",
"value": 373295872,
- "description": "Door position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the door is closed. The minInt32Value must be 0.\nThe maxInt32Value indicates the door is fully open.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the closed and fully open positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nSome vehicles (minivans) can open the door electronically. Hence, the ability to write this property.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Door position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the door is closed. The minInt32Value must be 0.\nThe maxInt32Value indicates the door is fully open.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the closed and fully open positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nSome vehicles (minivans) can open the door electronically. Hence, the ability to write this property.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Door move",
"value": 373295873,
- "description": "Door move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the door while closing.\nThe maxInt32Value represents the maximum movement speed of the door while opening.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the door reaches the positional limit, the value must reset to 0. If DOOR_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Door move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the door while closing.\nThe maxInt32Value represents the maximum movement speed of the door while opening.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the door reaches the positional limit, the value must reset to 0. If DOOR_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Door lock",
@@ -665,22 +665,22 @@
{
"name": "Mirror Z Position",
"value": 339741504,
- "description": "Mirror Z Position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the mirror is tilted completely downwards. This must be a non-positive value.\nThe maxInt32Value indicates the mirror is tilted completely upwards. This must be a non-negative value.\n0 indicates the mirror is not tilted in either direction.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the fully downward and fully upwards positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. Values in between minSupportedValue and maxSupportedValue indicate a transition state between the fully downward and fully upwards positions. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Mirror Z Position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the mirror is tilted completely downwards. This must be a non-positive value.\nThe maxInt32Value indicates the mirror is tilted completely upwards. This must be a non-negative value.\n0 indicates the mirror is not tilted in either direction.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the fully downward and fully upwards positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. Values in between minSupportedValue and maxSupportedValue indicate a transition state between the fully downward and fully upwards positions. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Mirror Z Move",
"value": 339741505,
- "description": "Mirror Z Move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the mirror while tilting downwards.\nThe maxInt32Value represents the maximum movement speed of the mirror while tilting upwards.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the mirror reaches the positional limit, the value must reset to 0. If MIRROR_Z_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Mirror Z Move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the mirror while tilting downwards.\nThe maxInt32Value represents the maximum movement speed of the mirror while tilting upwards.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the mirror reaches the positional limit, the value must reset to 0. If MIRROR_Z_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Mirror Y Position",
"value": 339741506,
- "description": "Mirror Y Position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the mirror is tilted completely to the left. This must be a non-positive value.\nThe maxInt32Value indicates the mirror is tilted completely to the right. This must be a non-negative value.\n0 indicates the mirror is not tilted in either direction.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the left extreme and right extreme positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. Values in between minSupportedValue and maxSupportedValue indicate a transition state between the fully downward and fully upwards positions. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Mirror Y Position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the mirror is tilted completely to the left. This must be a non-positive value.\nThe maxInt32Value indicates the mirror is tilted completely to the right. This must be a non-negative value.\n0 indicates the mirror is not tilted in either direction.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the left extreme and right extreme positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. Values in between minSupportedValue and maxSupportedValue indicate a transition state between the fully downward and fully upwards positions. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Mirror Y Move",
"value": 339741507,
- "description": "Mirror Y Move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the mirror while tilting left.\nThe maxInt32Value represents the maximum movement speed of the mirror while tilting right.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the mirror reaches the positional limit, the value must reset to 0. If MIRROR_Y_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Mirror Y Move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the mirror while tilting left.\nThe maxInt32Value represents the maximum movement speed of the mirror while tilting right.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the mirror reaches the positional limit, the value must reset to 0. If MIRROR_Y_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Mirror Lock",
@@ -705,12 +705,12 @@
{
"name": "Seat memory select",
"value": 356518784,
- "description": "Seat memory select\nThis parameter selects the memory preset to use to select the seat position.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined.\nAll integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value is always 0, and the maxInt32Value determines the number of seat preset memory slots available (i.e. numSeatPresets - 1).\nFor instance, if the driver's seat has 3 memory presets, the maxInt32Value will be 2. When the user wants to select a preset, the desired preset number (0, 1, or 2) is set.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue."
+ "description": "Seat memory select\nThis parameter selects the memory preset to use to select the seat position.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined.\nAll integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value is always 0, and the maxInt32Value determines the number of seat preset memory slots available (i.e. numSeatPresets - 1).\nFor instance, if the driver's seat has 3 memory presets, the maxInt32Value will be 2. When the user wants to select a preset, the desired preset number (0, 1, or 2) is set.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue."
},
{
"name": "Seat memory set",
"value": 356518785,
- "description": "Seat memory set\nThis setting allows the user to save the current seat position settings into the selected preset slot.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined.\nThe minInt32Value must be 0, and the maxInt32Value for each seat position must match the maxInt32Value for SEAT_MEMORY_SELECT.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue."
+ "description": "Seat memory set\nThis setting allows the user to save the current seat position settings into the selected preset slot.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined.\nThe minInt32Value must be 0, and the maxInt32Value for each seat position must match the maxInt32Value for SEAT_MEMORY_SELECT.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue."
},
{
"name": "Seatbelt buckled",
@@ -720,92 +720,92 @@
{
"name": "Seatbelt height position",
"value": 356518787,
- "description": "Seatbelt height position\nAdjusts the shoulder belt anchor point.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat belt's shoulder anchor is at its lowest position.\nThe maxInt32Value indicates the seat belt's shoulder anchor is at its highest position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the lowest and highest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. Values in between minSupportedValue and maxSupportedValue indicate a transition state between the lowest and highest positions. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seatbelt height position\nAdjusts the shoulder belt anchor point.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat belt's shoulder anchor is at its lowest position.\nThe maxInt32Value indicates the seat belt's shoulder anchor is at its highest position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the lowest and highest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. Values in between minSupportedValue and maxSupportedValue indicate a transition state between the lowest and highest positions. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Seatbelt height move",
"value": 356518788,
- "description": "Seatbelt height move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat belt's shoulder anchor while moving downwards.\nThe maxInt32Value represents the maximum movement speed of the seat belt's shoulder anchor while moving upwards.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat belt reaches the positional limit, the value must reset to 0. If SEAT_BELT_HEIGHT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seatbelt height move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat belt's shoulder anchor while moving downwards.\nThe maxInt32Value represents the maximum movement speed of the seat belt's shoulder anchor while moving upwards.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat belt reaches the positional limit, the value must reset to 0. If SEAT_BELT_HEIGHT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Seat fore\/aft position",
"value": 356518789,
- "description": "Seat fore\/aft position\nSets the seat position forward and backwards.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat is at its rearward-most linear position.\nThe maxInt32Value indicates the seat is at its forward-most linear position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the closest and farthest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seat fore\/aft position\nSets the seat position forward and backwards.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat is at its rearward-most linear position.\nThe maxInt32Value indicates the seat is at its forward-most linear position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the closest and farthest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Seat fore\/aft move",
"value": 356518790,
- "description": "Seat fore\/aft move\nThis property moves the entire seat forward\/backward in the direction that it is facing.\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat while moving backward.\nThe maxInt32Value represents the maximum movement speed of the seat while moving forward.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat reaches the positional limit, the value must reset to 0. If SEAT_FORE_AFT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seat fore\/aft move\nThis property moves the entire seat forward\/backward in the direction that it is facing.\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat while moving backward.\nThe maxInt32Value represents the maximum movement speed of the seat while moving forward.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat reaches the positional limit, the value must reset to 0. If SEAT_FORE_AFT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Seat backrest angle 1 position",
"value": 356518791,
- "description": "Seat backrest angle 1 position\nBackrest angle 1 is the actuator closest to the bottom of the seat.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat backrest's full recline position w.r.t the actuator at the bottom of the seat.\nThe maxInt32Value indicates the seat backrest's most upright\/forward position w.r.t the actuator at the bottom of the seat.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the full recline and upright\/forward positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. Values in between minSupportedValue and maxSupportedValue indicate a transition state between the full recline and upright\/forward positions. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seat backrest angle 1 position\nBackrest angle 1 is the actuator closest to the bottom of the seat.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat backrest's full recline position w.r.t the actuator at the bottom of the seat.\nThe maxInt32Value indicates the seat backrest's most upright\/forward position w.r.t the actuator at the bottom of the seat.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the full recline and upright\/forward positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. Values in between minSupportedValue and maxSupportedValue indicate a transition state between the full recline and upright\/forward positions. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Seat backrest angle 1 move",
"value": 356518792,
- "description": "Seat backrest angle 1 move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat backrest while reclining.\nThe maxInt32Value represents the maximum movement speed of the seat backrest while angling forward.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat backrest reaches the positional limit, the value must reset to 0. If SEAT_BACKREST_ANGLE_1_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seat backrest angle 1 move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat backrest while reclining.\nThe maxInt32Value represents the maximum movement speed of the seat backrest while angling forward.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat backrest reaches the positional limit, the value must reset to 0. If SEAT_BACKREST_ANGLE_1_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Seat backrest angle 2 position",
"value": 356518793,
- "description": "Seat backrest angle 2 position\nBackrest angle 2 is the next actuator up from the bottom of the seat.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat backrest's full recline position w.r.t the next actuator in the backrest from the one at the bottom of the seat (see SEAT_BACKREST_ANGLE_1_POS for additional details).\nThe maxInt32Value indicates the seat backrest's most upright\/forward position w.r.t the next actuator in the backrest from the one at the bottom of the seat(see SEAT_BACKREST_ANGLE_1_POS for additional details).\nValues in between minInt32Value and maxInt32Value indicate a transition state between the full recline and upright\/forward positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} ihas the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. Values in between minSupportedValue and maxSupportedValue indicate a transition state between the full recline and upright\/forward positions. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seat backrest angle 2 position\nBackrest angle 2 is the next actuator up from the bottom of the seat.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat backrest's full recline position w.r.t the next actuator in the backrest from the one at the bottom of the seat (see SEAT_BACKREST_ANGLE_1_POS for additional details).\nThe maxInt32Value indicates the seat backrest's most upright\/forward position w.r.t the next actuator in the backrest from the one at the bottom of the seat(see SEAT_BACKREST_ANGLE_1_POS for additional details).\nValues in between minInt32Value and maxInt32Value indicate a transition state between the full recline and upright\/forward positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} ihas the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. Values in between minSupportedValue and maxSupportedValue indicate a transition state between the full recline and upright\/forward positions. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Seat backrest angle 2 move",
"value": 356518794,
- "description": "Seat backrest angle 2 move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat backrest while reclining.\nThe maxInt32Value represents the maximum movement speed of the seat backrest while angling forward.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat backrest reaches the positional limit, the value must reset to 0. If SEAT_BACKREST_ANGLE_2_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seat backrest angle 2 move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat backrest while reclining.\nThe maxInt32Value represents the maximum movement speed of the seat backrest while angling forward.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat backrest reaches the positional limit, the value must reset to 0. If SEAT_BACKREST_ANGLE_2_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Seat height position",
"value": 356518795,
- "description": "Seat height position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat is in its lowest position.\nThe maxInt32Value indicates the seat is in its highest position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the lowest and highest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. position. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seat height position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat is in its lowest position.\nThe maxInt32Value indicates the seat is in its highest position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the lowest and highest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. position. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Seat height move",
"value": 356518796,
- "description": "Seat height move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat while moving downward.\nThe maxInt32Value represents the maximum movement speed of the seat while moving upward.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat reaches the positional limit, the value must reset to 0. If SEAT_HEIGHT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seat height move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat while moving downward.\nThe maxInt32Value represents the maximum movement speed of the seat while moving upward.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat reaches the positional limit, the value must reset to 0. If SEAT_HEIGHT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Seat depth position",
"value": 356518797,
- "description": "Seat depth position\nSets the seat depth, distance from back rest to front edge of seat.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat is in its shallowest position (i.e. the position with the smallest distance between the front edge of the seat cushion and the rear end of the seat).\nThe maxInt32Value indicates the seat is in its deepest position (i.e. the position with the largest distance between the front edge of the seat cushion and the rear end of the seat).\nValues in between minInt32Value and maxInt32Value indicate a transition state between the shallowest and deepest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seat depth position\nSets the seat depth, distance from back rest to front edge of seat.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat is in its shallowest position (i.e. the position with the smallest distance between the front edge of the seat cushion and the rear end of the seat).\nThe maxInt32Value indicates the seat is in its deepest position (i.e. the position with the largest distance between the front edge of the seat cushion and the rear end of the seat).\nValues in between minInt32Value and maxInt32Value indicate a transition state between the shallowest and deepest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Seat depth move",
"value": 356518798,
- "description": "Seat depth move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat while getting shallower.\nThe maxInt32Value represents the maximum movement speed of the seat while getting deeper.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat backrest reaches the positional limit, the value must reset to 0. If SEAT_DEPTH_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seat depth move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat while getting shallower.\nThe maxInt32Value represents the maximum movement speed of the seat while getting deeper.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat backrest reaches the positional limit, the value must reset to 0. If SEAT_DEPTH_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Seat tilt position",
"value": 356518799,
- "description": "Seat tilt position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat bottom is angled at its lowest angular position. This corresponds to the seat's front edge at its lowest possible position relative to the rear end of the seat.\nThe maxInt32Value indicates the seat bottom is angled at its highest angular position. This corresponds to the seat's front edge at its highest possible position relative to the rear end of the seat.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the lowest and highest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seat tilt position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat bottom is angled at its lowest angular position. This corresponds to the seat's front edge at its lowest possible position relative to the rear end of the seat.\nThe maxInt32Value indicates the seat bottom is angled at its highest angular position. This corresponds to the seat's front edge at its highest possible position relative to the rear end of the seat.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the lowest and highest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Seat tilt move",
"value": 356518800,
- "description": "Seat tilt move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the front edge of the seat while moving downward.\nThe maxInt32Value represents the maximum movement speed of the front edge of the seat while moving upward.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat bottom reaches the positional limit, the value must reset to 0. If SEAT_TILT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Seat tilt move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the front edge of the seat while moving downward.\nThe maxInt32Value represents the maximum movement speed of the front edge of the seat while moving upward.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat bottom reaches the positional limit, the value must reset to 0. If SEAT_TILT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Lumber fore\/aft position",
"value": 356518801,
- "description": "Lumber fore\/aft position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the lumbar support is in its rearward most position (i.e. least supportive position).\nThe maxInt32Value indicates the lumbar support is in its forward most position (i.e. most supportive position).\nValues in between minInt32Value and maxInt32Value indicate a transition state between the forward and rearward positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Lumber fore\/aft position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the lumbar support is in its rearward most position (i.e. least supportive position).\nThe maxInt32Value indicates the lumbar support is in its forward most position (i.e. most supportive position).\nValues in between minInt32Value and maxInt32Value indicate a transition state between the forward and rearward positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Lumbar fore\/aft move",
"value": 356518802,
- "description": "Lumbar fore\/aft move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat's lumbar support while moving backward.\nThe maxInt32Value represents the maximum movement speed of the seat's lumbar support while moving forward.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat's lumbar support reaches the positional limit, the value must reset to 0. If SEAT_LUMBAR_FORE_AFT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Lumbar fore\/aft move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat's lumbar support while moving backward.\nThe maxInt32Value represents the maximum movement speed of the seat's lumbar support while moving forward.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat's lumbar support reaches the positional limit, the value must reset to 0. If SEAT_LUMBAR_FORE_AFT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Lumbar side support position",
"value": 356518803,
- "description": "Lumbar side support position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the lumbar side support is in its thinnest position (i.e. most support).\nThe maxInt32Value indicates the lumbar side support is in its widest position (i.e. least support).\nValues in between minInt32Value and maxInt32Value indicate a transition state between the thinnest and widest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Lumbar side support position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the lumbar side support is in its thinnest position (i.e. most support).\nThe maxInt32Value indicates the lumbar side support is in its widest position (i.e. least support).\nValues in between minInt32Value and maxInt32Value indicate a transition state between the thinnest and widest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Lumbar side support move",
"value": 356518804,
- "description": "Lumbar side support move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat's lumbar side support while getting thinner.\nThe maxInt32Value represents the maximum movement speed of the seat's lumbar side support while getting wider.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat's lumbar side support reaches the positional limit, the value must reset to 0. If SEAT_LUMBAR_SIDE_SUPPORT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Lumbar side support move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat's lumbar side support while getting thinner.\nThe maxInt32Value represents the maximum movement speed of the seat's lumbar side support while getting wider.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat's lumbar side support reaches the positional limit, the value must reset to 0. If SEAT_LUMBAR_SIDE_SUPPORT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "SEAT_HEADREST_HEIGHT_POS",
@@ -815,32 +815,32 @@
{
"name": "Headrest height position",
"value": 356518820,
- "description": "Headrest height position\nSets the headrest height for supported seats. VehiclePropConfig.areaConfigs specifies which seats are supported.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the headrest is in its lowest position.\nThe maxInt32Value indicates the headrest is in its highest position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the lowest and highest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Headrest height position\nSets the headrest height for supported seats. VehiclePropConfig.areaConfigs specifies which seats are supported.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the headrest is in its lowest position.\nThe maxInt32Value indicates the headrest is in its highest position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the lowest and highest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Headrest height move",
"value": 356518806,
- "description": "Headrest height move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat's headrest while moving down.\nThe maxInt32Value represents the maximum movement speed of the seat's headrest while moving up.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat's headrest reaches the positional limit, the value must reset to 0. If SEAT_HEADREST_HEIGHT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Headrest height move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat's headrest while moving down.\nThe maxInt32Value represents the maximum movement speed of the seat's headrest while moving up.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat's headrest reaches the positional limit, the value must reset to 0. If SEAT_HEADREST_HEIGHT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Headrest angle position",
"value": 356518807,
- "description": "Headrest angle position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the headrest is in its full recline position.\nThe maxInt32Value indicates the headrest is in its most upright\/forward position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the full recline and most upright\/forward positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Headrest angle position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the headrest is in its full recline position.\nThe maxInt32Value indicates the headrest is in its most upright\/forward position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the full recline and most upright\/forward positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Headrest angle move",
"value": 356518808,
- "description": "Headrest angle move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat's headrest while moving into a shallow position.\nThe maxInt32Value represents the maximum movement speed of the seat's headrest while moving into an upright\/forward position.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat's headrest reaches the positional limit, the value must reset to 0. If SEAT_HEADREST_ANGLE_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Headrest angle move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat's headrest while moving into a shallow position.\nThe maxInt32Value represents the maximum movement speed of the seat's headrest while moving into an upright\/forward position.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat's headrest reaches the positional limit, the value must reset to 0. If SEAT_HEADREST_ANGLE_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Headrest fore\/aft position",
"value": 356518809,
- "description": "Headrest fore\/aft position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the headrest is in its rearward-most linear position.\nThe maxInt32Value indicates the headrest is in its forward-most linear position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the forward and rearward positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Headrest fore\/aft position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the headrest is in its rearward-most linear position.\nThe maxInt32Value indicates the headrest is in its forward-most linear position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the forward and rearward positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Headrest fore\/aft move",
"value": 356518810,
- "description": "Headrest fore\/aft move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat's headrest while moving backward.\nThe maxInt32Value represents the maximum movement speed of the seat's headrest while moving forward.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat's headrest reaches the positional limit, the value must reset to 0. If SEAT_HEADREST_FORE_AFT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Headrest fore\/aft move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat's headrest while moving backward.\nThe maxInt32Value represents the maximum movement speed of the seat's headrest while moving forward.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat's headrest reaches the positional limit, the value must reset to 0. If SEAT_HEADREST_FORE_AFT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "SEAT_FOOTWELL_LIGHTS_STATE",
@@ -849,7 +849,7 @@
"VehicleLightState"
],
"data_enum": "VehicleLightState",
- "description": "Represents property for the seat footwell lights state.\nSEAT_FOOTWELL_LIGHTS_STATE reflects the current state of the lights at any point in time. This is different from the function of SEAT_FOOTWELL_LIGHTS_SWITCH which represents the position of the switch controlling the lights. Therefore, SEAT_FOOTWELL_LIGHTS_STATE may not match the value of SEAT_FOOTWELL_LIGHTS_SWITCH (e.g. SEAT_FOOTWELL_LIGHTS_SWITCH=AUTOMATIC and SEAT_FOOTWELL_LIGHTS_STATE=ON).\nThis property should only be implemented if SEAT_FOOTWELL_LIGHTS_STATE's value may be different from that of CABIN_LIGHTS_STATE.\nFor each supported area ID, the VehicleAreaConfig#supportedEnumValues must be defined unless all enum values of VehicleLightState are supported.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} for the area ID unless all enum values of VehicleLightState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Represents property for the seat footwell lights state.\nSEAT_FOOTWELL_LIGHTS_STATE reflects the current state of the lights at any point in time. This is different from the function of SEAT_FOOTWELL_LIGHTS_SWITCH which represents the position of the switch controlling the lights. Therefore, SEAT_FOOTWELL_LIGHTS_STATE may not match the value of SEAT_FOOTWELL_LIGHTS_SWITCH (e.g. SEAT_FOOTWELL_LIGHTS_SWITCH=AUTOMATIC and SEAT_FOOTWELL_LIGHTS_STATE=ON).\nThis property should only be implemented if SEAT_FOOTWELL_LIGHTS_STATE's value may be different from that of CABIN_LIGHTS_STATE.\nFor each supported area ID, the VehicleAreaConfig#supportedEnumValues must be defined unless all enum values of VehicleLightState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID: {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "SEAT_FOOTWELL_LIGHTS_SWITCH",
@@ -858,7 +858,7 @@
"VehicleLightSwitch"
],
"data_enum": "VehicleLightSwitch",
- "description": "Represents property for the seat footwell lights switch.\nSEAT_FOOTWELL_LIGHTS_SWITCH represents the position of the switch controlling the lights. This is different from the function of SEAT_FOOTWELL_LIGHTS_STATE which reflects the current state of the lights at any point in time. Therefore, SEAT_FOOTWELL_LIGHTS_SWITCH may not match the value of SEAT_FOOTWELL_LIGHTS_STATE (e.g. SEAT_FOOTWELL_LIGHTS_SWITCH=AUTOMATIC and SEAT_FOOTWELL_LIGHTS_STATE=ON).\nThis property should only be implemented if SEAT_FOOTWELL_LIGHTS_SWITCH's value may be different from that of CABIN_LIGHTS_SWITCH.\nFor each supported area ID, the VehicleAreaConfig#supportedEnumValues must be defined unless all enum values of VehicleLightSwitch are supported.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} for the area ID unless all enum values of VehicleLightSwitch are supported. At boot, the supported values list is the same as supportedEnumValues.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Represents property for the seat footwell lights switch.\nSEAT_FOOTWELL_LIGHTS_SWITCH represents the position of the switch controlling the lights. This is different from the function of SEAT_FOOTWELL_LIGHTS_STATE which reflects the current state of the lights at any point in time. Therefore, SEAT_FOOTWELL_LIGHTS_SWITCH may not match the value of SEAT_FOOTWELL_LIGHTS_STATE (e.g. SEAT_FOOTWELL_LIGHTS_SWITCH=AUTOMATIC and SEAT_FOOTWELL_LIGHTS_STATE=ON).\nThis property should only be implemented if SEAT_FOOTWELL_LIGHTS_SWITCH's value may be different from that of CABIN_LIGHTS_SWITCH.\nFor each supported area ID, the VehicleAreaConfig#supportedEnumValues must be defined unless all enum values of VehicleLightSwitch are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID: {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "SEAT_EASY_ACCESS_ENABLED",
@@ -877,32 +877,32 @@
"VehicleAirbagLocation"
],
"data_enum": "VehicleAirbagLocation",
- "description": "Seat airbags deployed\nBit flag property to relay information on which airbags have been deployed in the vehicle at each seat, vs which ones are currently still armed. If SEAT_AIRBAG_ENABLED is set to false at a particular areaId, this property should return status code UNAVAILABLE at that areaId.\nEnums apply to each seat, not the global vehicle. For example, VehicleAirbagsLocation#CURTAIN at the driver seat areaId represents whether the driver side curtain airbag has been deployed. Multiple bit flags can be set to indicate that multiple different airbags have been deployed for the seat.\nFor each seat area ID, the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of VehicleAirbagLocation are supported (including OTHER, which is not recommended).\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} for the area ID unless all states of VehicleAirbagLocation are supported (including OTHER, which is not recommended). At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Seat airbags deployed\nBit flag property to relay information on which airbags have been deployed in the vehicle at each seat, vs which ones are currently still armed. If SEAT_AIRBAG_ENABLED is set to false at a particular areaId, this property should return status code UNAVAILABLE at that areaId.\nEnums apply to each seat, not the global vehicle. For example, VehicleAirbagsLocation#CURTAIN at the driver seat areaId represents whether the driver side curtain airbag has been deployed. Multiple bit flags can be set to indicate that multiple different airbags have been deployed for the seat.\nFor each seat area ID, the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of VehicleAirbagLocation are supported (including OTHER, which is not recommended).\nIf {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID: {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "SEAT_CUSHION_SIDE_SUPPORT_POS",
"value": 356518815,
- "description": "Represents property for seat’s hipside (bottom cushion’s side) support position.\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat cushion side support is in its thinnest position (i.e. most support).\nThe maxInt32Value indicates the seat cushion side support is in its widest position (i.e. least support).\nValues in between minInt32Value and maxInt32Value indicate a transition state between the thinnest and widest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Represents property for seat’s hipside (bottom cushion’s side) support position.\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the seat cushion side support is in its thinnest position (i.e. most support).\nThe maxInt32Value indicates the seat cushion side support is in its widest position (i.e. least support).\nValues in between minInt32Value and maxInt32Value indicate a transition state between the thinnest and widest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "SEAT_CUSHION_SIDE_SUPPORT_MOVE",
"value": 356518816,
- "description": "Represents property for movement direction and speed of seat cushion side support.\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat cushion side support when growing thinner (i.e. support is increasing).\nThe maxInt32Value represents the maximum movement speed of the seat cushion side support when growing wider (i.e. support is decreasing).\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat cushion side support reaches the positional limit, the value must reset to 0. If SEAT_CUSHION_SIDE_SUPPORT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Represents property for movement direction and speed of seat cushion side support.\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value represents the maximum movement speed of the seat cushion side support when growing thinner (i.e. support is increasing).\nThe maxInt32Value represents the maximum movement speed of the seat cushion side support when growing wider (i.e. support is decreasing).\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat cushion side support reaches the positional limit, the value must reset to 0. If SEAT_CUSHION_SIDE_SUPPORT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "SEAT_LUMBAR_VERTICAL_POS",
"value": 356518817,
- "description": "Represents property for seat’s lumbar support vertical position.\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the lumbar support's lowest position.\nThe maxInt32Value indicates the lumbar support's highest position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the lowest and highest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Represents property for seat’s lumbar support vertical position.\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the lumbar support's lowest position.\nThe maxInt32Value indicates the lumbar support's highest position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the lowest and highest positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "SEAT_LUMBAR_VERTICAL_MOVE",
"value": 356518818,
- "description": "Represents property for vertical movement direction and speed of seat lumbar support.\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the lumbar support is moving at the fastest downward speed.\nThe maxInt32Value indicates the lumbar support is moving at the fastest upward speed.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat cushion side support reaches the positional limit, the value must reset to 0. If SEAT_LUMBAR_VERTICAL_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Represents property for vertical movement direction and speed of seat lumbar support.\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the lumbar support is moving at the fastest downward speed.\nThe maxInt32Value indicates the lumbar support is moving at the fastest upward speed.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the seat cushion side support reaches the positional limit, the value must reset to 0. If SEAT_LUMBAR_VERTICAL_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "SEAT_WALK_IN_POS",
"value": 356518819,
- "description": "Represents property that indicates the current walk-in position of the seat.\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the normal seat position. The minInt32Value must be 0.\nThe maxInt32Value indicates the seat is in the full walk-in position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the normal and walk-in positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThe area ID must match the seat that actually moves when the walk-in feature activates, not the intended seat the passengers will sit in.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Represents property that indicates the current walk-in position of the seat.\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the normal seat position. The minInt32Value must be 0.\nThe maxInt32Value indicates the seat is in the full walk-in position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the normal and walk-in positions.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThe area ID must match the seat that actually moves when the walk-in feature activates, not the intended seat the passengers will sit in.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "SEAT_BELT_PRETENSIONER_DEPLOYED",
@@ -916,17 +916,17 @@
"VehicleSeatOccupancyState"
],
"data_enum": "VehicleSeatOccupancyState",
- "description": "Seat Occupancy\nIndicates whether a particular seat is occupied or not, to the best of the car's ability to determine. Valid values are from the VehicleSeatOccupancyState enum."
+ "description": "Seat Occupancy\nIndicates whether a particular seat is occupied or not, to the best of the car's ability to determine. Valid values are from the VehicleSeatOccupancyState enum.\nFor each supported area ID, the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleSeatOccupancyState (including UNKNOWN) are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID: {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Window Position",
"value": 322964416,
- "description": "Window Position\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined.\nAll integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the window is closed\/fully open out of plane. If the window cannot open out of plane, then minInt32Value is the position of the window when fully closed and must be 0. If the window can open out of plane, the minInt32Value indicates the window is fully open in its position out of plane and will be a negative value. See the example below for a more detailed explanation.\nThe maxInt32Value indicates the window is fully open.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the closed\/fully open out-of-plane and fully open positions.\nThis property is not in any particular unit but in a specified range of relative positions.\nFor example, this is how the property should work for a window that can move out of plane: For a window that may open out of plane (i.e. vent mode of sunroof) this parameter will work with negative values as follows: Max = sunroof completely open 0 = sunroof closed. Min = sunroof vent completely open\nNote that in this mode, 0 indicates the window is closed.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Window Position\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined.\nAll integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the window is closed\/fully open out of plane. If the window cannot open out of plane, then minInt32Value is the position of the window when fully closed and must be 0. If the window can open out of plane, the minInt32Value indicates the window is fully open in its position out of plane and will be a negative value. See the example below for a more detailed explanation.\nThe maxInt32Value indicates the window is fully open.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the closed\/fully open out-of-plane and fully open positions.\nThis property is not in any particular unit but in a specified range of relative positions.\nFor example, this is how the property should work for a window that can move out of plane: For a window that may open out of plane (i.e. vent mode of sunroof) this parameter will work with negative values as follows: Max = sunroof completely open 0 = sunroof closed. Min = sunroof vent completely open\nNote that in this mode, 0 indicates the window is closed.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Window Move",
"value": 322964417,
- "description": "Window Move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the window is closing in plane\/opening in the out of plane direction at the fastest speed.\nThe maxInt32Value indicates the window is opening in plane\/closing in the out of plane direction at the fastest speed.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the window reaches the positional limit, the value must reset to 0. If WINDOW_MOVE's value is currently 0, then that means there is no movement currently occurring.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nFor a window that may open out of plane (i.e. vent mode of sunroof) this parameter will work as follows:\nIf sunroof is open: Max = open the sunroof further, automatically stop when fully open. Min = close the sunroof, automatically stop when sunroof is closed.\nIf vent is open: Max = close the vent, automatically stop when vent is closed. Min = open the vent further, automatically stop when vent is fully open.\nIf sunroof is in the closed position: Max = open the sunroof, automatically stop when sunroof is fully open. Min = open the vent, automatically stop when vent is fully open.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Window Move\nThe maxInt32Value and minInt32Value in each VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the window is closing in plane\/opening in the out of plane direction at the fastest speed.\nThe maxInt32Value indicates the window is opening in plane\/closing in the out of plane direction at the fastest speed.\nLarger absolute values, either positive or negative, indicate a faster movement speed. Once the window reaches the positional limit, the value must reset to 0. If WINDOW_MOVE's value is currently 0, then that means there is no movement currently occurring.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nFor a window that may open out of plane (i.e. vent mode of sunroof) this parameter will work as follows:\nIf sunroof is open: Max = open the sunroof further, automatically stop when fully open. Min = close the sunroof, automatically stop when sunroof is closed.\nIf vent is open: Max = close the vent, automatically stop when vent is closed. Min = open the vent further, automatically stop when vent is fully open.\nIf sunroof is in the closed position: Max = open the sunroof, automatically stop when sunroof is fully open. Min = open the vent, automatically stop when vent is fully open.\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Window Child Lock",
@@ -936,7 +936,7 @@
{
"name": "WINDSHIELD_WIPERS_PERIOD",
"value": 322964421,
- "description": "Windshield wipers period (milliseconds).\nReturns the instantaneous time period for 1 full cycle of the windshield wipers in milliseconds. A full cycle is defined as a wiper moving from and returning to its rest position.\nWhen an intermittent wiper setting is selected, this property value must be set to 0 during the \"pause\" period of the intermittent wiping.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined.\nThe minInt32Value must be set to 0 for each area ID.\nThe maxInt32Value for each area ID must specify the longest wiper period.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue."
+ "description": "Windshield wipers period (milliseconds).\nReturns the instantaneous time period for 1 full cycle of the windshield wipers in milliseconds. A full cycle is defined as a wiper moving from and returning to its rest position.\nWhen an intermittent wiper setting is selected, this property value must be set to 0 during the \"pause\" period of the intermittent wiping.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined.\nThe minInt32Value must be set to 0 for each area ID.\nThe maxInt32Value for each area ID must specify the longest wiper period.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue."
},
{
"name": "Windshield wipers state.",
@@ -945,7 +945,7 @@
"WindshieldWipersState"
],
"data_enum": "WindshieldWipersState",
- "description": "Windshield wipers state.\nReturns the current state of the windshield wipers. The value of WINDSHIELD_WIPERS_STATE may not match the value of WINDSHIELD_WIPERS_SWITCH. (e.g. WINDSHIELD_WIPERS_STATE = ON and WINDSHIELD_WIPERS_SWITCH = WindshieldWipersSwitch#AUTO).\nIf WINDSHIELD_WIPERS_STATE = ON and WINDSHIELD_WIPERS_PERIOD is implemented, then WINDSHIELD_WIPERS_PERIOD must reflect the time period of 1 full cycle of the wipers.\nFor each supported area ID, the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in WindshieldWipersState are supported (including OTHER, which is not recommended).\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} for the area ID unless all states in WindshieldWipersState are supported (including OTHER, which is not recommended). At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Windshield wipers state.\nReturns the current state of the windshield wipers. The value of WINDSHIELD_WIPERS_STATE may not match the value of WINDSHIELD_WIPERS_SWITCH. (e.g. WINDSHIELD_WIPERS_STATE = ON and WINDSHIELD_WIPERS_SWITCH = WindshieldWipersSwitch#AUTO).\nIf WINDSHIELD_WIPERS_STATE = ON and WINDSHIELD_WIPERS_PERIOD is implemented, then WINDSHIELD_WIPERS_PERIOD must reflect the time period of 1 full cycle of the wipers.\nFor each supported area ID, the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in WindshieldWipersState are supported (including OTHER, which is not recommended).\nIf {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID: {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Windshield wipers switch.",
@@ -954,27 +954,27 @@
"WindshieldWipersSwitch"
],
"data_enum": "WindshieldWipersSwitch",
- "description": "Windshield wipers switch.\nRepresents the position of the switch controlling the windshield wipers. The value of WINDSHIELD_WIPERS_SWITCH may not match the value of WINDSHIELD_WIPERS_STATE (e.g. WINDSHIELD_WIPERS_SWITCH = AUTO and WINDSHIELD_WIPERS_STATE = WindshieldWipersState#ON).\nFor each supported area ID, the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in WindshieldWipersSwitch are supported (including OTHER, which is not recommended).\nIf {@code HasSupportedValueInfo} for a specific area ID is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} for the area ID unless all states in WindshieldWipersSwitch are supported (including OTHER, which is not recommended). At boot, the supported values list is the same as supportedEnumValues.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only.\nIf this property is implemented as VehiclePropertyAccess.READ_WRITE and the OTHER state is listed in the VehicleAreaConfig#supportedEnumValues array, then OTHER is not a supported value for writing. It is only a supported value for reading."
+ "description": "Windshield wipers switch.\nRepresents the position of the switch controlling the windshield wipers. The value of WINDSHIELD_WIPERS_SWITCH may not match the value of WINDSHIELD_WIPERS_STATE (e.g. WINDSHIELD_WIPERS_SWITCH = AUTO and WINDSHIELD_WIPERS_STATE = WindshieldWipersState#ON).\nFor each supported area ID, the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in WindshieldWipersSwitch are supported (including OTHER, which is not recommended).\nIf {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID: {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only.\nIf this property is implemented as VehiclePropertyAccess.READ_WRITE and the OTHER state is listed in the VehicleAreaConfig#supportedEnumValues array, then OTHER is not a supported value for writing. It is only a supported value for reading."
},
{
"name": "Steering wheel depth position",
"value": 289410016,
- "description": "Steering wheel depth position\nAll steering wheel properties' unique ids start from 0x0BE0.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All values between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the steering wheel position closest to the driver.\nThe maxInt32Value indicates the steering wheel position furthest from the driver.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the closest and furthest positions.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Steering wheel depth position\nAll steering wheel properties' unique ids start from 0x0BE0.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All values between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the steering wheel position closest to the driver.\nThe maxInt32Value indicates the steering wheel position furthest from the driver.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the closest and furthest positions.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Steering wheel depth movement",
"value": 289410017,
- "description": "Steering wheel depth movement\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All values between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the steering wheel moving towards the driver.\nThe maxInt32Value indicates the steering wheel moving away from the driver.\nLarger integers, either positive or negative, indicate a faster movement speed. Once the steering wheel reaches the positional limit, the value must reset to 0. If STEERING_WHEEL_DEPTH_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Steering wheel depth movement\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All values between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the steering wheel moving towards the driver.\nThe maxInt32Value indicates the steering wheel moving away from the driver.\nLarger integers, either positive or negative, indicate a faster movement speed. Once the steering wheel reaches the positional limit, the value must reset to 0. If STEERING_WHEEL_DEPTH_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Steering wheel height position",
"value": 289410018,
- "description": "Steering wheel height position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All values between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the steering wheel being in the lowest position.\nThe maxInt32Value indicates the steering wheel being in the highest position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the lowest and highest positions.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Steering wheel height position\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All values between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the steering wheel being in the lowest position.\nThe maxInt32Value indicates the steering wheel being in the highest position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the lowest and highest positions.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Steering wheel height movement",
"value": 289410019,
- "description": "Steering wheel height movement\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All values between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the steering wheel moving downwards.\nThe maxInt32Value indicates the steering wheel moving upwards.\nLarger integers, either positive or negative, indicate a faster movement speed. Once the steering wheel reaches the positional limit, the value must reset to 0. If STEERING_WHEEL_HEIGHT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Steering wheel height movement\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All values between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates the steering wheel moving downwards.\nThe maxInt32Value indicates the steering wheel moving upwards.\nLarger integers, either positive or negative, indicate a faster movement speed. Once the steering wheel reaches the positional limit, the value must reset to 0. If STEERING_WHEEL_HEIGHT_MOVE's value is currently 0, then that means there is no movement currently occurring.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative movement speeds.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "STEERING_WHEEL_THEFT_LOCK_ENABLED",
@@ -994,7 +994,7 @@
{
"name": "GLOVE_BOX_DOOR_POS",
"value": 356518896,
- "description": "Property that represents the current position of the glove box door.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates that the glove box door is closed. The minInt32Value must be 0.\nThe maxInt32Value indicates that the glove box door is in the fully open position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the closed and fully open positions.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasMinSupportedValue} and {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThe area ID must match the seat by which the glove box is intended to be used (e.g. if the front right dashboard has a glove box embedded in it, then the area ID should be SEAT_1_RIGHT).\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Property that represents the current position of the glove box door.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. All integers between minInt32Value and maxInt32Value must be supported.\nThe minInt32Value indicates that the glove box door is closed. The minInt32Value must be 0.\nThe maxInt32Value indicates that the glove box door is in the fully open position.\nValues in between minInt32Value and maxInt32Value indicate a transition state between the closed and fully open positions.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value. All integers between minSupportedValue and maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to maxSupportedValue.\nThis property is not in any particular unit but in a specified range of relative positions.\nThe area ID must match the seat by which the glove box is intended to be used (e.g. if the front right dashboard has a glove box embedded in it, then the area ID should be SEAT_1_RIGHT).\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Lock or unlock the glove box.",
@@ -1068,7 +1068,7 @@
"VehicleLightState"
],
"data_enum": "VehicleLightState",
- "description": "Headlights State\nReturn the current state of headlights."
+ "description": "Headlights State\nReturn the current state of headlights.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "High beam lights state",
@@ -1077,7 +1077,7 @@
"VehicleLightState"
],
"data_enum": "VehicleLightState",
- "description": "High beam lights state\nReturn the current state of high beam lights."
+ "description": "High beam lights state\nReturn the current state of high beam lights.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Fog light state",
@@ -1086,7 +1086,7 @@
"VehicleLightState"
],
"data_enum": "VehicleLightState",
- "description": "Fog light state\nReturn the current state of fog lights.\nIf the car has both front and rear fog lights: If front and rear fog lights can only be controlled together: FOG_LIGHTS_STATE must be implemented. FRONT_FOG_LIGHTS_STATE and REAR_FOG_LIGHTS_STATE must not be implemented.\nIf the front and rear fog lights can only be controlled independently: FOG_LIGHTS_STATE must not be implemented. FRONT_FOG_LIGHTS_STATE and REAR_FOG_LIGHTS_STATE must be implemented.\nIf the car has only front fog lights: Only one of FOG_LIGHTS_STATE or FRONT_FOG_LIGHTS_STATE must be implemented and not both. REAR_FOG_LIGHTS_STATE must not be implemented.\nIf the car has only rear fog lights: Only one of FOG_LIGHTS_STATE or REAR_FOG_LIGHTS_STATE must be implemented and not both. FRONT_FOG_LIGHTS_STATE must not be implemented."
+ "description": "Fog light state\nReturn the current state of fog lights.\nIf the car has both front and rear fog lights: If front and rear fog lights can only be controlled together: FOG_LIGHTS_STATE must be implemented. FRONT_FOG_LIGHTS_STATE and REAR_FOG_LIGHTS_STATE must not be implemented.\nIf the front and rear fog lights can only be controlled independently: FOG_LIGHTS_STATE must not be implemented. FRONT_FOG_LIGHTS_STATE and REAR_FOG_LIGHTS_STATE must be implemented.\nIf the car has only front fog lights: Only one of FOG_LIGHTS_STATE or FRONT_FOG_LIGHTS_STATE must be implemented and not both. REAR_FOG_LIGHTS_STATE must not be implemented.\nIf the car has only rear fog lights: Only one of FOG_LIGHTS_STATE or REAR_FOG_LIGHTS_STATE must be implemented and not both. FRONT_FOG_LIGHTS_STATE must not be implemented.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Hazard light status",
@@ -1095,7 +1095,7 @@
"VehicleLightState"
],
"data_enum": "VehicleLightState",
- "description": "Hazard light status\nReturn the current status of hazard lights."
+ "description": "Hazard light status\nReturn the current status of hazard lights.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Headlight switch",
@@ -1104,7 +1104,7 @@
"VehicleLightSwitch"
],
"data_enum": "VehicleLightSwitch",
- "description": "Headlight switch\nThe setting that the user wants.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Headlight switch\nThe setting that the user wants.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightSwitch are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "High beam light switch",
@@ -1113,7 +1113,7 @@
"VehicleLightSwitch"
],
"data_enum": "VehicleLightSwitch",
- "description": "High beam light switch\nThe setting that the user wants.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "High beam light switch\nThe setting that the user wants.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightSwitch are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Fog light switch",
@@ -1122,7 +1122,7 @@
"VehicleLightSwitch"
],
"data_enum": "VehicleLightSwitch",
- "description": "Fog light switch\nThe setting that the user wants.\nIf the car has both front and rear fog lights: If front and rear fog lights can only be controlled together: FOG_LIGHTS_SWITCH must be implemented. FRONT_FOG_LIGHTS_SWITCH and REAR_FOG_LIGHTS_SWITCH must not be implemented.\nIf the front and rear fog lights can only be controlled independently: FOG_LIGHTS_SWITCH must not be implemented. FRONT_FOG_LIGHTS_SWITCH and REAR_FOG_LIGHTS_SWITCH must be implemented.\nIf the car has only front fog lights: Only one of FOG_LIGHTS_SWITCH or FRONT_FOG_LIGHTS_SWITCH must be implemented and not both. REAR_FOG_LIGHTS_SWITCH must not be implemented.\nIf the car has only rear fog lights: Only one of FOG_LIGHTS_SWITCH or REAR_FOG_LIGHTS_SWITCH must be implemented and not both. FRONT_FOG_LIGHTS_SWITCH must not be implemented.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Fog light switch\nThe setting that the user wants.\nIf the car has both front and rear fog lights: If front and rear fog lights can only be controlled together: FOG_LIGHTS_SWITCH must be implemented. FRONT_FOG_LIGHTS_SWITCH and REAR_FOG_LIGHTS_SWITCH must not be implemented.\nIf the front and rear fog lights can only be controlled independently: FOG_LIGHTS_SWITCH must not be implemented. FRONT_FOG_LIGHTS_SWITCH and REAR_FOG_LIGHTS_SWITCH must be implemented.\nIf the car has only front fog lights: Only one of FOG_LIGHTS_SWITCH or FRONT_FOG_LIGHTS_SWITCH must be implemented and not both. REAR_FOG_LIGHTS_SWITCH must not be implemented.\nIf the car has only rear fog lights: Only one of FOG_LIGHTS_SWITCH or REAR_FOG_LIGHTS_SWITCH must be implemented and not both. FRONT_FOG_LIGHTS_SWITCH must not be implemented.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightSwitch are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Hazard light switch",
@@ -1131,7 +1131,7 @@
"VehicleLightSwitch"
],
"data_enum": "VehicleLightSwitch",
- "description": "Hazard light switch\nThe setting that the user wants.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Hazard light switch\nThe setting that the user wants.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightSwitch are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Cabin lights",
@@ -1140,7 +1140,7 @@
"VehicleLightState"
],
"data_enum": "VehicleLightState",
- "description": "Cabin lights\nReturn current status of cabin lights."
+ "description": "Cabin lights\nReturn current status of cabin lights.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Cabin lights switch",
@@ -1149,7 +1149,7 @@
"VehicleLightSwitch"
],
"data_enum": "VehicleLightSwitch",
- "description": "Cabin lights switch\nThe position of the physical switch which controls the cabin lights. This might be different than the CABIN_LIGHTS_STATE if the lights are on because a door is open or because of a voice command. For example, while the switch is in the \"off\" or \"automatic\" position.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Cabin lights switch\nThe position of the physical switch which controls the cabin lights. This might be different than the CABIN_LIGHTS_STATE if the lights are on because a door is open or because of a voice command. For example, while the switch is in the \"off\" or \"automatic\" position.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightSwitch are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Reading lights",
@@ -1158,7 +1158,7 @@
"VehicleLightState"
],
"data_enum": "VehicleLightState",
- "description": "Reading lights\nReturn current status of reading lights."
+ "description": "Reading lights\nReturn current status of reading lights.\nFor each supported area ID, the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID: {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Reading lights switch",
@@ -1167,7 +1167,7 @@
"VehicleLightSwitch"
],
"data_enum": "VehicleLightSwitch",
- "description": "Reading lights switch\nThe position of the physical switch which controls the reading lights. This might be different than the READING_LIGHTS_STATE if the lights are on because a door is open or because of a voice command. For example, while the switch is in the \"off\" or \"automatic\" position.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Reading lights switch\nThe position of the physical switch which controls the reading lights. This might be different than the READING_LIGHTS_STATE if the lights are on because a door is open or because of a voice command. For example, while the switch is in the \"off\" or \"automatic\" position.\nFor each supported area ID, the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightSwitch are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID: {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Steering wheel lights state",
@@ -1176,7 +1176,7 @@
"VehicleLightState"
],
"data_enum": "VehicleLightState",
- "description": "Steering wheel lights state\nRepresents the current state of the steering wheel lights. This is different from STEERING_WHEEL_LIGHTS_SWITCH which represents the position of the switch controlling the lights. Therefore, STEERING_WHEEL_LIGHTS_STATE may not match the value of STEERING_WHEEL_LIGHTS_SWITCH (e.g. STEERING_WHEEL_LIGHTS_SWITCH=AUTOMATIC and STEERING_WHEEL_LIGHTS_STATE=ON).\nThis property should only be implemented if STEERING_WHEEL_LIGHTS_STATE's value may be different from that of CABIN_LIGHTS_STATE.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues must be defined unless all enum values of VehicleLightState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all enum values of VehicleLightState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Steering wheel lights state\nRepresents the current state of the steering wheel lights. This is different from STEERING_WHEEL_LIGHTS_SWITCH which represents the position of the switch controlling the lights. Therefore, STEERING_WHEEL_LIGHTS_STATE may not match the value of STEERING_WHEEL_LIGHTS_SWITCH (e.g. STEERING_WHEEL_LIGHTS_SWITCH=AUTOMATIC and STEERING_WHEEL_LIGHTS_STATE=ON).\nThis property should only be implemented if STEERING_WHEEL_LIGHTS_STATE's value may be different from that of CABIN_LIGHTS_STATE.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues must be defined unless all enum values of VehicleLightState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Steering wheel lights switch",
@@ -1185,7 +1185,7 @@
"VehicleLightSwitch"
],
"data_enum": "VehicleLightSwitch",
- "description": "Steering wheel lights switch\nRepresents the position of the switch controlling the steering wheel lights. This is different from STEERING_WHEEL_LIGHTS_STATE which represents the current state of the steering wheel lights. Therefore, STEERING_WHEEL_LIGHTS_SWITCH may not match the value of STEERING_WHEEL_LIGHTS_STATE (e.g. STEERING_WHEEL_LIGHTS_SWITCH=AUTOMATIC and STEERING_WHEEL_LIGHTS_STATE=ON).\nThis property should only be implemented if STEERING_WHEEL_LIGHTS_SWITCH's value may be different from that of CABIN_LIGHTS_SWITCH.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues must be defined unless all enum values of VehicleLightSwitch are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all enum values of VehicleLightSwitch are supported. At boot, the supported values list is the same as supportedEnumValues.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Steering wheel lights switch\nRepresents the position of the switch controlling the steering wheel lights. This is different from STEERING_WHEEL_LIGHTS_STATE which represents the current state of the steering wheel lights. Therefore, STEERING_WHEEL_LIGHTS_SWITCH may not match the value of STEERING_WHEEL_LIGHTS_STATE (e.g. STEERING_WHEEL_LIGHTS_SWITCH=AUTOMATIC and STEERING_WHEEL_LIGHTS_STATE=ON).\nThis property should only be implemented if STEERING_WHEEL_LIGHTS_SWITCH's value may be different from that of CABIN_LIGHTS_SWITCH.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues must be defined unless all enum values of VehicleLightSwitch are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "SUPPORT_CUSTOMIZE_VENDOR_PERMISSION",
@@ -1289,7 +1289,7 @@
"ElectronicTollCollectionCardType"
],
"data_enum": "ElectronicTollCollectionCardType",
- "description": "Electronic Toll Collection card type.\nThis property indicates the type of ETC card in this vehicle. If the head unit is aware of an ETC card attached to the vehicle, this property should return the type of card attached; otherwise, this property should be UNAVAILABLE."
+ "description": "Electronic Toll Collection card type.\nThis property indicates the type of ETC card in this vehicle. If the head unit is aware of an ETC card attached to the vehicle, this property should return the type of card attached; otherwise, this property should be UNAVAILABLE.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in ElectronicTollCollectionCardType are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "ELECTRONIC_TOLL_COLLECTION_CARD_STATUS",
@@ -1298,7 +1298,7 @@
"ElectronicTollCollectionCardStatus"
],
"data_enum": "ElectronicTollCollectionCardStatus",
- "description": "Electronic Toll Collection card status.\nThis property indicates the status of ETC card in this vehicle. If the head unit is aware of an ETC card attached to the vehicle, ELECTRONIC_TOLL_COLLECTION_CARD_TYPE gives that status of the card; otherwise, this property should be UNAVAILABLE."
+ "description": "Electronic Toll Collection card status.\nThis property indicates the status of ETC card in this vehicle. If the head unit is aware of an ETC card attached to the vehicle, ELECTRONIC_TOLL_COLLECTION_CARD_TYPE gives that status of the card; otherwise, this property should be UNAVAILABLE.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in ElectronicTollCollectionCardStatus are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Front fog lights state",
@@ -1307,7 +1307,7 @@
"VehicleLightState"
],
"data_enum": "VehicleLightState",
- "description": "Front fog lights state\nReturn the current state of the front fog lights. Only one of FOG_LIGHTS_STATE or FRONT_FOG_LIGHTS_STATE must be implemented. Please refer to the documentation on FOG_LIGHTS_STATE for more information."
+ "description": "Front fog lights state\nReturn the current state of the front fog lights. Only one of FOG_LIGHTS_STATE or FRONT_FOG_LIGHTS_STATE must be implemented. Please refer to the documentation on FOG_LIGHTS_STATE for more information.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Front fog lights switch",
@@ -1316,7 +1316,7 @@
"VehicleLightSwitch"
],
"data_enum": "VehicleLightSwitch",
- "description": "Front fog lights switch\nThe setting that the user wants. Only one of FOG_LIGHTS_SWITCH or FRONT_FOG_LIGHTS_SWITCH must be implemented. Please refer to the documentation on FOG_LIGHTS_SWITCH for more information.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Front fog lights switch\nThe setting that the user wants. Only one of FOG_LIGHTS_SWITCH or FRONT_FOG_LIGHTS_SWITCH must be implemented. Please refer to the documentation on FOG_LIGHTS_SWITCH for more information.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightSwitch are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Rear fog lights state",
@@ -1325,7 +1325,7 @@
"VehicleLightState"
],
"data_enum": "VehicleLightState",
- "description": "Rear fog lights state\nReturn the current state of the rear fog lights. Only one of FOG_LIGHTS_STATE or REAR_FOG_LIGHTS_STATE must be implemented. Please refer to the documentation on FOG_LIGHTS_STATE for more information."
+ "description": "Rear fog lights state\nReturn the current state of the rear fog lights. Only one of FOG_LIGHTS_STATE or REAR_FOG_LIGHTS_STATE must be implemented. Please refer to the documentation on FOG_LIGHTS_STATE for more information.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "Rear fog lights switch",
@@ -1334,17 +1334,17 @@
"VehicleLightSwitch"
],
"data_enum": "VehicleLightSwitch",
- "description": "Rear fog lights switch\nThe setting that the user wants. Only one of FOG_LIGHTS_SWITCH or REAR_FOG_LIGHTS_SWITCH must be implemented. Please refer to the documentation on FOG_LIGHTS_SWITCH for more information.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Rear fog lights switch\nThe setting that the user wants. Only one of FOG_LIGHTS_SWITCH or REAR_FOG_LIGHTS_SWITCH must be implemented. Please refer to the documentation on FOG_LIGHTS_SWITCH for more information.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in VehicleLightSwitch are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "EV_CHARGE_CURRENT_DRAW_LIMIT",
"value": 291508031,
- "description": "Indicates the maximum current draw threshold for charging set by the user\nconfigArray[0] is used to specify the max current draw allowed by the vehicle in Amperes.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Indicates the maximum current draw threshold for charging set by the user\nconfigArray[0] is used to specify the max current draw allowed by the vehicle in Amperes at boot time.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}, {@code HasSupportedValueInfo#hasMaxSupportedValue} and {@code HasSupportedValueInfo#hasMinSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult#maxSupportedValue} specifies the max current draw allowed by the vehicle in Amperes at the current moment. {@code MinMaxSupportedValueResult#minSupportedValue} must be 0. At boot, configArray[0] is equal to maxSupportedValue.\nIf the max current draw allowed by the vehicle may change dynamically, {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} and {@code MinMaxSupportedValueResult#maxSupportedValue} must be implemented.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "EV_CHARGE_PERCENT_LIMIT",
"value": 291508032,
- "description": "Indicates the maximum charge percent threshold set by the user\nReturns a float value from 0 to 100.\nconfigArray is used to specify the valid values. For example, if the vehicle supports the following charge percent limit values: [20, 40, 60, 80, 100] then the configArray should be {20, 40, 60, 80, 100} If the configArray is empty then all values from 0 to 100 must be valid.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Indicates the maximum charge percent threshold set by the user\nReturns a float value from 0 to 100.\nconfigArray is used to specify the valid values at boot time. For example, if the vehicle supports the following charge percent limit values: [20, 40, 60, 80, 100] then the configArray should be {20, 40, 60, 80, 100} If the configArray is empty then all values from 0 to 100 must be valid.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}, {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. {@code SupportedValuesListResult#supportedValuesList} specifies the valid maximum charge percent threshold options at the current moment. At boot, configArray content must match the supported values list.\nIf the valid values may change dynamically, {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true} and {@code SupportedValuesListResult#supportedValuesList} must be implemented.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "Charging state of the car",
@@ -1353,7 +1353,7 @@
"EvChargeState"
],
"data_enum": "EvChargeState",
- "description": "Charging state of the car\nReturns the current charging state of the car.\nIf the vehicle has a target charge percentage other than 100, this property must return EvChargeState::STATE_FULLY_CHARGED when the battery charge level has reached the target level. See EV_CHARGE_PERCENT_LIMIT for more context."
+ "description": "Charging state of the car\nReturns the current charging state of the car.\nIf the vehicle has a target charge percentage other than 100, this property must return EvChargeState::STATE_FULLY_CHARGED when the battery charge level has reached the target level. See EV_CHARGE_PERCENT_LIMIT for more context.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in EvChargeState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "EV_CHARGE_SWITCH",
@@ -1372,7 +1372,7 @@
"EvRegenerativeBrakingState"
],
"data_enum": "EvRegenerativeBrakingState",
- "description": "Regenerative braking or one-pedal drive setting of the car\nReturns the current setting associated with the regenerative braking setting in the car\nIf the OEM requires more setting than those provided in EvRegenerativeBrakingState, the EV_BRAKE_REGENERATION_LEVEL property can be used instead, which provides a more granular way of providing the same information."
+ "description": "Regenerative braking or one-pedal drive setting of the car\nReturns the current setting associated with the regenerative braking setting in the car\nIf the OEM requires more setting than those provided in EvRegenerativeBrakingState, the EV_BRAKE_REGENERATION_LEVEL property can be used instead, which provides a more granular way of providing the same information.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in EvRegenerativeBrakingState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "TRAILER_PRESENT",
@@ -1381,7 +1381,7 @@
"TrailerState"
],
"data_enum": "TrailerState",
- "description": "Indicates if there is a trailer present or not.\nReturns the trailer state of the car."
+ "description": "Indicates if there is a trailer present or not.\nReturns the trailer state of the car.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states in TrailerState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "VEHICLE_CURB_WEIGHT",
@@ -1428,7 +1428,7 @@
"VehicleAutonomousState"
],
"data_enum": "VehicleAutonomousState",
- "description": "Current state of vehicle autonomy.\nDefines the level of autonomy currently engaged in the vehicle from the J3016_202104 revision of the SAE standard levels 0-5, with 0 representing no autonomy and 5 representing full driving automation.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of VehicleAutonomousState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all enum values of VehicleAutonomousState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Current state of vehicle autonomy.\nDefines the level of autonomy currently engaged in the vehicle from the J3016_202104 revision of the SAE standard levels 0-5, with 0 representing no autonomy and 5 representing full driving automation.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of VehicleAutonomousState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "VEHICLE_DRIVING_AUTOMATION_TARGET_LEVEL",
@@ -1437,7 +1437,7 @@
"VehicleAutonomousState"
],
"data_enum": "VehicleAutonomousState",
- "description": "Target state of vehicle autonomy.\nDefines the level of autonomy being targeted by the vehicle from the J3016_202104 revision of the SAE standard levels 0-5, with 0 representing no autonomy and 5 representing full driving automation.\nFor example, suppose the vehicle is currently in a Level 3 state of automation and wants to give the driver full manual control (i.e. Level 0) as soon as it's safe to do so. In this scenario, this property must be set to VehicleAutonomousState.LEVEL_0. Similarly, if the vehicle is currently in Level 1 state of automation and wants to go up to Level 2, this property must be set to VehicleAutonomousState.LEVEL_2. If the vehicle has already reached and is currently in the target level of autonomy, this property must be equal to the value of VEHICLE_DRIVING_AUTOMATION_CURRENT_LEVEL.\nFor the global area ID (0), the SupportedValuesListResult#supportedValuesList array must be defined unless all states of VehicleAutonomousState are supported. These values must match the values in supportedValuesList of VEHICLE_DRIVING_AUTOMATION_CURRENT_LEVEL.\nFor the property that communicates the current state of autonomy, see VEHICLE_DRIVING_AUTOMATION_CURRENT_LEVEL."
+ "description": "Target state of vehicle autonomy.\nDefines the level of autonomy being targeted by the vehicle from the J3016_202104 revision of the SAE standard levels 0-5, with 0 representing no autonomy and 5 representing full driving automation.\nFor example, suppose the vehicle is currently in a Level 3 state of automation and wants to give the driver full manual control (i.e. Level 0) as soon as it's safe to do so. In this scenario, this property must be set to VehicleAutonomousState.LEVEL_0. Similarly, if the vehicle is currently in Level 1 state of automation and wants to go up to Level 2, this property must be set to VehicleAutonomousState.LEVEL_2. If the vehicle has already reached and is currently in the target level of autonomy, this property must be equal to the value of VEHICLE_DRIVING_AUTOMATION_CURRENT_LEVEL.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of VehicleAutonomousState are supported. The supported values for this property must be the same as the supported values for VEHICLE_DRIVING_AUTOMATION_CURRENT_LEVEL.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nFor the property that communicates the current state of autonomy, see VEHICLE_DRIVING_AUTOMATION_CURRENT_LEVEL."
},
{
"name": "CAMERA_SERVICE_CURRENT_STATE",
@@ -1466,7 +1466,7 @@
"ErrorState"
],
"data_enum": "AutomaticEmergencyBrakingState",
- "description": "Automatic Emergency Braking (AEB) state.\nReturns the current state of AEB. This property must always return a valid state defined in AutomaticEmergencyBrakingState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead. This property should apply for higher speed applications only. For representing the state of the low speed automatic emergency braking system, LOW_SPEED_AUTOMATIC_EMERGENCY_BRAKING_STATE should be used.\nIf AEB includes forward collision warnings before activating the brakes, those warnings must be surfaced through the Forward Collision Warning (FCW) properties.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both AutomaticEmergencyBrakingState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of both AutomaticEmergencyBrakingState (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Automatic Emergency Braking (AEB) state.\nReturns the current state of AEB. This property must always return a valid state defined in AutomaticEmergencyBrakingState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead. This property should apply for higher speed applications only. For representing the state of the low speed automatic emergency braking system, LOW_SPEED_AUTOMATIC_EMERGENCY_BRAKING_STATE should be used.\nIf AEB includes forward collision warnings before activating the brakes, those warnings must be surfaced through the Forward Collision Warning (FCW) properties.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both AutomaticEmergencyBrakingState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "FORWARD_COLLISION_WARNING_ENABLED",
@@ -1481,7 +1481,7 @@
"ErrorState"
],
"data_enum": "ForwardCollisionWarningState",
- "description": "Forward Collision Warning (FCW) state.\nReturns the current state of FCW. This property must always return a valid state defined in ForwardCollisionWarningState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both ForwardCollisionWarningState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of both ForwardCollisionWarningState (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Forward Collision Warning (FCW) state.\nReturns the current state of FCW. This property must always return a valid state defined in ForwardCollisionWarningState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both ForwardCollisionWarningState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "BLIND_SPOT_WARNING_ENABLED",
@@ -1496,7 +1496,7 @@
"ErrorState"
],
"data_enum": "BlindSpotWarningState",
- "description": "Blind Spot Warning (BSW) state.\nReturns the current state of BSW. This property must always return a valid state defined in BlindSpotWarningState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead.\nFor each supported area ID, the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both BlindSpotWarningState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of both BlindSpotWarningState (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Blind Spot Warning (BSW) state.\nReturns the current state of BSW. This property must always return a valid state defined in BlindSpotWarningState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead.\nFor each supported area ID, the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both BlindSpotWarningState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "LANE_DEPARTURE_WARNING_ENABLED",
@@ -1511,7 +1511,7 @@
"ErrorState"
],
"data_enum": "LaneDepartureWarningState",
- "description": "Lane Departure Warning (LDW) state.\nReturns the current state of LDW. This property must always return a valid state defined in LaneDepartureWarningState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both LaneDepartureWarningState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of both LaneDepartureWarningState (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Lane Departure Warning (LDW) state.\nReturns the current state of LDW. This property must always return a valid state defined in LaneDepartureWarningState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both LaneDepartureWarningState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "LANE_KEEP_ASSIST_ENABLED",
@@ -1526,7 +1526,7 @@
"ErrorState"
],
"data_enum": "LaneKeepAssistState",
- "description": "Lane Keep Assist (LKA) state.\nReturns the current state of LKA. This property must always return a valid state defined in LaneKeepAssistState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead.\nIf LKA includes lane departure warnings before applying steering corrections, those warnings must be surfaced through the Lane Departure Warning (LDW) properties.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both LaneKeepAssistState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of both LaneKeepAssistState (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Lane Keep Assist (LKA) state.\nReturns the current state of LKA. This property must always return a valid state defined in LaneKeepAssistState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead.\nIf LKA includes lane departure warnings before applying steering corrections, those warnings must be surfaced through the Lane Departure Warning (LDW) properties.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both LaneKeepAssistState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "LANE_CENTERING_ASSIST_ENABLED",
@@ -1540,7 +1540,7 @@
"LaneCenteringAssistCommand"
],
"data_enum": "LaneCenteringAssistCommand",
- "description": "Lane Centering Assist (LCA) commands.\nCommands to activate and suspend LCA.\nWhen the command ACTIVATE from LaneCenteringAssistCommand is sent, LANE_CENTERING_ASSIST_STATE must be set to LaneCenteringAssistState#ACTIVATION_REQUESTED. When the ACTIVATE command succeeds, LANE_CENTERING_ASSIST_STATE must be set to LaneCenteringAssistState#ACTIVATED. When the command DEACTIVATE from LaneCenteringAssistCommand succeeds, LANE_CENTERING_ASSIST_STATE must be set to LaneCenteringAssistState#ENABLED.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues must be defined unless all enum values of LaneCenteringAssistCommand are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all enum values of LaneCenteringAssistCommand are supported. At boot, the supported values list is the same as supportedEnumValues.\nWhen this property is not available because LCA is disabled (i.e. LANE_CENTERING_ASSIST_ENABLED is false), this property must return StatusCode#NOT_AVAILABLE_DISABLED. If LANE_CENTERING_ASSIST_STATE is implemented and the state is set to an ErrorState value, then this property must return a StatusCode that aligns with the ErrorState value. For example, if LANE_CENTERING_ASSIST_STATE is set to ErrorState#NOT_AVAILABLE_SPEED_LOW, then this property must return StatusCode#NOT_AVAILABLE_SPEED_LOW."
+ "description": "Lane Centering Assist (LCA) commands.\nCommands to activate and suspend LCA.\nWhen the command ACTIVATE from LaneCenteringAssistCommand is sent, LANE_CENTERING_ASSIST_STATE must be set to LaneCenteringAssistState#ACTIVATION_REQUESTED. When the ACTIVATE command succeeds, LANE_CENTERING_ASSIST_STATE must be set to LaneCenteringAssistState#ACTIVATED. When the command DEACTIVATE from LaneCenteringAssistCommand succeeds, LANE_CENTERING_ASSIST_STATE must be set to LaneCenteringAssistState#ENABLED.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues must be defined unless all enum values of LaneCenteringAssistCommand are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nWhen this property is not available because LCA is disabled (i.e. LANE_CENTERING_ASSIST_ENABLED is false), this property must return StatusCode#NOT_AVAILABLE_DISABLED. If LANE_CENTERING_ASSIST_STATE is implemented and the state is set to an ErrorState value, then this property must return a StatusCode that aligns with the ErrorState value. For example, if LANE_CENTERING_ASSIST_STATE is set to ErrorState#NOT_AVAILABLE_SPEED_LOW, then this property must return StatusCode#NOT_AVAILABLE_SPEED_LOW."
},
{
"name": "LANE_CENTERING_ASSIST_STATE",
@@ -1550,7 +1550,7 @@
"ErrorState"
],
"data_enum": "LaneCenteringAssistState",
- "description": "Lane Centering Assist (LCA) state.\nReturns the current state of LCA. This property must always return a valid state defined in LaneCenteringAssistState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead.\nIf LCA includes lane departure warnings, those warnings must be surfaced through the Lane Departure Warning (LDW) properties.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both LaneCenteringAssistState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of both LaneCenteringAssistState (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Lane Centering Assist (LCA) state.\nReturns the current state of LCA. This property must always return a valid state defined in LaneCenteringAssistState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead.\nIf LCA includes lane departure warnings, those warnings must be surfaced through the Lane Departure Warning (LDW) properties.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both LaneCenteringAssistState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "EMERGENCY_LANE_KEEP_ASSIST_ENABLED",
@@ -1565,7 +1565,7 @@
"ErrorState"
],
"data_enum": "EmergencyLaneKeepAssistState",
- "description": "Emergency Lane Keep Assist (ELKA) state.\nReturns the current state of ELKA. Generally, this property should return a valid state defined in the EmergencyLaneKeepAssistState or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through ErrorState.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of EmergencyLaneKeepAssistState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of EmergencyLaneKeepAssistState (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Emergency Lane Keep Assist (ELKA) state.\nReturns the current state of ELKA. Generally, this property should return a valid state defined in the EmergencyLaneKeepAssistState or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through ErrorState.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of EmergencyLaneKeepAssistState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "CRUISE_CONTROL_ENABLED",
@@ -1580,7 +1580,7 @@
"ErrorState"
],
"data_enum": "CruiseControlType",
- "description": "Current type of Cruise Control (CC).\nWhen CRUISE_CONTROL_ENABLED is true, this property returns the type of CC that is currently enabled (for example, standard CC, adaptive CC, predictive CC, etc.). Generally, this property should return a valid state defined in the CruiseControlType or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through ErrorState.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of CruiseControlType (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of CruiseControlType (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues.\nTrying to write CruiseControlType#OTHER or an ErrorState to this property will throw an IllegalArgumentException.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Current type of Cruise Control (CC).\nWhen CRUISE_CONTROL_ENABLED is true, this property returns the type of CC that is currently enabled (for example, standard CC, adaptive CC, predictive CC, etc.). Generally, this property should return a valid state defined in the CruiseControlType or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through ErrorState.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of CruiseControlType (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nTrying to write CruiseControlType#OTHER or an ErrorState to this property will throw an IllegalArgumentException.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "CRUISE_CONTROL_STATE",
@@ -1590,7 +1590,7 @@
"ErrorState"
],
"data_enum": "CruiseControlState",
- "description": "Current state of Cruise Control (CC).\nThis property returns the current state of CC. Generally, this property should return a valid state defined in the CruiseControlState or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through ErrorState.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of CruiseControlState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of CruiseControlState (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Current state of Cruise Control (CC).\nThis property returns the current state of CC. Generally, this property should return a valid state defined in the CruiseControlState or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through ErrorState.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of CruiseControlState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "CRUISE_CONTROL_COMMAND",
@@ -1599,22 +1599,22 @@
"CruiseControlCommand"
],
"data_enum": "CruiseControlCommand",
- "description": "Write Cruise Control (CC) commands.\nSee CruiseControlCommand for the details about each supported command.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of CruiseControlState are supported. Any unsupported commands sent through this property must return StatusCode#INVALID_ARG.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of CruiseControlState are supported. At boot, the supported values list is the same as supportedEnumValues.\nWhen this property is not available because CC is disabled (i.e. CRUISE_CONTROL_ENABLED is false), this property must return StatusCode#NOT_AVAILABLE_DISABLED. If CRUISE_CONTROL_STATE is implemented and the state is set to an ErrorState value, then this property must return a StatusCode that aligns with the ErrorState value. For example, if CRUISE_CONTROL_STATE is set to ErrorState#NOT_AVAILABLE_SPEED_LOW, then this property must return StatusCode#NOT_AVAILABLE_SPEED_LOW."
+ "description": "Write Cruise Control (CC) commands.\nSee CruiseControlCommand for the details about each supported command.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of CruiseControlState are supported. Any unsupported commands sent through this property must return StatusCode#INVALID_ARG.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list.\nWhen this property is not available because CC is disabled (i.e. CRUISE_CONTROL_ENABLED is false), this property must return StatusCode#NOT_AVAILABLE_DISABLED. If CRUISE_CONTROL_STATE is implemented and the state is set to an ErrorState value, then this property must return a StatusCode that aligns with the ErrorState value. For example, if CRUISE_CONTROL_STATE is set to ErrorState#NOT_AVAILABLE_SPEED_LOW, then this property must return StatusCode#NOT_AVAILABLE_SPEED_LOW."
},
{
"name": "CRUISE_CONTROL_TARGET_SPEED",
"value": 291508243,
- "description": "Current target speed for Cruise Control (CC).\nOEMs should set the minFloatValue and maxFloatValue values for this property to define the min and max target speed values. These values must be non-negative.\nThe maxFloatValue represents the upper bound of the target speed. The minFloatValue represents the lower bound of the target speed.\nWhen this property is not available because CC is disabled (i.e. CRUISE_CONTROL_ENABLED is false), this property must return StatusCode#NOT_AVAILABLE_DISABLED. If CRUISE_CONTROL_STATE is implemented and the state is set to an ErrorState value, then this property must return a StatusCode that aligns with the ErrorState value. For example, if CRUISE_CONTROL_STATE is set to ErrorState#NOT_AVAILABLE_SPEED_LOW, then this property must return StatusCode#NOT_AVAILABLE_SPEED_LOW."
+ "description": "Current target speed for Cruise Control (CC).\nOEMs should set the minFloatValue and maxFloatValue values for this property to define the min and max target speed values. These values must be non-negative.\nThe minFloatValue represents the lower bound of the target speed.\nThe maxFloatValue represents the upper bound of the target speed.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minFloatValue. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxFloatValue.\nWhen this property is not available because CC is disabled (i.e. CRUISE_CONTROL_ENABLED is false), this property must return StatusCode#NOT_AVAILABLE_DISABLED. If CRUISE_CONTROL_STATE is implemented and the state is set to an ErrorState value, then this property must return a StatusCode that aligns with the ErrorState value. For example, if CRUISE_CONTROL_STATE is set to ErrorState#NOT_AVAILABLE_SPEED_LOW, then this property must return StatusCode#NOT_AVAILABLE_SPEED_LOW."
},
{
"name": "ADAPTIVE_CRUISE_CONTROL_TARGET_TIME_GAP",
"value": 289411092,
- "description": "Current target time gap for Adaptive Cruise Control (ACC) or Predictive Cruise Control in milliseconds.\nThis property should specify the target time gap to a leading vehicle. This gap is defined as the time to travel the distance between the leading vehicle's rear-most point to the ACC vehicle's front-most point. The actual time gap from a leading vehicle can be above or below this value.\nThe possible values to set for the target time gap should be specified in configArray in ascending order. All values must be positive. If the property is writable, all values must be writable.\nWhen this property is not available because CC is disabled (i.e. CRUISE_CONTROL_ENABLED is false), this property must return StatusCode#NOT_AVAILABLE_DISABLED. If CRUISE_CONTROL_STATE is implemented and the state is set to an ErrorState value, then this property must return a StatusCode that aligns with the ErrorState value. For example, if CRUISE_CONTROL_STATE is set to ErrorState#NOT_AVAILABLE_SPEED_LOW, then this property must return StatusCode#NOT_AVAILABLE_SPEED_LOW.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
+ "description": "Current target time gap for Adaptive Cruise Control (ACC) or Predictive Cruise Control in milliseconds.\nThis property should specify the target time gap to a leading vehicle. This gap is defined as the time to travel the distance between the leading vehicle's rear-most point to the ACC vehicle's front-most point. The actual time gap from a leading vehicle can be above or below this value.\nThe possible values to set for the target time gap at boot time should be specified in configArray in ascending order. All values must be positive. If the property is writable, all values must be writable.\nIf {@code HasSupportedValueInfo} is not {@code null}, {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. The supported values list represents the possible values to set at the current moment.\nIf the possible values to set may change dynamically, {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true} and the supported values list must be implemented.\nWhen this property is not available because CC is disabled (i.e. CRUISE_CONTROL_ENABLED is false), this property must return StatusCode#NOT_AVAILABLE_DISABLED. If CRUISE_CONTROL_STATE is implemented and the state is set to an ErrorState value, then this property must return a StatusCode that aligns with the ErrorState value. For example, if CRUISE_CONTROL_STATE is set to ErrorState#NOT_AVAILABLE_SPEED_LOW, then this property must return StatusCode#NOT_AVAILABLE_SPEED_LOW.\nThis property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to implement it as VehiclePropertyAccess.READ only."
},
{
"name": "ADAPTIVE_CRUISE_CONTROL_LEAD_VEHICLE_MEASURED_DISTANCE",
"value": 289411093,
- "description": "Measured distance from leading vehicle when using Adaptive Cruise Control (ACC) or Predictive Cruise Control.\nReturns the measured distance in millimeters between the rear-most point of the leading vehicle and the front-most point of the ACC vehicle.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined. The minInt32Value should be 0. The maxInt32Value should be populated with the maximum range the distance sensor can support. This value should be non-negative.\nWhen no lead vehicle is detected (that is, when there is no leading vehicle or the leading vehicle is too far away for the sensor to detect), this property should return StatusCode.NOT_AVAILABLE.\nWhen this property is not available because CC is disabled (i.e. CRUISE_CONTROL_ENABLED is false), this property must return StatusCode#NOT_AVAILABLE_DISABLED. If CRUISE_CONTROL_STATE is implemented and the state is set to an ErrorState value, then this property must return a StatusCode that aligns with the ErrorState value. For example, if CRUISE_CONTROL_STATE is set to ErrorState#NOT_AVAILABLE_SPEED_LOW, then this property must return StatusCode#NOT_AVAILABLE_SPEED_LOW."
+ "description": "Measured distance from leading vehicle when using Adaptive Cruise Control (ACC) or Predictive Cruise Control.\nReturns the measured distance in millimeters between the rear-most point of the leading vehicle and the front-most point of the ACC vehicle.\nThe maxInt32Value and minInt32Value in VehicleAreaConfig must be defined.\nThe minInt32Value should be 0.\nThe maxInt32Value should be populated with the maximum range the distance sensor can support. This value should be non-negative.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo#hasMinSupportedValue} and {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}. {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value. {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.\nWhen no lead vehicle is detected (that is, when there is no leading vehicle or the leading vehicle is too far away for the sensor to detect), this property should return StatusCode.NOT_AVAILABLE.\nWhen this property is not available because CC is disabled (i.e. CRUISE_CONTROL_ENABLED is false), this property must return StatusCode#NOT_AVAILABLE_DISABLED. If CRUISE_CONTROL_STATE is implemented and the state is set to an ErrorState value, then this property must return a StatusCode that aligns with the ErrorState value. For example, if CRUISE_CONTROL_STATE is set to ErrorState#NOT_AVAILABLE_SPEED_LOW, then this property must return StatusCode#NOT_AVAILABLE_SPEED_LOW."
},
{
"name": "HANDS_ON_DETECTION_ENABLED",
@@ -1629,7 +1629,7 @@
"ErrorState"
],
"data_enum": "HandsOnDetectionDriverState",
- "description": "Hands On Detection (HOD) driver state.\nReturns whether the driver's hands are on the steering wheel. Generally, this property should return a valid state defined in the HandsOnDetectionDriverState or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through ErrorState.\nIf the vehicle wants to send a warning to the user because the driver's hands have been off the steering wheel for too long, the warning should be surfaced through HANDS_ON_DETECTION_WARNING.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both HandsOnDetectionDriverState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of both HandsOnDetectionDriverState (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Hands On Detection (HOD) driver state.\nReturns whether the driver's hands are on the steering wheel. Generally, this property should return a valid state defined in the HandsOnDetectionDriverState or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through ErrorState.\nIf the vehicle wants to send a warning to the user because the driver's hands have been off the steering wheel for too long, the warning should be surfaced through HANDS_ON_DETECTION_WARNING.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both HandsOnDetectionDriverState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "HANDS_ON_DETECTION_WARNING",
@@ -1639,7 +1639,7 @@
"ErrorState"
],
"data_enum": "HandsOnDetectionWarning",
- "description": "Hands On Detection (HOD) warning.\nReturns whether a warning is being sent to the driver for having their hands off the wheel for too long a duration.\nGenerally, this property should return a valid state defined in HandsOnDetectionWarning or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through an ErrorState.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both HandsOnDetectionWarning (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of both HandsOnDetectionWarning (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Hands On Detection (HOD) warning.\nReturns whether a warning is being sent to the driver for having their hands off the wheel for too long a duration.\nGenerally, this property should return a valid state defined in HandsOnDetectionWarning or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through an ErrorState.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both HandsOnDetectionWarning (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "DRIVER_DROWSINESS_ATTENTION_SYSTEM_ENABLED",
@@ -1654,7 +1654,7 @@
"ErrorState"
],
"data_enum": "DriverDrowsinessAttentionState",
- "description": "Driver drowsiness and attention level state.\nReturns the current detected state of driver drowiness and attention level based on the Karolinska Sleepiness scale. If alternative measurement methods are used, the value should be translated to the Karolinska Sleepiness Scale equivalent.\nGenerally, this property should return a valid state defined in the DriverDrowsinessAttentionState or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through ErrorState.\nIf the vehicle is sending a warning to the user because the driver is too drowsy, the warning should be surfaced through {@link #DRIVER_DROWSINESS_ATTENTION_WARNING}.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both DriverDrowsinessAttentionState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of both DriverDrowsinessAttentionState (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Driver drowsiness and attention level state.\nReturns the current detected state of driver drowiness and attention level based on the Karolinska Sleepiness scale. If alternative measurement methods are used, the value should be translated to the Karolinska Sleepiness Scale equivalent.\nGenerally, this property should return a valid state defined in the DriverDrowsinessAttentionState or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through ErrorState.\nIf the vehicle is sending a warning to the user because the driver is too drowsy, the warning should be surfaced through {@link #DRIVER_DROWSINESS_ATTENTION_WARNING}.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both DriverDrowsinessAttentionState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "DRIVER_DROWSINESS_ATTENTION_WARNING_ENABLED",
@@ -1669,7 +1669,7 @@
"ErrorState"
],
"data_enum": "DriverDrowsinessAttentionWarning",
- "description": "Driver drowsiness and attention warning.\nReturns whether a warning is being sent to the driver for being drowsy or not attentive.\nGenerally, this property should return a valid state defined in DriverDrowsinessAttentionWarning or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through an ErrorState.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both DriverDrowsinessAttentionWarning (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of both DriverDrowsinessAttentionWarning (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Driver drowsiness and attention warning.\nReturns whether a warning is being sent to the driver for being drowsy or not attentive.\nGenerally, this property should return a valid state defined in DriverDrowsinessAttentionWarning or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through an ErrorState.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both DriverDrowsinessAttentionWarning (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "DRIVER_DISTRACTION_SYSTEM_ENABLED",
@@ -1684,7 +1684,7 @@
"ErrorState"
],
"data_enum": "DriverDistractionState",
- "description": "Driver distraction state.\nReturns the current detected driver distraction state.\nGenerally, this property should return a valid state defined in the DriverDistractionState or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through ErrorState.\nIf the vehicle is sending a warning to the user because the driver is too distracted, the warning should be surfaced through {@link #DRIVER_DISTRACTION_WARNING}.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both DriverDistractionState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of both DriverDistractionState (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Driver distraction state.\nReturns the current detected driver distraction state.\nGenerally, this property should return a valid state defined in the DriverDistractionState or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through ErrorState.\nIf the vehicle is sending a warning to the user because the driver is too distracted, the warning should be surfaced through {@link #DRIVER_DISTRACTION_WARNING}.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both DriverDistractionState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "DRIVER_DISTRACTION_WARNING_ENABLED",
@@ -1699,7 +1699,7 @@
"ErrorState"
],
"data_enum": "DriverDistractionWarning",
- "description": "Driver distraction warning.\nReturns whether a warning is being sent to the driver for being distracted.\nGenerally, this property should return a valid state defined in DriverDistractionWarning or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through an ErrorState.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both DriverDistractionWarning (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of both DriverDistractionWarning (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Driver distraction warning.\nReturns whether a warning is being sent to the driver for being distracted.\nGenerally, this property should return a valid state defined in DriverDistractionWarning or ErrorState. For example, if the feature is not available due to some temporary state, that information should be conveyed through an ErrorState.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both DriverDistractionWarning (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "LOW_SPEED_COLLISION_WARNING_ENABLED",
@@ -1714,7 +1714,7 @@
"ErrorState"
],
"data_enum": "LowSpeedCollisionWarningState",
- "description": "Low Speed Collision Warning state.\nReturns the current state of Low Speed Collision Warning. This property must always return a valid state defined in LowSpeedCollisionWarningState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead. This property is different from the pre-existing FORWARD_COLLISION_WARNING_STATE, which should apply to higher speed applications only. If the vehicle doesn't have a separate collision detection system for low speed environments, this property should not be implemented.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both LowSpeedCollisionWarningState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of both LowSpeedCollisionWarningState (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Low Speed Collision Warning state.\nReturns the current state of Low Speed Collision Warning. This property must always return a valid state defined in LowSpeedCollisionWarningState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead. This property is different from the pre-existing FORWARD_COLLISION_WARNING_STATE, which should apply to higher speed applications only. If the vehicle doesn't have a separate collision detection system for low speed environments, this property should not be implemented.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both LowSpeedCollisionWarningState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "CROSS_TRAFFIC_MONITORING_ENABLED",
@@ -1729,7 +1729,7 @@
"ErrorState"
],
"data_enum": "CrossTrafficMonitoringWarningState",
- "description": "Cross Traffic Monitoring warning state.\nReturns the current state of Cross Traffic Monitoring Warning. This property must always return a valid state defined in CrossTrafficMonitoringWarningState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both CrossTrafficMonitoringWarningState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of both CrossTrafficMonitoringWarningState (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Cross Traffic Monitoring warning state.\nReturns the current state of Cross Traffic Monitoring Warning. This property must always return a valid state defined in CrossTrafficMonitoringWarningState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both CrossTrafficMonitoringWarningState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
},
{
"name": "LOW_SPEED_AUTOMATIC_EMERGENCY_BRAKING_ENABLED",
@@ -1744,7 +1744,7 @@
"ErrorState"
],
"data_enum": "LowSpeedAutomaticEmergencyBrakingState",
- "description": "Low Speed Automatic Emergency Braking state.\nReturns the current state of Low Speed Automatic Emergency Braking. This property must always return a valid state defined in LowSpeedAutomaticEmergencyBrakingState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead. This property is different from the pre-existing AUTOMATIC_EMERGENCY_BRAKING_STATE, which should apply to higher speed applications only. If the vehicle doesn't have a separate collision avoidance system for low speed environments, this property should not be implemented.\nIf Low Speed Automatic Emergency Braking includes collision warnings before activating the brakes, those warnings must be surfaced through use of LOW_SPEED_COLLISION_WARNING_ENABLED and LOW_SPEED_COLLISION_WARNING_STATE.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both LowSpeedAutomaticEmergencyBrakingState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}: {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} unless all states of both LowSpeedAutomaticEmergencyBrakingState (including OTHER, which is not recommended) and ErrorState are supported. At boot, the supported values list is the same as supportedEnumValues."
+ "description": "Low Speed Automatic Emergency Braking state.\nReturns the current state of Low Speed Automatic Emergency Braking. This property must always return a valid state defined in LowSpeedAutomaticEmergencyBrakingState or ErrorState. It must not surface errors through StatusCode and must use the supported error states instead. This property is different from the pre-existing AUTOMATIC_EMERGENCY_BRAKING_STATE, which should apply to higher speed applications only. If the vehicle doesn't have a separate collision avoidance system for low speed environments, this property should not be implemented.\nIf Low Speed Automatic Emergency Braking includes collision warnings before activating the brakes, those warnings must be surfaced through use of LOW_SPEED_COLLISION_WARNING_ENABLED and LOW_SPEED_COLLISION_WARNING_STATE.\nFor the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined unless all states of both LowSpeedAutomaticEmergencyBrakingState (including OTHER, which is not recommended) and ErrorState are supported.\nIf {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0): {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. At boot, supportedEnumValues (if defined) is equal to the supported values list."
}
]
},
diff --git a/automotive/vehicle/aidl/generated_lib/4/cpp/AnnotationsForVehicleProperty.h b/automotive/vehicle/aidl/generated_lib/4/cpp/AnnotationsForVehicleProperty.h
new file mode 100644
index 0000000..8ff370a
--- /dev/null
+++ b/automotive/vehicle/aidl/generated_lib/4/cpp/AnnotationsForVehicleProperty.h
@@ -0,0 +1,327 @@
+/*
+ * 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 <string>
+#include <unordered_map>
+#include <unordered_set>
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace automotive {
+namespace vehicle {
+
+std::unordered_map<VehicleProperty, std::unordered_set<std::string>>
+ AnnotationsForVehicleProperty = {
+ {VehicleProperty::INFO_VIN, {"change_mode", "access", "version"}},
+ {VehicleProperty::INFO_MAKE, {"change_mode", "access", "version"}},
+ {VehicleProperty::INFO_MODEL, {"change_mode", "access", "version"}},
+ {VehicleProperty::INFO_MODEL_YEAR, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::INFO_FUEL_CAPACITY, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::INFO_FUEL_TYPE, {"change_mode", "access", "version", "data_enum"}},
+ {VehicleProperty::INFO_EV_BATTERY_CAPACITY, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::INFO_EV_CONNECTOR_TYPE, {"change_mode", "access", "version", "data_enum"}},
+ {VehicleProperty::INFO_FUEL_DOOR_LOCATION, {"change_mode", "access", "version", "data_enum"}},
+ {VehicleProperty::INFO_EV_PORT_LOCATION, {"change_mode", "access", "version", "data_enum"}},
+ {VehicleProperty::INFO_DRIVER_SEAT, {"change_mode", "access", "version", "data_enum"}},
+ {VehicleProperty::INFO_EXTERIOR_DIMENSIONS, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::INFO_MULTI_EV_PORT_LOCATIONS, {"change_mode", "access", "version", "data_enum"}},
+ {VehicleProperty::INFO_MODEL_TRIM, {"change_mode", "access", "version"}},
+ {VehicleProperty::INFO_VEHICLE_SIZE_CLASS, {"change_mode", "access", "version", "data_enum"}},
+ {VehicleProperty::PERF_ODOMETER, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::PERF_VEHICLE_SPEED, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::PERF_VEHICLE_SPEED_DISPLAY, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::PERF_STEERING_ANGLE, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::PERF_REAR_STEERING_ANGLE, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::INSTANTANEOUS_FUEL_ECONOMY, {"change_mode", "access", "version"}},
+ {VehicleProperty::INSTANTANEOUS_EV_EFFICIENCY, {"change_mode", "access", "version"}},
+ {VehicleProperty::ENGINE_COOLANT_TEMP, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::ENGINE_OIL_LEVEL, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::ENGINE_OIL_TEMP, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::ENGINE_RPM, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::WHEEL_TICK, {"change_mode", "access", "version"}},
+ {VehicleProperty::FUEL_LEVEL, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::FUEL_DOOR_OPEN, {"change_mode", "access", "version"}},
+ {VehicleProperty::EV_BATTERY_LEVEL, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::EV_CURRENT_BATTERY_CAPACITY, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::EV_CHARGE_PORT_OPEN, {"change_mode", "access", "version"}},
+ {VehicleProperty::EV_CHARGE_PORT_CONNECTED, {"change_mode", "access", "version"}},
+ {VehicleProperty::EV_BATTERY_INSTANTANEOUS_CHARGE_RATE, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::RANGE_REMAINING, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::EV_BATTERY_AVERAGE_TEMPERATURE, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::TIRE_PRESSURE, {"change_mode", "unit", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::CRITICALLY_LOW_TIRE_PRESSURE, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::ACCELERATOR_PEDAL_COMPRESSION_PERCENTAGE, {"change_mode", "access", "version"}},
+ {VehicleProperty::BRAKE_PEDAL_COMPRESSION_PERCENTAGE, {"change_mode", "access", "version"}},
+ {VehicleProperty::BRAKE_PAD_WEAR_PERCENTAGE, {"change_mode", "access", "version"}},
+ {VehicleProperty::BRAKE_FLUID_LEVEL_LOW, {"change_mode", "access", "version"}},
+ {VehicleProperty::VEHICLE_PASSIVE_SUSPENSION_HEIGHT, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::ENGINE_IDLE_AUTO_STOP_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::IMPACT_DETECTED, {"change_mode", "access", "require_supported_values_list", "version", "data_enum", "data_enum_bit_flags"}},
+ {VehicleProperty::VEHICLE_HORN_ENGAGED, {"change_mode", "access", "version"}},
+ {VehicleProperty::GEAR_SELECTION, {"change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::CURRENT_GEAR, {"change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::PARKING_BRAKE_ON, {"change_mode", "access", "version"}},
+ {VehicleProperty::PARKING_BRAKE_AUTO_APPLY, {"change_mode", "access", "version"}},
+ {VehicleProperty::EV_BRAKE_REGENERATION_LEVEL, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::FUEL_LEVEL_LOW, {"change_mode", "access", "version"}},
+ {VehicleProperty::NIGHT_MODE, {"change_mode", "access", "version"}},
+ {VehicleProperty::TURN_SIGNAL_STATE, {"change_mode", "access", "version", "data_enum"}},
+ {VehicleProperty::IGNITION_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::ABS_ACTIVE, {"change_mode", "access", "version"}},
+ {VehicleProperty::TRACTION_CONTROL_ACTIVE, {"change_mode", "access", "version"}},
+ {VehicleProperty::EV_STOPPING_MODE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::ELECTRONIC_STABILITY_CONTROL_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::ELECTRONIC_STABILITY_CONTROL_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::TURN_SIGNAL_LIGHT_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum", "data_enum_bit_flags"}},
+ {VehicleProperty::TURN_SIGNAL_SWITCH, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::HVAC_FAN_SPEED, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::HVAC_FAN_DIRECTION, {"change_mode", "access", "version", "data_enum"}},
+ {VehicleProperty::HVAC_TEMPERATURE_CURRENT, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::HVAC_TEMPERATURE_SET, {"change_mode", "unit", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::HVAC_DEFROSTER, {"change_mode", "access", "version"}},
+ {VehicleProperty::HVAC_AC_ON, {"change_mode", "access", "version"}},
+ {VehicleProperty::HVAC_MAX_AC_ON, {"change_mode", "access", "version"}},
+ {VehicleProperty::HVAC_MAX_DEFROST_ON, {"change_mode", "access", "version"}},
+ {VehicleProperty::HVAC_RECIRC_ON, {"change_mode", "access", "version"}},
+ {VehicleProperty::HVAC_DUAL_ON, {"change_mode", "access", "version"}},
+ {VehicleProperty::HVAC_AUTO_ON, {"change_mode", "access", "version"}},
+ {VehicleProperty::HVAC_SEAT_TEMPERATURE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::HVAC_SIDE_MIRROR_HEAT, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::HVAC_STEERING_WHEEL_HEAT, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::HVAC_TEMPERATURE_DISPLAY_UNITS, {"change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::HVAC_ACTUAL_FAN_SPEED_RPM, {"change_mode", "access", "version"}},
+ {VehicleProperty::HVAC_POWER_ON, {"change_mode", "access", "version"}},
+ {VehicleProperty::HVAC_FAN_DIRECTION_AVAILABLE, {"change_mode", "access", "version", "data_enum", "data_enum_bit_flags"}},
+ {VehicleProperty::HVAC_AUTO_RECIRC_ON, {"change_mode", "access", "version"}},
+ {VehicleProperty::HVAC_SEAT_VENTILATION, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::HVAC_ELECTRIC_DEFROSTER_ON, {"change_mode", "access", "version"}},
+ {VehicleProperty::HVAC_TEMPERATURE_VALUE_SUGGESTION, {"change_mode", "access", "version"}},
+ {VehicleProperty::DISTANCE_DISPLAY_UNITS, {"change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::FUEL_VOLUME_DISPLAY_UNITS, {"change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::TIRE_PRESSURE_DISPLAY_UNITS, {"change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::EV_BATTERY_DISPLAY_UNITS, {"change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME, {"change_mode", "access", "version"}},
+ {VehicleProperty::VEHICLE_SPEED_DISPLAY_UNITS, {"change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::EXTERNAL_CAR_TIME, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::ANDROID_EPOCH_TIME, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::STORAGE_ENCRYPTION_BINDING_SEED, {"change_mode", "access", "version"}},
+ {VehicleProperty::ENV_OUTSIDE_TEMPERATURE, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::AP_POWER_STATE_REQ, {"change_mode", "access", "version"}},
+ {VehicleProperty::AP_POWER_STATE_REPORT, {"change_mode", "access", "version"}},
+ {VehicleProperty::AP_POWER_BOOTUP_REASON, {"change_mode", "access", "version"}},
+ {VehicleProperty::DISPLAY_BRIGHTNESS, {"change_mode", "access", "version"}},
+ {VehicleProperty::PER_DISPLAY_BRIGHTNESS, {"change_mode", "access", "version"}},
+ {VehicleProperty::VALET_MODE_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::HEAD_UP_DISPLAY_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::HW_KEY_INPUT, {"change_mode", "access", "version"}},
+ {VehicleProperty::HW_KEY_INPUT_V2, {"change_mode", "access", "version"}},
+ {VehicleProperty::HW_MOTION_INPUT, {"change_mode", "access", "version"}},
+ {VehicleProperty::HW_ROTARY_INPUT, {"change_mode", "access", "version", "data_enum"}},
+ {VehicleProperty::HW_CUSTOM_INPUT, {"change_mode", "access", "version", "data_enum"}},
+ {VehicleProperty::DOOR_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::DOOR_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::DOOR_LOCK, {"change_mode", "access", "version"}},
+ {VehicleProperty::DOOR_CHILD_LOCK_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::MIRROR_Z_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::MIRROR_Z_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::MIRROR_Y_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::MIRROR_Y_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::MIRROR_LOCK, {"change_mode", "access", "version"}},
+ {VehicleProperty::MIRROR_FOLD, {"change_mode", "access", "version"}},
+ {VehicleProperty::MIRROR_AUTO_FOLD_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::MIRROR_AUTO_TILT_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::SEAT_MEMORY_SELECT, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_MEMORY_SET, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_BELT_BUCKLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::SEAT_BELT_HEIGHT_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_BELT_HEIGHT_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_FORE_AFT_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_FORE_AFT_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_BACKREST_ANGLE_1_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_BACKREST_ANGLE_1_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_BACKREST_ANGLE_2_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_BACKREST_ANGLE_2_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_HEIGHT_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_HEIGHT_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_DEPTH_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_DEPTH_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_TILT_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_TILT_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_LUMBAR_FORE_AFT_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_LUMBAR_FORE_AFT_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_LUMBAR_SIDE_SUPPORT_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_LUMBAR_SIDE_SUPPORT_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_HEADREST_HEIGHT_POS, {"change_mode", "access", "version"}},
+ {VehicleProperty::SEAT_HEADREST_HEIGHT_POS_V2, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_HEADREST_HEIGHT_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_HEADREST_ANGLE_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_HEADREST_ANGLE_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_HEADREST_FORE_AFT_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_HEADREST_FORE_AFT_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_FOOTWELL_LIGHTS_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::SEAT_FOOTWELL_LIGHTS_SWITCH, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::SEAT_EASY_ACCESS_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::SEAT_AIRBAG_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::SEAT_AIRBAGS_DEPLOYED, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::SEAT_CUSHION_SIDE_SUPPORT_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_CUSHION_SIDE_SUPPORT_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_LUMBAR_VERTICAL_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_LUMBAR_VERTICAL_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_WALK_IN_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::SEAT_BELT_PRETENSIONER_DEPLOYED, {"change_mode", "access", "version"}},
+ {VehicleProperty::SEAT_OCCUPANCY, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::WINDOW_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::WINDOW_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::WINDOW_LOCK, {"change_mode", "access", "version"}},
+ {VehicleProperty::WINDSHIELD_WIPERS_PERIOD, {"change_mode", "unit", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::WINDSHIELD_WIPERS_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::WINDSHIELD_WIPERS_SWITCH, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::STEERING_WHEEL_DEPTH_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::STEERING_WHEEL_DEPTH_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::STEERING_WHEEL_HEIGHT_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::STEERING_WHEEL_HEIGHT_MOVE, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::STEERING_WHEEL_THEFT_LOCK_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::STEERING_WHEEL_LOCKED, {"change_mode", "access", "version"}},
+ {VehicleProperty::STEERING_WHEEL_EASY_ACCESS_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::GLOVE_BOX_DOOR_POS, {"change_mode", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::GLOVE_BOX_LOCKED, {"change_mode", "access", "version"}},
+ {VehicleProperty::VEHICLE_MAP_SERVICE, {"change_mode", "access", "version"}},
+ {VehicleProperty::LOCATION_CHARACTERIZATION, {"change_mode", "access", "version"}},
+ {VehicleProperty::ULTRASONICS_SENSOR_POSITION, {"change_mode", "access", "version"}},
+ {VehicleProperty::ULTRASONICS_SENSOR_ORIENTATION, {"change_mode", "access", "version"}},
+ {VehicleProperty::ULTRASONICS_SENSOR_FIELD_OF_VIEW, {"change_mode", "access", "version"}},
+ {VehicleProperty::ULTRASONICS_SENSOR_DETECTION_RANGE, {"change_mode", "access", "version"}},
+ {VehicleProperty::ULTRASONICS_SENSOR_SUPPORTED_RANGES, {"change_mode", "access", "version"}},
+ {VehicleProperty::ULTRASONICS_SENSOR_MEASURED_DISTANCE, {"change_mode", "access", "version"}},
+ {VehicleProperty::OBD2_LIVE_FRAME, {"change_mode", "access", "version"}},
+ {VehicleProperty::OBD2_FREEZE_FRAME, {"change_mode", "access", "version"}},
+ {VehicleProperty::OBD2_FREEZE_FRAME_INFO, {"change_mode", "access", "version"}},
+ {VehicleProperty::OBD2_FREEZE_FRAME_CLEAR, {"change_mode", "access", "version"}},
+ {VehicleProperty::HEADLIGHTS_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::HIGH_BEAM_LIGHTS_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::FOG_LIGHTS_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::HAZARD_LIGHTS_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::HEADLIGHTS_SWITCH, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::HIGH_BEAM_LIGHTS_SWITCH, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::FOG_LIGHTS_SWITCH, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::HAZARD_LIGHTS_SWITCH, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::CABIN_LIGHTS_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::CABIN_LIGHTS_SWITCH, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::READING_LIGHTS_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::READING_LIGHTS_SWITCH, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::STEERING_WHEEL_LIGHTS_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::STEERING_WHEEL_LIGHTS_SWITCH, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::SUPPORT_CUSTOMIZE_VENDOR_PERMISSION, {"change_mode", "access", "version"}},
+ {VehicleProperty::DISABLED_OPTIONAL_FEATURES, {"change_mode", "access", "version"}},
+ {VehicleProperty::INITIAL_USER_INFO, {"change_mode", "access", "version"}},
+ {VehicleProperty::SWITCH_USER, {"change_mode", "access", "version"}},
+ {VehicleProperty::CREATE_USER, {"change_mode", "access", "version"}},
+ {VehicleProperty::REMOVE_USER, {"change_mode", "access", "version"}},
+ {VehicleProperty::USER_IDENTIFICATION_ASSOCIATION, {"change_mode", "access", "version"}},
+ {VehicleProperty::EVS_SERVICE_REQUEST, {"change_mode", "access", "version"}},
+ {VehicleProperty::POWER_POLICY_REQ, {"change_mode", "access", "version"}},
+ {VehicleProperty::POWER_POLICY_GROUP_REQ, {"change_mode", "access", "version"}},
+ {VehicleProperty::CURRENT_POWER_POLICY, {"change_mode", "access", "version"}},
+ {VehicleProperty::WATCHDOG_ALIVE, {"change_mode", "access", "version"}},
+ {VehicleProperty::WATCHDOG_TERMINATED_PROCESS, {"change_mode", "access", "version"}},
+ {VehicleProperty::VHAL_HEARTBEAT, {"change_mode", "access", "version"}},
+ {VehicleProperty::CLUSTER_SWITCH_UI, {"change_mode", "access", "version"}},
+ {VehicleProperty::CLUSTER_DISPLAY_STATE, {"change_mode", "access", "version"}},
+ {VehicleProperty::CLUSTER_REPORT_STATE, {"change_mode", "access", "version"}},
+ {VehicleProperty::CLUSTER_REQUEST_DISPLAY, {"change_mode", "access", "version"}},
+ {VehicleProperty::CLUSTER_NAVIGATION_STATE, {"change_mode", "access", "version"}},
+ {VehicleProperty::ELECTRONIC_TOLL_COLLECTION_CARD_TYPE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::ELECTRONIC_TOLL_COLLECTION_CARD_STATUS, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::FRONT_FOG_LIGHTS_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::FRONT_FOG_LIGHTS_SWITCH, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::REAR_FOG_LIGHTS_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::REAR_FOG_LIGHTS_SWITCH, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::EV_CHARGE_CURRENT_DRAW_LIMIT, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::EV_CHARGE_PERCENT_LIMIT, {"change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version"}},
+ {VehicleProperty::EV_CHARGE_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::EV_CHARGE_SWITCH, {"change_mode", "access", "version"}},
+ {VehicleProperty::EV_CHARGE_TIME_REMAINING, {"change_mode", "access", "version", "unit"}},
+ {VehicleProperty::EV_REGENERATIVE_BRAKING_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::TRAILER_PRESENT, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::VEHICLE_CURB_WEIGHT, {"change_mode", "access", "version"}},
+ {VehicleProperty::GENERAL_SAFETY_REGULATION_COMPLIANCE_REQUIREMENT, {"change_mode", "access", "version", "data_enum"}},
+ {VehicleProperty::SUPPORTED_PROPERTY_IDS, {"change_mode", "access", "version"}},
+ {VehicleProperty::SHUTDOWN_REQUEST, {"change_mode", "access", "version", "data_enum"}},
+ {VehicleProperty::VEHICLE_IN_USE, {"change_mode", "access", "version"}},
+ {VehicleProperty::CLUSTER_HEARTBEAT, {"change_mode", "access", "version"}},
+ {VehicleProperty::VEHICLE_DRIVING_AUTOMATION_CURRENT_LEVEL, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::VEHICLE_DRIVING_AUTOMATION_TARGET_LEVEL, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::CAMERA_SERVICE_CURRENT_STATE, {"change_mode", "access", "version", "data_enum"}},
+ {VehicleProperty::PER_DISPLAY_MAX_BRIGHTNESS, {"change_mode", "access", "version"}},
+ {VehicleProperty::AUTOMATIC_EMERGENCY_BRAKING_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::AUTOMATIC_EMERGENCY_BRAKING_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::FORWARD_COLLISION_WARNING_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::FORWARD_COLLISION_WARNING_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::BLIND_SPOT_WARNING_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::BLIND_SPOT_WARNING_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::LANE_DEPARTURE_WARNING_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::LANE_DEPARTURE_WARNING_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::LANE_KEEP_ASSIST_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::LANE_KEEP_ASSIST_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::LANE_CENTERING_ASSIST_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::LANE_CENTERING_ASSIST_COMMAND, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::LANE_CENTERING_ASSIST_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::EMERGENCY_LANE_KEEP_ASSIST_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::EMERGENCY_LANE_KEEP_ASSIST_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::CRUISE_CONTROL_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::CRUISE_CONTROL_TYPE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::CRUISE_CONTROL_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::CRUISE_CONTROL_COMMAND, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::CRUISE_CONTROL_TARGET_SPEED, {"change_mode", "unit", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::ADAPTIVE_CRUISE_CONTROL_TARGET_TIME_GAP, {"change_mode", "unit", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version"}},
+ {VehicleProperty::ADAPTIVE_CRUISE_CONTROL_LEAD_VEHICLE_MEASURED_DISTANCE, {"change_mode", "unit", "require_min_max_supported_value", "access", "version"}},
+ {VehicleProperty::HANDS_ON_DETECTION_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::HANDS_ON_DETECTION_DRIVER_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::HANDS_ON_DETECTION_WARNING, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::DRIVER_DROWSINESS_ATTENTION_SYSTEM_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::DRIVER_DROWSINESS_ATTENTION_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::DRIVER_DROWSINESS_ATTENTION_WARNING_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::DRIVER_DROWSINESS_ATTENTION_WARNING, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::DRIVER_DISTRACTION_SYSTEM_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::DRIVER_DISTRACTION_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::DRIVER_DISTRACTION_WARNING_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::DRIVER_DISTRACTION_WARNING, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::LOW_SPEED_COLLISION_WARNING_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::LOW_SPEED_COLLISION_WARNING_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::CROSS_TRAFFIC_MONITORING_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::CROSS_TRAFFIC_MONITORING_WARNING_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+ {VehicleProperty::LOW_SPEED_AUTOMATIC_EMERGENCY_BRAKING_ENABLED, {"change_mode", "access", "version"}},
+ {VehicleProperty::LOW_SPEED_AUTOMATIC_EMERGENCY_BRAKING_STATE, {"change_mode", "access", "require_supported_values_list", "version", "data_enum"}},
+};
+
+} // namespace vehicle
+} // namespace automotive
+} // namespace hardware
+} // namespace android
+} // aidl
diff --git a/automotive/vehicle/aidl/generated_lib/4/java/AnnotationsForVehicleProperty.java b/automotive/vehicle/aidl/generated_lib/4/java/AnnotationsForVehicleProperty.java
new file mode 100644
index 0000000..9ef5f04
--- /dev/null
+++ b/automotive/vehicle/aidl/generated_lib/4/java/AnnotationsForVehicleProperty.java
@@ -0,0 +1,315 @@
+/*
+ * 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
+
+package android.hardware.automotive.vehicle;
+
+import java.util.Set;
+import java.util.Map;
+
+public final class AnnotationsForVehicleProperty {
+
+ public static final Map<Integer, Set<String>> values = Map.ofEntries(
+ Map.entry(VehicleProperty.INFO_VIN, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.INFO_MAKE, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.INFO_MODEL, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.INFO_MODEL_YEAR, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.INFO_FUEL_CAPACITY, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.INFO_FUEL_TYPE, Set.of("change_mode", "access", "version", "data_enum")),
+ Map.entry(VehicleProperty.INFO_EV_BATTERY_CAPACITY, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.INFO_EV_CONNECTOR_TYPE, Set.of("change_mode", "access", "version", "data_enum")),
+ Map.entry(VehicleProperty.INFO_FUEL_DOOR_LOCATION, Set.of("change_mode", "access", "version", "data_enum")),
+ Map.entry(VehicleProperty.INFO_EV_PORT_LOCATION, Set.of("change_mode", "access", "version", "data_enum")),
+ Map.entry(VehicleProperty.INFO_DRIVER_SEAT, Set.of("change_mode", "access", "version", "data_enum")),
+ Map.entry(VehicleProperty.INFO_EXTERIOR_DIMENSIONS, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.INFO_MULTI_EV_PORT_LOCATIONS, Set.of("change_mode", "access", "version", "data_enum")),
+ Map.entry(VehicleProperty.INFO_MODEL_TRIM, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.INFO_VEHICLE_SIZE_CLASS, Set.of("change_mode", "access", "version", "data_enum")),
+ Map.entry(VehicleProperty.PERF_ODOMETER, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.PERF_VEHICLE_SPEED, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.PERF_VEHICLE_SPEED_DISPLAY, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.PERF_STEERING_ANGLE, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.PERF_REAR_STEERING_ANGLE, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.INSTANTANEOUS_FUEL_ECONOMY, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.INSTANTANEOUS_EV_EFFICIENCY, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.ENGINE_COOLANT_TEMP, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.ENGINE_OIL_LEVEL, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.ENGINE_OIL_TEMP, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.ENGINE_RPM, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.WHEEL_TICK, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.FUEL_LEVEL, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.FUEL_DOOR_OPEN, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.EV_BATTERY_LEVEL, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.EV_CURRENT_BATTERY_CAPACITY, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.EV_CHARGE_PORT_OPEN, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.EV_CHARGE_PORT_CONNECTED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.EV_BATTERY_INSTANTANEOUS_CHARGE_RATE, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.RANGE_REMAINING, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.EV_BATTERY_AVERAGE_TEMPERATURE, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.TIRE_PRESSURE, Set.of("change_mode", "unit", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.CRITICALLY_LOW_TIRE_PRESSURE, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.ACCELERATOR_PEDAL_COMPRESSION_PERCENTAGE, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.BRAKE_PEDAL_COMPRESSION_PERCENTAGE, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.BRAKE_PAD_WEAR_PERCENTAGE, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.BRAKE_FLUID_LEVEL_LOW, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.VEHICLE_PASSIVE_SUSPENSION_HEIGHT, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.ENGINE_IDLE_AUTO_STOP_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.IMPACT_DETECTED, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum", "data_enum_bit_flags")),
+ Map.entry(VehicleProperty.VEHICLE_HORN_ENGAGED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.GEAR_SELECTION, Set.of("change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.CURRENT_GEAR, Set.of("change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.PARKING_BRAKE_ON, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.PARKING_BRAKE_AUTO_APPLY, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.EV_BRAKE_REGENERATION_LEVEL, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.FUEL_LEVEL_LOW, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.NIGHT_MODE, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.TURN_SIGNAL_STATE, Set.of("change_mode", "access", "version", "data_enum")),
+ Map.entry(VehicleProperty.IGNITION_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.ABS_ACTIVE, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.TRACTION_CONTROL_ACTIVE, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.EV_STOPPING_MODE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.ELECTRONIC_STABILITY_CONTROL_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.ELECTRONIC_STABILITY_CONTROL_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.TURN_SIGNAL_LIGHT_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum", "data_enum_bit_flags")),
+ Map.entry(VehicleProperty.TURN_SIGNAL_SWITCH, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.HVAC_FAN_SPEED, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_FAN_DIRECTION, Set.of("change_mode", "access", "version", "data_enum")),
+ Map.entry(VehicleProperty.HVAC_TEMPERATURE_CURRENT, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.HVAC_TEMPERATURE_SET, Set.of("change_mode", "unit", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_DEFROSTER, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_AC_ON, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_MAX_AC_ON, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_MAX_DEFROST_ON, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_RECIRC_ON, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_DUAL_ON, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_AUTO_ON, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_SEAT_TEMPERATURE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_SIDE_MIRROR_HEAT, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_STEERING_WHEEL_HEAT, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_TEMPERATURE_DISPLAY_UNITS, Set.of("change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.HVAC_ACTUAL_FAN_SPEED_RPM, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_POWER_ON, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_FAN_DIRECTION_AVAILABLE, Set.of("change_mode", "access", "version", "data_enum", "data_enum_bit_flags")),
+ Map.entry(VehicleProperty.HVAC_AUTO_RECIRC_ON, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_SEAT_VENTILATION, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_ELECTRIC_DEFROSTER_ON, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HVAC_TEMPERATURE_VALUE_SUGGESTION, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.DISTANCE_DISPLAY_UNITS, Set.of("change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.FUEL_VOLUME_DISPLAY_UNITS, Set.of("change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.TIRE_PRESSURE_DISPLAY_UNITS, Set.of("change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.EV_BATTERY_DISPLAY_UNITS, Set.of("change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.VEHICLE_SPEED_DISPLAY_UNITS, Set.of("change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.EXTERNAL_CAR_TIME, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.ANDROID_EPOCH_TIME, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.STORAGE_ENCRYPTION_BINDING_SEED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.ENV_OUTSIDE_TEMPERATURE, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.AP_POWER_STATE_REQ, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.AP_POWER_STATE_REPORT, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.AP_POWER_BOOTUP_REASON, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.DISPLAY_BRIGHTNESS, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.PER_DISPLAY_BRIGHTNESS, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.VALET_MODE_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HEAD_UP_DISPLAY_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HW_KEY_INPUT, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HW_KEY_INPUT_V2, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HW_MOTION_INPUT, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HW_ROTARY_INPUT, Set.of("change_mode", "access", "version", "data_enum")),
+ Map.entry(VehicleProperty.HW_CUSTOM_INPUT, Set.of("change_mode", "access", "version", "data_enum")),
+ Map.entry(VehicleProperty.DOOR_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.DOOR_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.DOOR_LOCK, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.DOOR_CHILD_LOCK_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.MIRROR_Z_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.MIRROR_Z_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.MIRROR_Y_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.MIRROR_Y_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.MIRROR_LOCK, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.MIRROR_FOLD, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.MIRROR_AUTO_FOLD_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.MIRROR_AUTO_TILT_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_MEMORY_SELECT, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_MEMORY_SET, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_BELT_BUCKLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_BELT_HEIGHT_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_BELT_HEIGHT_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_FORE_AFT_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_FORE_AFT_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_BACKREST_ANGLE_1_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_BACKREST_ANGLE_1_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_BACKREST_ANGLE_2_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_BACKREST_ANGLE_2_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_HEIGHT_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_HEIGHT_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_DEPTH_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_DEPTH_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_TILT_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_TILT_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_LUMBAR_FORE_AFT_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_LUMBAR_FORE_AFT_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_LUMBAR_SIDE_SUPPORT_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_LUMBAR_SIDE_SUPPORT_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_HEADREST_HEIGHT_POS, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_HEADREST_HEIGHT_POS_V2, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_HEADREST_HEIGHT_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_HEADREST_ANGLE_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_HEADREST_ANGLE_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_HEADREST_FORE_AFT_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_HEADREST_FORE_AFT_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_FOOTWELL_LIGHTS_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.SEAT_FOOTWELL_LIGHTS_SWITCH, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.SEAT_EASY_ACCESS_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_AIRBAG_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_AIRBAGS_DEPLOYED, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.SEAT_CUSHION_SIDE_SUPPORT_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_CUSHION_SIDE_SUPPORT_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_LUMBAR_VERTICAL_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_LUMBAR_VERTICAL_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_WALK_IN_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_BELT_PRETENSIONER_DEPLOYED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.SEAT_OCCUPANCY, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.WINDOW_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.WINDOW_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.WINDOW_LOCK, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.WINDSHIELD_WIPERS_PERIOD, Set.of("change_mode", "unit", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.WINDSHIELD_WIPERS_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.WINDSHIELD_WIPERS_SWITCH, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.STEERING_WHEEL_DEPTH_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.STEERING_WHEEL_DEPTH_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.STEERING_WHEEL_HEIGHT_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.STEERING_WHEEL_HEIGHT_MOVE, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.STEERING_WHEEL_THEFT_LOCK_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.STEERING_WHEEL_LOCKED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.STEERING_WHEEL_EASY_ACCESS_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.GLOVE_BOX_DOOR_POS, Set.of("change_mode", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.GLOVE_BOX_LOCKED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.VEHICLE_MAP_SERVICE, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.LOCATION_CHARACTERIZATION, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.ULTRASONICS_SENSOR_POSITION, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.ULTRASONICS_SENSOR_ORIENTATION, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.ULTRASONICS_SENSOR_FIELD_OF_VIEW, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.ULTRASONICS_SENSOR_DETECTION_RANGE, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.ULTRASONICS_SENSOR_SUPPORTED_RANGES, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.ULTRASONICS_SENSOR_MEASURED_DISTANCE, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.OBD2_LIVE_FRAME, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.OBD2_FREEZE_FRAME, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.OBD2_FREEZE_FRAME_INFO, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.OBD2_FREEZE_FRAME_CLEAR, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HEADLIGHTS_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.HIGH_BEAM_LIGHTS_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.FOG_LIGHTS_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.HAZARD_LIGHTS_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.HEADLIGHTS_SWITCH, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.HIGH_BEAM_LIGHTS_SWITCH, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.FOG_LIGHTS_SWITCH, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.HAZARD_LIGHTS_SWITCH, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.CABIN_LIGHTS_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.CABIN_LIGHTS_SWITCH, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.READING_LIGHTS_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.READING_LIGHTS_SWITCH, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.STEERING_WHEEL_LIGHTS_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.STEERING_WHEEL_LIGHTS_SWITCH, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.SUPPORT_CUSTOMIZE_VENDOR_PERMISSION, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.DISABLED_OPTIONAL_FEATURES, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.INITIAL_USER_INFO, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.SWITCH_USER, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.CREATE_USER, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.REMOVE_USER, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.USER_IDENTIFICATION_ASSOCIATION, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.EVS_SERVICE_REQUEST, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.POWER_POLICY_REQ, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.POWER_POLICY_GROUP_REQ, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.CURRENT_POWER_POLICY, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.WATCHDOG_ALIVE, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.WATCHDOG_TERMINATED_PROCESS, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.VHAL_HEARTBEAT, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.CLUSTER_SWITCH_UI, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.CLUSTER_DISPLAY_STATE, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.CLUSTER_REPORT_STATE, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.CLUSTER_REQUEST_DISPLAY, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.CLUSTER_NAVIGATION_STATE, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.ELECTRONIC_TOLL_COLLECTION_CARD_TYPE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.ELECTRONIC_TOLL_COLLECTION_CARD_STATUS, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.FRONT_FOG_LIGHTS_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.FRONT_FOG_LIGHTS_SWITCH, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.REAR_FOG_LIGHTS_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.REAR_FOG_LIGHTS_SWITCH, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.EV_CHARGE_CURRENT_DRAW_LIMIT, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.EV_CHARGE_PERCENT_LIMIT, Set.of("change_mode", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version")),
+ Map.entry(VehicleProperty.EV_CHARGE_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.EV_CHARGE_SWITCH, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.EV_CHARGE_TIME_REMAINING, Set.of("change_mode", "access", "version", "unit")),
+ Map.entry(VehicleProperty.EV_REGENERATIVE_BRAKING_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.TRAILER_PRESENT, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.VEHICLE_CURB_WEIGHT, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.GENERAL_SAFETY_REGULATION_COMPLIANCE_REQUIREMENT, Set.of("change_mode", "access", "version", "data_enum")),
+ Map.entry(VehicleProperty.SUPPORTED_PROPERTY_IDS, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.SHUTDOWN_REQUEST, Set.of("change_mode", "access", "version", "data_enum")),
+ Map.entry(VehicleProperty.VEHICLE_IN_USE, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.CLUSTER_HEARTBEAT, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.VEHICLE_DRIVING_AUTOMATION_CURRENT_LEVEL, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.VEHICLE_DRIVING_AUTOMATION_TARGET_LEVEL, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.CAMERA_SERVICE_CURRENT_STATE, Set.of("change_mode", "access", "version", "data_enum")),
+ Map.entry(VehicleProperty.PER_DISPLAY_MAX_BRIGHTNESS, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.AUTOMATIC_EMERGENCY_BRAKING_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.AUTOMATIC_EMERGENCY_BRAKING_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.FORWARD_COLLISION_WARNING_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.FORWARD_COLLISION_WARNING_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.BLIND_SPOT_WARNING_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.BLIND_SPOT_WARNING_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.LANE_DEPARTURE_WARNING_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.LANE_DEPARTURE_WARNING_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.LANE_KEEP_ASSIST_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.LANE_KEEP_ASSIST_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.LANE_CENTERING_ASSIST_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.LANE_CENTERING_ASSIST_COMMAND, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.LANE_CENTERING_ASSIST_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.EMERGENCY_LANE_KEEP_ASSIST_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.EMERGENCY_LANE_KEEP_ASSIST_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.CRUISE_CONTROL_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.CRUISE_CONTROL_TYPE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.CRUISE_CONTROL_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.CRUISE_CONTROL_COMMAND, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.CRUISE_CONTROL_TARGET_SPEED, Set.of("change_mode", "unit", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.ADAPTIVE_CRUISE_CONTROL_TARGET_TIME_GAP, Set.of("change_mode", "unit", "legacy_supported_values_in_config", "access", "require_supported_values_list", "version")),
+ Map.entry(VehicleProperty.ADAPTIVE_CRUISE_CONTROL_LEAD_VEHICLE_MEASURED_DISTANCE, Set.of("change_mode", "unit", "require_min_max_supported_value", "access", "version")),
+ Map.entry(VehicleProperty.HANDS_ON_DETECTION_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.HANDS_ON_DETECTION_DRIVER_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.HANDS_ON_DETECTION_WARNING, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.DRIVER_DROWSINESS_ATTENTION_SYSTEM_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.DRIVER_DROWSINESS_ATTENTION_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.DRIVER_DROWSINESS_ATTENTION_WARNING_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.DRIVER_DROWSINESS_ATTENTION_WARNING, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.DRIVER_DISTRACTION_SYSTEM_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.DRIVER_DISTRACTION_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.DRIVER_DISTRACTION_WARNING_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.DRIVER_DISTRACTION_WARNING, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.LOW_SPEED_COLLISION_WARNING_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.LOW_SPEED_COLLISION_WARNING_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.CROSS_TRAFFIC_MONITORING_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.CROSS_TRAFFIC_MONITORING_WARNING_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum")),
+ Map.entry(VehicleProperty.LOW_SPEED_AUTOMATIC_EMERGENCY_BRAKING_ENABLED, Set.of("change_mode", "access", "version")),
+ Map.entry(VehicleProperty.LOW_SPEED_AUTOMATIC_EMERGENCY_BRAKING_STATE, Set.of("change_mode", "access", "require_supported_values_list", "version", "data_enum"))
+ );
+
+}
diff --git a/automotive/vehicle/aidl/impl/3/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp b/automotive/vehicle/aidl/impl/3/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp
index f6098ca..0dd5e9f 100644
--- a/automotive/vehicle/aidl/impl/3/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp
+++ b/automotive/vehicle/aidl/impl/3/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp
@@ -223,7 +223,8 @@
return status;
}
- const SetValueResult& result = getSetValueResults().back();
+ std::vector<SetValueResult> resultVector = getSetValueResults();
+ const SetValueResult& result = resultVector.back();
if (result.requestId != 0) {
ALOGE("request ID mismatch, got %" PRId64 ", expect 0", result.requestId);
@@ -245,7 +246,8 @@
return unexpected(status);
}
- const GetValueResult& result = getGetValueResults().back();
+ std::vector<GetValueResult> resultVector = getGetValueResults();
+ const GetValueResult& result = resultVector.back();
if (result.requestId != 0) {
ALOGE("request ID mismatch, got %" PRId64 ", expect 0", result.requestId);
return unexpected(StatusCode::INTERNAL_ERROR);
@@ -277,7 +279,7 @@
mCv.notify_all();
}
- const std::vector<SetValueResult>& getSetValueResults() {
+ std::vector<SetValueResult> getSetValueResults() {
std::scoped_lock<std::mutex> lockGuard(mLock);
return mSetValueResults;
}
@@ -291,7 +293,7 @@
mCv.notify_all();
}
- const std::vector<GetValueResult>& getGetValueResults() {
+ std::vector<GetValueResult> getGetValueResults() {
std::scoped_lock<std::mutex> lockGuard(mLock);
return mGetValueResults;
}
@@ -309,7 +311,7 @@
mCv.notify_all();
}
- const std::vector<VehiclePropValue>& getChangedProperties() {
+ std::vector<VehiclePropValue> getChangedProperties() {
std::scoped_lock<std::mutex> lockGuard(mLock);
return mChangedProperties;
}
diff --git a/automotive/vehicle/aidl/impl/3/vhal/Android.bp b/automotive/vehicle/aidl/impl/3/vhal/Android.bp
index a648fd4..22ea23d 100644
--- a/automotive/vehicle/aidl/impl/3/vhal/Android.bp
+++ b/automotive/vehicle/aidl/impl/3/vhal/Android.bp
@@ -47,6 +47,7 @@
cc_library {
name: "DefaultVehicleHal-V3",
vendor: true,
+ host_supported: true,
defaults: [
"VehicleHalDefaults-V3",
],
diff --git a/automotive/vehicle/aidl/impl/current/default_config/config/DefaultProperties.json b/automotive/vehicle/aidl/impl/current/default_config/config/DefaultProperties.json
index 86ac92e..f71dead 100644
--- a/automotive/vehicle/aidl/impl/current/default_config/config/DefaultProperties.json
+++ b/automotive/vehicle/aidl/impl/current/default_config/config/DefaultProperties.json
@@ -2549,57 +2549,49 @@
"property": "VehicleProperty::HVAC_TEMPERATURE_SET",
"defaultValue": {
"floatValues": [
- 17.0
+ 18.5
]
},
"areas": [
{
"areaId": "Constants::SEAT_1_LEFT",
- "minFloatValue": 16.0,
- "maxFloatValue": 28.0
+ "minFloatValue": 17.5,
+ "maxFloatValue": 32.5
},
{
"areaId": "Constants::SEAT_1_RIGHT",
- "minFloatValue": 16.0,
- "maxFloatValue": 28.0
+ "minFloatValue": 17.5,
+ "maxFloatValue": 32.5
},
{
"areaId": "Constants::SEAT_2_LEFT",
- "minFloatValue": 16.0,
- "maxFloatValue": 28.0
+ "minFloatValue": 17.5,
+ "maxFloatValue": 32.5
},
{
"areaId": "Constants::SEAT_2_RIGHT",
- "minFloatValue": 16.0,
- "maxFloatValue": 28.0
+ "minFloatValue": 17.5,
+ "maxFloatValue": 32.5
},
{
"areaId": "Constants::SEAT_2_CENTER",
- "minFloatValue": 16.0,
- "maxFloatValue": 28.0
+ "minFloatValue": 17.5,
+ "maxFloatValue": 32.5
}
],
"comment":
"minFloatValue and maxFloatValue in area config should match corresponding values in configArray",
"configArray": [
- 160,
- 280,
+ 175,
+ 325,
5,
- 608,
- 824,
- 9
+ 600,
+ 900,
+ 10
]
},
{
- "property": "VehicleProperty::HVAC_TEMPERATURE_VALUE_SUGGESTION",
- "defaultValue": {
- "floatValues": [
- 66.19999694824219,
- "VehicleUnit::FAHRENHEIT",
- 19.0,
- 66.2
- ]
- }
+ "property": "VehicleProperty::HVAC_TEMPERATURE_VALUE_SUGGESTION"
},
{
"property": "VehicleProperty::ENV_OUTSIDE_TEMPERATURE",
diff --git a/automotive/vehicle/aidl/impl/current/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp b/automotive/vehicle/aidl/impl/current/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp
index a097135..df5c2a3 100644
--- a/automotive/vehicle/aidl/impl/current/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp
+++ b/automotive/vehicle/aidl/impl/current/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp
@@ -223,7 +223,8 @@
return status;
}
- const SetValueResult& result = getSetValueResults().back();
+ std::vector<SetValueResult> resultVector = getSetValueResults();
+ const SetValueResult& result = resultVector.back();
if (result.requestId != 0) {
ALOGE("request ID mismatch, got %" PRId64 ", expect 0", result.requestId);
@@ -245,7 +246,8 @@
return unexpected(status);
}
- const GetValueResult& result = getGetValueResults().back();
+ std::vector<GetValueResult> resultVector = getGetValueResults();
+ const GetValueResult& result = resultVector.back();
if (result.requestId != 0) {
ALOGE("request ID mismatch, got %" PRId64 ", expect 0", result.requestId);
return unexpected(StatusCode::INTERNAL_ERROR);
@@ -277,7 +279,7 @@
mCv.notify_all();
}
- const std::vector<SetValueResult>& getSetValueResults() {
+ std::vector<SetValueResult> getSetValueResults() {
std::scoped_lock<std::mutex> lockGuard(mLock);
return mSetValueResults;
}
@@ -291,7 +293,7 @@
mCv.notify_all();
}
- const std::vector<GetValueResult>& getGetValueResults() {
+ std::vector<GetValueResult> getGetValueResults() {
std::scoped_lock<std::mutex> lockGuard(mLock);
return mGetValueResults;
}
@@ -309,7 +311,7 @@
mCv.notify_all();
}
- const std::vector<VehiclePropValue>& getChangedProperties() {
+ std::vector<VehiclePropValue> getChangedProperties() {
std::scoped_lock<std::mutex> lockGuard(mLock);
return mChangedProperties;
}
@@ -3064,8 +3066,8 @@
TEST_F(FakeVehicleHardwareTest, GetPropertyWithPropertyNameAreaName) {
auto result = getHardware()->dump({"--get", "HVAC_TEMPERATURE_SET", "-a", "ROW_1_LEFT"});
- // Default value is 17
- ASSERT_THAT(result.buffer, ContainsRegex("17"));
+ // Default value is 18.5
+ ASSERT_THAT(result.buffer, ContainsRegex("18.5"));
getHardware()->dump({"--set", "HVAC_TEMPERATURE_SET", "-a", "ROW_1_LEFT", "-f", "22"});
result = getHardware()->dump({"--get", "HVAC_TEMPERATURE_SET", "-a", "ROW_1_LEFT"});
@@ -3680,7 +3682,7 @@
.areaId = HVAC_ALL,
.value.floatValues = {0, 0, 0, 0},
};
- status = setValue(floatArraySizeFive);
+ status = setValue(invalidUnit);
EXPECT_EQ(status, StatusCode::INVALID_ARG);
clearChangedProperties();
@@ -3924,9 +3926,9 @@
{minTempInFahrenheit +
incrementInFahrenheit * 2.5f,
FAHRENHEIT,
- minTempInCelsius + incrementInCelsius * 2,
+ minTempInCelsius + incrementInCelsius * 3,
minTempInFahrenheit +
- incrementInFahrenheit * 2},
+ incrementInFahrenheit * 3},
},
},
},
diff --git a/automotive/vehicle/aidl/impl/current/vhal/Android.bp b/automotive/vehicle/aidl/impl/current/vhal/Android.bp
index 8764eff..cfc2b34 100644
--- a/automotive/vehicle/aidl/impl/current/vhal/Android.bp
+++ b/automotive/vehicle/aidl/impl/current/vhal/Android.bp
@@ -47,6 +47,7 @@
cc_library {
name: "DefaultVehicleHal",
vendor: true,
+ host_supported: true,
defaults: [
"VehicleHalDefaults",
],
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 856d38c..200ba4c 100644
--- a/automotive/vehicle/aidl_property/android/hardware/automotive/vehicle/VehicleProperty.aidl
+++ b/automotive/vehicle/aidl_property/android/hardware/automotive/vehicle/VehicleProperty.aidl
@@ -37,6 +37,51 @@
*
* Properties set to values out of range must be ignored and no action taken
* in response to such ill formed requests.
+ *
+ * Used custom annotation:
+ *
+ * change_mode:
+ * Required (except for INVALID). The change mode.
+ *
+ * access:
+ * Required (except for INVALID). The allowed access mode, can be specified multiple
+ * times to list multiple allowed access mode. Vendor must implement one of them.
+ *
+ * unit:
+ * Optional. the unit for the property.
+ *
+ * data_enum:
+ * Optional. If specified, the property is an enum-type property. Its value must be one of the
+ * enum values (unless it has data_enum_bit_flag annotation, see below). Can be specified multiple
+ * times to specify two separated enum types are supported.
+ *
+ * data_enum_bit_flag:
+ * Optional. Its value must be one or more enum values bit-ored together.
+ *
+ * version:
+ * Required (except for INVALID). Since which VHAL version is this property introduced in.
+ *
+ * require_min_max_supported_value:
+ * Optional. The property must specify min value and max value for all supported area IDs in the
+ * vehicle area config.
+ * If {@code HasSupportedValueInfo} in the vehicle area config is not {@code null},
+ * {@code HasSupportedValueInfo.hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo.hasMinSupportedValue} must be {@code true}.
+ *
+ * require_supported_values_list:
+ * Optional. The property must expose the supported values list through some way. If the property
+ * has data_enum annotation, it must specify {@code supportedEnumValues} in the vehicle area config
+ * unless all possible enum values (or all possible enum combination for data_enum_bit_flags) are
+ * supported.
+ * For certain properties, they must use the config array to specify supported values (see
+ * legacy_supported_values_in_config)
+ * If {@code HasSupportedValueInfo} in the vehicle area config is not {@code null},
+ * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}.
+ *
+ * legacy_supported_values_in_config:
+ * For certain legacy properties, they must use config array to specify supported values. For
+ * properties introduced later than V4, this is no longer used since the supported values can
+ * be specified via {@code getSupportedValuesLists} instead.
*/
@VintfStability
@JavaDerive(toString=true)
@@ -387,9 +432,17 @@
/**
* Engine oil level
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleOilLevel are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleOilLevel
+ * @require_supported_values_list
* @version 2
*/
ENGINE_OIL_LEVEL = 0x0303 + 0x10000000 + 0x01000000
@@ -621,10 +674,10 @@
* }
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minFloatValue.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxFloatValue.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minFloatValue.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxFloatValue.
* For example, if the recommended tire pressure of left_front tire is from 200.0 KILOPASCAL to
* 240.0 KILOPASCAL, {@code getMinMaxSupportedValue} for
* [propId=TIRE_PRESSURE, areaId=VehicleAreaWheel::LEFT_FRONT] must return a
@@ -736,17 +789,27 @@
* scenario, this property must be set to -20 for all wheels except for the front left, which
* must be set to 10.
*
- * HasSupportedValueInfo.hasMinSupportedValue and HasSupportedValueInfo.hasMaxSupportedValue
- * must be true for all areas.
+ * {@code minInt32Value} and {@code maxInt32Value} in {@code VehicleAreaConfig} must be
+ * specified for all supported area IDs.
*
- * MinMaxSupportedValueResult.minSupportedValue represents the lower bound of the suspension
- * height for the wheel at the specified area ID.
+ * {@code minInt32Value} represents the lower bound of the suspension height for the wheel at
+ * the specified area ID.
*
- * MinMaxSupportedValueResult.maxSupportedValue represents the upper bound of the suspension
- * height for the wheel at the specified area ID.
+ * {@code maxInt32Value} represents the upper bound of the suspension height for the wheel at
+ * the specified area ID.
+ *
+ * If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the specified
+ * area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
+ * At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
+ * maxSupportedValue.
*
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
+ * @require_min_max_supported_value
* @version 4
*/
VEHICLE_PASSIVE_SUSPENSION_HEIGHT =
@@ -778,13 +841,14 @@
* unless all bit flags of ImpactSensorLocation are supported.
*
* If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
- * {@code getSupportedValuesList} must return a {@code SupportedValuesListResult} that contains
- * supported values unless all bit flags of ImpactSensorLocation are supported.
- * At boot, supportedEnumValues is equal to the supported values list.
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum ImpactSensorLocation
+ * @data_enum_bit_flags
+ * @require_supported_values_list
* @version 3
*/
IMPACT_DETECTED =
@@ -817,7 +881,7 @@
* selected by the driver instead of simply GEAR_DRIVE.
*
* If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
- * {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID
+ * {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID
* (0) must be {@code true}.
* {@code getSupportedValuesList} for [GEAR_SELECTION, areaId=0] must return a
* {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}.
@@ -853,7 +917,7 @@
* same as that of the supported gears reported in GEAR_SELECTION.
*
* If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
- * {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID
+ * {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID
* (0) must be {@code true}.
* {@code getSupportedValuesList} for [GEAR_SELECTION, areaId=0] must return a
* {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList}.
@@ -918,10 +982,10 @@
* All values between min and max supported value must be supported.
*
* If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for global area ID(0)
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for global area ID(0)
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
*
@@ -990,9 +1054,17 @@
/**
* Represents ignition state
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleIgnitionState are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleIgnitionState
+ * @require_supported_values_list
* @version 2
*/
IGNITION_STATE = 0x0409 + 0x10000000 + 0x01000000
@@ -1030,10 +1102,8 @@
* all enum values of EvStoppingMode are supported.
*
* If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
- * For the global area ID (0), {@code getSupportedValuesList}
- * must return a {@code SupportedValuesListResult} that contains supported values unless all
- * enum values of EvStoppingMode are supported.
- * At boot, supportedEnumValues is equal to the supported values list.
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* The EvStoppingMode enum may be extended to include more states in the future.
*
@@ -1044,6 +1114,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum EvStoppingMode
+ * @require_supported_values_list
* @version 2
*/
EV_STOPPING_MODE =
@@ -1082,16 +1153,14 @@
* recommended) and ErrorState are supported.
*
* If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
- * For the global area ID (0), {@code getSupportedValuesList}
- * must return a {@code SupportedValuesListResult} that contains supported values unless all
- * states of both ElectronicStabilityControlState (including OTHER, which is not
- * recommended) and ErrorState are supported.
- * At boot, supportedEnumValues is equal to the supported values list.
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum ElectronicStabilityControlState
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 3
*/
ELECTRONIC_STABILITY_CONTROL_STATE =
@@ -1121,9 +1190,19 @@
*
* This property is a replacement to the TURN_SIGNAL_STATE property, which is now deprecated.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * to list all supported combinations of VehicleTurnSignal unless all combinations are
+ * supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleTurnSignal
+ * @data_enum_bit_flags
+ * @require_supported_values_list
* @version 4
*/
TURN_SIGNAL_LIGHT_STATE =
@@ -1142,10 +1221,18 @@
* This property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to
* implement it as VehiclePropertyAccess.READ only.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleTurnSignal are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleTurnSignal
+ * @require_supported_values_list
* @version 4
*/
TURN_SIGNAL_SWITCH =
@@ -1207,11 +1294,11 @@
* The maxInt32Value indicates the highest fan speed.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the specific
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the specific
* area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -1304,13 +1391,13 @@
* Any value set in between a valid value should be rounded to the closest valid value.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the specific
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the specific
* area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minFloatValue.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxFloatValue.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minFloatValue.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxFloatValue.
* If not all the values between minSupportedValue and maxSupportedValue are supported,
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} for the
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true} for the
* specified area ID. At boot, supportedValuesList must be equal to what is described in
* config array.
* At boot, minFloatValue is equal to minSupportedValue, maxFloatValue is equal to
@@ -1355,7 +1442,6 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
- * @config_flags Supported areaIds
* @version 2
*/
HVAC_AC_ON = 0x0505 + 0x10000000 + 0x05000000
@@ -1495,11 +1581,11 @@
* The maxInt32Value indicates the maximum seat temperature heating setting.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the specified
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the specified
* area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -1531,11 +1617,11 @@
* The maxInt32Value in the config data represents the maximum heating level.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the specified
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the specified
* area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -1568,10 +1654,10 @@
* The maxInt32Value indicates the maximum steering wheel heating setting.
*
* If {@code HasSupportedValueInfo} is not null for the global area ID (0):
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true}.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -1600,7 +1686,7 @@
* configArray[1] = FAHRENHEIT
*
* If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
- * {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID
+ * {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID
* (0) must be {@code true}.
* {@code getSupportedValuesLists} for [HVAC_TEMPERATURE_DISPLAY_UNITS, areaId=0] must return a
* {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList},
@@ -1699,6 +1785,7 @@
* @change_mode VehiclePropertyChangeMode.STATIC
* @access VehiclePropertyAccess.READ
* @data_enum VehicleHvacFanDirection
+ * @data_enum_bit_flags
* @version 2
*/
HVAC_FAN_DIRECTION_AVAILABLE = 0x0511 + 0x10000000 + 0x05000000
@@ -1732,11 +1819,11 @@
* The maxInt32Value indicates the maximum ventilation setting available for the seat.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the specified
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the specified
* area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -1841,7 +1928,7 @@
* configArray[2] = MILE
*
* If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
- * {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID
+ * {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID
* (0) must be {@code true}.
* {@code getSupportedValuesLists} for [DISTANCE_DISPLAY_UNITS, areaId=0] must returns a
* {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList},
@@ -1876,7 +1963,7 @@
* configArray[1] = GALLON
*
* If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
- * {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID
+ * {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID
* (0) must be {@code true}.
* {@code getSupportedValuesLists} for [FUEL_VOLUME_DISPLAY_UNITS, areaId=0] must return a
* {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList},
@@ -1912,7 +1999,7 @@
* configArray[2] = BAR
*
* If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
- * {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID
+ * {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID
* (0) must be {@code true}.
* {@code getSupportedValuesLists} for [TIRE_PRESSURE_DISPLAY_UNITS, areaId=0] must return a
* {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList},
@@ -1948,7 +2035,7 @@
* configArray[2] = KILOWATT_HOUR
*
* If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
- * {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID
+ * {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID
* (0) must be {@code true}.
* {@code getSupportedValuesLists} for [EV_BATTERY_DISPLAY_UNITS, areaId=0] must return a
* {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList},
@@ -2000,7 +2087,7 @@
* configArray[2] = KILOMETERS_PER_HOUR
*
* If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
- * {@code VehicleAreaConfig.HasSupportedValueInfo.hasSupportedValuesList} for the global area ID
+ * {@code VehicleAreaConfig.HasSupportedValueInfo#hasSupportedValuesList} for the global area ID
* (0) must be {@code true}.
* {@code getSupportedValuesLists} for [VEHICLE_SPEED_DISPLAY_UNITS, areaId=0] must return a
* {@code SupportedValuesListResult} that contains non-null {@code supportedValuesList},
@@ -2297,7 +2384,6 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
- * @config_flags
* @version 2
*/
HW_KEY_INPUT = 0x0A10 + 0x10000000 + 0x01000000
@@ -2320,7 +2406,6 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
- * @config_flags
* @version 2
*/
HW_KEY_INPUT_V2 =
@@ -2355,7 +2440,6 @@
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
- * @config_flags
* @version 2
*/
HW_MOTION_INPUT =
@@ -2408,6 +2492,7 @@
*/
HW_CUSTOM_INPUT = 0X0A30 + 0x10000000 + 0x01000000
+ 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC
+
/***************************************************************************
* Most Car Cabin properties have both a POSition and MOVE parameter. These
* are used to control the various movements for seats, doors, and windows
@@ -2440,10 +2525,10 @@
* closed and fully open positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -2479,10 +2564,10 @@
* currently 0, then that means there is no movement currently occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -2551,10 +2636,10 @@
* fully downward and fully upwards positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* Values in between minSupportedValue and maxSupportedValue indicate a transition state between
* the fully downward and fully upwards positions.
@@ -2590,10 +2675,10 @@
* is currently 0, then that means there is no movement currently occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -2630,10 +2715,10 @@
* left extreme and right extreme positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* Values in between minSupportedValue and maxSupportedValue indicate a transition state between
* the fully downward and fully upwards positions.
@@ -2668,10 +2753,10 @@
* is currently 0, then that means there is no movement currently occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -2736,7 +2821,6 @@
* @access VehiclePropertyAccess.READ
* @version 2
*/
-
MIRROR_AUTO_FOLD_ENABLED =
0x0B46 + VehiclePropertyGroup.SYSTEM + VehicleArea.MIRROR + VehiclePropertyType.BOOLEAN,
@@ -2755,7 +2839,6 @@
* @access VehiclePropertyAccess.READ
* @version 2
*/
-
MIRROR_AUTO_TILT_ENABLED =
0x0B47 + VehiclePropertyGroup.SYSTEM + VehicleArea.MIRROR + VehiclePropertyType.BOOLEAN,
@@ -2775,10 +2858,10 @@
* the user wants to select a preset, the desired preset number (0, 1, or 2) is set.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -2802,10 +2885,10 @@
* maxInt32Value for SEAT_MEMORY_SELECT.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
*
@@ -2850,10 +2933,10 @@
* lowest and highest positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* Values in between minSupportedValue and maxSupportedValue indicate a transition state between
* the lowest and highest positions. All integers between minSupportedValue and
* maxSupportedValue must be supported. At boot, minInt32Value is equal to minSupportedValue,
@@ -2890,10 +2973,10 @@
* occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -2928,10 +3011,10 @@
* closest and farthest positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -2966,10 +3049,10 @@
* value is currently 0, then that means there is no movement currently occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3006,10 +3089,10 @@
* full recline and upright/forward positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* Values in between minSupportedValue and maxSupportedValue indicate a transition state between
* the full recline and upright/forward positions.
@@ -3046,10 +3129,10 @@
* currently occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3088,10 +3171,10 @@
* full recline and upright/forward positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} ihas the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} ihas the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* Values in between minSupportedValue and maxSupportedValue indicate a transition state between
* the full recline and upright/forward positions.
@@ -3128,10 +3211,10 @@
* currently occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3164,10 +3247,10 @@
* lowest and highest positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* position.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
@@ -3201,10 +3284,10 @@
* is currently 0, then that means there is no movement currently occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3242,10 +3325,10 @@
* shallowest and deepest positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3279,10 +3362,10 @@
* occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3319,10 +3402,10 @@
* lowest and highest positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3357,10 +3440,10 @@
* value is currently 0, then that means there is no movement currently occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3395,10 +3478,10 @@
* forward and rearward positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3434,10 +3517,10 @@
* currently occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3472,10 +3555,10 @@
* thinnest and widest positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3511,10 +3594,10 @@
* currently occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3572,10 +3655,10 @@
* lowest and highest positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3612,10 +3695,10 @@
* currently occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3648,10 +3731,10 @@
* full recline and most upright/forward positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3687,10 +3770,10 @@
* currently occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3723,10 +3806,10 @@
* forward and rearward positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3762,10 +3845,10 @@
* currently occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3799,14 +3882,14 @@
* For each supported area ID, the VehicleAreaConfig#supportedEnumValues must be defined unless
* all enum values of VehicleLightState are supported.
*
- * If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} for the area ID
- * unless all enum values of VehicleLightState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID:
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @require_supported_values_list
* @version 2
*/
SEAT_FOOTWELL_LIGHTS_STATE =
@@ -3826,10 +3909,9 @@
* For each supported area ID, the VehicleAreaConfig#supportedEnumValues must be defined unless
* all enum values of VehicleLightSwitch are supported.
*
- * If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} for the area ID
- * unless all enum values of VehicleLightSwitch are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID:
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* This property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to
* implement it as VehiclePropertyAccess.READ only.
@@ -3838,6 +3920,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @require_supported_values_list
* @version 2
*/
SEAT_FOOTWELL_LIGHTS_SWITCH =
@@ -3896,15 +3979,14 @@
* all states of VehicleAirbagLocation are supported (including OTHER, which is not
* recommended).
*
- * If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} for the area ID
- * unless all states of VehicleAirbagLocation are supported (including OTHER, which is not
- * recommended).
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID:
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleAirbagLocation
+ * @require_supported_values_list
* @version 3
*/
SEAT_AIRBAGS_DEPLOYED =
@@ -3925,10 +4007,10 @@
* thinnest and widest positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -3964,10 +4046,10 @@
* currently occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -4000,10 +4082,10 @@
* lowest and highest positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -4037,10 +4119,10 @@
* currently occurring.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -4073,10 +4155,10 @@
* normal and walk-in positions.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -4122,9 +4204,17 @@
* Indicates whether a particular seat is occupied or not, to the best of the car's ability
* to determine. Valid values are from the VehicleSeatOccupancyState enum.
*
+ * For each supported area ID, the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleSeatOccupancyState (including UNKNOWN) are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID:
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleSeatOccupancyState
+ * @require_supported_values_list
* @version 2
*/
SEAT_OCCUPANCY = 0x0BB0 + 0x10000000 + 0x05000000
@@ -4159,10 +4249,10 @@
* Note that in this mode, 0 indicates the window is closed.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -4213,10 +4303,10 @@
* Min = open the vent, automatically stop when vent is fully open.
*
* If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true} for the area ID.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} for the area ID.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -4264,10 +4354,10 @@
* The maxInt32Value for each area ID must specify the longest wiper period.
*
* If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true}.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -4295,15 +4385,14 @@
* unless all states in WindshieldWipersState are supported (including OTHER, which is not
* recommended).
*
- * If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} for the area ID
- * unless all states in WindshieldWipersState are supported (including OTHER, which is not
- * recommended).
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID:
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum WindshieldWipersState
+ * @require_supported_values_list
* @version 2
*/
WINDSHIELD_WIPERS_STATE =
@@ -4320,11 +4409,9 @@
* unless all states in WindshieldWipersSwitch are supported (including OTHER, which is not
* recommended).
*
- * If {@code HasSupportedValueInfo} for a specific area ID is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true} for the area ID
- * unless all states in WindshieldWipersSwitch are supported (including OTHER, which is not
- * recommended).
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID:
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* This property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to
* implement it as VehiclePropertyAccess.READ only.
@@ -4337,6 +4424,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum WindshieldWipersSwitch
+ * @require_supported_values_list
* @version 2
*/
WINDSHIELD_WIPERS_SWITCH =
@@ -4358,10 +4446,10 @@
* closest and furthest positions.
*
* If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true}.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -4395,10 +4483,10 @@
* currently occurring.
*
* If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true}.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -4431,10 +4519,10 @@
* lowest and highest positions.
*
* If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true}.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -4468,10 +4556,10 @@
* currently occurring.
*
* If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true}.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -4551,10 +4639,10 @@
* closed and fully open positions.
*
* If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasMinSupportedValue} and
- * {@code HasSupportedValueInfo.hasMaxSupportedValue} must be {@code true}.
- * {@code MinMaxSupportedValueResult.minSupportedValue} has the same meaning as minInt32Value.
- * {@code MinMaxSupportedValueResult.maxSupportedValue} has the same meaning as maxInt32Value.
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
* All integers between minSupportedValue and maxSupportedValue must be supported.
* At boot, minInt32Value is equal to minSupportedValue, maxInt32Value is equal to
* maxSupportedValue.
@@ -4930,9 +5018,17 @@
*
* Return the current state of headlights.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightState are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @require_supported_values_list
* @version 2
*/
HEADLIGHTS_STATE = 0x0E00 + 0x10000000 + 0x01000000
@@ -4942,9 +5038,17 @@
*
* Return the current state of high beam lights.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightState are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @require_supported_values_list
* @version 2
*/
HIGH_BEAM_LIGHTS_STATE = 0x0E01 + 0x10000000 + 0x01000000
@@ -4970,9 +5074,17 @@
* Only one of FOG_LIGHTS_STATE or REAR_FOG_LIGHTS_STATE must be implemented and not both.
* FRONT_FOG_LIGHTS_STATE must not be implemented.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightState are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @require_supported_values_list
* @version 2
*/
FOG_LIGHTS_STATE = 0x0E02 + 0x10000000 + 0x01000000
@@ -4982,9 +5094,17 @@
*
* Return the current status of hazard lights.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightState are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @require_supported_values_list
* @version 2
*/
HAZARD_LIGHTS_STATE = 0x0E03 + 0x10000000 + 0x01000000
@@ -4994,6 +5114,13 @@
*
* The setting that the user wants.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightSwitch are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* This property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to
* implement it as VehiclePropertyAccess.READ only.
*
@@ -5001,6 +5128,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @require_supported_values_list
* @version 2
*/
HEADLIGHTS_SWITCH = 0x0E10 + 0x10000000 + 0x01000000
@@ -5010,6 +5138,13 @@
*
* The setting that the user wants.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightSwitch are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* This property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to
* implement it as VehiclePropertyAccess.READ only.
*
@@ -5017,6 +5152,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @require_supported_values_list
* @version 2
*/
HIGH_BEAM_LIGHTS_SWITCH = 0x0E11 + 0x10000000 + 0x01000000
@@ -5042,6 +5178,13 @@
* Only one of FOG_LIGHTS_SWITCH or REAR_FOG_LIGHTS_SWITCH must be implemented and not both.
* FRONT_FOG_LIGHTS_SWITCH must not be implemented.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightSwitch are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* This property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to
* implement it as VehiclePropertyAccess.READ only.
*
@@ -5049,6 +5192,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @require_supported_values_list
* @version 2
*/
FOG_LIGHTS_SWITCH = 0x0E12 + 0x10000000 + 0x01000000
@@ -5058,6 +5202,13 @@
*
* The setting that the user wants.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightSwitch are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* This property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to
* implement it as VehiclePropertyAccess.READ only.
*
@@ -5065,6 +5216,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @require_supported_values_list
* @version 2
*/
HAZARD_LIGHTS_SWITCH = 0x0E13 + 0x10000000 + 0x01000000
@@ -5074,9 +5226,17 @@
*
* Return current status of cabin lights.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightState are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @require_supported_values_list
* @version 2
*/
CABIN_LIGHTS_STATE = 0x0F01 + 0x10000000 + 0x01000000
@@ -5089,6 +5249,13 @@
* is open or because of a voice command.
* For example, while the switch is in the "off" or "automatic" position.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightSwitch are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* This property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to
* implement it as VehiclePropertyAccess.READ only.
*
@@ -5096,6 +5263,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @require_supported_values_list
* @version 2
*/
CABIN_LIGHTS_SWITCH = 0x0F02 + 0x10000000 + 0x01000000
@@ -5105,9 +5273,17 @@
*
* Return current status of reading lights.
*
+ * For each supported area ID, the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightState are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID:
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @require_supported_values_list
* @version 2
*/
READING_LIGHTS_STATE = 0x0F03 + 0x10000000 + 0x05000000
@@ -5120,6 +5296,13 @@
* is open or because of a voice command.
* For example, while the switch is in the "off" or "automatic" position.
*
+ * For each supported area ID, the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightSwitch are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for a specifc area ID:
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* This property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to
* implement it as VehiclePropertyAccess.READ only.
*
@@ -5127,6 +5310,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @require_supported_values_list
* @version 2
*/
READING_LIGHTS_SWITCH = 0x0F04 + 0x10000000 + 0x05000000
@@ -5146,14 +5330,14 @@
* For the global area ID (0), the VehicleAreaConfig#supportedEnumValues must be defined unless
* all enum values of VehicleLightState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all enum values of VehicleLightState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @require_supported_values_list
* @version 2
*/
STEERING_WHEEL_LIGHTS_STATE =
@@ -5173,10 +5357,9 @@
* For the global area ID (0), the VehicleAreaConfig#supportedEnumValues must be defined unless
* all enum values of VehicleLightSwitch are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all enum values of VehicleLightSwitch are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* This property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to
* implement it as VehiclePropertyAccess.READ only.
@@ -5185,6 +5368,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @require_supported_values_list
* @version 2
*/
STEERING_WHEEL_LIGHTS_SWITCH =
@@ -5689,7 +5873,7 @@
* @access VehiclePropertyAccess.WRITE
* @version 2
*/
- WATCHDOG_ALIVE = 0xF31 + 0x10000000 + 0x01000000
+ WATCHDOG_ALIVE = 0x0F31 + 0x10000000 + 0x01000000
+ 0x00500000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT64
/**
* Defines a process terminated by car watchdog and the reason of termination.
@@ -5827,9 +6011,17 @@
* If the head unit is aware of an ETC card attached to the vehicle, this property should
* return the type of card attached; otherwise, this property should be UNAVAILABLE.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in ElectronicTollCollectionCardType are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum ElectronicTollCollectionCardType
+ * @require_supported_values_list
* @version 2
*/
ELECTRONIC_TOLL_COLLECTION_CARD_TYPE = 0x0F39 + 0x10000000 + 0x01000000
@@ -5842,9 +6034,17 @@
* ELECTRONIC_TOLL_COLLECTION_CARD_TYPE gives that status of the card; otherwise,
* this property should be UNAVAILABLE.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in ElectronicTollCollectionCardStatus are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum ElectronicTollCollectionCardStatus
+ * @require_supported_values_list
* @version 2
*/
ELECTRONIC_TOLL_COLLECTION_CARD_STATUS = 0x0F3A + 0x10000000 + 0x01000000
@@ -5856,9 +6056,17 @@
* Only one of FOG_LIGHTS_STATE or FRONT_FOG_LIGHTS_STATE must be implemented. Please refer to
* the documentation on FOG_LIGHTS_STATE for more information.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightState are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @require_supported_values_list
* @version 2
*/
FRONT_FOG_LIGHTS_STATE = 0x0F3B + 0x10000000 + 0x01000000
@@ -5871,6 +6079,13 @@
* Only one of FOG_LIGHTS_SWITCH or FRONT_FOG_LIGHTS_SWITCH must be implemented. Please refer to
* the documentation on FOG_LIGHTS_SWITCH for more information.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightSwitch are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* This property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to
* implement it as VehiclePropertyAccess.READ only.
*
@@ -5878,6 +6093,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @require_supported_values_list
* @version 2
*/
FRONT_FOG_LIGHTS_SWITCH = 0x0F3C + 0x10000000 + 0x01000000
@@ -5890,9 +6106,17 @@
* Only one of FOG_LIGHTS_STATE or REAR_FOG_LIGHTS_STATE must be implemented. Please refer to
* the documentation on FOG_LIGHTS_STATE for more information.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightState are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightState
+ * @require_supported_values_list
* @version 2
*/
REAR_FOG_LIGHTS_STATE = 0x0F3D + 0x10000000 + 0x01000000
@@ -5905,6 +6129,13 @@
* Only one of FOG_LIGHTS_SWITCH or REAR_FOG_LIGHTS_SWITCH must be implemented. Please refer to
* the documentation on FOG_LIGHTS_SWITCH for more information.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in VehicleLightSwitch are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* This property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to
* implement it as VehiclePropertyAccess.READ only.
*
@@ -5912,6 +6143,7 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleLightSwitch
+ * @require_supported_values_list
* @version 2
*/
REAR_FOG_LIGHTS_SWITCH = 0x0F3E + 0x10000000 + 0x01000000
@@ -5920,8 +6152,20 @@
/**
* Indicates the maximum current draw threshold for charging set by the user
*
- * configArray[0] is used to specify the max current draw allowed by
- * the vehicle in Amperes.
+ * configArray[0] is used to specify the max current draw allowed by the vehicle in Amperes at
+ * boot time.
+ *
+ * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null},
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} must be {@code true}.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} specifies the max current draw allowed
+ * by the vehicle in Amperes at the current moment.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} must be 0.
+ * At boot, configArray[0] is equal to maxSupportedValue.
+ *
+ * If the max current draw allowed by the vehicle may change dynamically,
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true} and
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} must be implemented.
*
* This property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to
* implement it as VehiclePropertyAccess.READ only.
@@ -5940,18 +6184,30 @@
*
* Returns a float value from 0 to 100.
*
- * configArray is used to specify the valid values.
+ * configArray is used to specify the valid values at boot time.
* For example, if the vehicle supports the following charge percent limit values:
* [20, 40, 60, 80, 100]
* then the configArray should be {20, 40, 60, 80, 100}
* If the configArray is empty then all values from 0 to 100 must be valid.
*
+ * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null},
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * {@code SupportedValuesListResult#supportedValuesList} specifies the
+ * valid maximum charge percent threshold options at the current moment.
+ * At boot, configArray content must match the supported values list.
+ *
+ * If the valid values may change dynamically,
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true} and
+ * {@code SupportedValuesListResult#supportedValuesList} must be implemented.
+ *
* This property is defined as VehiclePropertyAccess.READ_WRITE, but OEMs have the option to
* implement it as VehiclePropertyAccess.READ only.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
+ * @require_supported_values_list
+ * @legacy_supported_values_in_config
* @version 2
*/
EV_CHARGE_PERCENT_LIMIT = 0x0F40 + 0x10000000 + 0x01000000
@@ -5966,9 +6222,17 @@
* EvChargeState::STATE_FULLY_CHARGED when the battery charge level has reached the target
* level. See EV_CHARGE_PERCENT_LIMIT for more context.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in EvChargeState are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum EvChargeState
+ * @require_supported_values_list
* @version 2
*/
EV_CHARGE_STATE = 0x0F41 + 0x10000000 + 0x01000000
@@ -6013,9 +6277,17 @@
* EV_BRAKE_REGENERATION_LEVEL property can be used instead, which provides a more granular
* way of providing the same information.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in EvRegenerativeBrakingState are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum EvRegenerativeBrakingState
+ * @require_supported_values_list
* @version 2
*/
EV_REGENERATIVE_BRAKING_STATE = 0x0F44 + 0x10000000 + 0x01000000
@@ -6026,9 +6298,17 @@
*
* Returns the trailer state of the car.
*
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states in TrailerState are supported.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
+ *
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum TrailerState
+ * @require_supported_values_list
* @version 2
*/
TRAILER_PRESENT = 0x0F45 + 0x10000000 + 0x01000000
@@ -6202,14 +6482,14 @@
* For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
* unless all states of VehicleAutonomousState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all enum values of VehicleAutonomousState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleAutonomousState
+ * @require_supported_values_list
* @version 3
*/
VEHICLE_DRIVING_AUTOMATION_CURRENT_LEVEL =
@@ -6229,9 +6509,14 @@
* and is currently in the target level of autonomy, this property must be equal to the value of
* VEHICLE_DRIVING_AUTOMATION_CURRENT_LEVEL.
*
- * For the global area ID (0), the SupportedValuesListResult#supportedValuesList array must be
- * defined unless all states of VehicleAutonomousState are supported. These values must match
- * the values in supportedValuesList of VEHICLE_DRIVING_AUTOMATION_CURRENT_LEVEL.
+ * For the global area ID (0), the VehicleAreaConfig#supportedEnumValues array must be defined
+ * unless all states of VehicleAutonomousState are supported. The supported values for this
+ * property must be the same as the supported values for
+ * VEHICLE_DRIVING_AUTOMATION_CURRENT_LEVEL.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* For the property that communicates the current state of autonomy, see
* VEHICLE_DRIVING_AUTOMATION_CURRENT_LEVEL.
@@ -6239,6 +6524,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum VehicleAutonomousState
+ * @require_supported_values_list
* @version 4
*/
VEHICLE_DRIVING_AUTOMATION_TARGET_LEVEL =
@@ -6334,16 +6620,15 @@
* unless all states of both AutomaticEmergencyBrakingState (including OTHER, which is not
* recommended) and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of both AutomaticEmergencyBrakingState (including OTHER, which is not
- * recommended) and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum AutomaticEmergencyBrakingState
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 2
*/
AUTOMATIC_EMERGENCY_BRAKING_STATE =
@@ -6382,16 +6667,15 @@
* unless all states of both ForwardCollisionWarningState (including OTHER, which is not
* recommended) and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of both ForwardCollisionWarningState (including OTHER, which is not
- * recommended) and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum ForwardCollisionWarningState
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 2
*/
FORWARD_COLLISION_WARNING_STATE =
@@ -6430,16 +6714,15 @@
* unless all states of both BlindSpotWarningState (including OTHER, which is not
* recommended) and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of both BlindSpotWarningState (including OTHER, which is not
- * recommended) and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum BlindSpotWarningState
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 2
*/
BLIND_SPOT_WARNING_STATE =
@@ -6479,16 +6762,15 @@
* unless all states of both LaneDepartureWarningState (including OTHER, which is not
* recommended) and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of both LaneDepartureWarningState (including OTHER, which is not
- * recommended) and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum LaneDepartureWarningState
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 2
*/
LANE_DEPARTURE_WARNING_STATE =
@@ -6535,16 +6817,15 @@
* unless all states of both LaneKeepAssistState (including OTHER, which is not
* recommended) and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of both LaneKeepAssistState (including OTHER, which is not
- * recommended) and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum LaneKeepAssistState
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 2
*/
LANE_KEEP_ASSIST_STATE =
@@ -6593,10 +6874,9 @@
* For the global area ID (0), the VehicleAreaConfig#supportedEnumValues must be defined unless
* all enum values of LaneCenteringAssistCommand are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all enum values of LaneCenteringAssistCommand are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* When this property is not available because LCA is disabled (i.e.
* LANE_CENTERING_ASSIST_ENABLED is false), this property must return
@@ -6609,6 +6889,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.WRITE
* @data_enum LaneCenteringAssistCommand
+ * @require_supported_values_list
* @version 2
*/
LANE_CENTERING_ASSIST_COMMAND =
@@ -6628,16 +6909,15 @@
* unless all states of both LaneCenteringAssistState (including OTHER, which is not
* recommended) and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of both LaneCenteringAssistState (including OTHER, which is not
- * recommended) and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum LaneCenteringAssistState
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 2
*/
LANE_CENTERING_ASSIST_STATE =
@@ -6679,16 +6959,15 @@
* unless all states of EmergencyLaneKeepAssistState (including OTHER, which is not recommended)
* and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of EmergencyLaneKeepAssistState (including OTHER, which is not recommended)
- * and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum EmergencyLaneKeepAssistState
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 2
*/
EMERGENCY_LANE_KEEP_ASSIST_STATE =
@@ -6732,11 +7011,9 @@
* unless all states of CruiseControlType (including OTHER, which is not recommended) and
* ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of CruiseControlType (including OTHER, which is not recommended) and
- * ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* Trying to write CruiseControlType#OTHER or an ErrorState to this property will throw an
* IllegalArgumentException.
@@ -6749,6 +7026,7 @@
* @access VehiclePropertyAccess.READ
* @data_enum CruiseControlType
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 2
*/
CRUISE_CONTROL_TYPE =
@@ -6766,16 +7044,15 @@
* unless all states of CruiseControlState (including OTHER, which is not recommended) and
* ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of CruiseControlState (including OTHER, which is not recommended) and
- * ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum CruiseControlState
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 2
*/
CRUISE_CONTROL_STATE =
@@ -6790,10 +7067,9 @@
* unless all states of CruiseControlState are supported. Any unsupported commands sent through
* this property must return StatusCode#INVALID_ARG.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of CruiseControlState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* When this property is not available because CC is disabled (i.e. CRUISE_CONTROL_ENABLED is
* false), this property must return StatusCode#NOT_AVAILABLE_DISABLED. If CRUISE_CONTROL_STATE
@@ -6805,6 +7081,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.WRITE
* @data_enum CruiseControlCommand
+ * @require_supported_values_list
* @version 2
*/
CRUISE_CONTROL_COMMAND =
@@ -6816,9 +7093,16 @@
* OEMs should set the minFloatValue and maxFloatValue values for this property to define the
* min and max target speed values. These values must be non-negative.
*
- * The maxFloatValue represents the upper bound of the target speed.
* The minFloatValue represents the lower bound of the target speed.
*
+ * The maxFloatValue represents the upper bound of the target speed.
+ *
+ * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minFloatValue.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxFloatValue.
+ *
* When this property is not available because CC is disabled (i.e. CRUISE_CONTROL_ENABLED is
* false), this property must return StatusCode#NOT_AVAILABLE_DISABLED. If CRUISE_CONTROL_STATE
* is implemented and the state is set to an ErrorState value, then this property must return a
@@ -6829,6 +7113,7 @@
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit.METER_PER_SEC
+ * @require_min_max_supported_value
* @version 2
*/
CRUISE_CONTROL_TARGET_SPEED =
@@ -6843,9 +7128,17 @@
* vehicle's front-most point. The actual time gap from a leading vehicle can be above or below
* this value.
*
- * The possible values to set for the target time gap should be specified in configArray in
- * ascending order. All values must be positive. If the property is writable, all values must be
- * writable.
+ * The possible values to set for the target time gap at boot time should be specified in
+ * configArray in ascending order. All values must be positive. If the property is writable, all
+ * values must be writable.
+ *
+ * If {@code HasSupportedValueInfo} is not {@code null},
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}. The supported
+ * values list represents the possible values to set at the current moment.
+ *
+ * If the possible values to set may change dynamically,
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true} and the supported
+ * values list must be implemented.
*
* When this property is not available because CC is disabled (i.e. CRUISE_CONTROL_ENABLED is
* false), this property must return StatusCode#NOT_AVAILABLE_DISABLED. If CRUISE_CONTROL_STATE
@@ -6861,6 +7154,8 @@
* @access VehiclePropertyAccess.READ_WRITE
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit.MILLI_SECS
+ * @require_supported_values_list
+ * @legacy_supported_values_in_config
* @version 2
*/
ADAPTIVE_CRUISE_CONTROL_TARGET_TIME_GAP =
@@ -6874,10 +7169,18 @@
* vehicle and the front-most point of the ACC vehicle.
*
* The maxInt32Value and minInt32Value in VehicleAreaConfig must be defined.
+ *
* The minInt32Value should be 0.
+ *
* The maxInt32Value should be populated with the maximum range the distance sensor can support.
* This value should be non-negative.
*
+ * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
+ * {@code HasSupportedValueInfo#hasMinSupportedValue} and
+ * {@code HasSupportedValueInfo#hasMaxSupportedValue} must be {@code true}.
+ * {@code MinMaxSupportedValueResult#minSupportedValue} has the same meaning as minInt32Value.
+ * {@code MinMaxSupportedValueResult#maxSupportedValue} has the same meaning as maxInt32Value.
+ *
* When no lead vehicle is detected (that is, when there is no leading vehicle or the leading
* vehicle is too far away for the sensor to detect), this property should return
* StatusCode.NOT_AVAILABLE.
@@ -6892,6 +7195,7 @@
* @change_mode VehiclePropertyChangeMode.CONTINUOUS
* @access VehiclePropertyAccess.READ
* @unit VehicleUnit.MILLIMETER
+ * @require_min_max_supported_value
* @version 2
*/
ADAPTIVE_CRUISE_CONTROL_LEAD_VEHICLE_MEASURED_DISTANCE =
@@ -6935,16 +7239,15 @@
* unless all states of both HandsOnDetectionDriverState (including OTHER, which is not
* recommended) and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of both HandsOnDetectionDriverState (including OTHER, which is not
- * recommended) and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum HandsOnDetectionDriverState
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 2
*/
HANDS_ON_DETECTION_DRIVER_STATE =
@@ -6964,16 +7267,15 @@
* unless all states of both HandsOnDetectionWarning (including OTHER, which is not recommended)
* and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of both HandsOnDetectionWarning (including OTHER, which is not recommended)
- * and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum HandsOnDetectionWarning
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 2
*/
HANDS_ON_DETECTION_WARNING =
@@ -7020,16 +7322,15 @@
* unless all states of both DriverDrowsinessAttentionState (including OTHER, which is not
* recommended) and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of both DriverDrowsinessAttentionState (including OTHER, which is not
- * recommended) and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum DriverDrowsinessAttentionState
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 3
*/
DRIVER_DROWSINESS_ATTENTION_STATE =
@@ -7073,16 +7374,15 @@
* unless all states of both DriverDrowsinessAttentionWarning (including OTHER, which is not
* recommended) and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of both DriverDrowsinessAttentionWarning (including OTHER, which is not
- * recommended) and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum DriverDrowsinessAttentionWarning
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 3
*/
DRIVER_DROWSINESS_ATTENTION_WARNING =
@@ -7127,16 +7427,15 @@
* unless all states of both DriverDistractionState (including OTHER, which is not
* recommended) and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of both DriverDistractionState (including OTHER, which is not
- * recommended) and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum DriverDistractionState
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 3
*/
DRIVER_DISTRACTION_STATE =
@@ -7179,16 +7478,15 @@
* unless all states of both DriverDistractionWarning (including OTHER, which is not
* recommended) and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of both DriverDistractionWarning (including OTHER, which is not
- * recommended) and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum DriverDistractionWarning
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 3
*/
DRIVER_DISTRACTION_WARNING =
@@ -7234,16 +7532,15 @@
* unless all states of both LowSpeedCollisionWarningState (including OTHER, which is not
* recommended) and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of both LowSpeedCollisionWarningState (including OTHER, which is not
- * recommended) and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum LowSpeedCollisionWarningState
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 3
*/
LOW_SPEED_COLLISION_WARNING_STATE =
@@ -7283,16 +7580,15 @@
* unless all states of both CrossTrafficMonitoringWarningState (including OTHER, which is not
* recommended) and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of both CrossTrafficMonitoringWarningState (including OTHER, which is not
- * recommended) and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum CrossTrafficMonitoringWarningState
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 3
*/
CROSS_TRAFFIC_MONITORING_WARNING_STATE =
@@ -7343,16 +7639,15 @@
* unless all states of both LowSpeedAutomaticEmergencyBrakingState (including OTHER, which is
* not recommended) and ErrorState are supported.
*
- * If {@code HasSupportedValueInfo} for the global area ID (0) is not {@code null}:
- * {@code HasSupportedValueInfo.hasSupportedValuesList} must be {@code true}
- * unless all states of both LowSpeedAutomaticEmergencyBrakingState (including OTHER, which is
- * not recommended) and ErrorState are supported.
- * At boot, the supported values list is the same as supportedEnumValues.
+ * If {@code HasSupportedValueInfo} is not {@code null} for the global area ID (0):
+ * {@code HasSupportedValueInfo#hasSupportedValuesList} must be {@code true}.
+ * At boot, supportedEnumValues (if defined) is equal to the supported values list.
*
* @change_mode VehiclePropertyChangeMode.ON_CHANGE
* @access VehiclePropertyAccess.READ
* @data_enum LowSpeedAutomaticEmergencyBrakingState
* @data_enum ErrorState
+ * @require_supported_values_list
* @version 3
*/
LOW_SPEED_AUTOMATIC_EMERGENCY_BRAKING_STATE =
diff --git a/automotive/vehicle/tools/generate_annotation_enums.py b/automotive/vehicle/tools/generate_annotation_enums.py
index 460e9f9..4ed19d3 100755
--- a/automotive/vehicle/tools/generate_annotation_enums.py
+++ b/automotive/vehicle/tools/generate_annotation_enums.py
@@ -45,6 +45,8 @@
ENUM_JAVA_FILE_PATH = GENERATED_LIB + '/java/EnumForVehicleProperty.java'
UNITS_JAVA_FILE_PATH = GENERATED_LIB + '/java/UnitsForVehicleProperty.java'
VERSION_CPP_FILE_PATH = GENERATED_LIB + '/cpp/VersionForVehicleProperty.h'
+ANNOTATIONS_CPP_FILE_PATH = GENERATED_LIB + '/cpp/AnnotationsForVehicleProperty.h'
+ANNOTATIONS_JAVA_FILE_PATH = GENERATED_LIB + '/java/AnnotationsForVehicleProperty.java'
SCRIPT_PATH = 'hardware/interfaces/automotive/vehicle/tools/generate_annotation_enums.py'
TAB = ' '
@@ -58,6 +60,28 @@
RE_DATA_ENUM = re.compile('\s*\* @data_enum (\S+)\s*')
RE_UNIT = re.compile('\s*\* @unit (\S+)\s+')
RE_VALUE = re.compile('\s*(\w+)\s*=(.*)')
+RE_ANNOTATION = re.compile('\s*\* @(\S+)\s*')
+
+SUPPORTED_ANNOTATIONS = ['change_mode', 'access', 'unit', 'data_enum', 'data_enum_bit_flags',
+ 'version', 'require_min_max_supported_value', 'require_supported_values_list',
+ 'legacy_supported_values_in_config']
+
+# Non static data_enum properties that do not require supported values list.
+# These properties are either deprecated or for internal use only.
+ENUM_PROPERTIES_WITHOUT_SUPPORTED_VALUES = [
+ # deprecated
+ 'TURN_SIGNAL_STATE',
+ # The supported values are exposed through HVAC_FAN_DIRECTION_AVAILABLE
+ 'HVAC_FAN_DIRECTION',
+ # Internal use only
+ 'HW_ROTARY_INPUT',
+ # Internal use only
+ 'HW_CUSTOM_INPUT',
+ # Internal use only
+ 'SHUTDOWN_REQUEST',
+ # Internal use only
+ 'CAMERA_SERVICE_CURRENT_STATE'
+]
LICENSE = """/*
* Copyright (C) 2023 The Android Open Source Project
@@ -142,6 +166,24 @@
std::unordered_map<VehicleProperty, int32_t> VersionForVehicleProperty = {
"""
+ANNOTATIONS_CPP_HEADER = """#pragma once
+
+#include <aidl/android/hardware/automotive/vehicle/VehicleProperty.h>
+
+#include <string>
+#include <unordered_map>
+#include <unordered_set>
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace automotive {
+namespace vehicle {
+
+std::unordered_map<VehicleProperty, std::unordered_set<std::string>>
+ AnnotationsForVehicleProperty = {
+"""
+
CHANGE_MODE_JAVA_HEADER = """package android.hardware.automotive.vehicle;
import java.util.Map;
@@ -185,6 +227,16 @@
public static final Map<Integer, Integer> values = Map.ofEntries(
"""
+ANNOTATIONS_JAVA_HEADER = """package android.hardware.automotive.vehicle;
+
+import java.util.Set;
+import java.util.Map;
+
+public final class AnnotationsForVehicleProperty {
+
+ public static final Map<Integer, Set<String>> values = Map.ofEntries(
+"""
+
class PropertyConfig:
"""Represents one VHAL property definition in VehicleProperty.aidl."""
@@ -198,6 +250,8 @@
self.enum_types = []
self.unit_type = None
self.version = None
+ # Use a set to avoid duplicate annotation.
+ self.annotations = set()
def __repr__(self):
return self.__str__()
@@ -232,60 +286,15 @@
if RE_COMMENT_BEGIN.match(line):
in_comment = True
config = PropertyConfig()
- description = ''
+ # Use an array so that we could modify the string in parseComment.
+ description = ['']
continue
if RE_COMMENT_END.match(line):
in_comment = False
if in_comment:
- 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'
+ # We will update the string in description in this function.
+ self.parseComment(line, config, description)
else:
match = RE_VALUE.match(line)
if match:
@@ -300,12 +309,79 @@
'No access_mode annotation for property: ' + prop_name)
if not config.version:
raise Exception(
- 'no version annotation for property: ' + prop_name)
+ 'No version annotation for property: ' + prop_name)
+ if ('data_enum' in config.annotations and
+ 'require_supported_values_list' not in config.annotations and
+ config.change_mode != 'STATIC' and
+ prop_name not in ENUM_PROPERTIES_WITHOUT_SUPPORTED_VALUES):
+ raise Exception(
+ 'The property: ' + prop_name + ' has @data_enum '
+ 'annotation but does not have @require_supported_values_list'
+ ', either add the annotation or add the property name to '
+ 'ENUM_PROPERTIES_WITHOUT_SUPPORTED_VALUES in '
+ 'generate_annotation_enums.py')
+
config.name = prop_name
configs.append(config)
self.configs = configs
+ def parseComment(self, line, config, description):
+ match_annotation = RE_ANNOTATION.match(line)
+ if match_annotation:
+ annotation = match_annotation.group(1)
+ if annotation not in SUPPORTED_ANNOTATIONS:
+ raise Exception('Annotation: @' + annotation + " is not supported, typo?")
+ config.annotations.add(annotation)
+ match = RE_CHANGE_MODE.match(line)
+ if match:
+ config.change_mode = match.group(1).replace('VehiclePropertyChangeMode.', '')
+ return
+ match = RE_ACCESS.match(line)
+ if match:
+ config.access_modes.append(match.group(1).replace('VehiclePropertyAccess.', ''))
+ return
+ match = RE_UNIT.match(line)
+ if match:
+ config.unit_type = match.group(1)
+ return
+ match = RE_DATA_ENUM.match(line)
+ if match:
+ config.enum_types.append(match.group(1))
+ return
+ 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)
+ return
+
+ 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[0]
+ else:
+ if description[0] != '':
+ description[0] += ' '
+ description[0] += 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'
+
def convert(self, output, header, footer, cpp, field):
"""Converts the property config file to C++/Java output file."""
counter = 0
@@ -313,38 +389,45 @@
for config in self.configs:
if field == 'change_mode':
if cpp:
- annotation = "VehiclePropertyChangeMode::" + config.change_mode
+ value = "VehiclePropertyChangeMode::" + config.change_mode
else:
- annotation = "VehiclePropertyChangeMode." + config.change_mode
+ value = "VehiclePropertyChangeMode." + config.change_mode
elif field == 'access_mode':
if cpp:
- annotation = "VehiclePropertyAccess::" + config.access_modes[0]
+ value = "VehiclePropertyAccess::" + config.access_modes[0]
else:
- annotation = "VehiclePropertyAccess." + config.access_modes[0]
+ value = "VehiclePropertyAccess." + config.access_modes[0]
elif field == 'enum_types':
if len(config.enum_types) < 1:
- continue;
+ continue
if not cpp:
- annotation = "List.of(" + ', '.join([class_name + ".class" for class_name in config.enum_types]) + ")"
+ value = "List.of(" + ', '.join([class_name + ".class" for class_name in config.enum_types]) + ")"
elif field == 'unit_type':
if not config.unit_type:
continue
if not cpp:
- annotation = config.unit_type
-
+ value = config.unit_type
elif field == 'version':
if cpp:
- annotation = config.version
+ value = config.version
+ elif field == 'annotations':
+ if len(config.annotations) < 1:
+ continue
+ joined_annotation_strings = ', '.join(['"' + annotation + '"' for annotation in config.annotations])
+ if cpp:
+ value = "{" + joined_annotation_strings + "}"
+ else:
+ value = "Set.of(" + joined_annotation_strings + ")"
else:
raise Exception('Unknown field: ' + field)
if counter != 0:
content += '\n'
if cpp:
content += (TAB + TAB + '{VehicleProperty::' + config.name + ', ' +
- annotation + '},')
+ value + '},')
else:
content += (TAB + TAB + 'Map.entry(VehicleProperty.' + config.name + ', ' +
- annotation + '),')
+ value + '),')
counter += 1
# Remove the additional ',' at the end for the Java file.
@@ -527,6 +610,15 @@
version.setCppFooter(CPP_FOOTER)
generated_files.append(version)
+ annotations = GeneratedFile('annotations')
+ annotations.setCppFilePath(os.path.join(android_top, ANNOTATIONS_CPP_FILE_PATH))
+ annotations.setJavaFilePath(os.path.join(android_top, ANNOTATIONS_JAVA_FILE_PATH))
+ annotations.setCppHeader(ANNOTATIONS_CPP_HEADER)
+ annotations.setCppFooter(CPP_FOOTER)
+ annotations.setJavaHeader(ANNOTATIONS_JAVA_HEADER)
+ annotations.setJavaFooter(JAVA_FOOTER)
+ generated_files.append(annotations)
+
temp_files = []
try:
diff --git a/biometrics/common/util/CancellationSignal.cpp b/biometrics/common/util/CancellationSignal.cpp
index 7888838..2bfc39e 100644
--- a/biometrics/common/util/CancellationSignal.cpp
+++ b/biometrics/common/util/CancellationSignal.cpp
@@ -22,10 +22,13 @@
namespace aidl::android::hardware::biometrics {
CancellationSignal::CancellationSignal(std::promise<void>&& cancellationPromise)
- : mCancellationPromise(std::move(cancellationPromise)) {}
+ : mCancellationPromise(std::move(cancellationPromise)), isSet(false) {}
ndk::ScopedAStatus CancellationSignal::cancel() {
- mCancellationPromise.set_value();
+ if (!isSet) {
+ mCancellationPromise.set_value();
+ isSet = true;
+ }
return ndk::ScopedAStatus::ok();
}
diff --git a/biometrics/common/util/include/util/CancellationSignal.h b/biometrics/common/util/include/util/CancellationSignal.h
index be77e29..d5a9a1d 100644
--- a/biometrics/common/util/include/util/CancellationSignal.h
+++ b/biometrics/common/util/include/util/CancellationSignal.h
@@ -30,6 +30,7 @@
private:
std::promise<void> mCancellationPromise;
+ bool isSet;
};
// Returns whether the given cancellation future is ready, i.e. whether the operation corresponding
diff --git a/biometrics/face/aidl/vts/Android.bp b/biometrics/face/aidl/vts/Android.bp
index e037eac..1b3a93a 100644
--- a/biometrics/face/aidl/vts/Android.bp
+++ b/biometrics/face/aidl/vts/Android.bp
@@ -28,4 +28,5 @@
"general-tests",
"vts",
],
+ disable_framework: false,
}
diff --git a/biometrics/face/aidl/vts/VtsHalBiometricsFaceTargetTest.cpp b/biometrics/face/aidl/vts/VtsHalBiometricsFaceTargetTest.cpp
index 08ab5d6..686f61e 100644
--- a/biometrics/face/aidl/vts/VtsHalBiometricsFaceTargetTest.cpp
+++ b/biometrics/face/aidl/vts/VtsHalBiometricsFaceTargetTest.cpp
@@ -186,6 +186,7 @@
void TearDown() override {
// Close the mSession.
+ ASSERT_NE(mSession, nullptr);
ASSERT_TRUE(mSession->close().isOk());
// Make sure the mSession is closed.
diff --git a/biometrics/fingerprint/aidl/vts/Android.bp b/biometrics/fingerprint/aidl/vts/Android.bp
index 628f03f..2b4f657 100644
--- a/biometrics/fingerprint/aidl/vts/Android.bp
+++ b/biometrics/fingerprint/aidl/vts/Android.bp
@@ -27,4 +27,5 @@
"general-tests",
"vts",
],
+ disable_framework: false,
}
diff --git a/biometrics/fingerprint/aidl/vts/VtsHalBiometricsFingerprintTargetTest.cpp b/biometrics/fingerprint/aidl/vts/VtsHalBiometricsFingerprintTargetTest.cpp
index 1cd8c76..2cc5e56 100644
--- a/biometrics/fingerprint/aidl/vts/VtsHalBiometricsFingerprintTargetTest.cpp
+++ b/biometrics/fingerprint/aidl/vts/VtsHalBiometricsFingerprintTargetTest.cpp
@@ -167,6 +167,7 @@
void TearDown() override {
// Close the mSession.
+ ASSERT_NE(mSession, nullptr);
ASSERT_TRUE(mSession->close().isOk());
// Make sure the mSession is closed.
diff --git a/bluetooth/aidl/Android.bp b/bluetooth/aidl/Android.bp
index 0daecf7..4ee2f49 100644
--- a/bluetooth/aidl/Android.bp
+++ b/bluetooth/aidl/Android.bp
@@ -16,13 +16,6 @@
srcs: ["android/hardware/bluetooth/*.aidl"],
stability: "vintf",
backend: {
- cpp: {
- // FIXME should this be disabled?
- // prefer NDK backend which can be used anywhere
- // If you disable this, you also need to delete the C++
- // translate code.
- enabled: true,
- },
rust: {
enabled: true,
},
@@ -44,5 +37,4 @@
},
],
frozen: true,
-
}
diff --git a/bluetooth/aidl/default/Android.bp b/bluetooth/aidl/default/Android.bp
index 3f4ba99..d3f6364 100644
--- a/bluetooth/aidl/default/Android.bp
+++ b/bluetooth/aidl/default/Android.bp
@@ -2,81 +2,62 @@
default_applicable_licenses: ["Android-Apache-2.0"],
}
-cc_defaults {
- name: "android.hardware.bluetooth-service-build-defaults",
- cflags: [
- "-Wall",
- "-Wextra",
- ],
- shared_libs: [
- "android.hardware.bluetooth-V1-ndk",
- "libbase",
- "libbinder_ndk",
- "libcutils",
- "libhidlbase",
- "liblog",
- "libutils",
- ],
- static_libs: [
- "android.hardware.bluetooth.async",
- "android.hardware.bluetooth.hci",
- ],
-}
-
cc_library_static {
name: "libbluetoothhcihalimpl",
vendor_available: true,
host_supported: true,
- defaults: ["android.hardware.bluetooth-service-build-defaults"],
srcs: [
"BluetoothHci.cpp",
"net_bluetooth_mgmt.cpp",
],
-}
-
-cc_binary {
- name: "android.hardware.bluetooth-service.default",
- relative_install_path: "hw",
- init_rc: ["bluetooth-service-default.rc"],
- vintf_fragments: [":manifest_android.hardware.bluetooth-service.default.xml"],
- vendor: true,
- defaults: ["android.hardware.bluetooth-service-build-defaults"],
- srcs: [
- "service.cpp",
+ cflags: [
+ "-Wall",
+ "-Wextra",
],
- shared_libs: [
- "android.hardware.bluetooth-V1-ndk",
- "libbase",
- "libbinder_ndk",
- "libhidlbase",
- "libutils",
- "liblog",
- ],
- static_libs: [
- "libbluetoothhcihalimpl",
- ],
-}
-
-cc_fuzz {
- name: "android.hardware.bluetooth-service.default_fuzzer",
- host_supported: true,
- defaults: ["service_fuzzer_defaults"],
- srcs: [
- "test/fuzzer.cpp",
+ header_libs: [
+ "libbluetooth_offload_hal_headers",
],
static_libs: [
"android.hardware.bluetooth.async",
"android.hardware.bluetooth.hci",
- "android.hardware.bluetooth-V1-ndk",
- "libbluetoothhcihalimpl",
- "liblog",
],
- fuzz_config: {
- componentid: 27441,
- cc: [
- "mylesgw@google.com",
- ],
- },
+ shared_libs: [
+ "libbase",
+ "libcutils",
+ "liblog",
+ "libutils",
+ ],
+}
+
+rust_binary {
+ name: "android.hardware.bluetooth-service.default",
+ crate_name: "bluetooth_hci_hal_server",
+ relative_install_path: "hw",
+ init_rc: ["bluetooth-service-default.rc"],
+ vintf_fragments: [":manifest_android.hardware.bluetooth-service.default.xml"],
+ vendor: true,
+ prefer_rlib: true,
+ srcs: ["main.rs"],
+ rustlibs: [
+ "android.hardware.bluetooth-V1-rust",
+ "libbluetooth_offload_hal",
+ "libbluetooth_offload_leaudio_hci",
+ "libbinder_rs",
+ "liblogger",
+ "liblog_rust",
+ ],
+ static_libs: [
+ "android.hardware.bluetooth.async",
+ "android.hardware.bluetooth.hci",
+ "libbluetoothhcihalimpl",
+ ],
+ shared_libs: [
+ "libbase",
+ "libc++",
+ "libcutils",
+ "liblog",
+ "libutils",
+ ],
}
filegroup {
diff --git a/bluetooth/aidl/default/BluetoothHci.cpp b/bluetooth/aidl/default/BluetoothHci.cpp
index a247cb0..bcdb67e 100644
--- a/bluetooth/aidl/default/BluetoothHci.cpp
+++ b/bluetooth/aidl/default/BluetoothHci.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright 2022 The Android Open Source Project
+ * Copyright 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.
@@ -16,18 +16,20 @@
#define LOG_TAG "android.hardware.bluetooth.service.default"
-#include "BluetoothHci.h"
-
#include <cutils/properties.h>
#include <fcntl.h>
-#include <netdb.h>
-#include <netinet/in.h>
-#include <poll.h>
+#include <hal/ffi.h>
#include <string.h>
-#include <sys/uio.h>
#include <termios.h>
+#include <future>
+#include <memory>
+#include <vector>
+
+#include "async_fd_watcher.h"
+#include "h4_protocol.h"
#include "log/log.h"
+#include "net_bluetooth_mgmt.h"
namespace {
int SetTerminalRaw(int fd) {
@@ -44,12 +46,9 @@
using namespace ::android::hardware::bluetooth::hci;
using namespace ::android::hardware::bluetooth::async;
-using aidl::android::hardware::bluetooth::Status;
namespace aidl::android::hardware::bluetooth::impl {
-void OnDeath(void* cookie);
-
std::optional<std::string> GetSystemProperty(const std::string& property) {
std::array<char, PROPERTY_VALUE_MAX> value_array{0};
auto value_len = property_get(property.c_str(), value_array.data(), nullptr);
@@ -63,302 +62,298 @@
return str.compare(0, prefix.length(), prefix) == 0;
}
-class BluetoothDeathRecipient {
+class Hal {
public:
- BluetoothDeathRecipient(BluetoothHci* hci) : mHci(hci) {}
-
- void LinkToDeath(const std::shared_ptr<IBluetoothHciCallbacks>& cb) {
- mCb = cb;
- clientDeathRecipient_ = AIBinder_DeathRecipient_new(OnDeath);
- auto linkToDeathReturnStatus = AIBinder_linkToDeath(
- mCb->asBinder().get(), clientDeathRecipient_, this /* cookie */);
- LOG_ALWAYS_FATAL_IF(linkToDeathReturnStatus != STATUS_OK,
- "Unable to link to death recipient");
+ Hal(const std::string& dev_path = "/dev/hvc5") {
+ char property_bytes[PROPERTY_VALUE_MAX];
+ property_get("vendor.ser.bt-uart", property_bytes, dev_path.c_str());
+ mDevPath = std::string(property_bytes);
}
- void UnlinkToDeath(const std::shared_ptr<IBluetoothHciCallbacks>& cb) {
- LOG_ALWAYS_FATAL_IF(cb != mCb, "Unable to unlink mismatched pointers");
+ static void Initialize(void* instance,
+ const struct hal_callbacks* callbacks) {
+ static_cast<Hal*>(instance)->Initialize(callbacks);
}
- void serviceDied() {
- if (mCb != nullptr && !AIBinder_isAlive(mCb->asBinder().get())) {
- ALOGE("Bluetooth remote service has died");
- } else {
- ALOGE("BluetoothDeathRecipient::serviceDied called but service not dead");
- return;
- }
- {
- std::lock_guard<std::mutex> guard(mHasDiedMutex);
- has_died_ = true;
- }
- mHci->close();
+ static void Close(void* instance) { static_cast<Hal*>(instance)->Close(); }
+
+ static void SendCommand(void* instance, const uint8_t* data, size_t len) {
+ static_cast<Hal*>(instance)->SendCommand(
+ std::vector<uint8_t>(data, data + len));
}
- BluetoothHci* mHci;
- std::shared_ptr<IBluetoothHciCallbacks> mCb;
- AIBinder_DeathRecipient* clientDeathRecipient_;
- bool getHasDied() {
- std::lock_guard<std::mutex> guard(mHasDiedMutex);
- return has_died_;
+
+ static void SendAcl(void* instance, const uint8_t* data, size_t len) {
+ static_cast<Hal*>(instance)->SendAcl(
+ std::vector<uint8_t>(data, data + len));
+ }
+
+ static void SendSco(void* instance, const uint8_t* data, size_t len) {
+ static_cast<Hal*>(instance)->SendSco(
+ std::vector<uint8_t>(data, data + len));
+ }
+
+ static void SendIso(void* instance, const uint8_t* data, size_t len) {
+ static_cast<Hal*>(instance)->SendIso(
+ std::vector<uint8_t>(data, data + len));
}
private:
- std::mutex mHasDiedMutex;
- bool has_died_{false};
-};
-
-void OnDeath(void* cookie) {
- auto* death_recipient = static_cast<BluetoothDeathRecipient*>(cookie);
- death_recipient->serviceDied();
-}
-
-BluetoothHci::BluetoothHci(const std::string& dev_path) {
- char property_bytes[PROPERTY_VALUE_MAX];
- property_get("vendor.ser.bt-uart", property_bytes, dev_path.c_str());
- mDevPath = std::string(property_bytes);
- mDeathRecipient = std::make_shared<BluetoothDeathRecipient>(this);
-}
-
-int BluetoothHci::getFdFromDevPath() {
- int fd = open(mDevPath.c_str(), O_RDWR);
- if (fd < 0) {
- ALOGE("Could not connect to bt: %s (%s)", mDevPath.c_str(),
- strerror(errno));
+ int getFdFromDevPath() {
+ int fd = open(mDevPath.c_str(), O_RDWR);
+ if (fd < 0) {
+ ALOGE("Could not connect to bt: %s (%s)", mDevPath.c_str(),
+ strerror(errno));
+ return fd;
+ }
+ if (int ret = SetTerminalRaw(fd) < 0) {
+ ALOGI("Could not make %s a raw terminal %d(%s)", mDevPath.c_str(), ret,
+ strerror(errno));
+ }
return fd;
}
- if (int ret = SetTerminalRaw(fd) < 0) {
- ALOGI("Could not make %s a raw terminal %d(%s)", mDevPath.c_str(), ret,
- strerror(errno));
- }
- return fd;
-}
-void BluetoothHci::reset() {
- // Send a reset command and wait until the command complete comes back.
+ void reset() {
+ // Send a reset command and wait until the command complete comes back.
- std::vector<uint8_t> reset = {0x03, 0x0c, 0x00};
+ std::vector<uint8_t> reset = {0x03, 0x0c, 0x00};
- auto resetPromise = std::make_shared<std::promise<void>>();
- auto resetFuture = resetPromise->get_future();
+ auto resetPromise = std::make_shared<std::promise<void>>();
+ auto resetFuture = resetPromise->get_future();
- mH4 = std::make_shared<H4Protocol>(
- mFd,
- [](const std::vector<uint8_t>& raw_command) {
- ALOGI("Discarding %d bytes with command type",
- static_cast<int>(raw_command.size()));
- },
- [](const std::vector<uint8_t>& raw_acl) {
- ALOGI("Discarding %d bytes with acl type",
- static_cast<int>(raw_acl.size()));
- },
- [](const std::vector<uint8_t>& raw_sco) {
- ALOGI("Discarding %d bytes with sco type",
- static_cast<int>(raw_sco.size()));
- },
- [resetPromise](const std::vector<uint8_t>& raw_event) {
- std::vector<uint8_t> reset_complete = {0x0e, 0x04, 0x01,
- 0x03, 0x0c, 0x00};
- bool valid = raw_event.size() == 6 &&
- raw_event[0] == reset_complete[0] &&
- raw_event[1] == reset_complete[1] &&
- // Don't compare the number of packets field.
- raw_event[3] == reset_complete[3] &&
- raw_event[4] == reset_complete[4] &&
- raw_event[5] == reset_complete[5];
- if (valid) {
- resetPromise->set_value();
- } else {
- ALOGI("Discarding %d bytes with event type",
- static_cast<int>(raw_event.size()));
- }
- },
- [](const std::vector<uint8_t>& raw_iso) {
- ALOGI("Discarding %d bytes with iso type",
- static_cast<int>(raw_iso.size()));
- },
- [this]() {
- ALOGI("HCI socket device disconnected while waiting for reset");
- mFdWatcher.StopWatchingFileDescriptors();
- });
- mFdWatcher.WatchFdForNonBlockingReads(mFd,
- [this](int) { mH4->OnDataReady(); });
+ mH4 = std::make_shared<H4Protocol>(
+ mFd,
+ [](const std::vector<uint8_t>& raw_command) {
+ ALOGI("Discarding %d bytes with command type",
+ static_cast<int>(raw_command.size()));
+ },
+ [](const std::vector<uint8_t>& raw_acl) {
+ ALOGI("Discarding %d bytes with acl type",
+ static_cast<int>(raw_acl.size()));
+ },
+ [](const std::vector<uint8_t>& raw_sco) {
+ ALOGI("Discarding %d bytes with sco type",
+ static_cast<int>(raw_sco.size()));
+ },
+ [resetPromise](const std::vector<uint8_t>& raw_event) {
+ std::vector<uint8_t> reset_complete = {0x0e, 0x04, 0x01,
+ 0x03, 0x0c, 0x00};
+ bool valid = raw_event.size() == 6 &&
+ raw_event[0] == reset_complete[0] &&
+ raw_event[1] == reset_complete[1] &&
+ // Don't compare the number of packets field.
+ raw_event[3] == reset_complete[3] &&
+ raw_event[4] == reset_complete[4] &&
+ raw_event[5] == reset_complete[5];
+ if (valid) {
+ resetPromise->set_value();
+ } else {
+ ALOGI("Discarding %d bytes with event type",
+ static_cast<int>(raw_event.size()));
+ }
+ },
+ [](const std::vector<uint8_t>& raw_iso) {
+ ALOGI("Discarding %d bytes with iso type",
+ static_cast<int>(raw_iso.size()));
+ },
+ [this]() {
+ ALOGI("HCI socket device disconnected while waiting for reset");
+ mFdWatcher.StopWatchingFileDescriptors();
+ });
+ mFdWatcher.WatchFdForNonBlockingReads(mFd,
+ [this](int) { mH4->OnDataReady(); });
- ndk::ScopedAStatus result = send(PacketType::COMMAND, reset);
- if (!result.isOk()) {
- ALOGE("Error sending reset command");
- }
- auto status = resetFuture.wait_for(std::chrono::seconds(1));
- mFdWatcher.StopWatchingFileDescriptors();
- if (status == std::future_status::ready) {
- ALOGI("HCI Reset successful");
- } else {
- ALOGE("HCI Reset Response not received in one second");
- }
-
- resetPromise.reset();
-}
-
-ndk::ScopedAStatus BluetoothHci::initialize(
- const std::shared_ptr<IBluetoothHciCallbacks>& cb) {
- ALOGI(__func__);
-
- if (cb == nullptr) {
- ALOGE("cb == nullptr! -> Unable to call initializationComplete(ERR)");
- return ndk::ScopedAStatus::fromServiceSpecificError(STATUS_BAD_VALUE);
- }
-
- HalState old_state = HalState::READY;
- {
- std::lock_guard<std::mutex> guard(mStateMutex);
- if (mState != HalState::READY) {
- old_state = mState;
+ if (!send(PacketType::COMMAND, reset)) {
+ ALOGE("Error sending reset command");
+ }
+ auto status = resetFuture.wait_for(std::chrono::seconds(1));
+ mFdWatcher.StopWatchingFileDescriptors();
+ if (status == std::future_status::ready) {
+ ALOGI("HCI Reset successful");
} else {
- mState = HalState::INITIALIZING;
+ ALOGE("HCI Reset Response not received in one second");
}
+
+ resetPromise.reset();
}
- if (old_state != HalState::READY) {
- ALOGE("initialize: Unexpected State %d", static_cast<int>(old_state));
- close();
- cb->initializationComplete(Status::ALREADY_INITIALIZED);
- return ndk::ScopedAStatus::ok();
- }
+ void Initialize(const struct hal_callbacks* callbacks) {
+ ALOGI(__func__);
- mCb = cb;
- management_.reset(new NetBluetoothMgmt);
- mFd = management_->openHci();
- if (mFd < 0) {
- management_.reset();
+ HalState old_state = HalState::READY;
+ {
+ std::lock_guard<std::mutex> guard(mStateMutex);
+ if (mState != HalState::READY) {
+ old_state = mState;
+ } else {
+ mState = HalState::INITIALIZING;
+ }
+ }
- ALOGI("Unable to open Linux interface, trying default path.");
- mFd = getFdFromDevPath();
+ if (old_state != HalState::READY) {
+ ALOGE("initialize: Unexpected State %d", static_cast<int>(old_state));
+ Close();
+ callbacks->initialization_complete(callbacks->handle,
+ STATUS_ALREADY_INITIALIZED);
+ return;
+ }
+
+ mCallbacks = std::make_unique<struct hal_callbacks>(*callbacks);
+ management_.reset(new NetBluetoothMgmt);
+ mFd = management_->openHci();
if (mFd < 0) {
+ management_.reset();
+
+ ALOGI("Unable to open Linux interface, trying default path.");
+ mFd = getFdFromDevPath();
+ if (mFd < 0) {
+ mState = HalState::READY;
+ mCallbacks->initialization_complete(mCallbacks->handle,
+ STATUS_UNABLE_TO_OPEN_INTERFACE);
+ return;
+ }
+ }
+
+ // TODO: HCI Reset on emulators since the bluetooth controller
+ // cannot be powered on/off during the HAL setup; and the stack
+ // might received spurious packets/events during boottime.
+ // Proper solution would be to use bt-virtio or vsock to better
+ // control the link to rootcanal and the controller lifetime.
+ const std::string kBoardProperty = "ro.product.board";
+ const std::string kCuttlefishBoard = "cutf";
+ auto board_name = GetSystemProperty(kBoardProperty);
+ if (board_name.has_value() &&
+ (starts_with(board_name.value(), "cutf") ||
+ starts_with(board_name.value(), "goldfish"))) {
+ reset();
+ }
+
+ mH4 = std::make_shared<H4Protocol>(
+ mFd,
+ [](const std::vector<uint8_t>& /* raw_command */) {
+ LOG_ALWAYS_FATAL("Unexpected command!");
+ },
+ [this](const std::vector<uint8_t>& raw_acl) {
+ mCallbacks->acl_received(mCallbacks->handle, raw_acl.data(),
+ raw_acl.size());
+ },
+ [this](const std::vector<uint8_t>& raw_sco) {
+ mCallbacks->sco_received(mCallbacks->handle, raw_sco.data(),
+ raw_sco.size());
+ },
+ [this](const std::vector<uint8_t>& raw_event) {
+ mCallbacks->event_received(mCallbacks->handle, raw_event.data(),
+ raw_event.size());
+ },
+ [this](const std::vector<uint8_t>& raw_iso) {
+ mCallbacks->iso_received(mCallbacks->handle, raw_iso.data(),
+ raw_iso.size());
+ },
+ [this]() {
+ ALOGI("HCI socket device disconnected");
+ mFdWatcher.StopWatchingFileDescriptors();
+ });
+ mFdWatcher.WatchFdForNonBlockingReads(mFd,
+ [this](int) { mH4->OnDataReady(); });
+
+ {
+ std::lock_guard<std::mutex> guard(mStateMutex);
+ mState = HalState::ONE_CLIENT;
+ }
+
+ ALOGI("initialization complete");
+ mCallbacks->initialization_complete(mCallbacks->handle, STATUS_SUCCESS);
+ }
+
+ void Close() {
+ ALOGI(__func__);
+ {
+ std::lock_guard<std::mutex> guard(mStateMutex);
+ if (mState != HalState::ONE_CLIENT) {
+ LOG_ALWAYS_FATAL_IF(mState == HalState::INITIALIZING,
+ "mState is INITIALIZING");
+ ALOGI("Already closed");
+ return;
+ }
+ mCallbacks.reset();
+ mState = HalState::CLOSING;
+ }
+
+ mFdWatcher.StopWatchingFileDescriptors();
+
+ if (management_) {
+ management_->closeHci();
+ } else {
+ ::close(mFd);
+ }
+
+ {
+ std::lock_guard<std::mutex> guard(mStateMutex);
mState = HalState::READY;
- cb->initializationComplete(Status::UNABLE_TO_OPEN_INTERFACE);
- return ndk::ScopedAStatus::ok();
+ mH4 = nullptr;
}
}
- mDeathRecipient->LinkToDeath(mCb);
-
- // TODO: HCI Reset on emulators since the bluetooth controller
- // cannot be powered on/off during the HAL setup; and the stack
- // might received spurious packets/events during boottime.
- // Proper solution would be to use bt-virtio or vsock to better
- // control the link to rootcanal and the controller lifetime.
- const std::string kBoardProperty = "ro.product.board";
- const std::string kCuttlefishBoard = "cutf";
- auto board_name = GetSystemProperty(kBoardProperty);
- if (board_name.has_value() && (
- starts_with(board_name.value(), "cutf") ||
- starts_with(board_name.value(), "goldfish"))) {
- reset();
+ void SendCommand(const std::vector<uint8_t>& data) {
+ send(PacketType::COMMAND, data);
+ }
+ void SendAcl(const std::vector<uint8_t>& data) {
+ send(PacketType::ACL_DATA, data);
+ }
+ void SendSco(const std::vector<uint8_t>& data) {
+ send(PacketType::SCO_DATA, data);
+ }
+ void SendIso(const std::vector<uint8_t>& data) {
+ send(PacketType::ISO_DATA, data);
}
- mH4 = std::make_shared<H4Protocol>(
- mFd,
- [](const std::vector<uint8_t>& /* raw_command */) {
- LOG_ALWAYS_FATAL("Unexpected command!");
- },
- [this](const std::vector<uint8_t>& raw_acl) {
- mCb->aclDataReceived(raw_acl);
- },
- [this](const std::vector<uint8_t>& raw_sco) {
- mCb->scoDataReceived(raw_sco);
- },
- [this](const std::vector<uint8_t>& raw_event) {
- mCb->hciEventReceived(raw_event);
- },
- [this](const std::vector<uint8_t>& raw_iso) {
- mCb->isoDataReceived(raw_iso);
- },
- [this]() {
- ALOGI("HCI socket device disconnected");
- mFdWatcher.StopWatchingFileDescriptors();
- });
- mFdWatcher.WatchFdForNonBlockingReads(mFd,
- [this](int) { mH4->OnDataReady(); });
-
- {
- std::lock_guard<std::mutex> guard(mStateMutex);
- mState = HalState::ONE_CLIENT;
- }
- ALOGI("initialization complete");
- auto status = mCb->initializationComplete(Status::SUCCESS);
- if (!status.isOk()) {
- if (!mDeathRecipient->getHasDied()) {
- ALOGE("Error sending init callback, but no death notification");
+ bool send(PacketType type, const std::vector<uint8_t>& v) {
+ if (v.empty()) {
+ ALOGE("Packet is empty, no data was found to be sent");
+ return false;
}
- close();
- return ndk::ScopedAStatus::fromServiceSpecificError(
- STATUS_FAILED_TRANSACTION);
- }
- return ndk::ScopedAStatus::ok();
-}
-
-ndk::ScopedAStatus BluetoothHci::close() {
- ALOGI(__func__);
- {
std::lock_guard<std::mutex> guard(mStateMutex);
- if (mState != HalState::ONE_CLIENT) {
- LOG_ALWAYS_FATAL_IF(mState == HalState::INITIALIZING,
- "mState is INITIALIZING");
- ALOGI("Already closed");
- return ndk::ScopedAStatus::ok();
+ if (mH4 == nullptr) {
+ ALOGE("Illegal State");
+ return false;
}
- mState = HalState::CLOSING;
+
+ mH4->Send(type, v);
+ return true;
}
- mFdWatcher.StopWatchingFileDescriptors();
+ std::unique_ptr<struct hal_callbacks> mCallbacks;
+ std::string mDevPath;
+ int mFd{-1};
+ ::android::hardware::bluetooth::async::AsyncFdWatcher mFdWatcher;
+ std::shared_ptr<::android::hardware::bluetooth::hci::H4Protocol> mH4;
+ std::unique_ptr<NetBluetoothMgmt> management_{};
- if (management_) {
- management_->closeHci();
- } else {
- ::close(mFd);
- }
-
- {
- std::lock_guard<std::mutex> guard(mStateMutex);
- mState = HalState::READY;
- mH4 = nullptr;
- }
- return ndk::ScopedAStatus::ok();
-}
-
-ndk::ScopedAStatus BluetoothHci::sendHciCommand(
- const std::vector<uint8_t>& packet) {
- return send(PacketType::COMMAND, packet);
-}
-
-ndk::ScopedAStatus BluetoothHci::sendAclData(
- const std::vector<uint8_t>& packet) {
- return send(PacketType::ACL_DATA, packet);
-}
-
-ndk::ScopedAStatus BluetoothHci::sendScoData(
- const std::vector<uint8_t>& packet) {
- return send(PacketType::SCO_DATA, packet);
-}
-
-ndk::ScopedAStatus BluetoothHci::sendIsoData(
- const std::vector<uint8_t>& packet) {
- return send(PacketType::ISO_DATA, packet);
-}
-
-ndk::ScopedAStatus BluetoothHci::send(PacketType type,
- const std::vector<uint8_t>& v) {
- if (v.empty()) {
- ALOGE("Packet is empty, no data was found to be sent");
- return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
- }
-
- std::lock_guard<std::mutex> guard(mStateMutex);
- if (mH4 == nullptr) {
- return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
- }
-
- mH4->Send(type, v);
- return ndk::ScopedAStatus::ok();
-}
+ // Don't close twice or open before close is complete
+ std::mutex mStateMutex;
+ enum class HalState {
+ READY,
+ INITIALIZING,
+ ONE_CLIENT,
+ CLOSING,
+ } mState{HalState::READY};
+};
} // namespace aidl::android::hardware::bluetooth::impl
+
+extern "C" {
+
+using namespace aidl::android::hardware::bluetooth::impl;
+
+struct hal_interface hal_new() {
+ return (struct hal_interface){
+ .handle = new Hal(),
+ .initialize = &Hal::Initialize,
+ .close = &Hal::Close,
+ .send_command = &Hal::SendCommand,
+ .send_acl = &Hal::SendAcl,
+ .send_sco = &Hal::SendSco,
+ .send_iso = &Hal::SendIso,
+ };
+}
+}
diff --git a/bluetooth/aidl/default/BluetoothHci.h b/bluetooth/aidl/default/BluetoothHci.h
deleted file mode 100644
index 477cc5c..0000000
--- a/bluetooth/aidl/default/BluetoothHci.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <aidl/android/hardware/bluetooth/BnBluetoothHci.h>
-#include <aidl/android/hardware/bluetooth/IBluetoothHciCallbacks.h>
-
-#include <future>
-#include <string>
-
-#include "async_fd_watcher.h"
-#include "h4_protocol.h"
-#include "net_bluetooth_mgmt.h"
-
-namespace aidl::android::hardware::bluetooth::impl {
-
-class BluetoothDeathRecipient;
-
-// This Bluetooth HAL implementation connects with a serial port at dev_path_.
-class BluetoothHci : public BnBluetoothHci {
- public:
- BluetoothHci(const std::string& dev_path = "/dev/hvc5");
-
- ndk::ScopedAStatus initialize(
- const std::shared_ptr<IBluetoothHciCallbacks>& cb) override;
-
- ndk::ScopedAStatus sendHciCommand(
- const std::vector<uint8_t>& packet) override;
-
- ndk::ScopedAStatus sendAclData(const std::vector<uint8_t>& packet) override;
-
- ndk::ScopedAStatus sendScoData(const std::vector<uint8_t>& packet) override;
-
- ndk::ScopedAStatus sendIsoData(const std::vector<uint8_t>& packet) override;
-
- ndk::ScopedAStatus close() override;
-
- static void OnPacketReady();
-
- static BluetoothHci* get();
-
- private:
- int mFd{-1};
- std::shared_ptr<IBluetoothHciCallbacks> mCb = nullptr;
-
- std::shared_ptr<::android::hardware::bluetooth::hci::H4Protocol> mH4;
-
- std::shared_ptr<BluetoothDeathRecipient> mDeathRecipient;
-
- std::string mDevPath;
-
- ::android::hardware::bluetooth::async::AsyncFdWatcher mFdWatcher;
-
- int getFdFromDevPath();
- [[nodiscard]] ndk::ScopedAStatus send(
- ::android::hardware::bluetooth::hci::PacketType type,
- const std::vector<uint8_t>& packet);
- std::unique_ptr<NetBluetoothMgmt> management_{};
-
- // Send a reset command and discard all packets until a reset is received.
- void reset();
-
- // Don't close twice or open before close is complete
- std::mutex mStateMutex;
- enum class HalState {
- READY,
- INITIALIZING,
- ONE_CLIENT,
- CLOSING,
- } mState{HalState::READY};
-};
-
-} // namespace aidl::android::hardware::bluetooth::impl
diff --git a/bluetooth/aidl/default/main.rs b/bluetooth/aidl/default/main.rs
new file mode 100644
index 0000000..b30162a
--- /dev/null
+++ b/bluetooth/aidl/default/main.rs
@@ -0,0 +1,58 @@
+// Copyright 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.
+
+use android_hardware_bluetooth::aidl::android::hardware::bluetooth::IBluetoothHci::{
+ self,
+ IBluetoothHci as _
+};
+use android_hardware_bluetooth::binder;
+use bluetooth_offload_hal::{ HciHalProxy, CInterface };
+use bluetooth_offload_leaudio_hci::LeAudioModuleBuilder;
+use log;
+use std::panic;
+
+fn new_hal() -> CInterface {
+ extern "C" { fn hal_new() -> CInterface; }
+ unsafe { hal_new() }
+}
+
+fn main() {
+ logger::init(
+ logger::Config::default()
+ .with_max_level(log::LevelFilter::Debug)
+ .with_tag_on_device("android.hardware.bluetooth"),
+ );
+
+ panic::set_hook(Box::new(|panic_info| {
+ log::error!("{}", panic_info);
+ }));
+
+ log::info!("Bluetooth HAL starting up");
+
+ binder::ProcessState::set_thread_pool_max_thread_count(0);
+ binder::ProcessState::start_thread_pool();
+
+ binder::add_service(
+ &format!("{}/default", IBluetoothHci::BpBluetoothHci::get_descriptor()),
+ IBluetoothHci::BnBluetoothHci::new_binder(
+ HciHalProxy::new(
+ vec![ Box::new(LeAudioModuleBuilder {}) ],
+ new_hal()
+ ),
+ binder::BinderFeatures::default(),
+ ).as_binder()
+ ).expect("Failed to register service");
+
+ binder::ProcessState::join_thread_pool();
+}
diff --git a/bluetooth/aidl/default/net_bluetooth_mgmt.cpp b/bluetooth/aidl/default/net_bluetooth_mgmt.cpp
index 24693ef..6b0cd63 100644
--- a/bluetooth/aidl/default/net_bluetooth_mgmt.cpp
+++ b/bluetooth/aidl/default/net_bluetooth_mgmt.cpp
@@ -259,8 +259,8 @@
int NetBluetoothMgmt::openHci(int hci_interface) {
ALOGI("opening hci interface %d", hci_interface);
- // Block Bluetooth.
- rfkill(1);
+ // Unblock Bluetooth.
+ rfkill(0);
// Wait for the HCI interface to complete initialization or to come online.
int hci = waitHciDev(hci_interface);
@@ -300,8 +300,8 @@
bt_fd_ = -1;
}
- // Unblock Bluetooth.
- rfkill(0);
+ // Block Bluetooth.
+ rfkill(1);
}
} // namespace aidl::android::hardware::bluetooth::impl
diff --git a/bluetooth/aidl/default/service.cpp b/bluetooth/aidl/default/service.cpp
deleted file mode 100644
index ef4b884..0000000
--- a/bluetooth/aidl/default/service.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "aidl.android.hardware.bluetooth.service.default"
-
-#include <aidl/android/hardware/bluetooth/IBluetoothHci.h>
-#include <android/binder_manager.h>
-#include <android/binder_process.h>
-#include <hidl/HidlSupport.h>
-#include <hidl/HidlTransportSupport.h>
-
-#include "BluetoothHci.h"
-
-using ::aidl::android::hardware::bluetooth::impl::BluetoothHci;
-using ::android::hardware::configureRpcThreadpool;
-using ::android::hardware::joinRpcThreadpool;
-
-int main(int /* argc */, char** /* argv */) {
- ALOGI("Bluetooth HAL starting");
- if (!ABinderProcess_setThreadPoolMaxThreadCount(0)) {
- ALOGI("failed to set thread pool max thread count");
- return 1;
- }
-
- std::shared_ptr<BluetoothHci> service =
- ndk::SharedRefBase::make<BluetoothHci>();
- std::string instance = std::string() + BluetoothHci::descriptor + "/default";
- auto result =
- AServiceManager_addService(service->asBinder().get(), instance.c_str());
- if (result == STATUS_OK) {
- ABinderProcess_joinThreadPool();
- } else {
- ALOGE("Could not register as a service!");
- }
- return 0;
-}
diff --git a/bluetooth/aidl/default/test/fuzzer.cpp b/bluetooth/aidl/default/test/fuzzer.cpp
deleted file mode 100644
index e7a1eef..0000000
--- a/bluetooth/aidl/default/test/fuzzer.cpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <fuzzbinder/libbinder_ndk_driver.h>
-#include <fuzzer/FuzzedDataProvider.h>
-
-#include "BluetoothHci.h"
-
-using aidl::android::hardware::bluetooth::impl::BluetoothHci;
-using android::fuzzService;
-using ndk::SharedRefBase;
-
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
- auto service = SharedRefBase::make<BluetoothHci>();
-
- fuzzService(service->asBinder().get(), FuzzedDataProvider(data, size));
-
- return 0;
-}
diff --git a/bluetooth/audio/utils/aidl_session/BluetoothLeAudioAseConfigurationSettingProvider.cpp b/bluetooth/audio/utils/aidl_session/BluetoothLeAudioAseConfigurationSettingProvider.cpp
index 5909c92..3e18de2 100644
--- a/bluetooth/audio/utils/aidl_session/BluetoothLeAudioAseConfigurationSettingProvider.cpp
+++ b/bluetooth/audio/utils/aidl_session/BluetoothLeAudioAseConfigurationSettingProvider.cpp
@@ -674,14 +674,14 @@
configurationFlags.bitmask |=
ConfigurationFlags::ALLOW_ASYMMETRIC_CONFIGURATIONS;
}
+ }
+ } else {
+ if (codec_cfg == nullptr) {
+ LOG(ERROR) << "No codec config matching key " << codec_config_key.c_str()
+ << " found";
} else {
- if (codec_cfg == nullptr) {
- LOG(ERROR) << "No codec config matching key "
- << codec_config_key.c_str() << " found";
- } else {
- LOG(ERROR) << "Configuration '" << flat_cfg->name()->c_str()
- << "' has no valid subconfigurations.";
- }
+ LOG(ERROR) << "Configuration '" << flat_cfg->name()->c_str()
+ << "' has no valid subconfigurations.";
}
}
}
diff --git a/bluetooth/socket/aidl/Android.bp b/bluetooth/socket/aidl/Android.bp
index 8b412b2..9341564 100644
--- a/bluetooth/socket/aidl/Android.bp
+++ b/bluetooth/socket/aidl/Android.bp
@@ -31,6 +31,9 @@
],
stability: "vintf",
backend: {
+ rust: {
+ enabled: true,
+ },
java: {
enabled: false,
},
diff --git a/compatibility_matrices/Android.bp b/compatibility_matrices/Android.bp
index 1f040cb..63ef223 100644
--- a/compatibility_matrices/Android.bp
+++ b/compatibility_matrices/Android.bp
@@ -46,7 +46,7 @@
product_variables: {
release_aidl_use_unfrozen: {
required: [
- "framework_compatibility_matrix.202504.xml",
+ "framework_compatibility_matrix.202604.xml",
],
},
},
@@ -69,7 +69,7 @@
product_variables: {
release_aidl_use_unfrozen: {
required: [
- "framework_compatibility_matrix.202504.xml",
+ "framework_compatibility_matrix.202604.xml",
],
},
},
@@ -151,3 +151,10 @@
"kernel_config_b_6.12",
],
}
+
+vintf_compatibility_matrix {
+ name: "framework_compatibility_matrix.202604.xml",
+ stem: "compatibility_matrix.202604.xml",
+ srcs: ["compatibility_matrix.202604.xml"],
+ kernel_configs: ["kernel_config_c_6.12"],
+}
diff --git a/compatibility_matrices/bump.py b/compatibility_matrices/bump.py
index 6c694d3..bbc4a11 100755
--- a/compatibility_matrices/bump.py
+++ b/compatibility_matrices/bump.py
@@ -14,9 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-"""
-Creates the next compatibility matrix.
-"""
+"""Creates the next compatibility matrix."""
import argparse
import os
@@ -27,174 +25,354 @@
def check_call(*args, **kwargs):
- print(args)
- subprocess.check_call(*args, **kwargs)
+ print(args)
+ subprocess.check_call(*args, **kwargs)
def check_output(*args, **kwargs):
- print(args)
- return subprocess.check_output(*args, **kwargs)
+ print(args)
+ return subprocess.check_output(*args, **kwargs)
class Bump(object):
- def __init__(self, cmdline_args):
- self.top = pathlib.Path(os.environ["ANDROID_BUILD_TOP"])
- self.interfaces_dir = self.top / "hardware/interfaces"
+ def __init__(self, cmdline_args):
+ self.top = pathlib.Path(os.environ["ANDROID_BUILD_TOP"])
+ self.interfaces_dir = self.top / "hardware/interfaces"
- self.current_level = cmdline_args.current_level
- self.current_letter = cmdline_args.current_letter
- self.current_version = cmdline_args.platform_version
- self.next_version = cmdline_args.next_platform_version
- self.current_module_name = f"framework_compatibility_matrix.{self.current_level}.xml"
- self.current_xml = self.interfaces_dir / f"compatibility_matrices/compatibility_matrix.{self.current_level}.xml"
- self.device_module_name = "framework_compatibility_matrix.device.xml"
+ self.current_level = cmdline_args.current_level
+ self.current_letter = cmdline_args.current_letter
+ self.current_version = cmdline_args.platform_version
+ self.next_version = cmdline_args.next_platform_version
+ self.current_module_name = (
+ f"framework_compatibility_matrix.{self.current_level}.xml"
+ )
+ self.current_xml = (
+ self.interfaces_dir
+ / f"compatibility_matrices/compatibility_matrix.{self.current_level}.xml"
+ )
+ self.device_module_name = "framework_compatibility_matrix.device.xml"
- self.next_level = cmdline_args.next_level
- self.next_letter = cmdline_args.next_letter
- self.next_module_name = f"framework_compatibility_matrix.{self.next_level}.xml"
- self.next_xml = self.interfaces_dir / f"compatibility_matrices/compatibility_matrix.{self.next_level}.xml"
+ self.next_level = cmdline_args.next_level
+ self.next_letter = cmdline_args.next_letter
+ self.current_sdk = cmdline_args.current_sdk
+ self.next_sdk = cmdline_args.next_sdk
+ self.next_module_name = (
+ f"framework_compatibility_matrix.{self.next_level}.xml"
+ )
+ self.next_xml = (
+ self.interfaces_dir
+ / f"compatibility_matrices/compatibility_matrix.{self.next_level}.xml"
+ )
- def run(self):
- self.bump_kernel_configs()
- self.copy_matrix()
- self.edit_android_bp()
- self.bump_libvintf()
+ def run(self):
+ self.bump_kernel_configs()
+ self.copy_matrix()
+ self.edit_android_bp()
+ self.bump_libvintf()
+ self.bump_libvts_vintf()
+ self.bump_cuttlefish()
- def bump_kernel_configs(self):
- check_call([
- self.top / "kernel/configs/tools/bump.py",
- self.current_letter.lower(),
- self.next_letter.lower(),
- ])
+ def bump_kernel_configs(self):
+ check_call([
+ self.top / "kernel/configs/tools/bump.py",
+ self.current_letter.lower(),
+ self.next_letter.lower(),
+ ])
- def copy_matrix(self):
- with open(self.current_xml) as f_current, open(self.next_xml, "w") as f_next:
- f_next.write(f_current.read().replace(f"level=\"{self.current_level}\"", f"level=\"{self.next_level}\""))
+ def copy_matrix(self):
+ with open(self.current_xml) as f_current, open(
+ self.next_xml, "w"
+ ) as f_next:
+ f_next.write(
+ f_current.read().replace(
+ f'level="{self.current_level}"', f'level="{self.next_level}"'
+ )
+ )
- def edit_android_bp(self):
- android_bp = self.interfaces_dir / "compatibility_matrices/Android.bp"
+ def edit_android_bp(self):
+ android_bp = self.interfaces_dir / "compatibility_matrices/Android.bp"
- with open(android_bp, "r+") as f:
- if self.next_module_name not in f.read():
- f.seek(0, 2) # end of file
- f.write("\n")
- f.write(
- textwrap.dedent(f"""\
+ with open(android_bp, "r+") as f:
+ if self.next_module_name not in f.read():
+ f.seek(0, 2) # end of file
+ f.write("\n")
+ f.write(textwrap.dedent(f"""\
vintf_compatibility_matrix {{
name: "{self.next_module_name}",
}}
"""))
- next_kernel_configs = check_output(
- """grep -rh name: | sed -E 's/^.*"(.*)".*/\\1/g'""",
- cwd=self.top / "kernel/configs" /
- self.next_letter.lower(),
- text=True,
- shell=True,
- ).splitlines()
- print(next_kernel_configs)
+ next_kernel_configs = check_output(
+ """grep -rh name: | sed -E 's/^.*"(.*)".*/\\1/g'""",
+ cwd=self.top / "kernel/configs" / self.next_letter.lower(),
+ text=True,
+ shell=True,
+ ).splitlines()
+ print(next_kernel_configs)
- check_call([
- "bpmodify", "-w", "-m", self.next_module_name, "-property", "stem",
- "-str", self.next_xml.name, android_bp
- ])
+ check_call([
+ "bpmodify",
+ "-w",
+ "-m",
+ self.next_module_name,
+ "-property",
+ "stem",
+ "-str",
+ self.next_xml.name,
+ android_bp,
+ ])
- check_call([
- "bpmodify", "-w", "-m", self.next_module_name, "-property", "srcs",
- "-a",
- self.next_xml.relative_to(android_bp.parent), android_bp
- ])
+ check_call([
+ "bpmodify",
+ "-w",
+ "-m",
+ self.next_module_name,
+ "-property",
+ "srcs",
+ "-a",
+ self.next_xml.relative_to(android_bp.parent),
+ android_bp,
+ ])
- check_call([
- "bpmodify", "-w", "-m", self.next_module_name, "-property",
- "kernel_configs", "-a", " ".join(next_kernel_configs), android_bp
- ])
+ check_call([
+ "bpmodify",
+ "-w",
+ "-m",
+ self.next_module_name,
+ "-property",
+ "kernel_configs",
+ "-a",
+ " ".join(next_kernel_configs),
+ android_bp,
+ ])
- # Replace the phony module's product_variables entry to add the new FCM
- # to the development targets (trunk* configs).
- lines = []
- with open(android_bp) as f:
- for line in f:
- if f" \"{self.current_module_name}\",\n" in line:
- lines.append(f" \"{self.next_module_name}\",\n")
- else:
- lines.append(line)
+ # Replace the phony module's product_variables entry to add the new FCM
+ # to the development targets (trunk* configs).
+ lines = []
+ with open(android_bp) as f:
+ for line in f:
+ if f' "{self.current_module_name}",\n' in line:
+ lines.append(f' "{self.next_module_name}",\n')
+ else:
+ lines.append(line)
- with open(android_bp, "w") as f:
- f.write("".join(lines))
+ with open(android_bp, "w") as f:
+ f.write("".join(lines))
- def bump_libvintf(self):
- if not self.current_version:
- print("Skip libvintf update...")
- return
- try:
- check_call(["grep", "-h",
- f"{self.next_letter.upper()} = {self.next_level}",
- f"{self.top}/system/libvintf/include/vintf/Level.h"])
- except subprocess.CalledProcessError:
- print("Adding new API level to libvintf")
- add_lines_above(f"{self.top}/system/libvintf/analyze_matrix/analyze_matrix.cpp",
- " case Level::UNSPECIFIED:",
- textwrap.indent(textwrap.dedent(f"""\
+ def bump_libvintf(self):
+ if not self.current_version:
+ print("Skip libvintf update...")
+ return
+ try:
+ check_call([
+ "grep",
+ "-h",
+ f"{self.next_letter.upper()} = {self.next_level}",
+ f"{self.top}/system/libvintf/include/vintf/Level.h",
+ ])
+ except subprocess.CalledProcessError:
+ print("Adding new API level to libvintf")
+ add_lines_above(
+ f"{self.top}/system/libvintf/analyze_matrix/analyze_matrix.cpp",
+ " case Level::UNSPECIFIED:",
+ textwrap.indent(
+ textwrap.dedent(
+ f"""\
case Level::{self.next_letter.upper()}:
- return "Android {self.next_version} ({self.next_letter.upper()})";"""),
- " "*2))
- add_lines_above(f"{self.top}/system/libvintf/include/vintf/Level.h",
- " // To add new values:",
- f" {self.next_letter.upper()} = {self.next_level},")
- add_lines_above(f"{self.top}/system/libvintf/include/vintf/Level.h",
- " Level::UNSPECIFIED,",
- f" Level::{self.next_letter.upper()},")
- add_lines_above(f"{self.top}/system/libvintf/RuntimeInfo.cpp",
- " // Add more levels above this line.",
- textwrap.indent(textwrap.dedent(f"""\
+ return "Android {self.next_version} ({self.next_letter.upper()})";"""
+ ),
+ " " * 2,
+ ),
+ )
+ add_lines_above(
+ f"{self.top}/system/libvintf/include/vintf/Level.h",
+ " // To add new values:",
+ f" {self.next_letter.upper()} = {self.next_level},",
+ )
+ add_lines_above(
+ f"{self.top}/system/libvintf/include/vintf/Level.h",
+ " Level::UNSPECIFIED,",
+ f" Level::{self.next_letter.upper()},",
+ )
+ add_lines_above(
+ f"{self.top}/system/libvintf/RuntimeInfo.cpp",
+ " // Add more levels above this line.",
+ textwrap.indent(
+ textwrap.dedent(f"""\
case {self.next_version}: {{
ret = Level::{self.next_letter.upper()};
}} break;"""),
- " "*3))
+ " " * 3,
+ ),
+ )
+
+ def bump_libvts_vintf(self):
+ if not self.current_version:
+ print("Skip libvts_vintf update...")
+ return
+ try:
+ check_call([
+ "grep",
+ "-h",
+ f"{self.next_level}, Level::{self.next_letter.upper()}",
+ f"{self.top}/test/vts-testcase/hal/treble/vintf/libvts_vintf_test_common/common.cpp",
+ ])
+ print("libvts_vintf is already up-to-date")
+ except subprocess.CalledProcessError:
+ print("Adding new API level to libvts_vintf")
+ add_lines_below(
+ f"{self.top}/test/vts-testcase/hal/treble/vintf/libvts_vintf_test_common/common.cpp",
+ f" {{{self.current_level},"
+ f" Level::{self.current_letter.upper()}}},",
+ f" {{{self.next_level},"
+ f" Level::{self.next_letter.upper()}}},\n",
+ )
+
+ def bump_cuttlefish(self):
+ if not self.next_sdk:
+ print("Skip Cuttlefish update...")
+ return
+ cf_mk_file = f"{self.top}/device/google/cuttlefish/shared/device.mk"
+ try:
+ check_call([
+ "grep",
+ "-h",
+ f"PRODUCT_SHIPPING_API_LEVEL := {self.next_sdk}",
+ cf_mk_file,
+ ])
+ print("Cuttlefish is already up-to-date")
+ except subprocess.CalledProcessError:
+ print("Bumping Cuttlefish to the next SHIPPING_API_LEVEL")
+ final_lines = []
+ with open(cf_mk_file, "r+") as f:
+ for line in f:
+ if f"PRODUCT_SHIPPING_API_LEVEL := {self.current_sdk}" in line:
+ final_lines.append(
+ f"PRODUCT_SHIPPING_API_LEVEL := {self.next_sdk}\n"
+ )
+ elif line.startswith("PRODUCT_SHIPPING_API_LEVEL :="):
+ # this is the previous SDK level.
+ final_lines.append(
+ f"PRODUCT_SHIPPING_API_LEVEL := {self.current_sdk}\n"
+ )
+ else:
+ final_lines.append(line)
+ f.seek(0)
+ f.write("".join(final_lines))
+ f.truncate()
+ final_lines = []
+ with open(
+ f"{self.top}/device/google/cuttlefish/shared/config/previous_manifest.xml",
+ "r+",
+ ) as f:
+ for line in f:
+ if "target-level=" in line:
+ final_lines.append(
+ '<manifest version="1.0" type="device"'
+ f' target-level="{self.current_level}">\n'
+ )
+ else:
+ final_lines.append(line)
+ f.seek(0)
+ f.write("".join(final_lines))
+ f.truncate()
+
+ final_lines = []
+ with open(
+ f"{self.top}/device/google/cuttlefish/shared/config/manifest.xml", "r+"
+ ) as f:
+ for line in f:
+ if "target-level=" in line:
+ final_lines.append(
+ '<manifest version="1.0" type="device"'
+ f' target-level="{self.next_level}">\n'
+ )
+ else:
+ final_lines.append(line)
+ f.seek(0)
+ f.write("".join(final_lines))
+ f.truncate()
def add_lines_above(file, pattern, lines):
- with open(file, 'r+') as f:
- text = f.read()
- split_text = re.split(rf"\n{pattern}\n", text)
- if len(split_text) != 2:
- # Only one pattern must be found, otherwise the source must be
- # changed unexpectedly.
- raise Exception(
- f'Pattern "{pattern}" not found or multiple patterns found in {file}')
- f.seek(0)
- f.write(f"\n{lines}\n{pattern}\n".join(split_text))
- f.truncate()
+ with open(file, "r+") as f:
+ text = f.read()
+ split_text = re.split(rf"\n{pattern}\n", text)
+ if len(split_text) != 2:
+ # Only one pattern must be found, otherwise the source must be
+ # changed unexpectedly.
+ raise Exception(
+ f'Pattern "{pattern}" not found or multiple patterns found in {file}'
+ )
+ f.seek(0)
+ f.write(f"\n{lines}\n{pattern}\n".join(split_text))
+ f.truncate()
+
+
+def add_lines_below(file, pattern, lines):
+ final_lines = []
+ with open(file, "r+") as f:
+ for line in f:
+ final_lines.append(line)
+ if pattern in line:
+ final_lines.append(lines)
+ f.seek(0)
+ f.write("".join(final_lines))
+ f.truncate()
def main():
- parser = argparse.ArgumentParser(description=__doc__)
- parser.add_argument("current_level",
- type=str,
- help="VINTF level of the current version (e.g. 202404)")
- parser.add_argument("next_level",
- type=str,
- help="VINTF level of the next version (e.g. 202504)")
- parser.add_argument("current_letter",
- type=str,
- help="Letter of the API level of the current version (e.g. b)")
- parser.add_argument("next_letter",
- type=str,
- help="Letter of the API level of the next version (e.g. c)")
- parser.add_argument("platform_version",
- type=str,
- nargs="?",
- help="Current Android release version number (e.g. 16)")
- parser.add_argument("next_platform_version",
- type=str,
- nargs="?",
- help="Next Android release version number number (e.g. 17)")
- cmdline_args = parser.parse_args()
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument(
+ "current_level",
+ type=str,
+ help="VINTF level of the current version (e.g. 202404)",
+ )
+ parser.add_argument(
+ "next_level",
+ type=str,
+ help="VINTF level of the next version (e.g. 202504)",
+ )
+ parser.add_argument(
+ "current_letter",
+ type=str,
+ help="Letter of the API level of the current version (e.g. b)",
+ )
+ parser.add_argument(
+ "next_letter",
+ type=str,
+ help="Letter of the API level of the next version (e.g. c)",
+ )
+ parser.add_argument(
+ "platform_version",
+ type=str,
+ nargs="?",
+ help="Current Android release version number (e.g. 16)",
+ )
+ parser.add_argument(
+ "next_platform_version",
+ type=str,
+ nargs="?",
+ help="Next Android release version number number (e.g. 17)",
+ )
+ parser.add_argument(
+ "current_sdk",
+ type=str,
+ nargs="?",
+ help="Version of the current SDK API level (e.g. 36)",
+ )
+ parser.add_argument(
+ "next_sdk",
+ type=str,
+ nargs="?",
+ help="Version of the next SDK API level(e.g. 37)",
+ )
- Bump(cmdline_args).run()
+ cmdline_args = parser.parse_args()
+
+ Bump(cmdline_args).run()
if __name__ == "__main__":
- main()
+ main()
diff --git a/compatibility_matrices/compatibility_matrix.202604.xml b/compatibility_matrices/compatibility_matrix.202604.xml
new file mode 100644
index 0000000..e5e2abf
--- /dev/null
+++ b/compatibility_matrices/compatibility_matrix.202604.xml
@@ -0,0 +1,720 @@
+<compatibility-matrix version="1.0" type="framework" level="202604">
+ <hal format="aidl">
+ <name>android.hardware.audio.core</name>
+ <version>1-3</version>
+ <interface>
+ <name>IModule</name>
+ <instance>default</instance>
+ <instance>a2dp</instance>
+ <instance>bluetooth</instance>
+ <instance>hearing_aid</instance>
+ <instance>msd</instance>
+ <instance>r_submix</instance>
+ <instance>stub</instance>
+ <instance>usb</instance>
+ </interface>
+ <interface>
+ <name>IConfig</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.audio.effect</name>
+ <version>1-3</version>
+ <interface>
+ <name>IFactory</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" updatable-via-apex="true">
+ <name>android.hardware.authsecret</name>
+ <version>1</version>
+ <interface>
+ <name>IAuthSecret</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.automotive.audiocontrol</name>
+ <version>2-5</version>
+ <interface>
+ <name>IAudioControl</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.automotive.can</name>
+ <version>1</version>
+ <interface>
+ <name>ICanController</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.automotive.evs</name>
+ <version>1-2</version>
+ <interface>
+ <name>IEvsEnumerator</name>
+ <regex-instance>[a-z]+/[0-9]+</regex-instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.macsec</name>
+ <version>1</version>
+ <interface>
+ <name>IMacsecPskPlugin</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.automotive.occupant_awareness</name>
+ <version>1</version>
+ <interface>
+ <name>IOccupantAwareness</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.automotive.vehicle</name>
+ <version>1-4</version>
+ <interface>
+ <name>IVehicle</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.automotive.remoteaccess</name>
+ <version>1-2</version>
+ <interface>
+ <name>IRemoteAccess</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.automotive.ivn</name>
+ <interface>
+ <name>IIvnAndroidDevice</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" updatable-via-apex="true">
+ <name>android.hardware.biometrics.face</name>
+ <version>3-4</version>
+ <interface>
+ <name>IFace</name>
+ <instance>default</instance>
+ <instance>virtual</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" updatable-via-apex="true">
+ <name>android.hardware.biometrics.fingerprint</name>
+ <version>3-5</version>
+ <interface>
+ <name>IFingerprint</name>
+ <instance>default</instance>
+ <instance>virtual</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.bluetooth</name>
+ <interface>
+ <name>IBluetoothHci</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.bluetooth.audio</name>
+ <version>3-5</version>
+ <interface>
+ <name>IBluetoothAudioProviderFactory</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.bluetooth.ranging</name>
+ <version>1-2</version>
+ <interface>
+ <name>IBluetoothChannelSounding</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.bluetooth.socket</name>
+ <version>1</version>
+ <interface>
+ <name>IBluetoothSocket</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.bluetooth.finder</name>
+ <version>1</version>
+ <interface>
+ <name>IBluetoothFinder</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <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">
+ <name>android.hardware.broadcastradio</name>
+ <version>1-3</version>
+ <interface>
+ <name>IBroadcastRadio</name>
+ <regex-instance>.*</regex-instance>
+ </interface>
+ </hal>
+ <hal format="aidl" updatable-via-apex="true">
+ <name>android.hardware.camera.provider</name>
+ <version>1-3</version>
+ <interface>
+ <name>ICameraProvider</name>
+ <regex-instance>[^/]+/[0-9]+</regex-instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.cas</name>
+ <interface>
+ <name>IMediaCasService</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.confirmationui</name>
+ <version>1</version>
+ <interface>
+ <name>IConfirmationUI</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.contexthub</name>
+ <version>3-4</version>
+ <interface>
+ <name>IContextHub</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" updatable-via-apex="true">
+ <name>android.hardware.drm</name>
+ <version>1</version>
+ <interface>
+ <name>IDrmFactory</name>
+ <regex-instance>.*</regex-instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.dumpstate</name>
+ <interface>
+ <name>IDumpstateDevice</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.gatekeeper</name>
+ <version>1</version>
+ <interface>
+ <name>IGatekeeper</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.gnss</name>
+ <version>2-5</version>
+ <interface>
+ <name>IGnss</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.graphics.allocator</name>
+ <version>1-2</version>
+ <interface>
+ <name>IAllocator</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.graphics.composer3</name>
+ <version>4</version>
+ <interface>
+ <name>IComposer</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.health</name>
+ <version>3-4</version>
+ <interface>
+ <name>IHealth</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.health.storage</name>
+ <version>1</version>
+ <interface>
+ <name>IStorage</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.identity</name>
+ <version>1-5</version>
+ <interface>
+ <name>IIdentityCredentialStore</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.net.nlinterceptor</name>
+ <interface>
+ <name>IInterceptor</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.oemlock</name>
+ <version>1</version>
+ <interface>
+ <name>IOemLock</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.ir</name>
+ <version>1</version>
+ <interface>
+ <name>IConsumerIr</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.input.processor</name>
+ <version>1</version>
+ <interface>
+ <name>IInputProcessor</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.security.secretkeeper</name>
+ <version>1-2</version>
+ <interface>
+ <name>ISecretkeeper</name>
+ <instance>default</instance>
+ <instance>nonsecure</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" updatable-via-apex="true">
+ <name>android.hardware.security.keymint</name>
+ <version>1-4</version>
+ <interface>
+ <name>IKeyMintDevice</name>
+ <instance>default</instance>
+ <instance>strongbox</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" updatable-via-apex="true">
+ <name>android.hardware.security.keymint</name>
+ <version>1-3</version>
+ <interface>
+ <name>IRemotelyProvisionedComponent</name>
+ <instance>default</instance>
+ <instance>strongbox</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.light</name>
+ <version>2</version>
+ <interface>
+ <name>ILights</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.media.c2</name>
+ <version>1</version>
+ <interface>
+ <name>IComponentStore</name>
+ <regex-instance>default[0-9]*</regex-instance>
+ <regex-instance>vendor[0-9]*_software</regex-instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.memtrack</name>
+ <version>1</version>
+ <interface>
+ <name>IMemtrack</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" updatable-via-apex="true">
+ <name>android.hardware.neuralnetworks</name>
+ <version>1-4</version>
+ <interface>
+ <name>IDevice</name>
+ <regex-instance>.*</regex-instance>
+ </interface>
+ </hal>
+ <hal format="aidl" updatable-via-apex="true">
+ <name>android.hardware.nfc</name>
+ <version>1-2</version>
+ <interface>
+ <name>INfc</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.power</name>
+ <version>5-6</version>
+ <interface>
+ <name>IPower</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.power.stats</name>
+ <version>2</version>
+ <interface>
+ <name>IPowerStats</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.radio.config</name>
+ <version>3-4</version>
+ <interface>
+ <name>IRadioConfig</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.radio.data</name>
+ <version>3-4</version>
+ <interface>
+ <name>IRadioData</name>
+ <instance>slot1</instance>
+ <instance>slot2</instance>
+ <instance>slot3</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.radio.messaging</name>
+ <version>3-4</version>
+ <interface>
+ <name>IRadioMessaging</name>
+ <instance>slot1</instance>
+ <instance>slot2</instance>
+ <instance>slot3</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.radio.modem</name>
+ <version>3-4</version>
+ <interface>
+ <name>IRadioModem</name>
+ <instance>slot1</instance>
+ <instance>slot2</instance>
+ <instance>slot3</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.radio.network</name>
+ <version>3-4</version>
+ <interface>
+ <name>IRadioNetwork</name>
+ <instance>slot1</instance>
+ <instance>slot2</instance>
+ <instance>slot3</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.radio.sim</name>
+ <version>3-4</version>
+ <interface>
+ <name>IRadioSim</name>
+ <instance>slot1</instance>
+ <instance>slot2</instance>
+ <instance>slot3</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.radio.sap</name>
+ <version>1</version>
+ <interface>
+ <name>ISap</name>
+ <instance>slot1</instance>
+ <instance>slot2</instance>
+ <instance>slot3</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.radio.voice</name>
+ <version>3-4</version>
+ <interface>
+ <name>IRadioVoice</name>
+ <instance>slot1</instance>
+ <instance>slot2</instance>
+ <instance>slot3</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.radio.ims</name>
+ <version>2-3</version>
+ <interface>
+ <name>IRadioIms</name>
+ <instance>slot1</instance>
+ <instance>slot2</instance>
+ <instance>slot3</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.radio.ims.media</name>
+ <version>2-3</version>
+ <interface>
+ <name>IImsMedia</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.rebootescrow</name>
+ <version>1</version>
+ <interface>
+ <name>IRebootEscrow</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.secure_element</name>
+ <version>1</version>
+ <interface>
+ <name>ISecureElement</name>
+ <regex-instance>eSE[1-9][0-9]*</regex-instance>
+ <regex-instance>SIM[1-9][0-9]*</regex-instance>
+ </interface>
+ </hal>
+ <hal format="aidl" updatable-via-apex="true">
+ <name>android.hardware.security.authgraph</name>
+ <version>1</version>
+ <interface>
+ <name>IAuthGraphKeyExchange</name>
+ <instance>nonsecure</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.security.see.hwcrypto</name>
+ <version>1</version>
+ <interface>
+ <name>IHwCryptoKey</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" updatable-via-apex="true">
+ <name>android.hardware.security.secureclock</name>
+ <version>1</version>
+ <interface>
+ <name>ISecureClock</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" updatable-via-apex="true">
+ <name>android.hardware.security.sharedsecret</name>
+ <version>1</version>
+ <interface>
+ <name>ISharedSecret</name>
+ <instance>default</instance>
+ <instance>strongbox</instance>
+ <regex-instance>.*</regex-instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.sensors</name>
+ <version>2-3</version>
+ <interface>
+ <name>ISensors</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.soundtrigger3</name>
+ <version>1-3</version>
+ <interface>
+ <name>ISoundTriggerHw</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.tetheroffload</name>
+ <version>1</version>
+ <interface>
+ <name>IOffload</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.thermal</name>
+ <version>3</version>
+ <interface>
+ <name>IThermal</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" updatable-via-apex="true">
+ <name>android.hardware.threadnetwork</name>
+ <version>1</version>
+ <interface>
+ <name>IThreadChip</name>
+ <regex-instance>chip[0-9]+</regex-instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.tv.hdmi.cec</name>
+ <version>1</version>
+ <interface>
+ <name>IHdmiCec</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.tv.hdmi.earc</name>
+ <version>1</version>
+ <interface>
+ <name>IEArc</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.tv.hdmi.connection</name>
+ <version>1</version>
+ <interface>
+ <name>IHdmiConnection</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.tv.tuner</name>
+ <version>1-3</version>
+ <interface>
+ <name>ITuner</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.tv.input</name>
+ <version>1-3</version>
+ <interface>
+ <name>ITvInput</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.usb</name>
+ <version>1-3</version>
+ <interface>
+ <name>IUsb</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.usb.gadget</name>
+ <interface>
+ <name>IUsbGadget</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.vibrator</name>
+ <version>1-3</version>
+ <interface>
+ <name>IVibrator</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.vibrator</name>
+ <version>1-3</version>
+ <interface>
+ <name>IVibratorManager</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.virtualization.capabilities</name>
+ <version>1</version>
+ <interface>
+ <name>IVmCapabilitiesService</name>
+ <instance>default</instance>
+ <instance>noop</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.weaver</name>
+ <version>2</version>
+ <interface>
+ <name>IWeaver</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" updatable-via-apex="true">
+ <name>android.hardware.wifi</name>
+ <version>2-3</version>
+ <interface>
+ <name>IWifi</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" updatable-via-apex="true">
+ <name>android.hardware.uwb</name>
+ <version>1</version>
+ <interface>
+ <name>IUwb</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.wifi.hostapd</name>
+ <version>2-3</version>
+ <interface>
+ <name>IHostapd</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>android.hardware.wifi.supplicant</name>
+ <version>3-4</version>
+ <interface>
+ <name>ISupplicant</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" optional="true">
+ <name>android.hardware.tv.mediaquality</name>
+ <version>1</version>
+ <interface>
+ <name>IMediaQuality</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <!-- The native mapper HAL must exist on the device -->
+ <hal format="native">
+ <name>mapper</name>
+ <version>5.0</version>
+ <interface>
+ <regex-instance>.*</regex-instance>
+ </interface>
+ </hal>
+</compatibility-matrix>
diff --git a/compatibility_matrices/finalize.py b/compatibility_matrices/finalize.py
index ae048ea..1938278 100755
--- a/compatibility_matrices/finalize.py
+++ b/compatibility_matrices/finalize.py
@@ -14,8 +14,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-"""
-Finalizes the current compatibility matrix and allows `next` targets to
+"""Finalizes the current compatibility matrix and allows `next` targets to
+
use the new FCM.
"""
@@ -28,52 +28,59 @@
def check_call(*args, **kwargs):
- print(args)
- subprocess.check_call(*args, **kwargs)
+ print(args)
+ subprocess.check_call(*args, **kwargs)
+
def check_output(*args, **kwargs):
- print(args)
- return subprocess.check_output(*args, **kwargs)
+ print(args)
+ return subprocess.check_output(*args, **kwargs)
+
class Bump(object):
- def __init__(self, cmdline_args):
- self.top = pathlib.Path(os.environ["ANDROID_BUILD_TOP"])
- self.interfaces_dir = self.top / "hardware/interfaces"
+ def __init__(self, cmdline_args):
+ self.top = pathlib.Path(os.environ["ANDROID_BUILD_TOP"])
+ self.interfaces_dir = self.top / "hardware/interfaces"
- self.current_level = cmdline_args.current_level
- self.current_module_name = f"framework_compatibility_matrix.{self.current_level}.xml"
- self.device_module_name = "framework_compatibility_matrix.device.xml"
+ self.current_level = cmdline_args.current_level
+ self.current_module_name = (
+ f"framework_compatibility_matrix.{self.current_level}.xml"
+ )
+ self.device_module_name = "framework_compatibility_matrix.device.xml"
- def run(self):
- self.edit_android_bp()
+ def run(self):
+ self.edit_android_bp()
- def edit_android_bp(self):
- android_bp = self.interfaces_dir / "compatibility_matrices/Android.bp"
+ def edit_android_bp(self):
+ android_bp = self.interfaces_dir / "compatibility_matrices/Android.bp"
- # update the SYSTEM_MATRIX_DEPS variable to unconditionally include the
- # latests FCM. This adds the file to `next` configs so releasing devices
- # can use the latest interfaces.
- lines = []
- with open(android_bp) as f:
- for line in f:
- if f" \"{self.device_module_name}\",\n" in line:
- lines.append(f" \"{self.current_module_name}\",\n")
+ # update the SYSTEM_MATRIX_DEPS variable to unconditionally include the
+ # latests FCM. This adds the file to `next` configs so releasing devices
+ # can use the latest interfaces.
+ lines = []
+ with open(android_bp) as f:
+ for line in f:
+ if f' "{self.device_module_name}",\n' in line:
+ lines.append(f' "{self.current_module_name}",\n')
- lines.append(line)
+ lines.append(line)
- with open(android_bp, "w") as f:
- f.write("".join(lines))
+ with open(android_bp, "w") as f:
+ f.write("".join(lines))
+
def main():
- parser = argparse.ArgumentParser(description=__doc__)
- parser.add_argument("current_level",
- type=str,
- help="VINTF level of the current version (e.g. 202404)")
- cmdline_args = parser.parse_args()
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument(
+ "current_level",
+ type=str,
+ help="VINTF level of the current version (e.g. 202404)",
+ )
+ cmdline_args = parser.parse_args()
- Bump(cmdline_args).run()
+ Bump(cmdline_args).run()
if __name__ == "__main__":
- main()
+ main()
diff --git a/contexthub/aidl/vts/VtsAidlHalContextHubTargetTest.cpp b/contexthub/aidl/vts/VtsAidlHalContextHubTargetTest.cpp
index d7859d9..900e6c9 100644
--- a/contexthub/aidl/vts/VtsAidlHalContextHubTargetTest.cpp
+++ b/contexthub/aidl/vts/VtsAidlHalContextHubTargetTest.cpp
@@ -72,17 +72,30 @@
constexpr int64_t kDefaultHubId = 1;
class TestEndpointCallback;
+
class ContextHubAidl : public testing::TestWithParam<std::tuple<std::string, int32_t>> {
public:
void SetUp() override {
mContextHub = android::waitForDeclaredService<IContextHub>(
String16(std::get<0>(GetParam()).c_str()));
ASSERT_NE(mContextHub, nullptr);
- mEndpointCb = sp<TestEndpointCallback>::make();
}
uint32_t getHubId() { return std::get<1>(GetParam()); }
+ void testSettingChanged(Setting setting);
+
+ sp<IContextHub> mContextHub;
+};
+
+class ContextHubEndpointAidl : public testing::TestWithParam<std::string> {
+ public:
+ void SetUp() override {
+ mContextHub = android::waitForDeclaredService<IContextHub>(String16(GetParam().c_str()));
+ ASSERT_NE(mContextHub, nullptr);
+ mEndpointCb = sp<TestEndpointCallback>::make();
+ }
+
Status registerHub(int64_t id, sp<IEndpointCommunication>* hubInterface) {
HubInfo info;
info.hubId = id;
@@ -103,17 +116,15 @@
return true;
}
- void testSettingChanged(Setting setting);
-
sp<IContextHub> mContextHub;
sp<TestEndpointCallback> mEndpointCb;
sp<IEndpointCommunication> mHubInterface;
};
-class ContextHubAidlWithTestMode : public ContextHubAidl {
+class ContextHubEndpointAidlWithTestMode : public ContextHubEndpointAidl {
public:
void SetUp() override {
- ContextHubAidl::SetUp();
+ ContextHubEndpointAidl::SetUp();
// Best effort enable test mode - this may not be supported on older HALS, so we
// ignore the return value.
@@ -122,11 +133,11 @@
void TearDown() override {
mContextHub->setTestMode(/* enable= */ false);
- ContextHubAidl::TearDown();
+ ContextHubEndpointAidl::TearDown();
}
};
-TEST_P(ContextHubAidl, TestGetHubs) {
+TEST_P(ContextHubEndpointAidl, TestGetHubs) {
std::vector<ContextHubInfo> hubs;
ASSERT_TRUE(mContextHub->getContextHubs(&hubs).isOk());
@@ -149,7 +160,7 @@
}
}
-TEST_P(ContextHubAidl, TestEnableTestMode) {
+TEST_P(ContextHubEndpointAidl, TestEnableTestMode) {
Status status = mContextHub->setTestMode(true);
if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
status.transactionError() == android::UNKNOWN_TRANSACTION) {
@@ -159,7 +170,7 @@
}
}
-TEST_P(ContextHubAidl, TestDisableTestMode) {
+TEST_P(ContextHubEndpointAidl, TestDisableTestMode) {
Status status = mContextHub->setTestMode(false);
if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
status.transactionError() == android::UNKNOWN_TRANSACTION) {
@@ -585,7 +596,7 @@
bool mWasOnEndpointSessionOpenCompleteCalled = false;
};
-TEST_P(ContextHubAidlWithTestMode, RegisterHub) {
+TEST_P(ContextHubEndpointAidlWithTestMode, RegisterHub) {
if (!registerDefaultHub()) {
GTEST_SKIP() << "Not supported -> old API; or not implemented";
}
@@ -604,7 +615,7 @@
EXPECT_TRUE(status.isOk());
}
-TEST_P(ContextHubAidlWithTestMode, RegisterEndpoint) {
+TEST_P(ContextHubEndpointAidlWithTestMode, RegisterEndpoint) {
if (!registerDefaultHub()) {
GTEST_SKIP() << "Not supported -> old API; or not implemented";
}
@@ -625,7 +636,7 @@
}
}
-TEST_P(ContextHubAidlWithTestMode, RegisterEndpointSameNameFailure) {
+TEST_P(ContextHubEndpointAidlWithTestMode, RegisterEndpointSameNameFailure) {
if (!registerDefaultHub()) {
GTEST_SKIP() << "Not supported -> old API; or not implemented";
}
@@ -655,7 +666,7 @@
EXPECT_FALSE(mHubInterface->registerEndpoint(endpointInfo2).isOk());
}
-TEST_P(ContextHubAidlWithTestMode, RegisterEndpointSameIdFailure) {
+TEST_P(ContextHubEndpointAidlWithTestMode, RegisterEndpointSameIdFailure) {
if (!registerDefaultHub()) {
GTEST_SKIP() << "Not supported -> old API; or not implemented";
}
@@ -685,7 +696,7 @@
EXPECT_FALSE(mHubInterface->registerEndpoint(endpointInfo2).isOk());
}
-TEST_P(ContextHubAidlWithTestMode, UnregisterEndpoint) {
+TEST_P(ContextHubEndpointAidlWithTestMode, UnregisterEndpoint) {
if (!registerDefaultHub()) {
GTEST_SKIP() << "Not supported -> old API; or not implemented";
}
@@ -708,7 +719,7 @@
EXPECT_TRUE(mHubInterface->unregisterEndpoint(endpointInfo).isOk());
}
-TEST_P(ContextHubAidlWithTestMode, UnregisterEndpointNonexistent) {
+TEST_P(ContextHubEndpointAidlWithTestMode, UnregisterEndpointNonexistent) {
if (!registerDefaultHub()) {
GTEST_SKIP() << "Not supported -> old API; or not implemented";
}
@@ -729,7 +740,7 @@
}
}
-TEST_P(ContextHubAidlWithTestMode, OpenEndpointSessionInvalidRange) {
+TEST_P(ContextHubEndpointAidlWithTestMode, OpenEndpointSessionInvalidRange) {
if (!registerDefaultHub()) {
GTEST_SKIP() << "Not supported -> old API; or not implemented";
}
@@ -775,7 +786,7 @@
.isOk());
}
-TEST_P(ContextHubAidlWithTestMode, OpenEndpointSessionAndSendMessageEchoesBack) {
+TEST_P(ContextHubEndpointAidlWithTestMode, OpenEndpointSessionAndSendMessageEchoesBack) {
if (!registerDefaultHub()) {
GTEST_SKIP() << "Not supported -> old API; or not implemented";
}
@@ -845,9 +856,17 @@
INSTANTIATE_TEST_SUITE_P(ContextHub, ContextHubAidl, testing::ValuesIn(generateContextHubMapping()),
PrintGeneratedTest);
-GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ContextHubAidlWithTestMode);
-INSTANTIATE_TEST_SUITE_P(ContextHub, ContextHubAidlWithTestMode,
- testing::ValuesIn(generateContextHubMapping()), PrintGeneratedTest);
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ContextHubEndpointAidl);
+INSTANTIATE_TEST_SUITE_P(
+ ContextHub, ContextHubEndpointAidl,
+ testing::ValuesIn(android::getAidlHalInstanceNames(IContextHub::descriptor)),
+ android::PrintInstanceNameToString);
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ContextHubEndpointAidlWithTestMode);
+INSTANTIATE_TEST_SUITE_P(
+ ContextHub, ContextHubEndpointAidlWithTestMode,
+ testing::ValuesIn(android::getAidlHalInstanceNames(IContextHub::descriptor)),
+ android::PrintInstanceNameToString);
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ContextHubTransactionTest);
INSTANTIATE_TEST_SUITE_P(ContextHub, ContextHubTransactionTest,
diff --git a/gnss/aidl/default/Gnss.cpp b/gnss/aidl/default/Gnss.cpp
index 41720c0..1fd21d8 100644
--- a/gnss/aidl/default/Gnss.cpp
+++ b/gnss/aidl/default/Gnss.cpp
@@ -298,8 +298,14 @@
ScopedAStatus Gnss::setPositionMode(const PositionModeOptions& options) {
ALOGD("setPositionMode. minIntervalMs:%d, lowPowerMode:%d", options.minIntervalMs,
(int)options.lowPowerMode);
- mMinIntervalMs = std::max(1000, options.minIntervalMs);
- mGnssMeasurementInterface->setLocationInterval(mMinIntervalMs);
+ if (std::max(1000, options.minIntervalMs) != mMinIntervalMs) {
+ mMinIntervalMs = std::max(1000, options.minIntervalMs);
+ mGnssMeasurementInterface->setLocationInterval(mMinIntervalMs);
+ if (mIsActive) {
+ stop();
+ start();
+ }
+ }
return ScopedAStatus::ok();
}
diff --git a/gnss/common/utils/default/MockLocation.cpp b/gnss/common/utils/default/MockLocation.cpp
index c90075f..512af21 100644
--- a/gnss/common/utils/default/MockLocation.cpp
+++ b/gnss/common/utils/default/MockLocation.cpp
@@ -21,7 +21,7 @@
float gMockLatitudeDegrees{37.4219999};
float gMockLongitudeDegrees{-122.0840575};
float gMockAltitudeMeters{1.60062531};
-float gMockBearingDegrees{0};
-float gMockSpeedMetersPerSec{0};
+float gMockBearingDegrees{0.0001}; // a real location rarely has exactly zero bearing
+float gMockSpeedMetersPerSec{0.0001};
} // namespace android::hardware::gnss::common
diff --git a/graphics/allocator/aidl/vts/VtsHalGraphicsAllocatorAidl_TargetTest.cpp b/graphics/allocator/aidl/vts/VtsHalGraphicsAllocatorAidl_TargetTest.cpp
index 0430ea7..22ad5f0 100644
--- a/graphics/allocator/aidl/vts/VtsHalGraphicsAllocatorAidl_TargetTest.cpp
+++ b/graphics/allocator/aidl/vts/VtsHalGraphicsAllocatorAidl_TargetTest.cpp
@@ -162,11 +162,19 @@
}
private:
- BufferDescriptor createDescriptor(const BufferDescriptorInfo& descriptorInfo) {
- BufferDescriptor descriptor;
+ std::optional<BufferDescriptor> createDescriptor(const BufferDescriptorInfo& descriptorInfo,
+ bool raise_failure) {
+ std::optional<BufferDescriptor> descriptor;
mMapper4->createDescriptor(
convert(descriptorInfo), [&](const auto& tmpError, const auto& tmpDescriptor) {
- ASSERT_EQ(Error::NONE, tmpError) << "failed to create descriptor";
+ if (raise_failure) {
+ ASSERT_EQ(Error::NONE, tmpError) << "failed to create descriptor";
+ }
+
+ if (tmpError != Error::NONE) {
+ return;
+ }
+
descriptor = tmpDescriptor;
});
@@ -174,19 +182,24 @@
}
public:
- std::unique_ptr<BufferHandle> allocate(const BufferDescriptorInfo& descriptorInfo) {
+ std::unique_ptr<BufferHandle> allocate(const BufferDescriptorInfo& descriptorInfo,
+ bool raise_failure = true) {
AllocationResult result;
::ndk::ScopedAStatus status;
if (mIAllocatorVersion >= 2) {
status = mAllocator->allocate2(descriptorInfo, 1, &result);
} else {
- auto descriptor = createDescriptor(descriptorInfo);
+ auto descriptor = createDescriptor(descriptorInfo, raise_failure);
+ if (!descriptor.has_value()) {
+ return nullptr;
+ }
+
if (::testing::Test::HasFatalFailure()) {
return nullptr;
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- status = mAllocator->allocate(descriptor, 1, &result);
+ status = mAllocator->allocate(descriptor.value(), 1, &result);
#pragma clang diagnostic pop // deprecation
}
if (!status.isOk()) {
@@ -380,7 +393,7 @@
.reservedSize = 0,
};
const bool supported = isSupported(info);
- auto buffer = allocate(info);
+ auto buffer = allocate(info, /*raise_failure=*/supported);
if (!supported) {
ASSERT_EQ(nullptr, buffer.get())
<< "Allocation succeeded, but IMapper::isSupported was false";
@@ -422,7 +435,7 @@
.reservedSize = 0,
};
const bool supported = isSupported(info);
- auto buffer = allocate(info);
+ auto buffer = allocate(info, /*raise_failure=*/supported);
if (!supported) {
ASSERT_EQ(nullptr, buffer.get())
<< "Allocation succeeded, but IMapper::isSupported was false";
@@ -480,4 +493,4 @@
[](auto info) -> std::string {
std::string name = std::to_string(info.index) + "/" + std::get<1>(info.param).name;
return Sanitize(name);
- });
\ No newline at end of file
+ });
diff --git a/graphics/composer/TEST_MAPPING b/graphics/composer/TEST_MAPPING
new file mode 100644
index 0000000..8513c9a
--- /dev/null
+++ b/graphics/composer/TEST_MAPPING
@@ -0,0 +1,12 @@
+{
+ "presubmit": [
+ {
+ "name": "VtsHalGraphicsComposer3_TargetTest"
+ }
+ ],
+ "desktop-presubmit": [
+ {
+ "name": "VtsHalGraphicsComposer3_TargetTest"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/Luts.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/Luts.aidl
index 393354e..6ff1db2 100644
--- a/graphics/composer/aidl/android/hardware/graphics/composer3/Luts.aidl
+++ b/graphics/composer/aidl/android/hardware/graphics/composer3/Luts.aidl
@@ -58,6 +58,8 @@
*
* Multiple Luts can be packed into one same `pfd`, and `offsets` is used to pinpoint
* the starting point of each Lut.
+ *
+ * `offsets` should be valid unless an invalid `pfd` is provided.
*/
@nullable int[] offsets;
diff --git a/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientReader.h b/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientReader.h
index 2196530..da6001a 100644
--- a/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientReader.h
+++ b/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientReader.h
@@ -270,7 +270,7 @@
for (auto& [layerId, luts] : displayLuts.layerLuts) {
if (luts.pfd.get() >= 0) {
data.layerLuts.push_back(
- {layerId, Luts{ndk::ScopedFileDescriptor(luts.pfd.release()), luts.offsets,
+ {layerId, Luts{ndk::ScopedFileDescriptor(dup(luts.pfd.get())), luts.offsets,
luts.lutProperties}});
}
}
diff --git a/graphics/composer/aidl/libhwc_aidl_test/Android.bp b/graphics/composer/aidl/libhwc_aidl_test/Android.bp
new file mode 100644
index 0000000..1955fcf
--- /dev/null
+++ b/graphics/composer/aidl/libhwc_aidl_test/Android.bp
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2025, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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_team: "trendy_team_android_core_graphics_stack",
+ // 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
+}
+
+cc_library_static {
+ name: "libhwc_aidl_test",
+ export_include_dirs: ["include"],
+ defaults: [
+ "use_libaidlvintf_gtest_helper_static",
+ "librenderengine_deps",
+ "android.hardware.graphics.common-ndk_static",
+ "android.hardware.graphics.composer3-ndk_static",
+ ],
+ srcs: [
+ "ComposerClientWrapper.cpp",
+ "GraphicsComposerCallback.cpp",
+ "Readback.cpp",
+ "RenderEngine.cpp",
+ ],
+ shared_libs: [
+ "libEGL",
+ "libGLESv2",
+ "libbinder_ndk",
+ "libbinder",
+ "libfmq",
+ "libbase",
+ "libsync",
+ "libui",
+ "libgui",
+ ],
+ header_libs: [
+ "android.hardware.graphics.composer3-command-buffer",
+ ],
+ static_libs: [
+ "android.hardware.graphics.common@1.2",
+ "android.hardware.common-V2-ndk",
+ "android.hardware.common.fmq-V1-ndk",
+ "libaidlcommonsupport",
+ "libarect",
+ "libbase",
+ "libfmq",
+ "libgtest",
+ "librenderengine",
+ "libsync",
+ "libsurfaceflinger_common",
+ ],
+ cflags: [
+ "-Wconversion",
+ ],
+}
diff --git a/graphics/composer/aidl/vts/VtsComposerClient.cpp b/graphics/composer/aidl/libhwc_aidl_test/ComposerClientWrapper.cpp
similarity index 65%
rename from graphics/composer/aidl/vts/VtsComposerClient.cpp
rename to graphics/composer/aidl/libhwc_aidl_test/ComposerClientWrapper.cpp
index f09482c..8af1fc3 100644
--- a/graphics/composer/aidl/vts/VtsComposerClient.cpp
+++ b/graphics/composer/aidl/libhwc_aidl_test/ComposerClientWrapper.cpp
@@ -14,19 +14,19 @@
* limitations under the License.
*/
-#include "VtsComposerClient.h"
+#include "ComposerClientWrapper.h"
#include <aidlcommonsupport/NativeHandle.h>
#include <android-base/logging.h>
#include <log/log_main.h>
#undef LOG_TAG
-#define LOG_TAG "VtsComposerClient"
+#define LOG_TAG "ComposerClientWrapper"
using namespace std::chrono_literals;
-namespace aidl::android::hardware::graphics::composer3::vts {
+namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test {
-VtsComposerClient::VtsComposerClient(const std::string& name) {
+ComposerClientWrapper::ComposerClientWrapper(const std::string& name) {
SpAIBinder binder(AServiceManager_waitForService(name.c_str()));
ALOGE_IF(binder == nullptr, "Could not initialize the service binder");
if (binder != nullptr) {
@@ -43,7 +43,7 @@
}
}
-ScopedAStatus VtsComposerClient::createClient() {
+ScopedAStatus ComposerClientWrapper::createClient() {
if (mComposer == nullptr) {
ALOGE("IComposer not initialized");
return ScopedAStatus::fromServiceSpecificError(IComposerClient::INVALID_CONFIGURATION);
@@ -62,11 +62,11 @@
return mComposerClient->registerCallback(mComposerCallback);
}
-bool VtsComposerClient::tearDown(ComposerClientWriter* writer) {
+bool ComposerClientWrapper::tearDown(ComposerClientWriter* writer) {
return verifyComposerCallbackParams() && destroyAllLayers(writer);
}
-std::pair<ScopedAStatus, int32_t> VtsComposerClient::getInterfaceVersion() const {
+std::pair<ScopedAStatus, int32_t> ComposerClientWrapper::getInterfaceVersion() const {
int32_t version = 1;
if (!mComposerClient) {
return {ScopedAStatus{nullptr}, version};
@@ -75,7 +75,7 @@
return {std::move(status), version};
}
-std::pair<ScopedAStatus, VirtualDisplay> VtsComposerClient::createVirtualDisplay(
+std::pair<ScopedAStatus, VirtualDisplay> ComposerClientWrapper::createVirtualDisplay(
int32_t width, int32_t height, PixelFormat pixelFormat, int32_t bufferSlotCount) {
VirtualDisplay outVirtualDisplay;
auto status = mComposerClient->createVirtualDisplay(width, height, pixelFormat, bufferSlotCount,
@@ -87,7 +87,7 @@
outVirtualDisplay};
}
-ScopedAStatus VtsComposerClient::destroyVirtualDisplay(int64_t display) {
+ScopedAStatus ComposerClientWrapper::destroyVirtualDisplay(int64_t display) {
auto status = mComposerClient->destroyVirtualDisplay(display);
if (!status.isOk()) {
return status;
@@ -96,9 +96,9 @@
return status;
}
-std::pair<ScopedAStatus, int64_t> VtsComposerClient::createLayer(int64_t display,
- int32_t bufferSlotCount,
- ComposerClientWriter* writer) {
+std::pair<ScopedAStatus, int64_t> ComposerClientWrapper::createLayer(int64_t display,
+ int32_t bufferSlotCount,
+ ComposerClientWriter* writer) {
if (mSupportsBatchedCreateLayer) {
int64_t layer = mNextLayerHandle++;
writer->setLayerLifecycleBatchCommandType(display, layer,
@@ -116,8 +116,8 @@
return {addLayerToDisplayResources(display, outLayer), outLayer};
}
-ScopedAStatus VtsComposerClient::destroyLayer(int64_t display, int64_t layer,
- ComposerClientWriter* writer) {
+ScopedAStatus ComposerClientWrapper::destroyLayer(int64_t display, int64_t layer,
+ ComposerClientWriter* writer) {
if (mSupportsBatchedCreateLayer) {
writer->setLayerLifecycleBatchCommandType(display, layer,
LayerLifecycleBatchCommandType::DESTROY);
@@ -132,27 +132,27 @@
return ScopedAStatus::ok();
}
-std::pair<ScopedAStatus, int32_t> VtsComposerClient::getActiveConfig(int64_t display) {
+std::pair<ScopedAStatus, int32_t> ComposerClientWrapper::getActiveConfig(int64_t display) {
int32_t outConfig;
return {mComposerClient->getActiveConfig(display, &outConfig), outConfig};
}
-ScopedAStatus VtsComposerClient::setActiveConfig(VtsDisplay* vtsDisplay, int32_t config) {
- auto status = mComposerClient->setActiveConfig(vtsDisplay->getDisplayId(), config);
+ScopedAStatus ComposerClientWrapper::setActiveConfig(DisplayWrapper* display, int32_t config) {
+ auto status = mComposerClient->setActiveConfig(display->getDisplayId(), config);
if (!status.isOk()) {
return status;
}
- return updateDisplayProperties(vtsDisplay, config);
+ return updateDisplayProperties(display, config);
}
-ScopedAStatus VtsComposerClient::setPeakRefreshRateConfig(VtsDisplay* vtsDisplay) {
- const auto displayId = vtsDisplay->getDisplayId();
+ScopedAStatus ComposerClientWrapper::setPeakRefreshRateConfig(DisplayWrapper* display) {
+ const auto displayId = display->getDisplayId();
auto [activeStatus, activeConfig] = getActiveConfig(displayId);
EXPECT_TRUE(activeStatus.isOk());
- auto peakDisplayConfig = vtsDisplay->getDisplayConfig(activeConfig);
+ auto peakDisplayConfig = display->getDisplayConfig(activeConfig);
auto peakConfig = activeConfig;
- const auto displayConfigs = vtsDisplay->getDisplayConfigs();
+ const auto displayConfigs = display->getDisplayConfigs();
for (const auto [config, displayConfig] : displayConfigs) {
if (displayConfig.configGroup == peakDisplayConfig.configGroup &&
displayConfig.vsyncPeriod < peakDisplayConfig.vsyncPeriod) {
@@ -160,10 +160,10 @@
peakConfig = config;
}
}
- return setActiveConfig(vtsDisplay, peakConfig);
+ return setActiveConfig(display, peakConfig);
}
-std::pair<ScopedAStatus, int32_t> VtsComposerClient::getDisplayAttribute(
+std::pair<ScopedAStatus, int32_t> ComposerClientWrapper::getDisplayAttribute(
int64_t display, int32_t config, DisplayAttribute displayAttribute) {
int32_t outDisplayAttribute;
return {mComposerClient->getDisplayAttribute(display, config, displayAttribute,
@@ -171,58 +171,59 @@
outDisplayAttribute};
}
-ScopedAStatus VtsComposerClient::setPowerMode(int64_t display, PowerMode powerMode) {
+ScopedAStatus ComposerClientWrapper::setPowerMode(int64_t display, PowerMode powerMode) {
return mComposerClient->setPowerMode(display, powerMode);
}
-ScopedAStatus VtsComposerClient::setVsync(int64_t display, bool enable) {
+ScopedAStatus ComposerClientWrapper::setVsync(int64_t display, bool enable) {
return mComposerClient->setVsyncEnabled(display, enable);
}
-void VtsComposerClient::setVsyncAllowed(bool isAllowed) {
+void ComposerClientWrapper::setVsyncAllowed(bool isAllowed) {
mComposerCallback->setVsyncAllowed(isAllowed);
}
-std::pair<ScopedAStatus, std::vector<float>> VtsComposerClient::getDataspaceSaturationMatrix(
+std::pair<ScopedAStatus, std::vector<float>> ComposerClientWrapper::getDataspaceSaturationMatrix(
Dataspace dataspace) {
std::vector<float> outMatrix;
return {mComposerClient->getDataspaceSaturationMatrix(dataspace, &outMatrix), outMatrix};
}
-std::pair<ScopedAStatus, std::vector<CommandResultPayload>> VtsComposerClient::executeCommands(
+std::pair<ScopedAStatus, std::vector<CommandResultPayload>> ComposerClientWrapper::executeCommands(
const std::vector<DisplayCommand>& commands) {
std::vector<CommandResultPayload> outResultPayload;
return {mComposerClient->executeCommands(commands, &outResultPayload),
std::move(outResultPayload)};
}
-std::optional<VsyncPeriodChangeTimeline> VtsComposerClient::takeLastVsyncPeriodChangeTimeline() {
+std::optional<VsyncPeriodChangeTimeline>
+ComposerClientWrapper::takeLastVsyncPeriodChangeTimeline() {
return mComposerCallback->takeLastVsyncPeriodChangeTimeline();
}
-ScopedAStatus VtsComposerClient::setContentType(int64_t display, ContentType contentType) {
+ScopedAStatus ComposerClientWrapper::setContentType(int64_t display, ContentType contentType) {
return mComposerClient->setContentType(display, contentType);
}
std::pair<ScopedAStatus, VsyncPeriodChangeTimeline>
-VtsComposerClient::setActiveConfigWithConstraints(VtsDisplay* vtsDisplay, int32_t config,
- const VsyncPeriodChangeConstraints& constraints) {
+ComposerClientWrapper::setActiveConfigWithConstraints(
+ DisplayWrapper* display, int32_t config, const VsyncPeriodChangeConstraints& constraints) {
VsyncPeriodChangeTimeline outTimeline;
- auto status = mComposerClient->setActiveConfigWithConstraints(
- vtsDisplay->getDisplayId(), config, constraints, &outTimeline);
+ auto status = mComposerClient->setActiveConfigWithConstraints(display->getDisplayId(), config,
+ constraints, &outTimeline);
if (!status.isOk()) {
return {std::move(status), outTimeline};
}
- return {updateDisplayProperties(vtsDisplay, config), outTimeline};
+ return {updateDisplayProperties(display, config), outTimeline};
}
-std::pair<ScopedAStatus, std::vector<DisplayCapability>> VtsComposerClient::getDisplayCapabilities(
- int64_t display) {
+std::pair<ScopedAStatus, std::vector<DisplayCapability>>
+ComposerClientWrapper::getDisplayCapabilities(int64_t display) {
std::vector<DisplayCapability> outCapabilities;
return {mComposerClient->getDisplayCapabilities(display, &outCapabilities), outCapabilities};
}
-ScopedAStatus VtsComposerClient::dumpDebugInfo() {
+ScopedAStatus ComposerClientWrapper::dumpDebugInfo() {
int pipefds[2];
if (pipe(pipefds) < 0) {
return ScopedAStatus::fromServiceSpecificError(IComposer::EX_NO_RESOURCES);
@@ -234,76 +235,79 @@
return ScopedAStatus::fromStatus(status);
}
-std::pair<ScopedAStatus, DisplayIdentification> VtsComposerClient::getDisplayIdentificationData(
+std::pair<ScopedAStatus, DisplayIdentification> ComposerClientWrapper::getDisplayIdentificationData(
int64_t display) {
DisplayIdentification outDisplayIdentification;
return {mComposerClient->getDisplayIdentificationData(display, &outDisplayIdentification),
outDisplayIdentification};
}
-std::pair<ScopedAStatus, HdrCapabilities> VtsComposerClient::getHdrCapabilities(int64_t display) {
+std::pair<ScopedAStatus, HdrCapabilities> ComposerClientWrapper::getHdrCapabilities(
+ int64_t display) {
HdrCapabilities outHdrCapabilities;
return {mComposerClient->getHdrCapabilities(display, &outHdrCapabilities), outHdrCapabilities};
}
std::pair<ScopedAStatus, std::vector<PerFrameMetadataKey>>
-VtsComposerClient::getPerFrameMetadataKeys(int64_t display) {
+ComposerClientWrapper::getPerFrameMetadataKeys(int64_t display) {
std::vector<PerFrameMetadataKey> outPerFrameMetadataKeys;
return {mComposerClient->getPerFrameMetadataKeys(display, &outPerFrameMetadataKeys),
outPerFrameMetadataKeys};
}
-std::pair<ScopedAStatus, ReadbackBufferAttributes> VtsComposerClient::getReadbackBufferAttributes(
- int64_t display) {
+std::pair<ScopedAStatus, ReadbackBufferAttributes>
+ComposerClientWrapper::getReadbackBufferAttributes(int64_t display) {
ReadbackBufferAttributes outReadbackBufferAttributes;
return {mComposerClient->getReadbackBufferAttributes(display, &outReadbackBufferAttributes),
outReadbackBufferAttributes};
}
-ScopedAStatus VtsComposerClient::setReadbackBuffer(int64_t display, const native_handle_t* buffer,
- const ScopedFileDescriptor& releaseFence) {
+ScopedAStatus ComposerClientWrapper::setReadbackBuffer(int64_t display,
+ const native_handle_t* buffer,
+ const ScopedFileDescriptor& releaseFence) {
return mComposerClient->setReadbackBuffer(display, ::android::dupToAidl(buffer), releaseFence);
}
-std::pair<ScopedAStatus, ScopedFileDescriptor> VtsComposerClient::getReadbackBufferFence(
+std::pair<ScopedAStatus, ScopedFileDescriptor> ComposerClientWrapper::getReadbackBufferFence(
int64_t display) {
ScopedFileDescriptor outReleaseFence;
return {mComposerClient->getReadbackBufferFence(display, &outReleaseFence),
std::move(outReleaseFence)};
}
-std::pair<ScopedAStatus, std::vector<ColorMode>> VtsComposerClient::getColorModes(int64_t display) {
+std::pair<ScopedAStatus, std::vector<ColorMode>> ComposerClientWrapper::getColorModes(
+ int64_t display) {
std::vector<ColorMode> outColorModes;
return {mComposerClient->getColorModes(display, &outColorModes), outColorModes};
}
-std::pair<ScopedAStatus, std::vector<RenderIntent>> VtsComposerClient::getRenderIntents(
+std::pair<ScopedAStatus, std::vector<RenderIntent>> ComposerClientWrapper::getRenderIntents(
int64_t display, ColorMode colorMode) {
std::vector<RenderIntent> outRenderIntents;
return {mComposerClient->getRenderIntents(display, colorMode, &outRenderIntents),
outRenderIntents};
}
-ScopedAStatus VtsComposerClient::setColorMode(int64_t display, ColorMode colorMode,
- RenderIntent renderIntent) {
+ScopedAStatus ComposerClientWrapper::setColorMode(int64_t display, ColorMode colorMode,
+ RenderIntent renderIntent) {
return mComposerClient->setColorMode(display, colorMode, renderIntent);
}
std::pair<ScopedAStatus, DisplayContentSamplingAttributes>
-VtsComposerClient::getDisplayedContentSamplingAttributes(int64_t display) {
+ComposerClientWrapper::getDisplayedContentSamplingAttributes(int64_t display) {
DisplayContentSamplingAttributes outAttributes;
return {mComposerClient->getDisplayedContentSamplingAttributes(display, &outAttributes),
outAttributes};
}
-ScopedAStatus VtsComposerClient::setDisplayedContentSamplingEnabled(
+ScopedAStatus ComposerClientWrapper::setDisplayedContentSamplingEnabled(
int64_t display, bool isEnabled, FormatColorComponent formatColorComponent,
int64_t maxFrames) {
return mComposerClient->setDisplayedContentSamplingEnabled(display, isEnabled,
formatColorComponent, maxFrames);
}
-std::pair<ScopedAStatus, DisplayContentSample> VtsComposerClient::getDisplayedContentSample(
+std::pair<ScopedAStatus, DisplayContentSample> ComposerClientWrapper::getDisplayedContentSample(
int64_t display, int64_t maxFrames, int64_t timestamp) {
DisplayContentSample outDisplayContentSample;
return {mComposerClient->getDisplayedContentSample(display, maxFrames, timestamp,
@@ -311,14 +315,14 @@
outDisplayContentSample};
}
-std::pair<ScopedAStatus, DisplayConnectionType> VtsComposerClient::getDisplayConnectionType(
+std::pair<ScopedAStatus, DisplayConnectionType> ComposerClientWrapper::getDisplayConnectionType(
int64_t display) {
DisplayConnectionType outDisplayConnectionType;
return {mComposerClient->getDisplayConnectionType(display, &outDisplayConnectionType),
outDisplayConnectionType};
}
-std::pair<ScopedAStatus, std::vector<int32_t>> VtsComposerClient::getDisplayConfigs(
+std::pair<ScopedAStatus, std::vector<int32_t>> ComposerClientWrapper::getDisplayConfigs(
int64_t display) {
std::vector<int32_t> outConfigs;
if (!getDisplayConfigurationSupported()) {
@@ -336,132 +340,131 @@
}
std::pair<ScopedAStatus, std::vector<DisplayConfiguration>>
-VtsComposerClient::getDisplayConfigurations(int64_t display) {
+ComposerClientWrapper::getDisplayConfigurations(int64_t display) {
std::vector<DisplayConfiguration> outConfigs;
return {mComposerClient->getDisplayConfigurations(display, kMaxFrameIntervalNs, &outConfigs),
outConfigs};
}
-ScopedAStatus VtsComposerClient::notifyExpectedPresent(int64_t display,
- ClockMonotonicTimestamp expectedPresentTime,
- int frameIntervalNs) {
+ScopedAStatus ComposerClientWrapper::notifyExpectedPresent(
+ int64_t display, ClockMonotonicTimestamp expectedPresentTime, int frameIntervalNs) {
return mComposerClient->notifyExpectedPresent(display, expectedPresentTime, frameIntervalNs);
}
-std::pair<ScopedAStatus, int32_t> VtsComposerClient::getDisplayVsyncPeriod(int64_t display) {
+std::pair<ScopedAStatus, int32_t> ComposerClientWrapper::getDisplayVsyncPeriod(int64_t display) {
int32_t outVsyncPeriodNanos;
return {mComposerClient->getDisplayVsyncPeriod(display, &outVsyncPeriodNanos),
outVsyncPeriodNanos};
}
-ScopedAStatus VtsComposerClient::setAutoLowLatencyMode(int64_t display, bool isEnabled) {
+ScopedAStatus ComposerClientWrapper::setAutoLowLatencyMode(int64_t display, bool isEnabled) {
return mComposerClient->setAutoLowLatencyMode(display, isEnabled);
}
-std::pair<ScopedAStatus, std::vector<ContentType>> VtsComposerClient::getSupportedContentTypes(
+std::pair<ScopedAStatus, std::vector<ContentType>> ComposerClientWrapper::getSupportedContentTypes(
int64_t display) {
std::vector<ContentType> outContentTypes;
return {mComposerClient->getSupportedContentTypes(display, &outContentTypes), outContentTypes};
}
std::pair<ScopedAStatus, std::optional<DisplayDecorationSupport>>
-VtsComposerClient::getDisplayDecorationSupport(int64_t display) {
+ComposerClientWrapper::getDisplayDecorationSupport(int64_t display) {
std::optional<DisplayDecorationSupport> outSupport;
return {mComposerClient->getDisplayDecorationSupport(display, &outSupport), outSupport};
}
-std::pair<ScopedAStatus, int32_t> VtsComposerClient::getMaxVirtualDisplayCount() {
+std::pair<ScopedAStatus, int32_t> ComposerClientWrapper::getMaxVirtualDisplayCount() {
int32_t outMaxVirtualDisplayCount;
return {mComposerClient->getMaxVirtualDisplayCount(&outMaxVirtualDisplayCount),
outMaxVirtualDisplayCount};
}
-std::pair<ScopedAStatus, std::string> VtsComposerClient::getDisplayName(int64_t display) {
+std::pair<ScopedAStatus, std::string> ComposerClientWrapper::getDisplayName(int64_t display) {
std::string outDisplayName;
return {mComposerClient->getDisplayName(display, &outDisplayName), outDisplayName};
}
-ScopedAStatus VtsComposerClient::setClientTargetSlotCount(int64_t display,
- int32_t bufferSlotCount) {
+ScopedAStatus ComposerClientWrapper::setClientTargetSlotCount(int64_t display,
+ int32_t bufferSlotCount) {
return mComposerClient->setClientTargetSlotCount(display, bufferSlotCount);
}
-std::pair<ScopedAStatus, std::vector<Capability>> VtsComposerClient::getCapabilities() {
+std::pair<ScopedAStatus, std::vector<Capability>> ComposerClientWrapper::getCapabilities() {
std::vector<Capability> outCapabilities;
return {mComposer->getCapabilities(&outCapabilities), outCapabilities};
}
-ScopedAStatus VtsComposerClient::setBootDisplayConfig(int64_t display, int32_t config) {
+ScopedAStatus ComposerClientWrapper::setBootDisplayConfig(int64_t display, int32_t config) {
return mComposerClient->setBootDisplayConfig(display, config);
}
-ScopedAStatus VtsComposerClient::clearBootDisplayConfig(int64_t display) {
+ScopedAStatus ComposerClientWrapper::clearBootDisplayConfig(int64_t display) {
return mComposerClient->clearBootDisplayConfig(display);
}
-std::pair<ScopedAStatus, int32_t> VtsComposerClient::getPreferredBootDisplayConfig(
+std::pair<ScopedAStatus, int32_t> ComposerClientWrapper::getPreferredBootDisplayConfig(
int64_t display) {
int32_t outConfig;
return {mComposerClient->getPreferredBootDisplayConfig(display, &outConfig), outConfig};
}
std::pair<ScopedAStatus, std::vector<common::HdrConversionCapability>>
-VtsComposerClient::getHdrConversionCapabilities() {
+ComposerClientWrapper::getHdrConversionCapabilities() {
std::vector<common::HdrConversionCapability> hdrConversionCapability;
return {mComposerClient->getHdrConversionCapabilities(&hdrConversionCapability),
hdrConversionCapability};
}
-std::pair<ScopedAStatus, common::Hdr> VtsComposerClient::setHdrConversionStrategy(
+std::pair<ScopedAStatus, common::Hdr> ComposerClientWrapper::setHdrConversionStrategy(
const common::HdrConversionStrategy& conversionStrategy) {
common::Hdr preferredHdrOutputType;
return {mComposerClient->setHdrConversionStrategy(conversionStrategy, &preferredHdrOutputType),
preferredHdrOutputType};
}
-std::pair<ScopedAStatus, common::Transform> VtsComposerClient::getDisplayPhysicalOrientation(
+std::pair<ScopedAStatus, common::Transform> ComposerClientWrapper::getDisplayPhysicalOrientation(
int64_t display) {
common::Transform outDisplayOrientation;
return {mComposerClient->getDisplayPhysicalOrientation(display, &outDisplayOrientation),
outDisplayOrientation};
}
-std::pair<ScopedAStatus, composer3::OverlayProperties> VtsComposerClient::getOverlaySupport() {
+std::pair<ScopedAStatus, composer3::OverlayProperties> ComposerClientWrapper::getOverlaySupport() {
OverlayProperties properties;
return {mComposerClient->getOverlaySupport(&properties), properties};
}
-ScopedAStatus VtsComposerClient::setIdleTimerEnabled(int64_t display, int32_t timeoutMs) {
+ScopedAStatus ComposerClientWrapper::setIdleTimerEnabled(int64_t display, int32_t timeoutMs) {
return mComposerClient->setIdleTimerEnabled(display, timeoutMs);
}
-int32_t VtsComposerClient::getVsyncIdleCount() {
+int32_t ComposerClientWrapper::getVsyncIdleCount() {
return mComposerCallback->getVsyncIdleCount();
}
-int64_t VtsComposerClient::getVsyncIdleTime() {
+int64_t ComposerClientWrapper::getVsyncIdleTime() {
return mComposerCallback->getVsyncIdleTime();
}
-ndk::ScopedAStatus VtsComposerClient::setRefreshRateChangedCallbackDebugEnabled(int64_t display,
- bool enabled) {
+ndk::ScopedAStatus ComposerClientWrapper::setRefreshRateChangedCallbackDebugEnabled(int64_t display,
+ bool enabled) {
mComposerCallback->setRefreshRateChangedDebugDataEnabledCallbackAllowed(enabled);
return mComposerClient->setRefreshRateChangedCallbackDebugEnabled(display, enabled);
}
std::vector<RefreshRateChangedDebugData>
-VtsComposerClient::takeListOfRefreshRateChangedDebugData() {
+ComposerClientWrapper::takeListOfRefreshRateChangedDebugData() {
return mComposerCallback->takeListOfRefreshRateChangedDebugData();
}
-int64_t VtsComposerClient::getInvalidDisplayId() {
+int64_t ComposerClientWrapper::getInvalidDisplayId() {
// returns an invalid display id (one that has not been registered to a
// display. Currently assuming that a device will never have close to
// std::numeric_limit<uint64_t>::max() displays registered while running tests
int64_t id = std::numeric_limits<int64_t>::max();
- std::vector<int64_t> displays = mComposerCallback->getDisplays();
+ std::vector<int64_t> displayIds = mComposerCallback->getDisplays();
while (id > 0) {
- if (std::none_of(displays.begin(), displays.end(),
+ if (std::none_of(displayIds.begin(), displayIds.end(),
[id](const auto& display) { return id == display; })) {
return id;
}
@@ -475,86 +478,87 @@
return id;
}
-std::pair<ScopedAStatus, std::vector<VtsDisplay>> VtsComposerClient::getDisplays() {
+std::pair<ScopedAStatus, std::vector<DisplayWrapper>> ComposerClientWrapper::getDisplays() {
while (true) {
// Sleep for a small period of time to allow all built-in displays
// to post hotplug events
std::this_thread::sleep_for(5ms);
- std::vector<int64_t> displays = mComposerCallback->getDisplays();
- if (displays.empty()) {
+ std::vector<int64_t> displayIds = mComposerCallback->getDisplays();
+ if (displayIds.empty()) {
continue;
}
- std::vector<VtsDisplay> vtsDisplays;
- vtsDisplays.reserve(displays.size());
- for (int64_t display : displays) {
- auto vtsDisplay = VtsDisplay{display};
+ std::vector<DisplayWrapper> displays;
+ displays.reserve(displayIds.size());
+ for (int64_t displayId : displayIds) {
+ auto display = DisplayWrapper{displayId};
if (getDisplayConfigurationSupported()) {
- auto [status, configs] = getDisplayConfigurations(display);
+ auto [status, configs] = getDisplayConfigurations(displayId);
if (!status.isOk()) {
ALOGE("Unable to get the displays for test, failed to get the DisplayConfigs "
- "for display %" PRId64,
- display);
- return {std::move(status), vtsDisplays};
+ "for displayId %" PRId64,
+ displayId);
+ return {std::move(status), displays};
}
- addDisplayConfigs(&vtsDisplay, configs);
+ addDisplayConfigs(&display, configs);
} else {
- auto [status, configs] = getDisplayConfigs(display);
+ auto [status, configs] = getDisplayConfigs(displayId);
if (!status.isOk()) {
ALOGE("Unable to get the displays for test, failed to get the configs "
- "for display %" PRId64,
- display);
- return {std::move(status), vtsDisplays};
+ "for displayId %" PRId64,
+ displayId);
+ return {std::move(status), displays};
}
for (int config : configs) {
- status = addDisplayConfigLegacy(&vtsDisplay, config);
+ status = addDisplayConfigLegacy(&display, config);
if (!status.isOk()) {
ALOGE("Unable to get the displays for test, failed to add config "
- "for display %" PRId64,
- display);
- return {std::move(status), vtsDisplays};
+ "for displayId %" PRId64,
+ displayId);
+ return {std::move(status), displays};
}
}
}
- auto activeConfig = getActiveConfig(display);
+ auto activeConfig = getActiveConfig(displayId);
if (!activeConfig.first.isOk()) {
ALOGE("Unable to get the displays for test, failed to get active config "
- "for display %" PRId64,
- display);
- return {std::move(activeConfig.first), vtsDisplays};
+ "for displayId %" PRId64,
+ displayId);
+ return {std::move(activeConfig.first), displays};
}
- auto status = updateDisplayProperties(&vtsDisplay, activeConfig.second);
+ auto status = updateDisplayProperties(&display, activeConfig.second);
if (!status.isOk()) {
ALOGE("Unable to get the displays for test, "
"failed to update the properties "
- "for display %" PRId64,
- display);
- return {std::move(status), vtsDisplays};
+ "for displayId %" PRId64,
+ displayId);
+ return {std::move(status), displays};
}
- vtsDisplays.emplace_back(vtsDisplay);
- addDisplayToDisplayResources(display, /*isVirtual*/ false);
+ displays.emplace_back(display);
+ addDisplayToDisplayResources(displayId, /*isVirtual*/ false);
}
- return {ScopedAStatus::ok(), vtsDisplays};
+ return {ScopedAStatus::ok(), displays};
}
}
-void VtsComposerClient::addDisplayConfigs(VtsDisplay* vtsDisplay,
- const std::vector<DisplayConfiguration>& configs) {
+void ComposerClientWrapper::addDisplayConfigs(DisplayWrapper* display,
+ const std::vector<DisplayConfiguration>& configs) {
for (const auto& config : configs) {
- vtsDisplay->addDisplayConfig(config.configId,
- {config.vsyncPeriod, config.configGroup, config.vrrConfig});
+ display->addDisplayConfig(config.configId,
+ {config.vsyncPeriod, config.configGroup, config.vrrConfig});
}
}
-ScopedAStatus VtsComposerClient::addDisplayConfigLegacy(VtsDisplay* vtsDisplay, int32_t config) {
+ScopedAStatus ComposerClientWrapper::addDisplayConfigLegacy(DisplayWrapper* display,
+ int32_t config) {
const auto vsyncPeriod =
- getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::VSYNC_PERIOD);
+ getDisplayAttribute(display->getDisplayId(), config, DisplayAttribute::VSYNC_PERIOD);
const auto configGroup =
- getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::CONFIG_GROUP);
+ getDisplayAttribute(display->getDisplayId(), config, DisplayAttribute::CONFIG_GROUP);
if (vsyncPeriod.first.isOk() && configGroup.first.isOk()) {
- vtsDisplay->addDisplayConfig(config, {vsyncPeriod.second, configGroup.second});
+ display->addDisplayConfig(config, {vsyncPeriod.second, configGroup.second});
return ScopedAStatus::ok();
}
@@ -563,13 +567,14 @@
return ScopedAStatus::fromServiceSpecificError(IComposerClient::EX_BAD_CONFIG);
}
-ScopedAStatus VtsComposerClient::updateDisplayProperties(VtsDisplay* vtsDisplay, int32_t config) {
+ScopedAStatus ComposerClientWrapper::updateDisplayProperties(DisplayWrapper* display,
+ int32_t config) {
if (getDisplayConfigurationSupported()) {
- auto [status, configs] = getDisplayConfigurations(vtsDisplay->getDisplayId());
+ auto [status, configs] = getDisplayConfigurations(display->getDisplayId());
if (status.isOk()) {
for (const auto& displayConfig : configs) {
if (displayConfig.configId == config) {
- vtsDisplay->setDimensions(displayConfig.width, displayConfig.height);
+ display->setDimensions(displayConfig.width, displayConfig.height);
return ScopedAStatus::ok();
}
}
@@ -577,11 +582,11 @@
LOG(ERROR) << "Failed to update display property with DisplayConfig";
} else {
const auto width =
- getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::WIDTH);
+ getDisplayAttribute(display->getDisplayId(), config, DisplayAttribute::WIDTH);
const auto height =
- getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::HEIGHT);
+ getDisplayAttribute(display->getDisplayId(), config, DisplayAttribute::HEIGHT);
if (width.first.isOk() && height.first.isOk()) {
- vtsDisplay->setDimensions(width.second, height.second);
+ display->setDimensions(width.second, height.second);
return ScopedAStatus::ok();
}
@@ -591,7 +596,7 @@
return ScopedAStatus::fromServiceSpecificError(IComposerClient::EX_BAD_CONFIG);
}
-ScopedAStatus VtsComposerClient::addDisplayToDisplayResources(int64_t display, bool isVirtual) {
+ScopedAStatus ComposerClientWrapper::addDisplayToDisplayResources(int64_t display, bool isVirtual) {
if (mDisplayResources.insert({display, DisplayResource(isVirtual)}).second) {
return ScopedAStatus::ok();
}
@@ -600,7 +605,7 @@
return ScopedAStatus::fromServiceSpecificError(IComposerClient::EX_BAD_DISPLAY);
}
-ScopedAStatus VtsComposerClient::addLayerToDisplayResources(int64_t display, int64_t layer) {
+ScopedAStatus ComposerClientWrapper::addLayerToDisplayResources(int64_t display, int64_t layer) {
auto resource = mDisplayResources.find(display);
if (resource == mDisplayResources.end()) {
resource = mDisplayResources.insert({display, DisplayResource(false)}).first;
@@ -613,14 +618,14 @@
return ScopedAStatus::ok();
}
-void VtsComposerClient::removeLayerFromDisplayResources(int64_t display, int64_t layer) {
+void ComposerClientWrapper::removeLayerFromDisplayResources(int64_t display, int64_t layer) {
auto resource = mDisplayResources.find(display);
if (resource != mDisplayResources.end()) {
resource->second.layers.erase(layer);
}
}
-bool VtsComposerClient::verifyComposerCallbackParams() {
+bool ComposerClientWrapper::verifyComposerCallbackParams() {
bool isValid = true;
if (mComposerCallback != nullptr) {
if (mComposerCallback->getInvalidHotplugCount() != 0) {
@@ -651,14 +656,14 @@
return isValid;
}
-bool VtsComposerClient::getDisplayConfigurationSupported() const {
+bool ComposerClientWrapper::getDisplayConfigurationSupported() const {
auto [status, interfaceVersion] = getInterfaceVersion();
EXPECT_TRUE(status.isOk());
// getDisplayConfigurations api is supported starting interface version 3
return interfaceVersion >= 3;
}
-bool VtsComposerClient::destroyAllLayers(ComposerClientWriter* writer) {
+bool ComposerClientWrapper::destroyAllLayers(ComposerClientWriter* writer) {
std::unordered_map<int64_t, DisplayResource> physicalDisplays;
while (!mDisplayResources.empty()) {
const auto& it = mDisplayResources.begin();
@@ -691,15 +696,16 @@
return true;
}
-std::pair<ScopedAStatus, int32_t> VtsComposerClient::getMaxLayerPictureProfiles(int64_t display) {
+std::pair<ScopedAStatus, int32_t> ComposerClientWrapper::getMaxLayerPictureProfiles(
+ int64_t display) {
int32_t outMaxProfiles = 0;
return {mComposerClient->getMaxLayerPictureProfiles(display, &outMaxProfiles), outMaxProfiles};
}
-std::pair<ScopedAStatus, std::vector<Luts>> VtsComposerClient::getLuts(
+std::pair<ScopedAStatus, std::vector<Luts>> ComposerClientWrapper::getLuts(
int64_t display, const std::vector<Buffer>& buffers) {
std::vector<Luts> outLuts;
return {mComposerClient->getLuts(display, buffers, &outLuts), std::move(outLuts)};
}
-} // namespace aidl::android::hardware::graphics::composer3::vts
+} // namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test
diff --git a/graphics/composer/aidl/vts/GraphicsComposerCallback.cpp b/graphics/composer/aidl/libhwc_aidl_test/GraphicsComposerCallback.cpp
similarity index 97%
rename from graphics/composer/aidl/vts/GraphicsComposerCallback.cpp
rename to graphics/composer/aidl/libhwc_aidl_test/GraphicsComposerCallback.cpp
index 1f7972c..ba16348 100644
--- a/graphics/composer/aidl/vts/GraphicsComposerCallback.cpp
+++ b/graphics/composer/aidl/libhwc_aidl_test/GraphicsComposerCallback.cpp
@@ -23,7 +23,7 @@
#undef LOG_TAG
#define LOG_TAG "GraphicsComposerCallback"
-namespace aidl::android::hardware::graphics::composer3::vts {
+namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test {
void GraphicsComposerCallback::setVsyncAllowed(bool allowed) {
std::scoped_lock lock(mMutex);
@@ -219,4 +219,4 @@
return ::ndk::ScopedAStatus::ok();
}
-} // namespace aidl::android::hardware::graphics::composer3::vts
+} // namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test
diff --git a/graphics/composer/aidl/vts/ReadbackVts.cpp b/graphics/composer/aidl/libhwc_aidl_test/Readback.cpp
similarity index 97%
rename from graphics/composer/aidl/vts/ReadbackVts.cpp
rename to graphics/composer/aidl/libhwc_aidl_test/Readback.cpp
index b45c8c0..2aded73 100644
--- a/graphics/composer/aidl/vts/ReadbackVts.cpp
+++ b/graphics/composer/aidl/libhwc_aidl_test/Readback.cpp
@@ -14,14 +14,12 @@
* limitations under the License.
*/
-#include "ReadbackVts.h"
+#include "Readback.h"
#include <aidl/android/hardware/graphics/common/BufferUsage.h>
-#include <cmath>
-#include "RenderEngineVts.h"
-#include "renderengine/ExternalTexture.h"
+#include "RenderEngine.h"
#include "renderengine/impl/ExternalTexture.h"
-namespace aidl::android::hardware::graphics::composer3::vts {
+namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test {
const std::vector<ColorMode> ReadbackHelper::colorModes = {ColorMode::SRGB, ColorMode::DISPLAY_P3};
const std::vector<Dataspace> ReadbackHelper::dataspaces = {common::Dataspace::SRGB,
@@ -344,8 +342,9 @@
}
}
-ReadbackBuffer::ReadbackBuffer(int64_t display, const std::shared_ptr<VtsComposerClient>& client,
- int32_t width, int32_t height, common::PixelFormat pixelFormat,
+ReadbackBuffer::ReadbackBuffer(int64_t display,
+ const std::shared_ptr<ComposerClientWrapper>& client, int32_t width,
+ int32_t height, common::PixelFormat pixelFormat,
common::Dataspace dataspace)
: mComposerClient(client) {
mDisplay = display;
@@ -427,7 +426,7 @@
return layerSettings;
}
-TestBufferLayer::TestBufferLayer(const std::shared_ptr<VtsComposerClient>& client,
+TestBufferLayer::TestBufferLayer(const std::shared_ptr<ComposerClientWrapper>& client,
TestRenderEngine& renderEngine, int64_t display, uint32_t width,
uint32_t height, common::PixelFormat format,
ComposerClientWriter& writer, Composition composition)
@@ -513,4 +512,4 @@
writer.setLayerCompositionType(mDisplay, mLayer, Composition::CLIENT);
}
-} // namespace aidl::android::hardware::graphics::composer3::vts
+} // namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test
diff --git a/graphics/composer/aidl/vts/RenderEngineVts.cpp b/graphics/composer/aidl/libhwc_aidl_test/RenderEngine.cpp
similarity index 96%
rename from graphics/composer/aidl/vts/RenderEngineVts.cpp
rename to graphics/composer/aidl/libhwc_aidl_test/RenderEngine.cpp
index 8f8b5fd..6715ea4 100644
--- a/graphics/composer/aidl/vts/RenderEngineVts.cpp
+++ b/graphics/composer/aidl/libhwc_aidl_test/RenderEngine.cpp
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-#include "RenderEngineVts.h"
+#include "RenderEngine.h"
#include "renderengine/impl/ExternalTexture.h"
-namespace aidl::android::hardware::graphics::composer3::vts {
+namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test {
using ::android::renderengine::DisplaySettings;
using ::android::renderengine::LayerSettings;
@@ -115,4 +115,4 @@
ASSERT_EQ(::android::OK, mGraphicBuffer->unlock());
}
-} // namespace aidl::android::hardware::graphics::composer3::vts
+} // namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test
diff --git a/graphics/composer/aidl/vts/VtsComposerClient.h b/graphics/composer/aidl/libhwc_aidl_test/include/ComposerClientWrapper.h
similarity index 90%
rename from graphics/composer/aidl/vts/VtsComposerClient.h
rename to graphics/composer/aidl/libhwc_aidl_test/include/ComposerClientWrapper.h
index f0dbe57..22dd888 100644
--- a/graphics/composer/aidl/vts/VtsComposerClient.h
+++ b/graphics/composer/aidl/libhwc_aidl_test/include/ComposerClientWrapper.h
@@ -46,17 +46,17 @@
using aidl::android::hardware::graphics::common::Rect;
using namespace ::ndk;
-namespace aidl::android::hardware::graphics::composer3::vts {
+namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test {
-class VtsDisplay;
+class DisplayWrapper;
/**
* A wrapper to IComposerClient.
* This wrapper manages the IComposerClient instance and manages the resources for
* the tests with respect to the IComposerClient calls.
*/
-class VtsComposerClient {
+class ComposerClientWrapper {
public:
- VtsComposerClient(const std::string& name);
+ ComposerClientWrapper(const std::string& name);
ScopedAStatus createClient();
@@ -77,9 +77,9 @@
std::pair<ScopedAStatus, int32_t> getActiveConfig(int64_t display);
- ScopedAStatus setActiveConfig(VtsDisplay* vtsDisplay, int32_t config);
+ ScopedAStatus setActiveConfig(DisplayWrapper* display, int32_t config);
- ScopedAStatus setPeakRefreshRateConfig(VtsDisplay* vtsDisplay);
+ ScopedAStatus setPeakRefreshRateConfig(DisplayWrapper* display);
std::pair<ScopedAStatus, int32_t> getDisplayAttribute(int64_t display, int32_t config,
DisplayAttribute displayAttribute);
@@ -100,7 +100,7 @@
ScopedAStatus setContentType(int64_t display, ContentType contentType);
std::pair<ScopedAStatus, VsyncPeriodChangeTimeline> setActiveConfigWithConstraints(
- VtsDisplay* vtsDisplay, int32_t config,
+ DisplayWrapper* display, int32_t config,
const VsyncPeriodChangeConstraints& constraints);
std::pair<ScopedAStatus, std::vector<DisplayCapability>> getDisplayCapabilities(
@@ -190,7 +190,7 @@
int64_t getInvalidDisplayId();
- std::pair<ScopedAStatus, std::vector<VtsDisplay>> getDisplays();
+ std::pair<ScopedAStatus, std::vector<DisplayWrapper>> getDisplays();
std::pair<ScopedAStatus, OverlayProperties> getOverlaySupport();
@@ -207,10 +207,10 @@
static constexpr int32_t kNoFrameIntervalNs = 0;
private:
- void addDisplayConfigs(VtsDisplay*, const std::vector<DisplayConfiguration>&);
- ScopedAStatus addDisplayConfigLegacy(VtsDisplay*, int32_t config);
+ void addDisplayConfigs(DisplayWrapper*, const std::vector<DisplayConfiguration>&);
+ ScopedAStatus addDisplayConfigLegacy(DisplayWrapper*, int32_t config);
bool getDisplayConfigurationSupported() const;
- ScopedAStatus updateDisplayProperties(VtsDisplay* vtsDisplay, int32_t config);
+ ScopedAStatus updateDisplayProperties(DisplayWrapper* display, int32_t config);
ScopedAStatus addDisplayToDisplayResources(int64_t display, bool isVirtual);
@@ -223,7 +223,7 @@
bool verifyComposerCallbackParams();
// Keep track of displays and layers. When a test fails/ends,
- // the VtsComposerClient::tearDown should be called from the
+ // the ComposerClientWrapper::tearDown should be called from the
// test tearDown to clean up the resources for the test.
struct DisplayResource {
DisplayResource(bool isVirtual_) : isVirtual(isVirtual_) {}
@@ -240,9 +240,10 @@
std::atomic<int64_t> mNextLayerHandle = 1;
};
-class VtsDisplay {
+class DisplayWrapper {
public:
- VtsDisplay(int64_t displayId) : mDisplayId(displayId), mDisplayWidth(0), mDisplayHeight(0) {}
+ DisplayWrapper(int64_t displayId)
+ : mDisplayId(displayId), mDisplayWidth(0), mDisplayHeight(0) {}
int64_t getDisplayId() const { return mDisplayId; }
@@ -299,9 +300,8 @@
std::stringstream ss;
if (displayConfig.vrrConfigOpt) {
ss << "{Config " << config << ": vsyncPeriod " << displayConfig.vsyncPeriod
- << ", minFrameIntervalNs " << vrrConfigOpt->minFrameIntervalNs << "}";
- }
- else {
+ << ", minFrameIntervalNs " << vrrConfigOpt->minFrameIntervalNs << "}";
+ } else {
ss << "{Config " << config << ": vsyncPeriod " << displayConfig.vsyncPeriod << "}";
}
return ss.str();
@@ -315,4 +315,4 @@
int32_t mDisplayHeight;
std::unordered_map<int32_t, DisplayConfig> mDisplayConfigs;
};
-} // namespace aidl::android::hardware::graphics::composer3::vts
+} // namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test
diff --git a/graphics/composer/aidl/vts/GraphicsComposerCallback.h b/graphics/composer/aidl/libhwc_aidl_test/include/GraphicsComposerCallback.h
similarity index 95%
rename from graphics/composer/aidl/vts/GraphicsComposerCallback.h
rename to graphics/composer/aidl/libhwc_aidl_test/include/GraphicsComposerCallback.h
index 97f8e2b..ff379b7 100644
--- a/graphics/composer/aidl/vts/GraphicsComposerCallback.h
+++ b/graphics/composer/aidl/libhwc_aidl_test/include/GraphicsComposerCallback.h
@@ -20,7 +20,7 @@
#include <mutex>
#include <vector>
-namespace aidl::android::hardware::graphics::composer3::vts {
+namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test {
class GraphicsComposerCallback : public BnComposerCallback {
public:
@@ -93,4 +93,4 @@
int32_t mHdcpLevelChangedCount GUARDED_BY(mMutex) = 0;
};
-} // namespace aidl::android::hardware::graphics::composer3::vts
+} // namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test
diff --git a/graphics/composer/aidl/vts/ReadbackVts.h b/graphics/composer/aidl/libhwc_aidl_test/include/Readback.h
similarity index 90%
rename from graphics/composer/aidl/vts/ReadbackVts.h
rename to graphics/composer/aidl/libhwc_aidl_test/include/Readback.h
index c04e37a..9fdb4d3 100644
--- a/graphics/composer/aidl/vts/ReadbackVts.h
+++ b/graphics/composer/aidl/libhwc_aidl_test/include/Readback.h
@@ -24,12 +24,11 @@
#include <renderengine/RenderEngine.h>
#include <ui/GraphicBuffer.h>
#include <memory>
-#include "GraphicsComposerCallback.h"
-#include "VtsComposerClient.h"
+#include "ComposerClientWrapper.h"
using aidl::android::hardware::graphics::composer3::Luts;
-namespace aidl::android::hardware::graphics::composer3::vts {
+namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test {
using ::android::renderengine::LayerSettings;
using common::Dataspace;
@@ -53,7 +52,7 @@
class TestLayer {
public:
- TestLayer(const std::shared_ptr<VtsComposerClient>& client, int64_t display,
+ TestLayer(const std::shared_ptr<ComposerClientWrapper>& client, int64_t display,
ComposerClientWriter& writer)
: mDisplay(display) {
const auto& [status, layer] = client->createLayer(display, kBufferSlotCount, &writer);
@@ -63,7 +62,7 @@
// ComposerClient will take care of destroying layers, no need to explicitly
// call destroyLayers here
- virtual ~TestLayer(){};
+ virtual ~TestLayer() {};
virtual void write(ComposerClientWriter& writer);
virtual LayerSettings toRenderEngineLayerSettings();
@@ -114,7 +113,7 @@
class TestColorLayer : public TestLayer {
public:
- TestColorLayer(const std::shared_ptr<VtsComposerClient>& client, int64_t display,
+ TestColorLayer(const std::shared_ptr<ComposerClientWrapper>& client, int64_t display,
ComposerClientWriter& writer)
: TestLayer{client, display, writer} {}
@@ -130,7 +129,7 @@
class TestBufferLayer : public TestLayer {
public:
- TestBufferLayer(const std::shared_ptr<VtsComposerClient>& client,
+ TestBufferLayer(const std::shared_ptr<ComposerClientWrapper>& client,
TestRenderEngine& renderEngine, int64_t display, uint32_t width,
uint32_t height, common::PixelFormat format, ComposerClientWriter& writer,
Composition composition = Composition::DEVICE);
@@ -206,8 +205,9 @@
class ReadbackBuffer {
public:
- ReadbackBuffer(int64_t display, const std::shared_ptr<VtsComposerClient>& client, int32_t width,
- int32_t height, common::PixelFormat pixelFormat, common::Dataspace dataspace);
+ ReadbackBuffer(int64_t display, const std::shared_ptr<ComposerClientWrapper>& client,
+ int32_t width, int32_t height, common::PixelFormat pixelFormat,
+ common::Dataspace dataspace);
void setReadbackBuffer();
@@ -224,7 +224,7 @@
Dataspace mDataspace;
int64_t mDisplay;
::android::sp<::android::GraphicBuffer> mGraphicBuffer;
- std::shared_ptr<VtsComposerClient> mComposerClient;
+ std::shared_ptr<ComposerClientWrapper> mComposerClient;
::android::Rect mAccessRegion;
native_handle_t mBufferHandle;
@@ -232,4 +232,4 @@
::android::sp<::android::GraphicBuffer> allocateBuffer();
};
-} // namespace aidl::android::hardware::graphics::composer3::vts
+} // namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test
diff --git a/graphics/composer/aidl/vts/RenderEngineVts.h b/graphics/composer/aidl/libhwc_aidl_test/include/RenderEngine.h
similarity index 91%
rename from graphics/composer/aidl/vts/RenderEngineVts.h
rename to graphics/composer/aidl/libhwc_aidl_test/include/RenderEngine.h
index 6553720..6b8b82f 100644
--- a/graphics/composer/aidl/vts/RenderEngineVts.h
+++ b/graphics/composer/aidl/libhwc_aidl_test/include/RenderEngine.h
@@ -23,9 +23,9 @@
#include <ui/PixelFormat.h>
#include <ui/Rect.h>
#include <ui/Region.h>
-#include "ReadbackVts.h"
+#include "Readback.h"
-namespace aidl::android::hardware::graphics::composer3::vts {
+namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test {
using ::android::renderengine::DisplaySettings;
using ::android::renderengine::ExternalTexture;
@@ -60,4 +60,4 @@
DisplaySettings mDisplaySettings;
};
-} // namespace aidl::android::hardware::graphics::composer3::vts
+} // namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test
diff --git a/graphics/composer/aidl/vts/Android.bp b/graphics/composer/aidl/vts/Android.bp
index 61c2593..cf9c6d7 100644
--- a/graphics/composer/aidl/vts/Android.bp
+++ b/graphics/composer/aidl/vts/Android.bp
@@ -36,28 +36,19 @@
srcs: [
"VtsHalGraphicsComposer3_TargetTest.cpp",
"VtsHalGraphicsComposer3_ReadbackTest.cpp",
- "GraphicsComposerCallback.cpp",
- "ReadbackVts.cpp",
- "RenderEngineVts.cpp",
- "VtsComposerClient.cpp",
],
-
shared_libs: [
"libEGL",
- "libGLESv1_CM",
"libGLESv2",
"libbinder_ndk",
"libbinder",
- "libfmq",
"libbase",
"libsync",
"libui",
"libgui",
- "libhidlbase",
"libprocessgroup",
- "libvndksupport",
- "server_configurable_flags",
"libtracing_perfetto",
+ "server_configurable_flags",
],
header_libs: [
"android.hardware.graphics.composer3-command-buffer",
@@ -66,19 +57,17 @@
"android.hardware.graphics.common@1.2",
"android.hardware.common-V2-ndk",
"android.hardware.common.fmq-V1-ndk",
- "android.hardware.drm.common-V1-ndk",
"libaidlcommonsupport",
"libarect",
"libbase",
- "libfmq",
"libgmock",
"libgtest",
- "libmath",
+ "libhwc_aidl_test",
"librenderengine",
- "libshaders",
"libsync",
- "libtonemap",
"libsurfaceflinger_common",
+ "libshaders",
+ "libtonemap",
],
cflags: [
"-Wconversion",
diff --git a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_ReadbackTest.cpp b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_ReadbackTest.cpp
index 6883cdb..dff044d 100644
--- a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_ReadbackTest.cpp
+++ b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_ReadbackTest.cpp
@@ -27,14 +27,16 @@
#include <ui/GraphicBuffer.h>
#include <ui/PixelFormat.h>
#include <ui/Rect.h>
+#include "ComposerClientWrapper.h"
#include "GraphicsComposerCallback.h"
-#include "ReadbackVts.h"
-#include "RenderEngineVts.h"
-#include "VtsComposerClient.h"
+#include "Readback.h"
+#include "RenderEngine.h"
namespace aidl::android::hardware::graphics::composer3::vts {
namespace {
+using namespace ::aidl::android::hardware::graphics::composer3::libhwc_aidl_test;
+
using ::android::Rect;
using common::Dataspace;
using common::PixelFormat;
@@ -42,7 +44,7 @@
class GraphicsCompositionTestBase : public ::testing::Test {
protected:
void SetUpBase(const std::string& name) {
- mComposerClient = std::make_shared<VtsComposerClient>(name);
+ mComposerClient = std::make_shared<ComposerClientWrapper>(name);
ASSERT_TRUE(mComposerClient->createClient().isOk());
const auto& [status, displays] = mComposerClient->getDisplays();
@@ -97,7 +99,7 @@
ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
}
- const VtsDisplay& getPrimaryDisplay() const { return mDisplays[0]; }
+ const DisplayWrapper& getPrimaryDisplay() const { return mDisplays[0]; }
int64_t getPrimaryDisplayId() const { return getPrimaryDisplay().getDisplayId(); }
@@ -158,8 +160,8 @@
return false;
}
- std::shared_ptr<VtsComposerClient> mComposerClient;
- std::vector<VtsDisplay> mDisplays;
+ std::shared_ptr<ComposerClientWrapper> mComposerClient;
+ std::vector<DisplayWrapper> mDisplays;
// use the slot count usually set by SF
std::vector<ColorMode> mTestColorModes;
std::unique_ptr<ComposerClientWriter> mWriter;
@@ -226,7 +228,7 @@
writeLayers(layers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
// if hwc cannot handle and asks for composition change,
// just succeed the test
@@ -286,7 +288,7 @@
writeLayers(layers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
@@ -347,7 +349,7 @@
ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
@@ -462,7 +464,7 @@
auto layer = std::make_shared<TestBufferLayer>(
mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
- getDisplayHeight(), PixelFormat::RGBA_FP16, *mWriter);
+ getDisplayHeight(), PixelFormat::RGBA_8888, *mWriter);
layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
layer->setZOrder(10);
layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
@@ -475,7 +477,7 @@
writeLayers(layers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
@@ -512,7 +514,7 @@
clientDataspace, std::vector<common::Rect>(1, damage), 1.f);
layer->setToClientComposition(*mWriter);
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
ASSERT_TRUE(changedCompositionTypes.empty());
@@ -612,7 +614,7 @@
writeLayers(layers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
// if hwc cannot handle and asks for composition change,
// just succeed the test
@@ -703,7 +705,7 @@
writeLayers({srgbLayer, displayP3Layer});
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
@@ -780,7 +782,7 @@
clientLayer->setZOrder(0);
clientLayer->write(*mWriter);
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
@@ -813,7 +815,7 @@
clientDataspace, std::vector<common::Rect>(1, clientFrame), 1.f);
clientLayer->setToClientComposition(*mWriter);
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
ASSERT_TRUE(changedCompositionTypes.empty());
@@ -862,7 +864,7 @@
writeLayers(layers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
GTEST_SUCCEED();
@@ -891,7 +893,7 @@
writeLayers(layers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
ASSERT_TRUE(mReader.takeErrors().empty());
ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
@@ -934,7 +936,7 @@
writeLayers(layers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
GTEST_SUCCEED();
@@ -999,7 +1001,7 @@
writeLayers(layers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
GTEST_SUCCEED();
@@ -1060,7 +1062,7 @@
writeLayers(layers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
GTEST_SUCCEED();
@@ -1083,7 +1085,7 @@
writeLayers(layers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
ASSERT_TRUE(mReader.takeErrors().empty());
@@ -1149,7 +1151,7 @@
writeLayers(layers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
GTEST_SUCCEED()
@@ -1285,7 +1287,7 @@
writeLayers(mLayers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
GTEST_SUCCEED();
@@ -1331,7 +1333,7 @@
writeLayers(mLayers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
GTEST_SUCCEED();
@@ -1372,7 +1374,7 @@
writeLayers(mLayers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
GTEST_SUCCEED();
@@ -1457,7 +1459,7 @@
writeLayers(mLayers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
GTEST_SUCCEED();
@@ -1504,7 +1506,7 @@
writeLayers(mLayers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
GTEST_SUCCEED();
@@ -1551,7 +1553,7 @@
writeLayers(mLayers);
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
GTEST_SUCCEED();
@@ -1646,7 +1648,7 @@
ASSERT_TRUE(mReader.takeErrors().empty());
mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
continue;
diff --git a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp
index 6b43cc8..88e5cb5 100644
--- a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp
+++ b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp
@@ -22,7 +22,6 @@
#include <aidl/android/hardware/graphics/common/PixelFormat.h>
#include <aidl/android/hardware/graphics/common/Rect.h>
#include <aidl/android/hardware/graphics/composer3/Composition.h>
-#include <aidl/android/hardware/graphics/composer3/OutputType.h>
#include <aidl/android/hardware/graphics/composer3/IComposer.h>
#include <android-base/properties.h>
#include <android/binder_process.h>
@@ -34,7 +33,6 @@
#include <gtest/gtest.h>
#include <ui/Fence.h>
#include <ui/GraphicBuffer.h>
-#include <ui/PictureProfileHandle.h>
#include <ui/PixelFormat.h>
#include <algorithm>
#include <iterator>
@@ -43,8 +41,8 @@
#include <string>
#include <thread>
#include <unordered_map>
+#include "ComposerClientWrapper.h"
#include "GraphicsComposerCallback.h"
-#include "VtsComposerClient.h"
#undef LOG_TAG
#define LOG_TAG "VtsHalGraphicsComposer3_TargetTest"
@@ -54,6 +52,7 @@
namespace aidl::android::hardware::graphics::composer3::vts {
using namespace std::chrono_literals;
+using namespace aidl::android::hardware::graphics::composer3::libhwc_aidl_test;
using ::android::GraphicBuffer;
using ::android::sp;
@@ -61,7 +60,7 @@
class GraphicsComposerAidlTest : public ::testing::TestWithParam<std::string> {
protected:
void SetUp() override {
- mComposerClient = std::make_unique<VtsComposerClient>(GetParam());
+ mComposerClient = std::make_unique<ComposerClientWrapper>(GetParam());
ASSERT_TRUE(mComposerClient->createClient().isOk());
const auto& [status, displays] = mComposerClient->getDisplays();
@@ -124,36 +123,21 @@
[&](const Capability& activeCapability) { return activeCapability == capability; });
}
- bool hasDisplayCapability(int64_t displayId, DisplayCapability capability) {
- const auto& [status, capabilities] = mComposerClient->getDisplayCapabilities(displayId);
- EXPECT_TRUE(status.isOk());
- return std::any_of(capabilities.begin(), capabilities.end(),
- [&](const DisplayCapability& activeCapability) {
- return activeCapability == capability;
- });
- }
-
int getInterfaceVersion() {
const auto& [versionStatus, version] = mComposerClient->getInterfaceVersion();
EXPECT_TRUE(versionStatus.isOk());
return version;
}
- const VtsDisplay& getPrimaryDisplay() const { return mDisplays[0]; }
-
- int64_t getPrimaryDisplayId() const { return getPrimaryDisplay().getDisplayId(); }
-
int64_t getInvalidDisplayId() const { return mComposerClient->getInvalidDisplayId(); }
- VtsDisplay& getEditablePrimaryDisplay() { return mDisplays[0]; }
-
struct TestParameters {
nsecs_t delayForChange;
bool refreshMiss;
};
- std::unique_ptr<VtsComposerClient> mComposerClient;
- std::vector<VtsDisplay> mDisplays;
+ std::unique_ptr<ComposerClientWrapper> mComposerClient;
+ std::vector<DisplayWrapper> mDisplays;
// use the slot count usually set by SF
static constexpr uint32_t kBufferSlotCount = 64;
};
@@ -187,125 +171,145 @@
}
TEST_P(GraphicsComposerAidlTest, GetDisplayIdentificationData) {
- const auto& [status0, displayIdentification0] =
- mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
- if (!status0.isOk() && status0.getExceptionCode() == EX_SERVICE_SPECIFIC &&
- status0.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
- GTEST_SUCCEED() << "Display identification data not supported, skipping test";
- return;
+ for (const auto& display : mDisplays) {
+ const auto& [status0, displayIdentification0] =
+ mComposerClient->getDisplayIdentificationData(display.getDisplayId());
+ if (!status0.isOk() && status0.getExceptionCode() == EX_SERVICE_SPECIFIC &&
+ status0.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
+ GTEST_SUCCEED() << "Display identification data not supported, skipping test";
+ return;
+ }
+ ASSERT_TRUE(status0.isOk()) << "failed to get display identification data";
+ ASSERT_FALSE(displayIdentification0.data.empty());
+
+ constexpr size_t kEdidBlockSize = 128;
+ ASSERT_TRUE(displayIdentification0.data.size() % kEdidBlockSize == 0)
+ << "EDID blob length is not a multiple of " << kEdidBlockSize;
+
+ const uint8_t kEdidHeader[] = {0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00};
+ ASSERT_TRUE(std::equal(std::begin(kEdidHeader), std::end(kEdidHeader),
+ displayIdentification0.data.begin()))
+ << "EDID blob doesn't start with the fixed EDID header";
+ ASSERT_EQ(0, std::accumulate(displayIdentification0.data.begin(),
+ displayIdentification0.data.begin() + kEdidBlockSize,
+ static_cast<uint8_t>(0)))
+ << "EDID base block doesn't checksum";
+
+ const auto& [status1, displayIdentification1] =
+ mComposerClient->getDisplayIdentificationData(display.getDisplayId());
+ ASSERT_TRUE(status1.isOk());
+
+ ASSERT_EQ(displayIdentification0.port, displayIdentification1.port)
+ << "ports are not stable";
+ ASSERT_TRUE(displayIdentification0.data.size() == displayIdentification1.data.size() &&
+ std::equal(displayIdentification0.data.begin(),
+ displayIdentification0.data.end(),
+ displayIdentification1.data.begin()))
+ << "data is not stable";
}
- ASSERT_TRUE(status0.isOk()) << "failed to get display identification data";
- ASSERT_FALSE(displayIdentification0.data.empty());
-
- constexpr size_t kEdidBlockSize = 128;
- ASSERT_TRUE(displayIdentification0.data.size() % kEdidBlockSize == 0)
- << "EDID blob length is not a multiple of " << kEdidBlockSize;
-
- const uint8_t kEdidHeader[] = {0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00};
- ASSERT_TRUE(std::equal(std::begin(kEdidHeader), std::end(kEdidHeader),
- displayIdentification0.data.begin()))
- << "EDID blob doesn't start with the fixed EDID header";
- ASSERT_EQ(0, std::accumulate(displayIdentification0.data.begin(),
- displayIdentification0.data.begin() + kEdidBlockSize,
- static_cast<uint8_t>(0)))
- << "EDID base block doesn't checksum";
-
- const auto& [status1, displayIdentification1] =
- mComposerClient->getDisplayIdentificationData(getPrimaryDisplayId());
- ASSERT_TRUE(status1.isOk());
-
- ASSERT_EQ(displayIdentification0.port, displayIdentification1.port) << "ports are not stable";
- ASSERT_TRUE(displayIdentification0.data.size() == displayIdentification1.data.size() &&
- std::equal(displayIdentification0.data.begin(), displayIdentification0.data.end(),
- displayIdentification1.data.begin()))
- << "data is not stable";
}
TEST_P(GraphicsComposerAidlTest, GetHdrCapabilities) {
- const auto& [status, hdrCapabilities] =
- mComposerClient->getHdrCapabilities(getPrimaryDisplayId());
+ for (const auto& display : mDisplays) {
+ const auto& [status, hdrCapabilities] =
+ mComposerClient->getHdrCapabilities(display.getDisplayId());
- ASSERT_TRUE(status.isOk());
- EXPECT_TRUE(hdrCapabilities.maxLuminance >= hdrCapabilities.minLuminance);
+ ASSERT_TRUE(status.isOk());
+ EXPECT_TRUE(hdrCapabilities.maxLuminance >= hdrCapabilities.minLuminance);
+ }
}
TEST_P(GraphicsComposerAidlTest, GetPerFrameMetadataKeys) {
- const auto& [status, keys] = mComposerClient->getPerFrameMetadataKeys(getPrimaryDisplayId());
- if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
- status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
- GTEST_SUCCEED() << "getPerFrameMetadataKeys is not supported";
- return;
- }
+ for (const auto& display : mDisplays) {
+ const auto& [status, keys] =
+ mComposerClient->getPerFrameMetadataKeys(display.getDisplayId());
+ if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
+ status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
+ GTEST_SUCCEED() << "getPerFrameMetadataKeys is not supported";
+ return;
+ }
- ASSERT_TRUE(status.isOk());
- EXPECT_TRUE(keys.size() >= 0);
+ ASSERT_TRUE(status.isOk());
+ EXPECT_TRUE(keys.size() >= 0);
+ }
}
TEST_P(GraphicsComposerAidlTest, GetReadbackBufferAttributes) {
- const auto& [status, _] = mComposerClient->getReadbackBufferAttributes(getPrimaryDisplayId());
- if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
- status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
- GTEST_SUCCEED() << "getReadbackBufferAttributes is not supported";
- return;
+ for (const auto& display : mDisplays) {
+ const auto& [status, _] =
+ mComposerClient->getReadbackBufferAttributes(display.getDisplayId());
+ if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
+ status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
+ GTEST_SUCCEED() << "getReadbackBufferAttributes is not supported";
+ return;
+ }
+ ASSERT_TRUE(status.isOk());
}
-
- ASSERT_TRUE(status.isOk());
}
TEST_P(GraphicsComposerAidlTest, GetRenderIntents) {
- const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
- EXPECT_TRUE(status.isOk());
+ for (const auto& display : mDisplays) {
+ const auto& [status, modes] = mComposerClient->getColorModes(display.getDisplayId());
+ EXPECT_TRUE(status.isOk());
- for (auto mode : modes) {
- const auto& [intentStatus, intents] =
- mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
- EXPECT_TRUE(intentStatus.isOk());
- bool isHdr;
- switch (mode) {
- case ColorMode::BT2100_PQ:
- case ColorMode::BT2100_HLG:
- isHdr = true;
- break;
- default:
- isHdr = false;
- break;
+ for (auto mode : modes) {
+ const auto& [intentStatus, intents] =
+ mComposerClient->getRenderIntents(display.getDisplayId(), mode);
+ EXPECT_TRUE(intentStatus.isOk());
+ bool isHdr;
+ switch (mode) {
+ case ColorMode::BT2100_PQ:
+ case ColorMode::BT2100_HLG:
+ isHdr = true;
+ break;
+ default:
+ isHdr = false;
+ break;
+ }
+ RenderIntent requiredIntent =
+ isHdr ? RenderIntent::TONE_MAP_COLORIMETRIC : RenderIntent::COLORIMETRIC;
+
+ const auto iter = std::find(intents.cbegin(), intents.cend(), requiredIntent);
+ EXPECT_NE(intents.cend(), iter);
}
- RenderIntent requiredIntent =
- isHdr ? RenderIntent::TONE_MAP_COLORIMETRIC : RenderIntent::COLORIMETRIC;
-
- const auto iter = std::find(intents.cbegin(), intents.cend(), requiredIntent);
- EXPECT_NE(intents.cend(), iter);
}
}
TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadDisplay) {
- const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
- ASSERT_TRUE(status.isOk());
+ for (const auto& display : mDisplays) {
+ const auto& [status, modes] = mComposerClient->getColorModes(display.getDisplayId());
+ ASSERT_TRUE(status.isOk());
- for (auto mode : modes) {
- const auto& [intentStatus, _] =
- mComposerClient->getRenderIntents(getInvalidDisplayId(), mode);
+ for (auto mode : modes) {
+ const auto& [intentStatus, _] =
+ mComposerClient->getRenderIntents(getInvalidDisplayId(), mode);
- EXPECT_FALSE(intentStatus.isOk());
- EXPECT_NO_FATAL_FAILURE(
- assertServiceSpecificError(intentStatus, IComposerClient::EX_BAD_DISPLAY));
+ EXPECT_FALSE(intentStatus.isOk());
+ EXPECT_NO_FATAL_FAILURE(
+ assertServiceSpecificError(intentStatus, IComposerClient::EX_BAD_DISPLAY));
+ }
}
}
TEST_P(GraphicsComposerAidlTest, GetRenderIntents_BadParameter) {
- const auto& [status, _] =
- mComposerClient->getRenderIntents(getPrimaryDisplayId(), static_cast<ColorMode>(-1));
+ for (const auto& display : mDisplays) {
+ const auto& [status, _] = mComposerClient->getRenderIntents(display.getDisplayId(),
+ static_cast<ColorMode>(-1));
- EXPECT_FALSE(status.isOk());
- EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
+ EXPECT_FALSE(status.isOk());
+ EXPECT_NO_FATAL_FAILURE(
+ assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
+ }
}
TEST_P(GraphicsComposerAidlTest, GetColorModes) {
- const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
- ASSERT_TRUE(status.isOk());
+ for (const auto& display : mDisplays) {
+ const auto& [status, colorModes] = mComposerClient->getColorModes(display.getDisplayId());
+ ASSERT_TRUE(status.isOk());
- const auto native = std::find(colorModes.cbegin(), colorModes.cend(), ColorMode::NATIVE);
- EXPECT_NE(colorModes.cend(), native);
+ const auto native = std::find(colorModes.cbegin(), colorModes.cend(), ColorMode::NATIVE);
+ EXPECT_NE(colorModes.cend(), native);
+ }
}
TEST_P(GraphicsComposerAidlTest, GetColorMode_BadDisplay) {
@@ -316,128 +320,145 @@
}
TEST_P(GraphicsComposerAidlTest, SetColorMode) {
- const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
- EXPECT_TRUE(status.isOk());
+ for (const auto& display : mDisplays) {
+ const auto& [status, colorModes] = mComposerClient->getColorModes(display.getDisplayId());
+ EXPECT_TRUE(status.isOk());
- for (auto mode : colorModes) {
- const auto& [intentStatus, intents] =
- mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
- EXPECT_TRUE(intentStatus.isOk()) << "failed to get render intents";
+ for (auto mode : colorModes) {
+ const auto& [intentStatus, intents] =
+ mComposerClient->getRenderIntents(display.getDisplayId(), mode);
+ EXPECT_TRUE(intentStatus.isOk()) << "failed to get render intents";
- for (auto intent : intents) {
- const auto modeStatus =
- mComposerClient->setColorMode(getPrimaryDisplayId(), mode, intent);
- EXPECT_TRUE(modeStatus.isOk() ||
+ for (auto intent : intents) {
+ const auto modeStatus =
+ mComposerClient->setColorMode(display.getDisplayId(), mode, intent);
+ EXPECT_TRUE(
+ modeStatus.isOk() ||
(modeStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError()))
- << "failed to set color mode";
+ << "failed to set color mode";
+ }
}
- }
- const auto modeStatus = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
- RenderIntent::COLORIMETRIC);
- EXPECT_TRUE(modeStatus.isOk() ||
- (modeStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
- IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError()))
- << "failed to set color mode";
+ const auto modeStatus = mComposerClient->setColorMode(
+ display.getDisplayId(), ColorMode::NATIVE, RenderIntent::COLORIMETRIC);
+ EXPECT_TRUE(modeStatus.isOk() ||
+ (modeStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
+ IComposerClient::EX_UNSUPPORTED == modeStatus.getServiceSpecificError()))
+ << "failed to set color mode";
+ }
}
TEST_P(GraphicsComposerAidlTest, SetColorMode_BadDisplay) {
- const auto& [status, colorModes] = mComposerClient->getColorModes(getPrimaryDisplayId());
- ASSERT_TRUE(status.isOk());
+ for (const auto& display : mDisplays) {
+ const auto& [status, colorModes] = mComposerClient->getColorModes(display.getDisplayId());
+ ASSERT_TRUE(status.isOk());
- for (auto mode : colorModes) {
- const auto& [intentStatus, intents] =
- mComposerClient->getRenderIntents(getPrimaryDisplayId(), mode);
- ASSERT_TRUE(intentStatus.isOk()) << "failed to get render intents";
+ for (auto mode : colorModes) {
+ const auto& [intentStatus, intents] =
+ mComposerClient->getRenderIntents(display.getDisplayId(), mode);
+ ASSERT_TRUE(intentStatus.isOk()) << "failed to get render intents";
- for (auto intent : intents) {
- auto const modeStatus =
- mComposerClient->setColorMode(getInvalidDisplayId(), mode, intent);
+ for (auto intent : intents) {
+ auto const modeStatus =
+ mComposerClient->setColorMode(getInvalidDisplayId(), mode, intent);
- EXPECT_FALSE(modeStatus.isOk());
- EXPECT_NO_FATAL_FAILURE(
- assertServiceSpecificError(modeStatus, IComposerClient::EX_BAD_DISPLAY));
+ EXPECT_FALSE(modeStatus.isOk());
+ EXPECT_NO_FATAL_FAILURE(
+ assertServiceSpecificError(modeStatus, IComposerClient::EX_BAD_DISPLAY));
+ }
}
}
}
TEST_P(GraphicsComposerAidlTest, SetColorMode_BadParameter) {
- auto status = mComposerClient->setColorMode(getPrimaryDisplayId(), static_cast<ColorMode>(-1),
- RenderIntent::COLORIMETRIC);
+ for (const auto& display : mDisplays) {
+ auto status = mComposerClient->setColorMode(
+ display.getDisplayId(), static_cast<ColorMode>(-1), RenderIntent::COLORIMETRIC);
- EXPECT_FALSE(status.isOk());
- EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
+ EXPECT_FALSE(status.isOk());
+ EXPECT_NO_FATAL_FAILURE(
+ assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
- status = mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE,
- static_cast<RenderIntent>(-1));
+ status = mComposerClient->setColorMode(display.getDisplayId(), ColorMode::NATIVE,
+ static_cast<RenderIntent>(-1));
- EXPECT_FALSE(status.isOk());
- EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
+ EXPECT_FALSE(status.isOk());
+ EXPECT_NO_FATAL_FAILURE(
+ assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
+ }
}
TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSamplingAttributes) {
int constexpr kInvalid = -1;
- const auto& [status, format] =
- mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
+ for (const auto& display : mDisplays) {
+ const auto& [status, format] =
+ mComposerClient->getDisplayedContentSamplingAttributes(display.getDisplayId());
- if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
- status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
- SUCCEED() << "Device does not support optional extension. Test skipped";
- return;
+ if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
+ status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
+ SUCCEED() << "Device does not support optional extension. Test skipped";
+ return;
+ }
+
+ ASSERT_TRUE(status.isOk());
+ EXPECT_NE(kInvalid, static_cast<int>(format.format));
+ EXPECT_NE(kInvalid, static_cast<int>(format.dataspace));
+ EXPECT_NE(kInvalid, static_cast<int>(format.componentMask));
}
-
- ASSERT_TRUE(status.isOk());
- EXPECT_NE(kInvalid, static_cast<int>(format.format));
- EXPECT_NE(kInvalid, static_cast<int>(format.dataspace));
- EXPECT_NE(kInvalid, static_cast<int>(format.componentMask));
-};
+}
TEST_P(GraphicsComposerAidlTest, SetDisplayedContentSamplingEnabled) {
int constexpr kMaxFrames = 10;
FormatColorComponent enableAllComponents = FormatColorComponent::FORMAT_COMPONENT_0;
- auto status = mComposerClient->setDisplayedContentSamplingEnabled(
- getPrimaryDisplayId(), /*isEnabled*/ true, enableAllComponents, kMaxFrames);
- if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
- status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
- SUCCEED() << "Device does not support optional extension. Test skipped";
- return;
- }
- EXPECT_TRUE(status.isOk());
- status = mComposerClient->setDisplayedContentSamplingEnabled(
- getPrimaryDisplayId(), /*isEnabled*/ false, enableAllComponents, kMaxFrames);
- EXPECT_TRUE(status.isOk());
+ for (const auto& display : mDisplays) {
+ auto status = mComposerClient->setDisplayedContentSamplingEnabled(
+ display.getDisplayId(), /*isEnabled*/ true, enableAllComponents, kMaxFrames);
+ if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
+ status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
+ SUCCEED() << "Device does not support optional extension. Test skipped";
+ return;
+ }
+ EXPECT_TRUE(status.isOk());
+
+ status = mComposerClient->setDisplayedContentSamplingEnabled(
+ display.getDisplayId(), /*isEnabled*/ false, enableAllComponents, kMaxFrames);
+ EXPECT_TRUE(status.isOk());
+ }
}
TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSample) {
- const auto& [status, displayContentSamplingAttributes] =
- mComposerClient->getDisplayedContentSamplingAttributes(getPrimaryDisplayId());
- if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
- status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
- SUCCEED() << "Sampling attributes aren't supported on this device, test skipped";
- return;
- }
+ for (const auto& display : mDisplays) {
+ const auto& [status, displayContentSamplingAttributes] =
+ mComposerClient->getDisplayedContentSamplingAttributes(display.getDisplayId());
+ if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
+ status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
+ SUCCEED() << "Sampling attributes aren't supported on this device, test skipped";
+ return;
+ }
- int64_t constexpr kMaxFrames = 10;
- int64_t constexpr kTimestamp = 0;
- const auto& [sampleStatus, displayContentSample] = mComposerClient->getDisplayedContentSample(
- getPrimaryDisplayId(), kMaxFrames, kTimestamp);
- if (!sampleStatus.isOk() && sampleStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
- sampleStatus.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
- SUCCEED() << "Device does not support optional extension. Test skipped";
- return;
- }
+ int64_t constexpr kMaxFrames = 10;
+ int64_t constexpr kTimestamp = 0;
+ const auto& [sampleStatus, displayContentSample] =
+ mComposerClient->getDisplayedContentSample(display.getDisplayId(), kMaxFrames,
+ kTimestamp);
+ if (!sampleStatus.isOk() && sampleStatus.getExceptionCode() == EX_SERVICE_SPECIFIC &&
+ sampleStatus.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
+ SUCCEED() << "Device does not support optional extension. Test skipped";
+ return;
+ }
- EXPECT_TRUE(sampleStatus.isOk());
- const std::vector<std::vector<int64_t>> histogram = {
- displayContentSample.sampleComponent0, displayContentSample.sampleComponent1,
- displayContentSample.sampleComponent2, displayContentSample.sampleComponent3};
+ EXPECT_TRUE(sampleStatus.isOk());
+ const std::vector<std::vector<int64_t>> histogram = {
+ displayContentSample.sampleComponent0, displayContentSample.sampleComponent1,
+ displayContentSample.sampleComponent2, displayContentSample.sampleComponent3};
- for (size_t i = 0; i < histogram.size(); i++) {
- const bool shouldHaveHistogram =
- static_cast<int>(displayContentSamplingAttributes.componentMask) & (1 << i);
- EXPECT_EQ(shouldHaveHistogram, !histogram[i].empty());
+ for (size_t i = 0; i < histogram.size(); i++) {
+ const bool shouldHaveHistogram =
+ static_cast<int>(displayContentSamplingAttributes.componentMask) & (1 << i);
+ EXPECT_EQ(shouldHaveHistogram, !histogram[i].empty());
+ }
}
}
@@ -512,7 +533,7 @@
VsyncPeriodChangeConstraints constraints;
constraints.seamlessRequired = false;
constraints.desiredTimeNanos = systemTime();
- auto invalidDisplay = VtsDisplay(getInvalidDisplayId());
+ auto invalidDisplay = DisplayWrapper(getInvalidDisplayId());
const auto& [status, timeline] = mComposerClient->setActiveConfigWithConstraints(
&invalidDisplay, /*config*/ 0, constraints);
@@ -526,7 +547,7 @@
constraints.seamlessRequired = false;
constraints.desiredTimeNanos = systemTime();
- for (VtsDisplay& display : mDisplays) {
+ for (DisplayWrapper& display : mDisplays) {
int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
const auto& [status, _] = mComposerClient->setActiveConfigWithConstraints(
&display, kInvalidConfigId, constraints);
@@ -552,7 +573,7 @@
GTEST_SUCCEED() << "Boot Display Config not supported";
return;
}
- for (VtsDisplay& display : mDisplays) {
+ for (DisplayWrapper& display : mDisplays) {
int32_t constexpr kInvalidConfigId = IComposerClient::INVALID_CONFIGURATION;
const auto& status =
mComposerClient->setBootDisplayConfig(display.getDisplayId(), kInvalidConfigId);
@@ -567,10 +588,14 @@
GTEST_SUCCEED() << "Boot Display Config not supported";
return;
}
- const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
- EXPECT_TRUE(status.isOk());
- for (const auto& config : configs) {
- EXPECT_TRUE(mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config).isOk());
+
+ for (const auto& display : mDisplays) {
+ const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
+ EXPECT_TRUE(status.isOk());
+ for (const auto& config : configs) {
+ EXPECT_TRUE(
+ mComposerClient->setBootDisplayConfig(display.getDisplayId(), config).isOk());
+ }
}
}
@@ -590,7 +615,10 @@
GTEST_SUCCEED() << "Boot Display Config not supported";
return;
}
- EXPECT_TRUE(mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId()).isOk());
+
+ for (const auto& display : mDisplays) {
+ EXPECT_TRUE(mComposerClient->clearBootDisplayConfig(display.getDisplayId()).isOk());
+ }
}
TEST_P(GraphicsComposerAidlTest, GetPreferredBootDisplayConfig_BadDisplay) {
@@ -609,36 +637,42 @@
GTEST_SUCCEED() << "Boot Display Config not supported";
return;
}
- const auto& [status, preferredDisplayConfig] =
- mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId());
- EXPECT_TRUE(status.isOk());
- const auto& [configStatus, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
+ for (const auto& display : mDisplays) {
+ const auto& [status, preferredDisplayConfig] =
+ mComposerClient->getPreferredBootDisplayConfig(display.getDisplayId());
+ EXPECT_TRUE(status.isOk());
- EXPECT_TRUE(configStatus.isOk());
- EXPECT_NE(configs.end(), std::find(configs.begin(), configs.end(), preferredDisplayConfig));
+ const auto& [configStatus, configs] =
+ mComposerClient->getDisplayConfigs(display.getDisplayId());
+
+ EXPECT_TRUE(configStatus.isOk());
+ EXPECT_NE(configs.end(), std::find(configs.begin(), configs.end(), preferredDisplayConfig));
+ }
}
TEST_P(GraphicsComposerAidlTest, BootDisplayConfig_Unsupported) {
if (!hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
- const auto& [configStatus, config] =
- mComposerClient->getActiveConfig(getPrimaryDisplayId());
- EXPECT_TRUE(configStatus.isOk());
+ for (const auto& display : mDisplays) {
+ const auto& [configStatus, config] =
+ mComposerClient->getActiveConfig(display.getDisplayId());
+ EXPECT_TRUE(configStatus.isOk());
- auto status = mComposerClient->setBootDisplayConfig(getPrimaryDisplayId(), config);
- EXPECT_FALSE(status.isOk());
- EXPECT_NO_FATAL_FAILURE(
- assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
+ auto status = mComposerClient->setBootDisplayConfig(display.getDisplayId(), config);
+ EXPECT_FALSE(status.isOk());
+ EXPECT_NO_FATAL_FAILURE(
+ assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
- status = mComposerClient->getPreferredBootDisplayConfig(getPrimaryDisplayId()).first;
- EXPECT_FALSE(status.isOk());
- EXPECT_NO_FATAL_FAILURE(
- assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
+ status = mComposerClient->getPreferredBootDisplayConfig(display.getDisplayId()).first;
+ EXPECT_FALSE(status.isOk());
+ EXPECT_NO_FATAL_FAILURE(
+ assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
- status = mComposerClient->clearBootDisplayConfig(getPrimaryDisplayId());
- EXPECT_FALSE(status.isOk());
- EXPECT_NO_FATAL_FAILURE(
- assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
+ status = mComposerClient->clearBootDisplayConfig(display.getDisplayId());
+ EXPECT_FALSE(status.isOk());
+ EXPECT_NO_FATAL_FAILURE(
+ assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
+ }
}
}
@@ -670,22 +704,25 @@
return;
}
const auto& [status, conversionCapabilities] = mComposerClient->getHdrConversionCapabilities();
- const auto& [status2, hdrCapabilities] =
- mComposerClient->getHdrCapabilities(getPrimaryDisplayId());
- const auto& hdrTypes = hdrCapabilities.types;
- for (auto conversionCapability : conversionCapabilities) {
- if (conversionCapability.outputType != common::Hdr::INVALID) {
- if (std::find(hdrTypes.begin(), hdrTypes.end(), conversionCapability.outputType) ==
- hdrTypes.end()) {
- continue;
+
+ for (const auto& display : mDisplays) {
+ const auto& [status2, hdrCapabilities] =
+ mComposerClient->getHdrCapabilities(display.getDisplayId());
+ const auto& hdrTypes = hdrCapabilities.types;
+ for (auto conversionCapability : conversionCapabilities) {
+ if (conversionCapability.outputType != common::Hdr::INVALID) {
+ if (std::find(hdrTypes.begin(), hdrTypes.end(), conversionCapability.outputType) ==
+ hdrTypes.end()) {
+ continue;
+ }
+ common::HdrConversionStrategy hdrConversionStrategy;
+ hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::forceHdrConversion>(
+ conversionCapability.outputType);
+ const auto& [statusSet, preferredHdrOutputType] =
+ mComposerClient->setHdrConversionStrategy(hdrConversionStrategy);
+ EXPECT_TRUE(statusSet.isOk());
+ EXPECT_EQ(common::Hdr::INVALID, preferredHdrOutputType);
}
- common::HdrConversionStrategy hdrConversionStrategy;
- hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::forceHdrConversion>(
- conversionCapability.outputType);
- const auto& [statusSet, preferredHdrOutputType] =
- mComposerClient->setHdrConversionStrategy(hdrConversionStrategy);
- EXPECT_TRUE(statusSet.isOk());
- EXPECT_EQ(common::Hdr::INVALID, preferredHdrOutputType);
}
}
}
@@ -696,24 +733,27 @@
return;
}
const auto& [status, conversionCapabilities] = mComposerClient->getHdrConversionCapabilities();
- const auto& [status2, hdrCapabilities] =
- mComposerClient->getHdrCapabilities(getPrimaryDisplayId());
- if (hdrCapabilities.types.size() <= 0) {
- return;
- }
- std::vector<aidl::android::hardware::graphics::common::Hdr> autoHdrTypes;
- for (auto conversionCapability : conversionCapabilities) {
- if (conversionCapability.outputType != common::Hdr::INVALID) {
- autoHdrTypes.push_back(conversionCapability.outputType);
+
+ for (const auto& display : mDisplays) {
+ const auto& [status2, hdrCapabilities] =
+ mComposerClient->getHdrCapabilities(display.getDisplayId());
+ if (hdrCapabilities.types.size() <= 0) {
+ return;
}
+ std::vector<aidl::android::hardware::graphics::common::Hdr> autoHdrTypes;
+ for (auto conversionCapability : conversionCapabilities) {
+ if (conversionCapability.outputType != common::Hdr::INVALID) {
+ autoHdrTypes.push_back(conversionCapability.outputType);
+ }
+ }
+ common::HdrConversionStrategy hdrConversionStrategy;
+ hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::autoAllowedHdrTypes>(
+ autoHdrTypes);
+ const auto& [statusSet, preferredHdrOutputType] =
+ mComposerClient->setHdrConversionStrategy(hdrConversionStrategy);
+ EXPECT_TRUE(statusSet.isOk());
+ EXPECT_NE(common::Hdr::INVALID, preferredHdrOutputType);
}
- common::HdrConversionStrategy hdrConversionStrategy;
- hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::autoAllowedHdrTypes>(
- autoHdrTypes);
- const auto& [statusSet, preferredHdrOutputType] =
- mComposerClient->setHdrConversionStrategy(hdrConversionStrategy);
- EXPECT_TRUE(statusSet.isOk());
- EXPECT_NE(common::Hdr::INVALID, preferredHdrOutputType);
}
TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode_BadDisplay) {
@@ -852,11 +892,12 @@
return;
}
- const auto& [status, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, nullptr);
-
- EXPECT_TRUE(status.isOk());
- EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer, nullptr).isOk());
+ for (const auto& display : mDisplays) {
+ const auto& [status, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, nullptr);
+ EXPECT_TRUE(status.isOk());
+ EXPECT_TRUE(mComposerClient->destroyLayer(display.getDisplayId(), layer, nullptr).isOk());
+ }
}
TEST_P(GraphicsComposerAidlTest, CreateLayer_BadDisplay) {
@@ -878,17 +919,19 @@
return;
}
- const auto& [status, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, nullptr);
- EXPECT_TRUE(status.isOk());
+ for (const auto& display : mDisplays) {
+ const auto& [status, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, nullptr);
+ EXPECT_TRUE(status.isOk());
- const auto& destroyStatus =
- mComposerClient->destroyLayer(getInvalidDisplayId(), layer, nullptr);
+ 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, nullptr).isOk());
+ EXPECT_FALSE(destroyStatus.isOk());
+ EXPECT_NO_FATAL_FAILURE(
+ assertServiceSpecificError(destroyStatus, IComposerClient::EX_BAD_DISPLAY));
+ ASSERT_TRUE(mComposerClient->destroyLayer(display.getDisplayId(), layer, nullptr).isOk());
+ }
}
TEST_P(GraphicsComposerAidlTest, DestroyLayer_BadLayerError) {
@@ -897,11 +940,14 @@
return;
}
- // We haven't created any layers yet, so any id should be invalid
- const auto& status = mComposerClient->destroyLayer(getPrimaryDisplayId(), /*layer*/ 1, nullptr);
+ for (const auto& display : mDisplays) {
+ // We haven't created any layers yet, so any id should be invalid
+ const auto& status =
+ mComposerClient->destroyLayer(display.getDisplayId(), /*layer*/ 1, nullptr);
- EXPECT_FALSE(status.isOk());
- EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_LAYER));
+ EXPECT_FALSE(status.isOk());
+ EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_LAYER));
+ }
}
TEST_P(GraphicsComposerAidlTest, GetActiveConfig_BadDisplay) {
@@ -912,8 +958,10 @@
}
TEST_P(GraphicsComposerAidlTest, GetDisplayConfig) {
- const auto& [status, _] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
- EXPECT_TRUE(status.isOk());
+ for (const auto& display : mDisplays) {
+ const auto& [status, _] = mComposerClient->getDisplayConfigs(display.getDisplayId());
+ EXPECT_TRUE(status.isOk());
+ }
}
TEST_P(GraphicsComposerAidlTest, GetDisplayConfig_BadDisplay) {
@@ -924,15 +972,10 @@
}
TEST_P(GraphicsComposerAidlTest, GetDisplayName) {
- const auto& [status, _] = mComposerClient->getDisplayName(getPrimaryDisplayId());
- EXPECT_TRUE(status.isOk());
-}
-
-TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation_BadDisplay) {
- const auto& [status, _] = mComposerClient->getDisplayPhysicalOrientation(getInvalidDisplayId());
-
- EXPECT_FALSE(status.isOk());
- EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
+ for (const auto& display : mDisplays) {
+ const auto& [status, _] = mComposerClient->getDisplayName(display.getDisplayId());
+ EXPECT_TRUE(status.isOk());
+ }
}
TEST_P(GraphicsComposerAidlTest, GetDisplayPhysicalOrientation) {
@@ -943,197 +986,214 @@
Transform::ROT_270,
};
- const auto& [status, displayOrientation] =
- mComposerClient->getDisplayPhysicalOrientation(getPrimaryDisplayId());
+ for (const auto& display : mDisplays) {
+ const auto& [status, displayOrientation] =
+ mComposerClient->getDisplayPhysicalOrientation(display.getDisplayId());
- EXPECT_TRUE(status.isOk());
- EXPECT_NE(std::find(allowedDisplayOrientations.begin(), allowedDisplayOrientations.end(),
- displayOrientation),
- allowedDisplayOrientations.end());
+ EXPECT_TRUE(status.isOk());
+ EXPECT_NE(std::find(allowedDisplayOrientations.begin(), allowedDisplayOrientations.end(),
+ displayOrientation),
+ allowedDisplayOrientations.end());
+ }
}
TEST_P(GraphicsComposerAidlTest, SetClientTargetSlotCount) {
- EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
+ for (const auto& display : mDisplays) {
+ EXPECT_TRUE(
+ mComposerClient->setClientTargetSlotCount(display.getDisplayId(), kBufferSlotCount)
.isOk());
+ }
}
TEST_P(GraphicsComposerAidlTest, SetActiveConfig) {
- const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
- EXPECT_TRUE(status.isOk());
+ for (auto& display : mDisplays) {
+ const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
+ EXPECT_TRUE(status.isOk());
- for (const auto& config : configs) {
- auto display = getEditablePrimaryDisplay();
- EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
- const auto& [configStatus, config1] =
- mComposerClient->getActiveConfig(getPrimaryDisplayId());
- EXPECT_TRUE(configStatus.isOk());
- EXPECT_EQ(config, config1);
+ for (const auto& config : configs) {
+ EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
+ const auto& [configStatus, config1] =
+ mComposerClient->getActiveConfig(display.getDisplayId());
+ EXPECT_TRUE(configStatus.isOk());
+ EXPECT_EQ(config, config1);
+ }
}
}
TEST_P(GraphicsComposerAidlTest, SetActiveConfigPowerCycle) {
- EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
- EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
+ for (auto& display : mDisplays) {
+ EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::OFF).isOk());
+ EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::ON).isOk());
- const auto& [status, configs] = mComposerClient->getDisplayConfigs(getPrimaryDisplayId());
- EXPECT_TRUE(status.isOk());
+ const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
+ EXPECT_TRUE(status.isOk());
- for (const auto& config : configs) {
- auto display = getEditablePrimaryDisplay();
- EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
- const auto& [config1Status, config1] =
- mComposerClient->getActiveConfig(getPrimaryDisplayId());
- EXPECT_TRUE(config1Status.isOk());
- EXPECT_EQ(config, config1);
+ for (const auto& config : configs) {
+ EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config).isOk());
+ const auto& [config1Status, config1] =
+ mComposerClient->getActiveConfig(display.getDisplayId());
+ EXPECT_TRUE(config1Status.isOk());
+ EXPECT_EQ(config, config1);
- EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
- EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
- const auto& [config2Status, config2] =
- mComposerClient->getActiveConfig(getPrimaryDisplayId());
- EXPECT_TRUE(config2Status.isOk());
- EXPECT_EQ(config, config2);
+ EXPECT_TRUE(
+ mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::OFF).isOk());
+ EXPECT_TRUE(
+ mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::ON).isOk());
+ const auto& [config2Status, config2] =
+ mComposerClient->getActiveConfig(display.getDisplayId());
+ EXPECT_TRUE(config2Status.isOk());
+ EXPECT_EQ(config, config2);
+ }
}
}
TEST_P(GraphicsComposerAidlTest, SetPowerModeUnsupported) {
- const auto& [status, capabilities] =
- mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
- ASSERT_TRUE(status.isOk());
+ for (const auto& display : mDisplays) {
+ const auto& [status, capabilities] =
+ mComposerClient->getDisplayCapabilities(display.getDisplayId());
+ ASSERT_TRUE(status.isOk());
- const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
- DisplayCapability::DOZE) != capabilities.end();
- const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
- DisplayCapability::SUSPEND) != capabilities.end();
+ const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
+ DisplayCapability::DOZE) != capabilities.end();
+ const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
+ DisplayCapability::SUSPEND) != capabilities.end();
- if (!isDozeSupported) {
- const auto& powerModeDozeStatus =
- mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE);
- EXPECT_FALSE(powerModeDozeStatus.isOk());
- EXPECT_NO_FATAL_FAILURE(
- assertServiceSpecificError(powerModeDozeStatus, IComposerClient::EX_UNSUPPORTED));
+ if (!isDozeSupported) {
+ const auto& powerModeDozeStatus =
+ mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::DOZE);
+ EXPECT_FALSE(powerModeDozeStatus.isOk());
+ EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeStatus,
+ IComposerClient::EX_UNSUPPORTED));
- const auto& powerModeDozeSuspendStatus =
- mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
- EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
- EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
- IComposerClient::EX_UNSUPPORTED));
- }
+ const auto& powerModeDozeSuspendStatus =
+ mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::DOZE_SUSPEND);
+ EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
+ EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
+ IComposerClient::EX_UNSUPPORTED));
+ }
- if (!isSuspendSupported) {
- const auto& powerModeSuspendStatus =
- mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON_SUSPEND);
- EXPECT_FALSE(powerModeSuspendStatus.isOk());
- EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeSuspendStatus,
- IComposerClient::EX_UNSUPPORTED));
+ if (!isSuspendSupported) {
+ const auto& powerModeSuspendStatus =
+ mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::ON_SUSPEND);
+ EXPECT_FALSE(powerModeSuspendStatus.isOk());
+ EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeSuspendStatus,
+ IComposerClient::EX_UNSUPPORTED));
- const auto& powerModeDozeSuspendStatus =
- mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::DOZE_SUSPEND);
- EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
- EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
- IComposerClient::EX_UNSUPPORTED));
+ const auto& powerModeDozeSuspendStatus =
+ mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::DOZE_SUSPEND);
+ EXPECT_FALSE(powerModeDozeSuspendStatus.isOk());
+ EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(powerModeDozeSuspendStatus,
+ IComposerClient::EX_UNSUPPORTED));
+ }
}
}
TEST_P(GraphicsComposerAidlTest, SetVsyncEnabled) {
mComposerClient->setVsyncAllowed(true);
- EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), true).isOk());
- usleep(60 * 1000);
- EXPECT_TRUE(mComposerClient->setVsync(getPrimaryDisplayId(), false).isOk());
+ for (const auto& display : mDisplays) {
+ EXPECT_TRUE(mComposerClient->setVsync(display.getDisplayId(), true).isOk());
+ usleep(60 * 1000);
+ EXPECT_TRUE(mComposerClient->setVsync(display.getDisplayId(), false).isOk());
+ }
mComposerClient->setVsyncAllowed(false);
}
TEST_P(GraphicsComposerAidlTest, SetPowerMode) {
- const auto& [status, capabilities] =
- mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
- ASSERT_TRUE(status.isOk());
+ for (const auto& display : mDisplays) {
+ const auto& [status, capabilities] =
+ mComposerClient->getDisplayCapabilities(display.getDisplayId());
+ ASSERT_TRUE(status.isOk());
- const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
- DisplayCapability::DOZE) != capabilities.end();
- const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
- DisplayCapability::SUSPEND) != capabilities.end();
+ const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
+ DisplayCapability::DOZE) != capabilities.end();
+ const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
+ DisplayCapability::SUSPEND) != capabilities.end();
- std::vector<PowerMode> modes;
- modes.push_back(PowerMode::OFF);
- modes.push_back(PowerMode::ON);
+ std::vector<PowerMode> modes;
+ modes.push_back(PowerMode::OFF);
+ modes.push_back(PowerMode::ON);
- if (isSuspendSupported) {
- modes.push_back(PowerMode::ON_SUSPEND);
- }
+ if (isSuspendSupported) {
+ modes.push_back(PowerMode::ON_SUSPEND);
+ }
- if (isDozeSupported) {
- modes.push_back(PowerMode::DOZE);
- }
+ if (isDozeSupported) {
+ modes.push_back(PowerMode::DOZE);
+ }
- if (isSuspendSupported && isDozeSupported) {
- modes.push_back(PowerMode::DOZE_SUSPEND);
- }
+ if (isSuspendSupported && isDozeSupported) {
+ modes.push_back(PowerMode::DOZE_SUSPEND);
+ }
- for (auto mode : modes) {
- EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
+ for (auto mode : modes) {
+ EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), mode).isOk());
+ }
}
}
TEST_P(GraphicsComposerAidlTest, SetPowerModeVariations) {
- const auto& [status, capabilities] =
- mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
- ASSERT_TRUE(status.isOk());
+ for (const auto& display : mDisplays) {
+ const auto& [status, capabilities] =
+ mComposerClient->getDisplayCapabilities(display.getDisplayId());
+ ASSERT_TRUE(status.isOk());
- const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
- DisplayCapability::DOZE) != capabilities.end();
- const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
- DisplayCapability::SUSPEND) != capabilities.end();
+ const bool isDozeSupported = std::find(capabilities.begin(), capabilities.end(),
+ DisplayCapability::DOZE) != capabilities.end();
+ const bool isSuspendSupported = std::find(capabilities.begin(), capabilities.end(),
+ DisplayCapability::SUSPEND) != capabilities.end();
- std::vector<PowerMode> modes;
+ std::vector<PowerMode> modes;
- modes.push_back(PowerMode::OFF);
- modes.push_back(PowerMode::ON);
- modes.push_back(PowerMode::OFF);
- for (auto mode : modes) {
- EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
- }
- modes.clear();
-
- modes.push_back(PowerMode::OFF);
- modes.push_back(PowerMode::OFF);
- for (auto mode : modes) {
- EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
- }
- modes.clear();
-
- modes.push_back(PowerMode::ON);
- modes.push_back(PowerMode::ON);
- for (auto mode : modes) {
- EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
- }
- modes.clear();
-
- if (isSuspendSupported) {
- modes.push_back(PowerMode::ON_SUSPEND);
- modes.push_back(PowerMode::ON_SUSPEND);
+ modes.push_back(PowerMode::OFF);
+ modes.push_back(PowerMode::ON);
+ modes.push_back(PowerMode::OFF);
for (auto mode : modes) {
- EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
+ EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), mode).isOk());
}
modes.clear();
- }
- if (isDozeSupported) {
- modes.push_back(PowerMode::DOZE);
- modes.push_back(PowerMode::DOZE);
+ modes.push_back(PowerMode::OFF);
+ modes.push_back(PowerMode::OFF);
for (auto mode : modes) {
- EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
+ EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), mode).isOk());
}
modes.clear();
- }
- if (isSuspendSupported && isDozeSupported) {
- modes.push_back(PowerMode::DOZE_SUSPEND);
- modes.push_back(PowerMode::DOZE_SUSPEND);
+ modes.push_back(PowerMode::ON);
+ modes.push_back(PowerMode::ON);
for (auto mode : modes) {
- EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), mode).isOk());
+ EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), mode).isOk());
}
modes.clear();
+
+ if (isSuspendSupported) {
+ modes.push_back(PowerMode::ON_SUSPEND);
+ modes.push_back(PowerMode::ON_SUSPEND);
+ for (auto mode : modes) {
+ EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), mode).isOk());
+ }
+ modes.clear();
+ }
+
+ if (isDozeSupported) {
+ modes.push_back(PowerMode::DOZE);
+ modes.push_back(PowerMode::DOZE);
+ for (auto mode : modes) {
+ EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), mode).isOk());
+ }
+ modes.clear();
+ }
+
+ if (isSuspendSupported && isDozeSupported) {
+ modes.push_back(PowerMode::DOZE_SUSPEND);
+ modes.push_back(PowerMode::DOZE_SUSPEND);
+ for (auto mode : modes) {
+ EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), mode).isOk());
+ }
+ modes.clear();
+ }
}
}
@@ -1145,11 +1205,14 @@
}
TEST_P(GraphicsComposerAidlTest, SetPowerMode_BadParameter) {
- const auto& status =
- mComposerClient->setPowerMode(getPrimaryDisplayId(), static_cast<PowerMode>(-1));
+ for (const auto& display : mDisplays) {
+ const auto& status =
+ mComposerClient->setPowerMode(display.getDisplayId(), static_cast<PowerMode>(-1));
- EXPECT_FALSE(status.isOk());
- EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
+ EXPECT_FALSE(status.isOk());
+ EXPECT_NO_FATAL_FAILURE(
+ assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
+ }
}
TEST_P(GraphicsComposerAidlTest, GetDataspaceSaturationMatrix) {
@@ -1315,7 +1378,7 @@
const auto minFrameInterval = *min_element(frameIntervalPowerHints.cbegin(),
frameIntervalPowerHints.cend());
EXPECT_LE(minFrameInterval->frameIntervalNs,
- VtsComposerClient::kMaxFrameIntervalNs);
+ ComposerClientWrapper::kMaxFrameIntervalNs);
const auto maxFrameInterval = *max_element(frameIntervalPowerHints.cbegin(),
frameIntervalPowerHints.cend());
EXPECT_GE(maxFrameInterval->frameIntervalNs, vrrConfig.minFrameIntervalNs);
@@ -1419,9 +1482,11 @@
void TearDown() override {
ASSERT_FALSE(mDisplays.empty());
ASSERT_TRUE(mReader.takeErrors().empty());
- ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
- ASSERT_TRUE(mComposerClient->tearDown(&getWriter(getPrimaryDisplayId())));
+ for (const auto& display : mDisplays) {
+ ASSERT_TRUE(mReader.takeChangedCompositionTypes(display.getDisplayId()).empty());
+ ASSERT_TRUE(mComposerClient->tearDown(&getWriter(display.getDisplayId())));
+ }
ASSERT_NO_FATAL_FAILURE(GraphicsComposerAidlTest::TearDown());
}
@@ -1490,12 +1555,13 @@
"VtsHalGraphicsComposer3_TargetTest");
}
- sp<GraphicBuffer> allocate(::android::PixelFormat pixelFormat) {
- return allocate(static_cast<uint32_t>(getPrimaryDisplay().getDisplayWidth()),
- static_cast<uint32_t>(getPrimaryDisplay().getDisplayHeight()), pixelFormat);
+ sp<GraphicBuffer> allocate(::android::PixelFormat pixelFormat, const DisplayWrapper& display) {
+ return allocate(static_cast<uint32_t>(display.getDisplayWidth()),
+ static_cast<uint32_t>(display.getDisplayHeight()), pixelFormat);
}
- void sendRefreshFrame(const VtsDisplay& display, const VsyncPeriodChangeTimeline* timeline) {
+ void sendRefreshFrame(const DisplayWrapper& display,
+ const VsyncPeriodChangeTimeline* timeline) {
if (timeline != nullptr) {
// Refresh time should be before newVsyncAppliedTimeNanos
EXPECT_LT(timeline->refreshTimeNanos, timeline->newVsyncAppliedTimeNanos);
@@ -1514,7 +1580,7 @@
mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
EXPECT_TRUE(status.isOk());
{
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, display);
ASSERT_NE(nullptr, buffer);
ASSERT_EQ(::android::OK, buffer->initCheck());
ASSERT_NE(nullptr, buffer->handle);
@@ -1526,7 +1592,7 @@
writer.setLayerDataspace(display.getDisplayId(), layer, common::Dataspace::UNKNOWN);
writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
ASSERT_TRUE(mReader.takeErrors().empty());
@@ -1536,7 +1602,7 @@
}
{
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, display);
ASSERT_NE(nullptr, buffer->handle);
writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
@@ -1544,7 +1610,7 @@
writer.setLayerSurfaceDamage(display.getDisplayId(), layer,
std::vector<Rect>(1, {0, 0, 10, 10}));
writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
ASSERT_TRUE(mReader.takeErrors().empty());
@@ -1556,10 +1622,8 @@
}
sp<::android::Fence> presentAndGetFence(
- std::optional<ClockMonotonicTimestamp> expectedPresentTime,
- std::optional<int64_t> displayIdOpt = {},
- int32_t frameIntervalNs = VtsComposerClient::kNoFrameIntervalNs) {
- const auto displayId = displayIdOpt.value_or(getPrimaryDisplayId());
+ std::optional<ClockMonotonicTimestamp> expectedPresentTime, int64_t displayId,
+ int32_t frameIntervalNs = ComposerClientWrapper::kNoFrameIntervalNs) {
auto& writer = getWriter(displayId);
writer.validateDisplay(displayId, expectedPresentTime, frameIntervalNs);
execute();
@@ -1577,18 +1641,17 @@
return sp<::android::Fence>::make(fenceOwner);
}
- int32_t getVsyncPeriod() {
- const auto& [status, activeConfig] =
- mComposerClient->getActiveConfig(getPrimaryDisplayId());
+ int32_t getVsyncPeriod(int64_t displayId) {
+ const auto& [status, activeConfig] = mComposerClient->getActiveConfig(displayId);
EXPECT_TRUE(status.isOk());
const auto& [vsyncPeriodStatus, vsyncPeriod] = mComposerClient->getDisplayAttribute(
- getPrimaryDisplayId(), activeConfig, DisplayAttribute::VSYNC_PERIOD);
+ displayId, activeConfig, DisplayAttribute::VSYNC_PERIOD);
EXPECT_TRUE(vsyncPeriodStatus.isOk());
return vsyncPeriod;
}
- int64_t createOnScreenLayer(const VtsDisplay& display,
+ int64_t createOnScreenLayer(const DisplayWrapper& display,
Composition composition = Composition::DEVICE) {
auto& writer = getWriter(display.getDisplayId());
const auto& [status, layer] =
@@ -1602,16 +1665,16 @@
return layer;
}
- void sendBufferUpdate(int64_t layer) {
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+ void sendBufferUpdate(int64_t layer, int64_t displayId) {
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, displayId);
ASSERT_NE(nullptr, buffer->handle);
- auto& writer = getWriter(getPrimaryDisplayId());
- writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer->handle,
+ auto& writer = getWriter(displayId);
+ writer.setLayerBuffer(displayId, layer, /*slot*/ 0, buffer->handle,
/*acquireFence*/ -1);
const sp<::android::Fence> presentFence =
- presentAndGetFence(ComposerClientWriter::kNoTimestamp);
+ presentAndGetFence(ComposerClientWriter::kNoTimestamp, displayId);
presentFence->waitForever(LOG_TAG);
}
@@ -1623,7 +1686,7 @@
}
void Test_setActiveConfigWithConstraints(const TestParameters& params) {
- for (VtsDisplay& display : mDisplays) {
+ for (DisplayWrapper& display : mDisplays) {
forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
EXPECT_TRUE(mComposerClient->setActiveConfig(&display, config1).isOk());
sendRefreshFrame(display, nullptr);
@@ -1707,51 +1770,56 @@
return;
}
- ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
+ for (const auto& display : mDisplays) {
+ ASSERT_TRUE(
+ mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::ON).isOk());
- const auto vsyncPeriod = getVsyncPeriod();
+ const auto vsyncPeriod = getVsyncPeriod(display.getDisplayId());
- const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
- const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
- ASSERT_NE(nullptr, buffer1);
- ASSERT_NE(nullptr, buffer2);
+ const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888, display);
+ const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888, display);
+ ASSERT_NE(nullptr, buffer1);
+ ASSERT_NE(nullptr, buffer2);
- const auto layer = createOnScreenLayer(getPrimaryDisplay());
- auto& writer = getWriter(getPrimaryDisplayId());
- writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer1->handle,
- /*acquireFence*/ -1);
- const sp<::android::Fence> presentFence1 =
- presentAndGetFence(ComposerClientWriter::kNoTimestamp);
- presentFence1->waitForever(LOG_TAG);
+ const auto layer = createOnScreenLayer(display);
+ auto& writer = getWriter(display.getDisplayId());
+ writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer1->handle,
+ /*acquireFence*/ -1);
+ const sp<::android::Fence> presentFence1 =
+ presentAndGetFence(ComposerClientWriter::kNoTimestamp, display.getDisplayId());
+ presentFence1->waitForever(LOG_TAG);
- auto expectedPresentTime = presentFence1->getSignalTime() + vsyncPeriod;
- if (framesDelay.has_value()) {
- expectedPresentTime += *framesDelay * vsyncPeriod;
- }
-
- writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer2->handle,
- /*acquireFence*/ -1);
- const auto setExpectedPresentTime = [&]() -> std::optional<ClockMonotonicTimestamp> {
- if (!framesDelay.has_value()) {
- return ComposerClientWriter::kNoTimestamp;
- } else if (*framesDelay == 0) {
- return ClockMonotonicTimestamp{0};
+ auto expectedPresentTime = presentFence1->getSignalTime() + vsyncPeriod;
+ if (framesDelay.has_value()) {
+ expectedPresentTime += *framesDelay * vsyncPeriod;
}
- return ClockMonotonicTimestamp{expectedPresentTime};
- }();
- const sp<::android::Fence> presentFence2 = presentAndGetFence(setExpectedPresentTime);
- presentFence2->waitForever(LOG_TAG);
+ writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer2->handle,
+ /*acquireFence*/ -1);
+ const auto setExpectedPresentTime = [&]() -> std::optional<ClockMonotonicTimestamp> {
+ if (!framesDelay.has_value()) {
+ return ComposerClientWriter::kNoTimestamp;
+ } else if (*framesDelay == 0) {
+ return ClockMonotonicTimestamp{0};
+ }
+ return ClockMonotonicTimestamp{expectedPresentTime};
+ }();
- const auto actualPresentTime = presentFence2->getSignalTime();
- EXPECT_GE(actualPresentTime, expectedPresentTime - vsyncPeriod / 2);
+ const sp<::android::Fence> presentFence2 =
+ presentAndGetFence(setExpectedPresentTime, display.getDisplayId());
+ presentFence2->waitForever(LOG_TAG);
- ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
+ const auto actualPresentTime = presentFence2->getSignalTime();
+ EXPECT_GE(actualPresentTime, expectedPresentTime - vsyncPeriod / 2);
+
+ ASSERT_TRUE(
+ mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::OFF).isOk());
+ }
}
void forEachNotifyExpectedPresentConfig(
- std::function<void(VtsDisplay&, const DisplayConfiguration&)> func) {
- for (VtsDisplay& display : mDisplays) {
+ std::function<void(DisplayWrapper&, const DisplayConfiguration&)> func) {
+ for (DisplayWrapper& display : mDisplays) {
const auto displayId = display.getDisplayId();
EXPECT_TRUE(mComposerClient->setPowerMode(displayId, PowerMode::ON).isOk());
const auto& [status, displayConfigurations] =
@@ -1777,11 +1845,11 @@
}
}
EXPECT_TRUE(
- mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
+ mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::OFF).isOk());
}
}
- void configureLayer(const VtsDisplay& display, int64_t layer, Composition composition,
+ void configureLayer(const DisplayWrapper& display, int64_t layer, Composition composition,
const Rect& displayFrame, const FRect& cropRect) {
auto& writer = getWriter(display.getDisplayId());
writer.setLayerCompositionType(display.getDisplayId(), layer, composition);
@@ -1838,86 +1906,94 @@
};
TEST_P(GraphicsComposerAidlCommandTest, SetColorTransform) {
- auto& writer = getWriter(getPrimaryDisplayId());
- writer.setColorTransform(getPrimaryDisplayId(), kIdentity.data());
- execute();
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ writer.setColorTransform(display.getDisplayId(), kIdentity.data());
+ execute();
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerColorTransform) {
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [status, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(status.isOk());
- writer.setLayerColorTransform(getPrimaryDisplayId(), layer, kIdentity.data());
- execute();
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [status, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(status.isOk());
+ writer.setLayerColorTransform(display.getDisplayId(), layer, kIdentity.data());
+ execute();
- const auto errors = mReader.takeErrors();
- if (errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_UNSUPPORTED) {
- GTEST_SUCCEED() << "setLayerColorTransform is not supported";
- return;
+ const auto errors = mReader.takeErrors();
+ if (errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_UNSUPPORTED) {
+ GTEST_SUCCEED() << "setLayerColorTransform is not supported";
+ continue;
+ }
}
}
TEST_P(GraphicsComposerAidlCommandTest, SetDisplayBrightness) {
- EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
- const auto& [status, capabilities] =
- mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
- ASSERT_TRUE(status.isOk());
- bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
- DisplayCapability::BRIGHTNESS) != capabilities.end();
- auto& writer = getWriter(getPrimaryDisplayId());
- if (!brightnessSupport) {
- writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
+ for (const auto& display : mDisplays) {
+ const auto& [status, capabilities] =
+ mComposerClient->getDisplayCapabilities(display.getDisplayId());
+ ASSERT_TRUE(status.isOk());
+ bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
+ DisplayCapability::BRIGHTNESS) != capabilities.end();
+ auto& writer = getWriter(display.getDisplayId());
+ if (!brightnessSupport) {
+ writer.setDisplayBrightness(display.getDisplayId(), /*brightness*/ 0.5f, -1.f);
+ execute();
+ const auto errors = mReader.takeErrors();
+ ASSERT_EQ(1, errors.size());
+ EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
+ GTEST_SUCCEED() << "SetDisplayBrightness is not supported";
+ continue;
+ }
+
+ writer.setDisplayBrightness(display.getDisplayId(), /*brightness*/ 0.0f, -1.f);
execute();
- const auto errors = mReader.takeErrors();
- ASSERT_EQ(1, errors.size());
- EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
- GTEST_SUCCEED() << "SetDisplayBrightness is not supported";
- return;
- }
+ EXPECT_TRUE(mReader.takeErrors().empty());
- writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.0f, -1.f);
- execute();
- EXPECT_TRUE(mReader.takeErrors().empty());
+ writer.setDisplayBrightness(display.getDisplayId(), /*brightness*/ 0.5f, -1.f);
+ execute();
+ EXPECT_TRUE(mReader.takeErrors().empty());
- writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
- execute();
- EXPECT_TRUE(mReader.takeErrors().empty());
+ writer.setDisplayBrightness(display.getDisplayId(), /*brightness*/ 1.0f, -1.f);
+ execute();
+ EXPECT_TRUE(mReader.takeErrors().empty());
- writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 1.0f, -1.f);
- execute();
- EXPECT_TRUE(mReader.takeErrors().empty());
+ writer.setDisplayBrightness(display.getDisplayId(), /*brightness*/ -1.0f, -1.f);
+ execute();
+ EXPECT_TRUE(mReader.takeErrors().empty());
- writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -1.0f, -1.f);
- execute();
- EXPECT_TRUE(mReader.takeErrors().empty());
+ writer.setDisplayBrightness(display.getDisplayId(), /*brightness*/ 2.0f, -1.f);
+ execute();
+ {
+ const auto errors = mReader.takeErrors();
+ ASSERT_EQ(1, errors.size());
+ EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
+ }
- writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 2.0f, -1.f);
- execute();
- {
- const auto errors = mReader.takeErrors();
- ASSERT_EQ(1, errors.size());
- EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
- }
-
- writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ -2.0f, -1.f);
- execute();
- {
- const auto errors = mReader.takeErrors();
- ASSERT_EQ(1, errors.size());
- EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
+ writer.setDisplayBrightness(display.getDisplayId(), /*brightness*/ 2.0f, -1.f);
+ execute();
+ {
+ const auto errors = mReader.takeErrors();
+ ASSERT_EQ(1, errors.size());
+ EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
+ }
}
}
TEST_P(GraphicsComposerAidlCommandTest, SetClientTarget) {
- EXPECT_TRUE(mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kBufferSlotCount)
+ for (const auto& display : mDisplays) {
+ EXPECT_TRUE(
+ mComposerClient->setClientTargetSlotCount(display.getDisplayId(), kBufferSlotCount)
.isOk());
- auto& writer = getWriter(getPrimaryDisplayId());
- writer.setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, nullptr, /*acquireFence*/ -1,
- Dataspace::UNKNOWN, std::vector<Rect>(), 1.0f);
+ auto& writer = getWriter(display.getDisplayId());
+ writer.setClientTarget(display.getDisplayId(), /*slot*/ 0, nullptr, /*acquireFence*/ -1,
+ Dataspace::UNKNOWN, std::vector<Rect>(), 1.0f);
- execute();
+ execute();
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetOutputBuffer) {
@@ -1933,34 +2009,43 @@
kBufferSlotCount);
EXPECT_TRUE(displayStatus.isOk());
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+ // Use dimensions from the primary display
+ const DisplayWrapper& primary = mDisplays[0];
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, primary);
const auto handle = buffer->handle;
auto& writer = getWriter(display.display);
- writer.setOutputBuffer(display.display, /*slot*/ 0, handle, /*releaseFence*/ -1);
+ writer.setOutputBuffer(display.display, /*slot*/ 0, handle,
+ /*releaseFence*/ -1);
execute();
}
TEST_P(GraphicsComposerAidlCommandTest, ValidDisplay) {
- auto& writer = getWriter(getPrimaryDisplayId());
- writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
- execute();
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp,
+ ComposerClientWrapper::kNoFrameIntervalNs);
+ execute();
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, AcceptDisplayChanges) {
- auto& writer = getWriter(getPrimaryDisplayId());
- writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
- writer.acceptDisplayChanges(getPrimaryDisplayId());
- execute();
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp,
+ ComposerClientWrapper::kNoFrameIntervalNs);
+ writer.acceptDisplayChanges(display.getDisplayId());
+ execute();
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, PresentDisplay) {
- auto& writer = getWriter(getPrimaryDisplayId());
- writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
- writer.presentDisplay(getPrimaryDisplayId());
- execute();
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp,
+ ComposerClientWrapper::kNoFrameIntervalNs);
+ writer.presentDisplay(display.getDisplayId());
+ execute();
+ }
}
/**
@@ -1971,264 +2056,282 @@
* surface damage have been set
*/
TEST_P(GraphicsComposerAidlCommandTest, PresentDisplayNoLayerStateChanges) {
- EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
+ for (const auto& display : mDisplays) {
+ EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::ON).isOk());
- const auto& [renderIntentsStatus, renderIntents] =
- mComposerClient->getRenderIntents(getPrimaryDisplayId(), ColorMode::NATIVE);
- EXPECT_TRUE(renderIntentsStatus.isOk());
- auto& writer = getWriter(getPrimaryDisplayId());
- for (auto intent : renderIntents) {
- EXPECT_TRUE(mComposerClient->setColorMode(getPrimaryDisplayId(), ColorMode::NATIVE, intent)
+ const auto& [renderIntentsStatus, renderIntents] =
+ mComposerClient->getRenderIntents(display.getDisplayId(), ColorMode::NATIVE);
+ EXPECT_TRUE(renderIntentsStatus.isOk());
+ auto& writer = getWriter(display.getDisplayId());
+ for (auto intent : renderIntents) {
+ EXPECT_TRUE(
+ mComposerClient->setColorMode(display.getDisplayId(), ColorMode::NATIVE, intent)
.isOk());
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
- const auto handle = buffer->handle;
- ASSERT_NE(nullptr, handle);
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, display);
+ const auto handle = buffer->handle;
+ ASSERT_NE(nullptr, handle);
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
- Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
- getPrimaryDisplay().getDisplayHeight()};
- FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
- (float)getPrimaryDisplay().getDisplayHeight()};
- configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
- writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle,
- /*acquireFence*/ -1);
- writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
- writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
- execute();
- if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
- GTEST_SUCCEED() << "Composition change requested, skipping test";
- return;
+ Rect displayFrame{0, 0, display.getDisplayWidth(), display.getDisplayHeight()};
+ FRect cropRect{0, 0, (float)display.getDisplayWidth(),
+ (float)display.getDisplayHeight()};
+ configureLayer(display, layer, Composition::CURSOR, displayFrame, cropRect);
+ writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, handle,
+ /*acquireFence*/ -1);
+ writer.setLayerDataspace(display.getDisplayId(), layer, Dataspace::UNKNOWN);
+ writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp,
+ ComposerClientWrapper::kNoFrameIntervalNs);
+ execute();
+ if (!mReader.takeChangedCompositionTypes(display.getDisplayId()).empty()) {
+ GTEST_SUCCEED() << "Composition change requested, skipping test";
+ return;
+ }
+
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.presentDisplay(display.getDisplayId());
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+
+ const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888, display);
+ const auto handle2 = buffer2->handle;
+ ASSERT_NE(nullptr, handle2);
+ writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, handle2,
+ /*acquireFence*/ -1);
+ writer.setLayerSurfaceDamage(display.getDisplayId(), layer,
+ std::vector<Rect>(1, {0, 0, 10, 10}));
+ writer.presentDisplay(display.getDisplayId());
+ execute();
}
-
- ASSERT_TRUE(mReader.takeErrors().empty());
- writer.presentDisplay(getPrimaryDisplayId());
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
-
- const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
- const auto handle2 = buffer2->handle;
- ASSERT_NE(nullptr, handle2);
- writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle2,
- /*acquireFence*/ -1);
- writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer,
- std::vector<Rect>(1, {0, 0, 10, 10}));
- writer.presentDisplay(getPrimaryDisplayId());
- execute();
}
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerCursorPosition) {
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
- const auto handle = buffer->handle;
- ASSERT_NE(nullptr, handle);
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, display);
+ const auto handle = buffer->handle;
+ ASSERT_NE(nullptr, handle);
- writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
+ writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, handle,
+ /*acquireFence*/ -1);
- Rect displayFrame{0, 0, getPrimaryDisplay().getDisplayWidth(),
- getPrimaryDisplay().getDisplayHeight()};
- FRect cropRect{0, 0, (float)getPrimaryDisplay().getDisplayWidth(),
- (float)getPrimaryDisplay().getDisplayHeight()};
- configureLayer(getPrimaryDisplay(), layer, Composition::CURSOR, displayFrame, cropRect);
- writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
- writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ Rect displayFrame{0, 0, display.getDisplayWidth(), display.getDisplayHeight()};
+ FRect cropRect{0, 0, (float)display.getDisplayWidth(), (float)display.getDisplayHeight()};
+ configureLayer(display, layer, Composition::CURSOR, displayFrame, cropRect);
+ writer.setLayerDataspace(display.getDisplayId(), layer, Dataspace::UNKNOWN);
+ writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp,
+ ComposerClientWrapper::kNoFrameIntervalNs);
- execute();
+ execute();
- if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
- GTEST_SUCCEED() << "Composition change requested, skipping test";
- return;
+ if (!mReader.takeChangedCompositionTypes(display.getDisplayId()).empty()) {
+ continue; // Skip this display if composition change requested
+ }
+ writer.presentDisplay(display.getDisplayId());
+ ASSERT_TRUE(mReader.takeErrors().empty());
+
+ writer.setLayerCursorPosition(display.getDisplayId(), layer, /*x*/ 1, /*y*/ 1);
+ execute();
+
+ writer.setLayerCursorPosition(display.getDisplayId(), layer, /*x*/ 0, /*y*/ 0);
+ writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp,
+ ComposerClientWrapper::kNoFrameIntervalNs);
+ execute();
}
- writer.presentDisplay(getPrimaryDisplayId());
- ASSERT_TRUE(mReader.takeErrors().empty());
-
- writer.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 1, /*y*/ 1);
- execute();
-
- writer.setLayerCursorPosition(getPrimaryDisplayId(), layer, /*x*/ 0, /*y*/ 0);
- writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
- writer.presentDisplay(getPrimaryDisplayId());
- execute();
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerBuffer) {
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
- const auto handle = buffer->handle;
- ASSERT_NE(nullptr, handle);
+ for (const auto& display : mDisplays) {
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, display);
+ const auto handle = buffer->handle;
+ ASSERT_NE(nullptr, handle);
- 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();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
+ writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, handle,
+ /*acquireFence*/ -1);
+ execute();
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerBufferMultipleTimes) {
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), 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
- // slot to a placeholder buffer, and then restoring the active buffer.
+ // 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
+ // slot to a placeholder buffer, and then restoring the active buffer.
- // This is used on HALs that don't support setLayerBufferSlotsToClear (version <= 3.1).
+ // This is used on HALs that don't support setLayerBufferSlotsToClear (version <= 3.1).
- const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
- ASSERT_NE(nullptr, buffer1);
- const auto handle1 = buffer1->handle;
- writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle1, /*acquireFence*/ -1);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888, display);
+ ASSERT_NE(nullptr, buffer1);
+ const auto handle1 = buffer1->handle;
+ writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, handle1,
+ /*acquireFence*/ -1);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
- ASSERT_NE(nullptr, buffer2);
- const auto handle2 = buffer2->handle;
- writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 1, handle2, /*acquireFence*/ -1);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888, display);
+ ASSERT_NE(nullptr, buffer2);
+ const auto handle2 = buffer2->handle;
+ writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 1, handle2,
+ /*acquireFence*/ -1);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- const auto buffer3 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
- ASSERT_NE(nullptr, buffer3);
- const auto handle3 = buffer3->handle;
- writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 2, handle3, /*acquireFence*/ -1);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ const auto buffer3 = allocate(::android::PIXEL_FORMAT_RGBA_8888, display);
+ ASSERT_NE(nullptr, buffer3);
+ const auto handle3 = buffer3->handle;
+ writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 2, handle3,
+ /*acquireFence*/ -1);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- // Older versions of the HAL clear all but the active buffer slot with a placeholder buffer,
- // and then restoring the current active buffer at the end
- auto clearSlotBuffer = allocate(1u, 1u, ::android::PIXEL_FORMAT_RGB_888);
- ASSERT_NE(nullptr, clearSlotBuffer);
- auto clearSlotBufferHandle = clearSlotBuffer->handle;
+ // Older versions of the HAL clear all but the active buffer slot with a placeholder buffer,
+ // and then restoring the current active buffer at the end
+ auto clearSlotBuffer = allocate(1u, 1u, ::android::PIXEL_FORMAT_RGB_888);
+ ASSERT_NE(nullptr, clearSlotBuffer);
+ auto clearSlotBufferHandle = clearSlotBuffer->handle;
- // clear buffer slots 0 and 1 with new layer commands... and then...
- writer.setLayerBufferWithNewCommand(getPrimaryDisplayId(), layer, /* slot */ 0,
- clearSlotBufferHandle, /*acquireFence*/ -1);
- writer.setLayerBufferWithNewCommand(getPrimaryDisplayId(), layer, /* slot */ 1,
- clearSlotBufferHandle, /*acquireFence*/ -1);
- // ...reset the layer buffer to the current active buffer slot with a final new command
- writer.setLayerBufferWithNewCommand(getPrimaryDisplayId(), layer, /*slot*/ 2, nullptr,
- /*acquireFence*/ -1);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ // clear buffer slots 0 and 1 with new layer commands... and then...
+ writer.setLayerBufferWithNewCommand(display.getDisplayId(), layer, /* slot */ 0,
+ clearSlotBufferHandle, /*acquireFence*/ -1);
+ writer.setLayerBufferWithNewCommand(display.getDisplayId(), layer, /* slot */ 1,
+ clearSlotBufferHandle, /*acquireFence*/ -1);
+ // ...reset the layer buffer to the current active buffer slot with a final new command
+ writer.setLayerBufferWithNewCommand(display.getDisplayId(), layer, /*slot*/ 2, nullptr,
+ /*acquireFence*/ -1);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerSurfaceDamage) {
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
- Rect empty{0, 0, 0, 0};
- Rect unit{0, 0, 1, 1};
+ Rect empty{0, 0, 0, 0};
+ Rect unit{0, 0, 1, 1};
- writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerSurfaceDamage(display.getDisplayId(), layer, std::vector<Rect>(1, empty));
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerSurfaceDamage(display.getDisplayId(), layer, std::vector<Rect>(1, unit));
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerSurfaceDamage(getPrimaryDisplayId(), layer, std::vector<Rect>());
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerSurfaceDamage(display.getDisplayId(), layer, std::vector<Rect>());
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlockingRegion) {
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
- Rect empty{0, 0, 0, 0};
- Rect unit{0, 0, 1, 1};
+ Rect empty{0, 0, 0, 0};
+ Rect unit{0, 0, 1, 1};
- writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerBlockingRegion(display.getDisplayId(), layer, std::vector<Rect>(1, empty));
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerBlockingRegion(display.getDisplayId(), layer, std::vector<Rect>(1, unit));
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerBlockingRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerBlockingRegion(display.getDisplayId(), layer, std::vector<Rect>());
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerBlendMode) {
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
- writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::NONE);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerBlendMode(display.getDisplayId(), layer, BlendMode::NONE);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::PREMULTIPLIED);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerBlendMode(display.getDisplayId(), layer, BlendMode::PREMULTIPLIED);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerBlendMode(getPrimaryDisplayId(), layer, BlendMode::COVERAGE);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerBlendMode(display.getDisplayId(), layer, BlendMode::COVERAGE);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerColor) {
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
- writer.setLayerColor(getPrimaryDisplayId(), layer, Color{1.0f, 1.0f, 1.0f, 1.0f});
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerColor(display.getDisplayId(), layer, Color{1.0f, 1.0f, 1.0f, 1.0f});
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerColor(getPrimaryDisplayId(), layer, Color{0.0f, 0.0f, 0.0f, 0.0f});
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerColor(display.getDisplayId(), layer, Color{0.0f, 0.0f, 0.0f, 0.0f});
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerCompositionType) {
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
- writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CLIENT);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerCompositionType(display.getDisplayId(), layer, Composition::CLIENT);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::DEVICE);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerCompositionType(display.getDisplayId(), layer, Composition::DEVICE);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::SOLID_COLOR);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerCompositionType(display.getDisplayId(), layer, Composition::SOLID_COLOR);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerCompositionType(getPrimaryDisplayId(), layer, Composition::CURSOR);
- execute();
+ writer.setLayerCompositionType(display.getDisplayId(), layer, Composition::CURSOR);
+ execute();
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, DisplayDecoration) {
- for (VtsDisplay& display : mDisplays) {
+ for (DisplayWrapper& display : mDisplays) {
const auto displayId = display.getDisplayId();
auto& writer = getWriter(displayId);
const auto [layerStatus, layer] =
@@ -2239,7 +2342,7 @@
const auto format = (error.isOk() && support) ? support->format
: aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888;
- const auto decorBuffer = allocate(static_cast<::android::PixelFormat>(format));
+ const auto decorBuffer = allocate(static_cast<::android::PixelFormat>(format), display);
ASSERT_NE(nullptr, decorBuffer);
if (::android::OK != decorBuffer->initCheck()) {
if (support) {
@@ -2258,7 +2361,7 @@
writer.setLayerBuffer(displayId, layer, /*slot*/ 0, decorBuffer->handle,
/*acquireFence*/ -1);
writer.validateDisplay(displayId, ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute();
if (support) {
ASSERT_TRUE(mReader.takeErrors().empty());
@@ -2272,38 +2375,42 @@
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerDataspace) {
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
-
- writer.setLayerDataspace(getPrimaryDisplayId(), layer, Dataspace::UNKNOWN);
- execute();
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
+ writer.setLayerDataspace(display.getDisplayId(), layer, Dataspace::UNKNOWN);
+ execute();
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerDisplayFrame) {
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
-
- writer.setLayerDisplayFrame(getPrimaryDisplayId(), layer, Rect{0, 0, 1, 1});
- execute();
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
+ writer.setLayerDisplayFrame(display.getDisplayId(), layer, Rect{0, 0, 1, 1});
+ execute();
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerPlaneAlpha) {
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
- writer.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 0.0f);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerPlaneAlpha(display.getDisplayId(), layer, /*alpha*/ 0.0f);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerPlaneAlpha(getPrimaryDisplayId(), layer, /*alpha*/ 1.0f);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerPlaneAlpha(display.getDisplayId(), layer, /*alpha*/ 1.0f);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerSidebandStream) {
@@ -2312,186 +2419,201 @@
return;
}
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
- const auto handle = buffer->handle;
- ASSERT_NE(nullptr, handle);
+ for (const auto& display : mDisplays) {
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, display);
+ const auto handle = buffer->handle;
+ ASSERT_NE(nullptr, handle);
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
- writer.setLayerSidebandStream(getPrimaryDisplayId(), layer, handle);
- execute();
+ writer.setLayerSidebandStream(display.getDisplayId(), layer, handle);
+ execute();
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerSourceCrop) {
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
- writer.setLayerSourceCrop(getPrimaryDisplayId(), layer, FRect{0.0f, 0.0f, 1.0f, 1.0f});
- execute();
+ writer.setLayerSourceCrop(display.getDisplayId(), 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, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
- writer.setLayerTransform(getPrimaryDisplayId(), layer, static_cast<Transform>(0));
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerTransform(display.getDisplayId(), layer, static_cast<Transform>(0));
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_H);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerTransform(display.getDisplayId(), layer, Transform::FLIP_H);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::FLIP_V);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerTransform(display.getDisplayId(), layer, Transform::FLIP_V);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_90);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerTransform(display.getDisplayId(), layer, Transform::ROT_90);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_180);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerTransform(display.getDisplayId(), layer, Transform::ROT_180);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerTransform(getPrimaryDisplayId(), layer, Transform::ROT_270);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerTransform(display.getDisplayId(), layer, Transform::ROT_270);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerTransform(getPrimaryDisplayId(), layer,
- static_cast<Transform>(static_cast<int>(Transform::FLIP_H) |
- static_cast<int>(Transform::ROT_90)));
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerTransform(display.getDisplayId(), layer,
+ static_cast<Transform>(static_cast<int>(Transform::FLIP_H) |
+ static_cast<int>(Transform::ROT_90)));
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerTransform(getPrimaryDisplayId(), layer,
- static_cast<Transform>(static_cast<int>(Transform::FLIP_V) |
- static_cast<int>(Transform::ROT_90)));
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerTransform(display.getDisplayId(), layer,
+ static_cast<Transform>(static_cast<int>(Transform::FLIP_V) |
+ static_cast<int>(Transform::ROT_90)));
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerVisibleRegion) {
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
- Rect empty{0, 0, 0, 0};
- Rect unit{0, 0, 1, 1};
+ Rect empty{0, 0, 0, 0};
+ Rect unit{0, 0, 1, 1};
- writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, empty));
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerVisibleRegion(display.getDisplayId(), layer, std::vector<Rect>(1, empty));
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>(1, unit));
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerVisibleRegion(display.getDisplayId(), layer, std::vector<Rect>(1, unit));
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerVisibleRegion(getPrimaryDisplayId(), layer, std::vector<Rect>());
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerVisibleRegion(display.getDisplayId(), layer, std::vector<Rect>());
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerZOrder) {
- auto& writer = getWriter(getPrimaryDisplayId());
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
- writer.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 10);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerZOrder(display.getDisplayId(), layer, /*z*/ 10);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerZOrder(getPrimaryDisplayId(), layer, /*z*/ 0);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerZOrder(display.getDisplayId(), layer, /*z*/ 0);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerPerFrameMetadata) {
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
- /**
- * DISPLAY_P3 is a color space that uses the DCI_P3 primaries,
- * the D65 white point and the SRGB transfer functions.
- * Rendering Intent: Colorimetric
- * Primaries:
- * x y
- * green 0.265 0.690
- * blue 0.150 0.060
- * red 0.680 0.320
- * white (D65) 0.3127 0.3290
- */
+ /**
+ * DISPLAY_P3 is a color space that uses the DCI_P3 primaries,
+ * the D65 white point and the SRGB transfer functions.
+ * Rendering Intent: Colorimetric
+ * Primaries:
+ * x y
+ * green 0.265 0.690
+ * blue 0.150 0.060
+ * red 0.680 0.320
+ * white (D65) 0.3127 0.3290
+ */
- std::vector<PerFrameMetadata> aidlMetadata;
- aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X, 0.680f});
- aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y, 0.320f});
- aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X, 0.265f});
- aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y, 0.690f});
- aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X, 0.150f});
- aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y, 0.060f});
- aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_X, 0.3127f});
- aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_Y, 0.3290f});
- aidlMetadata.push_back({PerFrameMetadataKey::MAX_LUMINANCE, 100.0f});
- aidlMetadata.push_back({PerFrameMetadataKey::MIN_LUMINANCE, 0.1f});
- aidlMetadata.push_back({PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL, 78.0});
- aidlMetadata.push_back({PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL, 62.0});
- writer.setLayerPerFrameMetadata(getPrimaryDisplayId(), layer, aidlMetadata);
- execute();
+ std::vector<PerFrameMetadata> aidlMetadata;
+ aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X, 0.680f});
+ aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y, 0.320f});
+ aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X, 0.265f});
+ aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y, 0.690f});
+ aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X, 0.150f});
+ aidlMetadata.push_back({PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y, 0.060f});
+ aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_X, 0.3127f});
+ aidlMetadata.push_back({PerFrameMetadataKey::WHITE_POINT_Y, 0.3290f});
+ aidlMetadata.push_back({PerFrameMetadataKey::MAX_LUMINANCE, 100.0f});
+ aidlMetadata.push_back({PerFrameMetadataKey::MIN_LUMINANCE, 0.1f});
+ aidlMetadata.push_back({PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL, 78.0});
+ aidlMetadata.push_back({PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL, 62.0});
+ writer.setLayerPerFrameMetadata(display.getDisplayId(), layer, aidlMetadata);
+ execute();
- 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, &writer).isOk());
- return;
+ 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(display.getDisplayId(), layer, &writer).isOk());
+ return;
+ }
+
+ EXPECT_TRUE(mComposerClient->destroyLayer(display.getDisplayId(), layer, &writer).isOk());
}
-
- EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer, &writer).isOk());
}
TEST_P(GraphicsComposerAidlCommandTest, setLayerBrightness) {
- auto& writer = getWriter(getPrimaryDisplayId());
+ for (const auto& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
- writer.setLayerBrightness(getPrimaryDisplayId(), layer, 0.2f);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerBrightness(display.getDisplayId(), layer, 0.2f);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerBrightness(getPrimaryDisplayId(), layer, 1.f);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerBrightness(display.getDisplayId(), layer, 1.f);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerBrightness(getPrimaryDisplayId(), layer, 0.f);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ writer.setLayerBrightness(display.getDisplayId(), layer, 0.f);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- writer.setLayerBrightness(getPrimaryDisplayId(), layer, -1.f);
- execute();
- {
- const auto errors = mReader.takeErrors();
- ASSERT_EQ(1, errors.size());
- EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
- }
+ writer.setLayerBrightness(display.getDisplayId(), layer, -1.f);
+ execute();
+ {
+ const auto errors = mReader.takeErrors();
+ ASSERT_EQ(1, errors.size());
+ EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
+ }
- writer.setLayerBrightness(getPrimaryDisplayId(), layer, std::nanf(""));
- execute();
- {
- const auto errors = mReader.takeErrors();
- ASSERT_EQ(1, errors.size());
- EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
+ writer.setLayerBrightness(display.getDisplayId(), layer, std::nanf(""));
+ execute();
+ {
+ const auto errors = mReader.takeErrors();
+ ASSERT_EQ(1, errors.size());
+ EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
+ }
}
}
@@ -2509,7 +2631,7 @@
}
TEST_P(GraphicsComposerAidlCommandTest, GetDisplayVsyncPeriod) {
- for (VtsDisplay& display : mDisplays) {
+ for (DisplayWrapper& display : mDisplays) {
const auto& [status, configs] = mComposerClient->getDisplayConfigs(display.getDisplayId());
EXPECT_TRUE(status.isOk());
@@ -2568,7 +2690,7 @@
constraints.seamlessRequired = true;
constraints.desiredTimeNanos = systemTime();
- for (VtsDisplay& display : mDisplays) {
+ for (DisplayWrapper& display : mDisplays) {
forEachTwoConfigs(display.getDisplayId(), [&](int32_t config1, int32_t config2) {
int32_t configGroup1 = display.getDisplayConfig(config1).configGroup;
int32_t configGroup2 = display.getDisplayConfig(config2).configGroup;
@@ -2598,77 +2720,86 @@
}
TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Unsupported) {
- const bool hasDisplayIdleTimerSupport =
- hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
- if (!hasDisplayIdleTimerSupport) {
- const auto& status =
- mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0);
- EXPECT_FALSE(status.isOk());
- EXPECT_NO_FATAL_FAILURE(
- assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
+ for (const DisplayWrapper& display : mDisplays) {
+ const bool hasDisplayIdleTimerSupport =
+ hasDisplayCapability(display.getDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
+ if (!hasDisplayIdleTimerSupport) {
+ const auto& status =
+ mComposerClient->setIdleTimerEnabled(display.getDisplayId(), /*timeout*/ 0);
+ EXPECT_FALSE(status.isOk());
+ EXPECT_NO_FATAL_FAILURE(
+ assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
+ }
}
}
TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_BadParameter) {
- const bool hasDisplayIdleTimerSupport =
- hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
- if (!hasDisplayIdleTimerSupport) {
- GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
- return;
- }
+ for (const DisplayWrapper& display : mDisplays) {
+ const bool hasDisplayIdleTimerSupport =
+ hasDisplayCapability(display.getDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
+ if (!hasDisplayIdleTimerSupport) {
+ continue; // DisplayCapability::DISPLAY_IDLE_TIMER is not supported
+ }
- const auto& status =
- mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ -1);
- EXPECT_FALSE(status.isOk());
- EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
+ const auto& status =
+ mComposerClient->setIdleTimerEnabled(display.getDisplayId(), /*timeout*/ -1);
+ EXPECT_FALSE(status.isOk());
+ EXPECT_NO_FATAL_FAILURE(
+ assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Disable) {
- const bool hasDisplayIdleTimerSupport =
- hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
- if (!hasDisplayIdleTimerSupport) {
- GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
- return;
- }
+ for (const DisplayWrapper& display : mDisplays) {
+ const bool hasDisplayIdleTimerSupport =
+ hasDisplayCapability(display.getDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
+ if (!hasDisplayIdleTimerSupport) {
+ continue; // DisplayCapability::DISPLAY_IDLE_TIMER is not supported
+ }
- EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
- std::this_thread::sleep_for(1s);
- EXPECT_EQ(0, mComposerClient->getVsyncIdleCount());
+ EXPECT_TRUE(
+ mComposerClient->setIdleTimerEnabled(display.getDisplayId(), /*timeout*/ 0).isOk());
+ std::this_thread::sleep_for(1s);
+ EXPECT_EQ(0, mComposerClient->getVsyncIdleCount());
+ }
}
TEST_P(GraphicsComposerAidlCommandTest, SetIdleTimerEnabled_Timeout_2) {
- const bool hasDisplayIdleTimerSupport =
- hasDisplayCapability(getPrimaryDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
- if (!hasDisplayIdleTimerSupport) {
- GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
- return;
+ for (const DisplayWrapper& display : mDisplays) {
+ const bool hasDisplayIdleTimerSupport =
+ hasDisplayCapability(display.getDisplayId(), DisplayCapability::DISPLAY_IDLE_TIMER);
+ if (!hasDisplayIdleTimerSupport) {
+ GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
+ return;
+ }
+
+ EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::ON).isOk());
+ EXPECT_TRUE(
+ mComposerClient->setIdleTimerEnabled(display.getDisplayId(), /*timeout*/ 0).isOk());
+
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, display);
+ ASSERT_NE(nullptr, buffer->handle);
+
+ const auto layer = createOnScreenLayer(display);
+ auto& writer = getWriter(display.getDisplayId());
+ writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
+ /*acquireFence*/ -1);
+ int32_t vsyncIdleCount = mComposerClient->getVsyncIdleCount();
+ auto earlyVsyncIdleTime = systemTime() + std::chrono::nanoseconds(2s).count();
+ EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(display.getDisplayId(), /*timeout*/ 2000)
+ .isOk());
+
+ const sp<::android::Fence> presentFence =
+ presentAndGetFence(ComposerClientWriter::kNoTimestamp, display.getDisplayId());
+ presentFence->waitForever(LOG_TAG);
+
+ std::this_thread::sleep_for(3s);
+ if (vsyncIdleCount < mComposerClient->getVsyncIdleCount()) {
+ EXPECT_GE(mComposerClient->getVsyncIdleTime(), earlyVsyncIdleTime);
+ }
+
+ EXPECT_TRUE(mComposerClient->setPowerMode(display.getDisplayId(), PowerMode::OFF).isOk());
}
-
- EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
- EXPECT_TRUE(mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 0).isOk());
-
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
- ASSERT_NE(nullptr, buffer->handle);
-
- const auto layer = createOnScreenLayer(getPrimaryDisplay());
- auto& writer = getWriter(getPrimaryDisplayId());
- writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer->handle,
- /*acquireFence*/ -1);
- int32_t vsyncIdleCount = mComposerClient->getVsyncIdleCount();
- auto earlyVsyncIdleTime = systemTime() + std::chrono::nanoseconds(2s).count();
- EXPECT_TRUE(
- mComposerClient->setIdleTimerEnabled(getPrimaryDisplayId(), /*timeout*/ 2000).isOk());
-
- const sp<::android::Fence> presentFence =
- presentAndGetFence(ComposerClientWriter::kNoTimestamp);
- presentFence->waitForever(LOG_TAG);
-
- std::this_thread::sleep_for(3s);
- if (vsyncIdleCount < mComposerClient->getVsyncIdleCount()) {
- EXPECT_GE(mComposerClient->getVsyncIdleTime(), earlyVsyncIdleTime);
- }
-
- EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
}
class GraphicsComposerAidlCommandV2Test : public GraphicsComposerAidlCommandTest {
@@ -2680,6 +2811,7 @@
}
}
};
+
/**
* Test Capability::SKIP_VALIDATE
*
@@ -2694,58 +2826,66 @@
}
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, &writer);
- EXPECT_TRUE(layerStatus.isOk());
+ for (const DisplayWrapper& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ // 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(display.getDisplayId(), 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
+ // 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
- const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
- ASSERT_NE(nullptr, buffer1);
- const auto handle1 = buffer1->handle;
- writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle1, /*acquireFence*/ -1);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ const auto buffer1 = allocate(::android::PIXEL_FORMAT_RGBA_8888, display.getDisplayId());
+ ASSERT_NE(nullptr, buffer1);
+ const auto handle1 = buffer1->handle;
+ writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, handle1,
+ /*acquireFence*/ -1);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
- ASSERT_NE(nullptr, buffer2);
- const auto handle2 = buffer2->handle;
- writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 1, handle2, /*acquireFence*/ -1);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ const auto buffer2 = allocate(::android::PIXEL_FORMAT_RGBA_8888, display.getDisplayId());
+ ASSERT_NE(nullptr, buffer2);
+ const auto handle2 = buffer2->handle;
+ writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 1, handle2,
+ /*acquireFence*/ -1);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- const auto buffer3 = allocate(::android::PIXEL_FORMAT_RGBA_8888);
- ASSERT_NE(nullptr, buffer3);
- const auto handle3 = buffer3->handle;
- writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 2, handle3, /*acquireFence*/ -1);
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ const auto buffer3 = allocate(::android::PIXEL_FORMAT_RGBA_8888, display.getDisplayId());
+ ASSERT_NE(nullptr, buffer3);
+ const auto handle3 = buffer3->handle;
+ writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 2, handle3,
+ /*acquireFence*/ -1);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
- // Ensure we can clear all 3 buffer slots, even the active buffer - it is assumed the
- // current active buffer's slot will be cleared, but still remain the active buffer and no
- // errors will occur.
- writer.setLayerBufferSlotsToClear(getPrimaryDisplayId(), layer, {0, 1, 2});
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ // Ensure we can clear all 3 buffer slots, even the active buffer - it is assumed the
+ // current active buffer's slot will be cleared, but still remain the active buffer and no
+ // errors will occur.
+ writer.setLayerBufferSlotsToClear(display.getDisplayId(), layer, {0, 1, 2});
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ }
}
TEST_P(GraphicsComposerAidlCommandV2Test, SetRefreshRateChangedCallbackDebug_Unsupported) {
if (!hasCapability(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG)) {
- auto status = mComposerClient->setRefreshRateChangedCallbackDebugEnabled(
- getPrimaryDisplayId(), /*enabled*/ true);
- EXPECT_FALSE(status.isOk());
- EXPECT_NO_FATAL_FAILURE(
- assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
+ for (const DisplayWrapper& display : mDisplays) {
+ auto status = mComposerClient->setRefreshRateChangedCallbackDebugEnabled(
+ display.getDisplayId(), /*enabled*/ true);
+ EXPECT_FALSE(status.isOk());
+ EXPECT_NO_FATAL_FAILURE(
+ assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
- status = mComposerClient->setRefreshRateChangedCallbackDebugEnabled(getPrimaryDisplayId(),
- /*enabled*/ false);
- EXPECT_FALSE(status.isOk());
- EXPECT_NO_FATAL_FAILURE(
- assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
+ status = mComposerClient->setRefreshRateChangedCallbackDebugEnabled(
+ display.getDisplayId(),
+ /*enabled*/ false);
+ EXPECT_FALSE(status.isOk());
+ EXPECT_NO_FATAL_FAILURE(
+ assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
+ }
}
}
@@ -2755,7 +2895,7 @@
return;
}
- for (VtsDisplay& display : mDisplays) {
+ for (DisplayWrapper& display : mDisplays) {
const auto displayId = display.getDisplayId();
EXPECT_TRUE(mComposerClient->setPowerMode(displayId, PowerMode::ON).isOk());
// Enable the callback
@@ -2798,54 +2938,55 @@
return;
}
- auto display = getEditablePrimaryDisplay();
- const auto displayId = display.getDisplayId();
+ for (DisplayWrapper& display : mDisplays) {
+ const auto displayId = display.getDisplayId();
- if (!hasDisplayCapability(displayId, DisplayCapability::DISPLAY_IDLE_TIMER)) {
- GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
- return;
- }
-
- EXPECT_TRUE(mComposerClient->setPowerMode(displayId, PowerMode::ON).isOk());
- EXPECT_TRUE(mComposerClient->setPeakRefreshRateConfig(&display).isOk());
-
- ASSERT_TRUE(mComposerClient->setIdleTimerEnabled(displayId, /*timeoutMs*/ 500).isOk());
- // Enable the callback
- ASSERT_TRUE(mComposerClient
- ->setRefreshRateChangedCallbackDebugEnabled(displayId,
- /*enabled*/ true)
- .isOk());
-
- const auto displayFilter = [displayId](auto refreshRateChangedDebugData) {
- return displayId == refreshRateChangedDebugData.display;
- };
-
- int retryCount = 3;
- do {
- // Wait for 1s so that we enter the idle state
- std::this_thread::sleep_for(1s);
- if (!checkIfCallbackRefreshRateChangedDebugEnabledReceived(displayFilter)) {
- // DID NOT receive a callback, we are in the idle state.
- break;
+ if (!hasDisplayCapability(displayId, DisplayCapability::DISPLAY_IDLE_TIMER)) {
+ GTEST_SUCCEED() << "DisplayCapability::DISPLAY_IDLE_TIMER is not supported";
+ return;
}
- } while (--retryCount > 0);
- if (retryCount == 0) {
- GTEST_SUCCEED() << "Unable to enter the idle mode";
- return;
+ EXPECT_TRUE(mComposerClient->setPowerMode(displayId, PowerMode::ON).isOk());
+ EXPECT_TRUE(mComposerClient->setPeakRefreshRateConfig(&display).isOk());
+
+ ASSERT_TRUE(mComposerClient->setIdleTimerEnabled(displayId, /*timeoutMs*/ 500).isOk());
+ // Enable the callback
+ ASSERT_TRUE(mComposerClient
+ ->setRefreshRateChangedCallbackDebugEnabled(displayId,
+ /*enabled*/ true)
+ .isOk());
+
+ const auto displayFilter = [displayId](auto refreshRateChangedDebugData) {
+ return displayId == refreshRateChangedDebugData.display;
+ };
+
+ int retryCount = 3;
+ do {
+ // Wait for 1s so that we enter the idle state
+ std::this_thread::sleep_for(1s);
+ if (!checkIfCallbackRefreshRateChangedDebugEnabledReceived(displayFilter)) {
+ // DID NOT receive a callback, we are in the idle state.
+ break;
+ }
+ } while (--retryCount > 0);
+
+ if (retryCount == 0) {
+ GTEST_SUCCEED() << "Unable to enter the idle mode";
+ return;
+ }
+
+ // Send the REFRESH_RATE_INDICATOR update
+ ASSERT_NO_FATAL_FAILURE(sendBufferUpdate(
+ createOnScreenLayer(display, Composition::REFRESH_RATE_INDICATOR), displayId));
+ std::this_thread::sleep_for(1s);
+ EXPECT_FALSE(checkIfCallbackRefreshRateChangedDebugEnabledReceived(displayFilter))
+ << "A callback should not be received for REFRESH_RATE_INDICATOR";
+
+ EXPECT_TRUE(mComposerClient
+ ->setRefreshRateChangedCallbackDebugEnabled(displayId,
+ /*enabled*/ false)
+ .isOk());
}
-
- // Send the REFRESH_RATE_INDICATOR update
- ASSERT_NO_FATAL_FAILURE(sendBufferUpdate(
- createOnScreenLayer(getPrimaryDisplay(), Composition::REFRESH_RATE_INDICATOR)));
- std::this_thread::sleep_for(1s);
- EXPECT_FALSE(checkIfCallbackRefreshRateChangedDebugEnabledReceived(displayFilter))
- << "A callback should not be received for REFRESH_RATE_INDICATOR";
-
- EXPECT_TRUE(mComposerClient
- ->setRefreshRateChangedCallbackDebugEnabled(displayId,
- /*enabled*/ false)
- .isOk());
}
TEST_P(GraphicsComposerAidlCommandV2Test,
@@ -2859,7 +3000,7 @@
constraints.seamlessRequired = false;
constraints.desiredTimeNanos = systemTime();
- for (VtsDisplay& display : mDisplays) {
+ for (DisplayWrapper& display : mDisplays) {
const auto displayId = display.getDisplayId();
EXPECT_TRUE(mComposerClient->setPowerMode(displayId, PowerMode::ON).isOk());
@@ -2917,7 +3058,7 @@
}
TEST_P(GraphicsComposerAidlCommandTest, MultiThreadedPresent) {
- std::vector<VtsDisplay*> displays;
+ std::vector<DisplayWrapper*> displays;
for (auto& display : mDisplays) {
if (hasDisplayCapability(display.getDisplayId(),
DisplayCapability::MULTI_THREADED_PRESENT)) {
@@ -2959,7 +3100,7 @@
const auto& [status, layer] =
mComposerClient->createLayer(displayId, kBufferSlotCount, &writer);
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, displayId);
ASSERT_NE(nullptr, buffer);
ASSERT_EQ(::android::OK, buffer->initCheck());
ASSERT_NE(nullptr, buffer->handle);
@@ -2980,7 +3121,7 @@
lock.unlock();
writer.validateDisplay(displayId, ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
+ ComposerClientWrapper::kNoFrameIntervalNs);
execute(writer, reader);
threads.emplace_back([this, displayId, &readers, &readersMutex]() {
@@ -3034,12 +3175,14 @@
GTEST_SKIP() << "LAYER_LIFECYCLE_BATCH_COMMAND not supported by the implementation";
return;
}
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [status, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(status.isOk());
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ for (const DisplayWrapper& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [status, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(status.isOk());
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ }
}
TEST_P(GraphicsComposerAidlCommandV3Test, CreateBatchedCommand_BadDisplay) {
@@ -3063,15 +3206,18 @@
GTEST_SKIP() << "LAYER_LIFECYCLE_BATCH_COMMAND not supported by the implementation";
return;
}
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [status, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(status.isOk());
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
- EXPECT_TRUE(mComposerClient->destroyLayer(getPrimaryDisplayId(), layer, &writer).isOk());
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+
+ for (const DisplayWrapper& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [status, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(status.isOk());
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ EXPECT_TRUE(mComposerClient->destroyLayer(display.getDisplayId(), layer, &writer).isOk());
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ }
}
TEST_P(GraphicsComposerAidlCommandV3Test, DestroyBatchedCommand_BadDisplay) {
@@ -3079,20 +3225,23 @@
GTEST_SKIP() << "LAYER_LIFECYCLE_BATCH_COMMAND not supported by the implementation";
return;
}
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [status, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(status.isOk());
- execute();
- ASSERT_TRUE(mReader.takeErrors().empty());
+ for (const DisplayWrapper& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [status, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
- auto& invalid_writer = getWriter(getInvalidDisplayId());
- invalid_writer.setLayerLifecycleBatchCommandType(getInvalidDisplayId(), layer,
- LayerLifecycleBatchCommandType::DESTROY);
- execute();
- const auto errors = mReader.takeErrors();
- ASSERT_TRUE(errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_BAD_DISPLAY);
+ EXPECT_TRUE(status.isOk());
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+
+ auto& invalid_writer = getWriter(getInvalidDisplayId());
+ invalid_writer.setLayerLifecycleBatchCommandType(getInvalidDisplayId(), layer,
+ LayerLifecycleBatchCommandType::DESTROY);
+ execute();
+ const auto errors = mReader.takeErrors();
+ ASSERT_TRUE(errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_BAD_DISPLAY);
+ }
}
TEST_P(GraphicsComposerAidlCommandV3Test, NoCreateDestroyBatchedCommandIncorrectLayer) {
@@ -3101,13 +3250,15 @@
return;
}
- auto& writer = getWriter(getPrimaryDisplayId());
- int64_t layer = 5;
- writer.setLayerLifecycleBatchCommandType(getPrimaryDisplayId(), layer,
- LayerLifecycleBatchCommandType::DESTROY);
- execute();
- const auto errors = mReader.takeErrors();
- ASSERT_TRUE(errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_BAD_LAYER);
+ for (const DisplayWrapper& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ int64_t layer = 5;
+ writer.setLayerLifecycleBatchCommandType(display.getDisplayId(), layer,
+ LayerLifecycleBatchCommandType::DESTROY);
+ execute();
+ const auto errors = mReader.takeErrors();
+ ASSERT_TRUE(errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_BAD_LAYER);
+ }
}
TEST_P(GraphicsComposerAidlCommandV3Test, notifyExpectedPresentTimeout) {
@@ -3115,13 +3266,13 @@
GTEST_SUCCEED() << "Device has unreliable present fences capability, skipping";
return;
}
- forEachNotifyExpectedPresentConfig([&](VtsDisplay& display,
+ forEachNotifyExpectedPresentConfig([&](DisplayWrapper& display,
const DisplayConfiguration& config) {
const auto displayId = display.getDisplayId();
auto minFrameIntervalNs = config.vrrConfig->minFrameIntervalNs;
const auto timeoutNs = config.vrrConfig->notifyExpectedPresentConfig->timeoutNs;
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, displayId);
ASSERT_NE(nullptr, buffer);
const auto layer = createOnScreenLayer(display);
auto& writer = getWriter(displayId);
@@ -3155,10 +3306,10 @@
GTEST_SUCCEED() << "Device has unreliable present fences capability, skipping";
return;
}
- forEachNotifyExpectedPresentConfig([&](VtsDisplay& display,
+ forEachNotifyExpectedPresentConfig([&](DisplayWrapper& display,
const DisplayConfiguration& config) {
const auto displayId = display.getDisplayId();
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, displayId);
ASSERT_NE(nullptr, buffer);
const auto layer = createOnScreenLayer(display);
auto& writer = getWriter(displayId);
@@ -3171,7 +3322,7 @@
auto lastPresentTimeNs = presentFence->getSignalTime();
auto vsyncPeriod = config.vsyncPeriod;
- int32_t highestDivisor = VtsComposerClient::kMaxFrameIntervalNs / vsyncPeriod;
+ int32_t highestDivisor = ComposerClientWrapper::kMaxFrameIntervalNs / vsyncPeriod;
int32_t lowestDivisor = minFrameIntervalNs / vsyncPeriod;
const auto headsUpNs = config.vrrConfig->notifyExpectedPresentConfig->headsUpNs;
float totalDivisorsPassed = 0.f;
@@ -3202,10 +3353,10 @@
GTEST_SUCCEED() << "Device has unreliable present fences capability, skipping";
return;
}
- forEachNotifyExpectedPresentConfig([&](VtsDisplay& display,
+ forEachNotifyExpectedPresentConfig([&](DisplayWrapper& display,
const DisplayConfiguration& config) {
const auto displayId = display.getDisplayId();
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, displayId);
ASSERT_NE(nullptr, buffer);
const auto layer = createOnScreenLayer(display);
auto& writer = getWriter(displayId);
@@ -3214,7 +3365,7 @@
auto minFrameIntervalNs = config.vrrConfig->minFrameIntervalNs;
auto vsyncPeriod = config.vsyncPeriod;
- int32_t highestDivisor = VtsComposerClient::kMaxFrameIntervalNs / vsyncPeriod;
+ int32_t highestDivisor = ComposerClientWrapper::kMaxFrameIntervalNs / vsyncPeriod;
int32_t lowestDivisor = minFrameIntervalNs / vsyncPeriod;
const auto headsUpNs = config.vrrConfig->notifyExpectedPresentConfig->headsUpNs;
float totalDivisorsPassed = 0.f;
@@ -3291,7 +3442,7 @@
auto& writer = getWriter(displayId);
const auto layer = createOnScreenLayer(display);
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, displayId);
ASSERT_NE(nullptr, buffer->handle);
// TODO(b/337330263): Lookup profile IDs from MediaQualityManager
writer.setDisplayPictureProfileId(displayId, PictureProfileId(1));
@@ -3316,7 +3467,7 @@
auto& writer = getWriter(displayId);
const auto layer = createOnScreenLayer(display);
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, displayId);
ASSERT_NE(nullptr, buffer->handle);
writer.setLayerBuffer(displayId, layer, /*slot*/ 0, buffer->handle,
/*acquireFence*/ -1);
@@ -3342,7 +3493,7 @@
auto& writer = getWriter(displayId);
for (int profileId = 1; profileId <= maxProfiles + 1; ++profileId) {
const auto layer = createOnScreenLayer(display);
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, displayId);
ASSERT_NE(nullptr, buffer->handle);
writer.setLayerBuffer(displayId, layer, /*slot*/ 0, buffer->handle,
/*acquireFence*/ -1);
@@ -3362,7 +3513,7 @@
int64_t displayId = display.getDisplayId();
auto& writer = getWriter(displayId);
const auto layer = createOnScreenLayer(display);
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, displayId);
ASSERT_NE(nullptr, buffer->handle);
writer.setLayerBuffer(displayId, layer, /*slot*/ 0, buffer->handle,
/*acquireFence*/ -1);
@@ -3381,45 +3532,47 @@
}
TEST_P(GraphicsComposerAidlCommandV4Test, SetUnsupportedLayerLuts) {
- auto& writer = getWriter(getPrimaryDisplayId());
- const auto& [layerStatus, layer] =
- mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
- EXPECT_TRUE(layerStatus.isOk());
- const auto& [status, properties] = mComposerClient->getOverlaySupport();
+ for (const DisplayWrapper& display : mDisplays) {
+ auto& writer = getWriter(display.getDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(display.getDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
+ const auto& [status, properties] = mComposerClient->getOverlaySupport();
- // TODO (b/362319189): add Lut VTS enforcement
- if ((!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
- status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) ||
- (status.isOk() && !properties.lutProperties)) {
- int32_t size = 7;
- size_t bufferSize = static_cast<size_t>(size) * sizeof(float);
- int32_t fd = ashmem_create_region("lut_shared_mem", bufferSize);
- void* ptr = mmap(nullptr, bufferSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- std::vector<float> buffers = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
- memcpy(ptr, buffers.data(), bufferSize);
- munmap(ptr, bufferSize);
- Luts luts;
- luts.offsets = {0};
- luts.lutProperties = {
- {LutProperties::Dimension::ONE_D, size, {LutProperties::SamplingKey::RGB}}};
- luts.pfd = ndk::ScopedFileDescriptor(fd);
+ // TODO (b/362319189): add Lut VTS enforcement
+ if ((!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
+ status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) ||
+ (status.isOk() && !properties.lutProperties)) {
+ int32_t size = 7;
+ size_t bufferSize = static_cast<size_t>(size) * sizeof(float);
+ int32_t fd = ashmem_create_region("lut_shared_mem", bufferSize);
+ void* ptr = mmap(nullptr, bufferSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ std::vector<float> buffers = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
+ memcpy(ptr, buffers.data(), bufferSize);
+ munmap(ptr, bufferSize);
+ Luts luts;
+ luts.offsets = {0};
+ luts.lutProperties = {
+ {LutProperties::Dimension::ONE_D, size, {LutProperties::SamplingKey::RGB}}};
+ luts.pfd = ndk::ScopedFileDescriptor(fd);
- const auto layer = createOnScreenLayer(getPrimaryDisplayId());
- const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
- ASSERT_NE(nullptr, buffer->handle);
- writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, buffer->handle,
- /*acquireFence*/ -1);
- writer.setLayerLuts(getPrimaryDisplayId(), layer, luts);
- writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
- VtsComposerClient::kNoFrameIntervalNs);
- execute();
- const auto errors = mReader.takeErrors();
- if (errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_UNSUPPORTED) {
- GTEST_SUCCEED() << "setLayerLuts is not supported";
- return;
+ const auto layer = createOnScreenLayer(display.getDisplayId());
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888, display.getDisplayId());
+ ASSERT_NE(nullptr, buffer->handle);
+ writer.setLayerBuffer(display.getDisplayId(), layer, /*slot*/ 0, buffer->handle,
+ /*acquireFence*/ -1);
+ writer.setLayerLuts(display.getDisplayId(), layer, luts);
+ writer.validateDisplay(display.getDisplayId(), ComposerClientWriter::kNoTimestamp,
+ ComposerClientWrapper::kNoFrameIntervalNs);
+ execute();
+ const auto errors = mReader.takeErrors();
+ if (errors.size() == 1 && errors[0].errorCode == IComposerClient::EX_UNSUPPORTED) {
+ GTEST_SUCCEED() << "setLayerLuts is not supported";
+ return;
+ }
+ // change to client composition
+ ASSERT_FALSE(mReader.takeChangedCompositionTypes(display.getDisplayId()).empty());
}
- // change to client composition
- ASSERT_FALSE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
}
}
diff --git a/health/aidl/vts/functional/VtsHalHealthTargetTest.cpp b/health/aidl/vts/functional/VtsHalHealthTargetTest.cpp
index a44cd5e..fc735f7 100644
--- a/health/aidl/vts/functional/VtsHalHealthTargetTest.cpp
+++ b/health/aidl/vts/functional/VtsHalHealthTargetTest.cpp
@@ -363,8 +363,14 @@
* Tests the values returned by getHingeInfo() from interface IHealth.
*/
TEST_P(HealthAidl, getHingeInfo) {
+ int32_t version{};
+ auto status = health->getInterfaceVersion(&version);
+ ASSERT_TRUE(status.isOk()) << status;
+ if (version < 4) {
+ GTEST_SKIP() << "Support for hinge health hal is added in v4";
+ }
std::vector<HingeInfo> value;
- auto status = health->getHingeInfo(&value);
+ status = health->getHingeInfo(&value);
ASSERT_THAT(status, AnyOf(IsOk(), ExceptionIs(EX_UNSUPPORTED_OPERATION)));
if (!status.isOk()) return;
for (auto& hinge : value) {
diff --git a/keymaster/4.1/vts/functional/DeviceUniqueAttestationTest.cpp b/keymaster/4.1/vts/functional/DeviceUniqueAttestationTest.cpp
index 4a57f44..fc5979a 100644
--- a/keymaster/4.1/vts/functional/DeviceUniqueAttestationTest.cpp
+++ b/keymaster/4.1/vts/functional/DeviceUniqueAttestationTest.cpp
@@ -229,13 +229,13 @@
.Authorization(TAG_INCLUDE_UNIQUE_ID))));
hidl_vec<hidl_vec<uint8_t>> cert_chain;
- EXPECT_EQ(ErrorCode::UNIMPLEMENTED,
- convert(AttestKey(
- AuthorizationSetBuilder()
+ ErrorCode result = convert(
+ AttestKey(AuthorizationSetBuilder()
.Authorization(TAG_DEVICE_UNIQUE_ATTESTATION)
.Authorization(TAG_ATTESTATION_CHALLENGE, HidlBuf("challenge"))
.Authorization(TAG_ATTESTATION_APPLICATION_ID, HidlBuf("foo")),
- &cert_chain)));
+ &cert_chain));
+ EXPECT_TRUE(result == ErrorCode::UNIMPLEMENTED || result == ErrorCode::INVALID_ARGUMENT);
CheckedDeleteKey();
ASSERT_EQ(ErrorCode::OK, convert(GenerateKey(AuthorizationSetBuilder()
@@ -244,13 +244,13 @@
.Digest(Digest::SHA_2_256)
.Authorization(TAG_INCLUDE_UNIQUE_ID))));
- EXPECT_EQ(ErrorCode::UNIMPLEMENTED,
- convert(AttestKey(
- AuthorizationSetBuilder()
+ result = convert(
+ AttestKey(AuthorizationSetBuilder()
.Authorization(TAG_DEVICE_UNIQUE_ATTESTATION)
.Authorization(TAG_ATTESTATION_CHALLENGE, HidlBuf("challenge"))
.Authorization(TAG_ATTESTATION_APPLICATION_ID, HidlBuf("foo")),
- &cert_chain)));
+ &cert_chain));
+ EXPECT_TRUE(result == ErrorCode::UNIMPLEMENTED || result == ErrorCode::INVALID_ARGUMENT);
CheckedDeleteKey();
}
diff --git a/nfc/aidl/vts/functional/VtsNfcBehaviorChangesTest.cpp b/nfc/aidl/vts/functional/VtsNfcBehaviorChangesTest.cpp
index e93de95..6db7e14 100644
--- a/nfc/aidl/vts/functional/VtsNfcBehaviorChangesTest.cpp
+++ b/nfc/aidl/vts/functional/VtsNfcBehaviorChangesTest.cpp
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+#include "nfc_api.h"
#define LOG_TAG "nfc_behavior_changes_test"
#include <aidl/Gtest.h>
@@ -21,6 +22,7 @@
#include <aidl/android/hardware/nfc/BnNfc.h>
#include <aidl/android/hardware/nfc/INfc.h>
#include <android-base/logging.h>
+#include <android-base/properties.h>
#include <android-base/stringprintf.h>
#include <android/binder_process.h>
#include <gtest/gtest.h>
@@ -43,9 +45,34 @@
static SyncEvent sNfaVsCommand; // event for VS commands
static SyncEvent sNfaEnableDisablePollingEvent;
static SyncEvent sNfaPowerChangeEvent;
+static std::vector<uint8_t> sCaps(0);
+static uint8_t sObserveModeState;
static bool sIsNfaEnabled;
static tNFA_STATUS sVSCmdStatus;
+static const int SET_PASSIVE_OBSERVER_TECH_TIMEOUT_MS = 15;
+
+static int get_vsr_api_level() {
+ int api_level =
+ ::android::base::GetIntProperty("ro.vendor.api_level", -1);
+ if (api_level != -1) {
+ return api_level;
+ }
+
+ api_level =
+ ::android::base::GetIntProperty("ro.board.api_level", -1);
+ if (api_level != -1) {
+ return api_level;
+ }
+
+ api_level =
+ ::android::base::GetIntProperty("ro.board.first_api_level", -1);
+ EXPECT_NE(api_level, -1) << "Could not find VSR API level.";
+
+ return api_level;
+
+}
+
static void nfaDeviceManagementCallback(uint8_t dmEvent, tNFA_DM_CBACK_DATA* eventData) {
LOG(DEBUG) << StringPrintf("%s: enter; event=0x%X", __func__, dmEvent);
@@ -114,21 +141,44 @@
}
}
-void static nfaVSCallback(uint8_t event, uint16_t /* param_len */, uint8_t* p_param) {
+void static nfaVSCallback(uint8_t event, uint16_t param_len, uint8_t* p_param) {
switch (event & NCI_OID_MASK) {
case NCI_MSG_PROP_ANDROID: {
uint8_t android_sub_opcode = p_param[3];
switch (android_sub_opcode) {
- case NCI_ANDROID_SET_PASSIVE_OBSERVER_TECH:
- case NCI_ANDROID_PASSIVE_OBSERVE: {
- sVSCmdStatus = p_param[4];
- LOG(INFO) << StringPrintf("Observe mode RSP: status: %x", sVSCmdStatus);
+ case NCI_QUERY_ANDROID_PASSIVE_OBSERVE: {
+ sObserveModeState = p_param[5];
+ LOG(INFO) << StringPrintf("Query observe mode state response is %x",
+ sObserveModeState);
SyncEventGuard guard(sNfaVsCommand);
sNfaVsCommand.notifyOne();
} break;
+ case NCI_ANDROID_SET_PASSIVE_OBSERVER_TECH:
+ case NCI_ANDROID_PASSIVE_OBSERVE: {
+ if (param_len == 5) {
+ if ((p_param[0] & NCI_MT_MASK) == (NCI_MT_RSP << NCI_MT_SHIFT)) {
+ sVSCmdStatus = p_param[4];
+ LOG(INFO) << StringPrintf("Observe mode RSP: status: %x", sVSCmdStatus);
+ SyncEventGuard guard(sNfaVsCommand);
+ sNfaVsCommand.notifyOne();
+ } else {
+ LOG(WARNING) << StringPrintf(
+ "Observe Mode RSP has incorrect message type: %x", p_param[0]);
+ }
+ } else {
+ LOG(WARNING) << StringPrintf("Observe Mode RSP has incorrect length: %d",
+ param_len);
+ }
+ } break;
case NCI_ANDROID_POLLING_FRAME_NTF: {
// TODO
} break;
+ case NCI_ANDROID_GET_CAPS: {
+ sVSCmdStatus = p_param[4];
+ SyncEventGuard guard(sNfaVsCommand);
+ sCaps.assign(p_param + 8, p_param + param_len);
+ sNfaVsCommand.notifyOne();
+ } break;
default:
LOG(WARNING) << StringPrintf("Unknown Android sub opcode %x",
android_sub_opcode);
@@ -153,8 +203,7 @@
}
}
- uint8_t cmd[] = {(NCI_MT_CMD << NCI_MT_SHIFT) | NCI_GID_PROP, NCI_MSG_PROP_ANDROID,
- NCI_ANDROID_PASSIVE_OBSERVE_PARAM_SIZE, NCI_ANDROID_PASSIVE_OBSERVE,
+ uint8_t cmd[] = {NCI_ANDROID_PASSIVE_OBSERVE,
static_cast<uint8_t>(enable ? NCI_ANDROID_PASSIVE_OBSERVE_PARAM_ENABLE
: NCI_ANDROID_PASSIVE_OBSERVE_PARAM_DISABLE)};
@@ -162,7 +211,7 @@
if (status == NFA_STATUS_OK) {
if (!sNfaVsCommand.wait(1000)) {
- LOG(WARNING) << "Timeout waiting for NFA VS command response";
+ LOG(WARNING) << "Timeout waiting for set observe mode command response";
return NFA_STATUS_TIMEOUT;
}
}
@@ -170,10 +219,83 @@
return status;
}
+/*
+ * Get observe mode state.
+ */
+tNFA_STATUS static nfaQueryObserveModeState() {
+ tNFA_STATUS status = NFA_STATUS_FAILED;
+
+ uint8_t cmd[] = {NCI_QUERY_ANDROID_PASSIVE_OBSERVE};
+
+ status = NFA_SendVsCommand(NCI_MSG_PROP_ANDROID, sizeof(cmd), cmd, nfaVSCallback);
+
+ if (status == NFA_STATUS_OK) {
+ if (!sNfaVsCommand.wait(1000)) {
+ LOG(WARNING) << "Timeout waiting for query observe mode response";
+ return NFA_STATUS_TIMEOUT;
+ }
+ }
+
+ return status;
+}
+
+/*
+ * Enable per-technology observe mode.
+ */
+tNFA_STATUS static nfaSetPassiveObserverTech(uint8_t tech_mask) {
+ tNFA_STATUS status = NFA_STATUS_FAILED;
+
+ uint8_t cmd[] = {NCI_ANDROID_SET_PASSIVE_OBSERVER_TECH, tech_mask};
+
+ status = NFA_SendVsCommand(NCI_MSG_PROP_ANDROID, sizeof(cmd), cmd, nfaVSCallback);
+
+ if (status == NFA_STATUS_OK) {
+ if (!sNfaVsCommand.wait(SET_PASSIVE_OBSERVER_TECH_TIMEOUT_MS)) {
+ LOG(WARNING) << "Timeout waiting for set observer tech response";
+ return NFA_STATUS_TIMEOUT;
+ }
+ }
+
+ return status;
+}
+
+/*
+ * Get chipset capabilities.
+ */
+tNFA_STATUS static nfaGetCaps() {
+ tNFA_STATUS status = NFA_STATUS_FAILED;
+
+ uint8_t cmd[] = {NCI_ANDROID_GET_CAPS};
+ status = NFA_SendVsCommand(NCI_MSG_PROP_ANDROID, sizeof(cmd), cmd, nfaVSCallback);
+
+ if (status == NFA_STATUS_OK) {
+ if (!sNfaVsCommand.wait(1000)) {
+ LOG(WARNING) << "Timeout waiting for GET_CAPS response";
+ return NFA_STATUS_TIMEOUT;
+ }
+ }
+
+ return status;
+}
+
+/*
+ * Get observe mode capabilities.
+ */
+uint8_t static getCapsPassiveObserverModeValue() {
+ return sCaps[2];
+}
+
class NfcBehaviorChanges : public testing::TestWithParam<std::string> {
- protected:
+protected:
void SetUp() override {
tNFA_STATUS status = NFA_STATUS_OK;
+ status = NFA_StartRfDiscovery();
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ ASSERT_TRUE(sNfaEnableDisablePollingEvent.wait(1000)) << "Timeout starting RF discovery";
+ }
+
+ static void SetUpTestSuite() {
+ tNFA_STATUS status = NFA_STATUS_OK;
sIsNfaEnabled = false;
sVSCmdStatus = NFA_STATUS_OK;
@@ -196,34 +318,150 @@
}
ASSERT_TRUE(sIsNfaEnabled) << "Could not initialize NFC controller";
-
- status = NFA_StartRfDiscovery();
- ASSERT_EQ(status, NFA_STATUS_OK);
- ASSERT_TRUE(sNfaEnableDisablePollingEvent.wait(1000)) << "Timeout starting RF discovery";
}
};
/*
- * ObserveModeEnable:
+ * ObserveModeEnableDisable:
* Attempts to enable observe mode. Does not test Observe Mode functionality,
* but simply verifies that the enable command responds successfully.
*
* @VsrTest = GMS-VSR-3.2.8-001
*/
TEST_P(NfcBehaviorChanges, ObserveModeEnableDisable) {
+ if (get_vsr_api_level() < 202404) {
+ GTEST_SKIP() << "Skipping test for board API level < 202404";
+ }
+
tNFA_STATUS status = nfaObserveModeEnable(true);
ASSERT_EQ(status, NFA_STATUS_OK);
+ status = nfaQueryObserveModeState();
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ ASSERT_NE(sObserveModeState, 0);
+
status = nfaObserveModeEnable(false);
ASSERT_EQ(status, NFA_STATUS_OK);
+
+ status = nfaQueryObserveModeState();
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ ASSERT_EQ(sObserveModeState, 0);
+}
+
+/*
+ * SetPassiveObserverTech_individualTechnologies:
+ * Verifies per-technology observe mode is supported as a capability. Then sets observe mode
+ * for each individual technology and verifies the command succeeds.
+ *
+ * @VsrTest = GMS-VSR-3.2.8-002
+ */
+TEST_P(NfcBehaviorChanges, SetPassiveObserverTech_individualTechnologies) {
+ if (get_vsr_api_level() < 202504) {
+ GTEST_SKIP() << "Skipping test for board API level < 202504";
+ }
+
+ tNFC_STATUS status = nfaGetCaps();
+ ASSERT_EQ(status, NFC_STATUS_OK);
+ ASSERT_EQ(getCapsPassiveObserverModeValue(), 0x2);
+
+ status = nfaSetPassiveObserverTech(NCI_ANDROID_PASSIVE_OBSERVE_PARAM_ENABLE_A);
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ status = nfaQueryObserveModeState();
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ ASSERT_EQ(sObserveModeState, NCI_ANDROID_PASSIVE_OBSERVE_PARAM_ENABLE_A);
+
+ status = nfaSetPassiveObserverTech(NCI_ANDROID_PASSIVE_OBSERVE_PARAM_ENABLE_B);
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ status = nfaQueryObserveModeState();
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ ASSERT_EQ(sObserveModeState, NCI_ANDROID_PASSIVE_OBSERVE_PARAM_ENABLE_B);
+
+ status = nfaSetPassiveObserverTech(NCI_ANDROID_PASSIVE_OBSERVE_PARAM_ENABLE_V);
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ status = nfaQueryObserveModeState();
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ ASSERT_EQ(sObserveModeState, NCI_ANDROID_PASSIVE_OBSERVE_PARAM_ENABLE_V);
+
+ status = nfaSetPassiveObserverTech(NCI_ANDROID_PASSIVE_OBSERVE_PARAM_ENABLE_F);
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ status = nfaQueryObserveModeState();
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ ASSERT_EQ(sObserveModeState, NCI_ANDROID_PASSIVE_OBSERVE_PARAM_ENABLE_F);
+}
+
+/*
+ * SetPassiveObserverTech_allExceptF:
+ * Verifies observe mode can be enabled for NFC-A, NFC-B, NFC-V, and disable for NFC-F.
+ *
+ * @VsrTest = GMS-VSR-3.2.8-002
+ */
+TEST_P(NfcBehaviorChanges, SetPassiveObserverTech_allExceptF) {
+ if (get_vsr_api_level() < 202504) {
+ GTEST_SKIP() << "Skipping test for board API level < 202504";
+ }
+
+ tNFC_STATUS status = nfaSetPassiveObserverTech(NCI_ANDROID_PASSIVE_OBSERVE_PARAM_ENABLE_A |
+ NCI_ANDROID_PASSIVE_OBSERVE_PARAM_ENABLE_B |
+ NCI_ANDROID_PASSIVE_OBSERVE_PARAM_ENABLE_V);
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ status = nfaQueryObserveModeState();
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ ASSERT_EQ(sObserveModeState, NCI_ANDROID_PASSIVE_OBSERVE_PARAM_ENABLE_A |
+ NCI_ANDROID_PASSIVE_OBSERVE_PARAM_ENABLE_B |
+ NCI_ANDROID_PASSIVE_OBSERVE_PARAM_ENABLE_V);
+}
+
+/*
+ * SetPassiveObserverTech_allOnAndOff:
+ * Verifies observe mode can be enabled and disabled for all technologies.
+ *
+ * @VsrTest = GMS-VSR-3.2.8-002
+ */
+TEST_P(NfcBehaviorChanges, SetPassiveObserverTech_allOnAndOff) {
+ if (get_vsr_api_level() < 202504) {
+ GTEST_SKIP() << "Skipping test for board API level < 202504";
+ }
+
+ tNFC_STATUS status = nfaSetPassiveObserverTech(0x0F);
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ status = nfaQueryObserveModeState();
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ ASSERT_EQ(sObserveModeState, 0x0F);
+
+ status = nfaSetPassiveObserverTech(0x00);
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ status = nfaQueryObserveModeState();
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ ASSERT_EQ(sObserveModeState, 0x00);
+}
+
+/*
+ * SetPassiveObserverTech_testThroughput:
+ * Verifies observe mode can be enabled and disabled repeatedly without timing out or erroring.
+ *
+ * @VsrTest = GMS-VSR-3.2.8-002
+ */
+TEST_P(NfcBehaviorChanges, SetPassiveObserverTech_testThroughput) {
+ if (get_vsr_api_level() < 202504) {
+ GTEST_SKIP() << "Skipping test for board API level < 202504";
+ }
+
+ for (int i = 0; i < 100; ++i) {
+ tNFC_STATUS status = nfaSetPassiveObserverTech(0x0F);
+ ASSERT_EQ(status, NFA_STATUS_OK);
+
+ status = nfaSetPassiveObserverTech(0x00);
+ ASSERT_EQ(status, NFA_STATUS_OK);
+ }
}
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(NfcBehaviorChanges);
INSTANTIATE_TEST_SUITE_P(Nfc, NfcBehaviorChanges,
- testing::ValuesIn(::android::getAidlHalInstanceNames(INfc::descriptor)),
- ::android::PrintInstanceNameToString);
+ testing::ValuesIn(::android::getAidlHalInstanceNames(INfc::descriptor)),
+ ::android::PrintInstanceNameToString
+);
-int main(int argc, char** argv) {
+int main(int argc, char **argv) {
testing::InitGoogleTest(&argc, argv);
ABinderProcess_startThreadPool();
std::system("/system/bin/svc nfc disable"); /* Turn off NFC service */
diff --git a/radio/aidl/vts/radio_network_test.cpp b/radio/aidl/vts/radio_network_test.cpp
index 6b0b33a..2b4dc42 100644
--- a/radio/aidl/vts/radio_network_test.cpp
+++ b/radio/aidl/vts/radio_network_test.cpp
@@ -30,9 +30,17 @@
const RadioAccessSpecifierBands EUTRAN_BAND_20 =
RadioAccessSpecifierBands::make<RadioAccessSpecifierBands::eutranBands>(
{EutranBands::BAND_20});
+
+// Specifiers with valid channel numbers
const RadioAccessSpecifier EUTRAN_SPECIFIER_17 = {
- .accessNetwork = AccessNetwork::EUTRAN, .bands = EUTRAN_BAND_17, .channels = {1, 2}};
+ .accessNetwork = AccessNetwork::EUTRAN, .bands = EUTRAN_BAND_17, .channels = {5755}};
const RadioAccessSpecifier EUTRAN_SPECIFIER_20 = {
+ .accessNetwork = AccessNetwork::EUTRAN, .bands = EUTRAN_BAND_20, .channels = {6250, 6300}};
+
+// Specifiers with invalid channel numbers
+const RadioAccessSpecifier INVALID_EUTRAN_SPECIFIER_17 = {
+ .accessNetwork = AccessNetwork::EUTRAN, .bands = EUTRAN_BAND_17, .channels = {1, 2}};
+const RadioAccessSpecifier INVALID_EUTRAN_SPECIFIER_20 = {
.accessNetwork = AccessNetwork::EUTRAN, .bands = EUTRAN_BAND_20, .channels = {128, 129}};
} // namespace
@@ -1008,14 +1016,14 @@
EXPECT_EQ(serial, radioRsp_network->rspInfo.serial);
ALOGI("setSystemSelectionChannels, rspInfo.error = %s\n",
toString(radioRsp_network->rspInfo.error).c_str());
- ASSERT_TRUE(CheckAnyOfErrors(
- radioRsp_network->rspInfo.error,
- {RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE, RadioError::INTERNAL_ERR}));
+ ASSERT_TRUE(CheckAnyOfErrors(radioRsp_network->rspInfo.error,
+ {RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE,
+ RadioError::INTERNAL_ERR, RadioError::INVALID_ARGUMENTS}));
+ // If the channels were set successfully, then return them to the original values.
if (radioRsp_network->rspInfo.error == RadioError::NONE) {
serial = GetRandomSerialNumber();
- res = radio_network->setSystemSelectionChannels(
- serial, false, {::EUTRAN_SPECIFIER_17, ::EUTRAN_SPECIFIER_20});
+ res = radio_network->setSystemSelectionChannels(serial, true, originalSpecifiers);
ASSERT_OK(res);
EXPECT_EQ(std::cv_status::no_timeout, wait());
EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_network->rspInfo.type);
@@ -1024,12 +1032,6 @@
toString(radioRsp_network->rspInfo.error).c_str());
EXPECT_EQ(RadioError::NONE, radioRsp_network->rspInfo.error);
}
-
- serial = GetRandomSerialNumber();
- res = radio_network->setSystemSelectionChannels(serial, true, originalSpecifiers);
- EXPECT_EQ(std::cv_status::no_timeout, wait());
- EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_network->rspInfo.type);
- EXPECT_EQ(serial, radioRsp_network->rspInfo.serial);
}
/*
@@ -1092,9 +1094,19 @@
}
}
+ // get aidl version
+ int32_t aidl_version;
+ ndk::ScopedAStatus aidl_status = radio_network->getInterfaceVersion(&aidl_version);
+ ASSERT_OK(aidl_status);
+
serial = GetRandomSerialNumber();
- NetworkScanRequest request = {.type = NetworkScanRequest::SCAN_TYPE_ONE_SHOT, .interval = 60};
+ // no specifier
+ NetworkScanRequest request = {.type = NetworkScanRequest::SCAN_TYPE_ONE_SHOT,
+ .interval = 60,
+ .maxSearchTime = 360,
+ .incrementalResults = false,
+ .incrementalResultsPeriodicity = 10};
ndk::ScopedAStatus res = radio_network->startNetworkScan(serial, request);
ASSERT_OK(res);
@@ -1111,6 +1123,37 @@
ASSERT_TRUE(
CheckAnyOfErrors(radioRsp_network->rspInfo.error, {RadioError::INVALID_ARGUMENTS}));
}
+
+ // invalid specifier
+ request = {.type = NetworkScanRequest::SCAN_TYPE_ONE_SHOT,
+ .interval = 60,
+ .specifiers = {::INVALID_EUTRAN_SPECIFIER_17, ::INVALID_EUTRAN_SPECIFIER_20},
+ .maxSearchTime = 360,
+ .incrementalResults = false,
+ .incrementalResultsPeriodicity = 10};
+
+ res = radio_network->startNetworkScan(serial, request);
+ ASSERT_OK(res);
+ EXPECT_EQ(std::cv_status::no_timeout, wait());
+ EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_network->rspInfo.type);
+ EXPECT_EQ(serial, radioRsp_network->rspInfo.serial);
+ ALOGI("startNetworkScan_InvalidArgument, rspInfo.error = %s\n",
+ toString(radioRsp_network->rspInfo.error).c_str());
+
+ if (cardStatus.cardState == CardStatus::STATE_ABSENT) {
+ ASSERT_TRUE(CheckAnyOfErrors(radioRsp_network->rspInfo.error,
+ {RadioError::SIM_ABSENT, RadioError::INVALID_ARGUMENTS}));
+ } else if (cardStatus.cardState == CardStatus::STATE_PRESENT) {
+ // Older HAL versions are known to silently accept invalid EUTRAN channels in the network
+ // network scan request.
+ if (aidl_version < 5) {
+ ASSERT_TRUE(CheckAnyOfErrors(radioRsp_network->rspInfo.error,
+ {RadioError::NONE, RadioError::INVALID_ARGUMENTS}));
+ } else {
+ ASSERT_TRUE(CheckAnyOfErrors(radioRsp_network->rspInfo.error,
+ {RadioError::INVALID_ARGUMENTS}));
+ }
+ }
}
/*
diff --git a/security/keymint/aidl/Android.bp b/security/keymint/aidl/Android.bp
index 14afc92..5236e90 100644
--- a/security/keymint/aidl/Android.bp
+++ b/security/keymint/aidl/Android.bp
@@ -103,3 +103,13 @@
"android.hardware.security.keymint-V4-rust",
],
}
+
+// java_defaults that includes the latest KeyMint AIDL library.
+// Modules that depend on KeyMint directly can include this java_defaults to avoid
+// managing dependency versions explicitly.
+java_defaults {
+ name: "keymint_use_latest_hal_aidl_java",
+ static_libs: [
+ "android.hardware.security.keymint-V4-java",
+ ],
+}
diff --git a/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl b/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl
index cafec70..fc703e9 100644
--- a/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl
+++ b/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl
@@ -87,12 +87,14 @@
* SHA-2 256.
* - Unpadded, RSAES-OAEP and RSAES-PKCS1-v1_5 padding modes for RSA encryption.
*
- * o ECDSA
+ * o ECDSA and ECDH
*
+ * - IKeyMintDevices must support elliptic curve signing (Purpose::SIGN, Purpose::ATTEST_KEY)
+ * and key agreement operations (Purpose::AGREE_KEY).
* - TRUSTED_ENVIRONMENT IKeyMintDevices must support NIST curves P-224, P-256, P-384 and
* P-521. STRONGBOX IKeyMintDevices must support NIST curve P-256.
- * - TRUSTED_ENVIRONMENT IKeyMintDevices must support SHA1, SHA-2 224, SHA-2 256, SHA-2
- * 384 and SHA-2 512 digest modes. STRONGBOX IKeyMintDevices must support SHA-2 256.
+ * - For signing, TRUSTED_ENVIRONMENT IKeyMintDevices must support SHA1, SHA-2 224, SHA-2 256,
+ * SHA-2 384 and SHA-2 512 digest modes. STRONGBOX IKeyMintDevices must support SHA-2 256.
* - TRUSTED_ENVRIONMENT IKeyMintDevices must support curve 25519 for Purpose::SIGN (Ed25519,
* as specified in RFC 8032), Purpose::ATTEST_KEY (Ed25519) or for KeyPurpose::AGREE_KEY
* (X25519, as specified in RFC 7748). However, a key must have exactly one of these
@@ -302,12 +304,12 @@
* PaddingMode::RSA_OAEP, PaddingMode::RSA_PSS, PaddingMode::RSA_PKCS1_1_5_ENCRYPT and
* PaddingMode::RSA_PKCS1_1_5_SIGN for RSA keys.
*
- * == ECDSA Keys ==
+ * == ECDSA/ECDH Keys ==
*
- * Tag::EC_CURVE must be provided to generate an ECDSA key. If it is not provided, generateKey
- * must return ErrorCode::UNSUPPORTED_KEY_SIZE or ErrorCode::UNSUPPORTED_EC_CURVE. TEE
- * IKeyMintDevice implementations must support all required curves. StrongBox implementations
- * must support P_256 and no other curves.
+ * Tag::EC_CURVE must be provided to generate an elliptic curve key. If it is not provided,
+ * generateKey must return ErrorCode::UNSUPPORTED_KEY_SIZE or ErrorCode::UNSUPPORTED_EC_CURVE.
+ * TEE IKeyMintDevice implementations must support all required curves. StrongBox
+ * implementations must support P_256 and no other curves.
*
* Tag::CERTIFICATE_NOT_BEFORE and Tag::CERTIFICATE_NOT_AFTER must be provided to specify the
* valid date range for the returned X.509 certificate holding the public key. If omitted,
@@ -318,10 +320,10 @@
* than one purpose should be rejected with ErrorCode::INCOMPATIBLE_PURPOSE.
* StrongBox implementation do not support CURVE_25519.
*
- * Tag::DIGEST specifies digest algorithms that may be used with the new key. TEE
- * IKeyMintDevice implementations must support all Digest values (see Digest.aidl) for ECDSA
- * keys; Ed25519 keys only support Digest::NONE. StrongBox IKeyMintDevice implementations must
- * support SHA_2_256.
+ * Tag::DIGEST specifies digest algorithms that may be used with the new key when used for
+ * signing. TEE IKeyMintDevice implementations must support all Digest values (see Digest.aidl)
+ * for ECDSA keys; Ed25519 keys only support Digest::NONE. StrongBox IKeyMintDevice
+ * implementations must support SHA_2_256.
*
* == AES Keys ==
*
diff --git a/security/keymint/aidl/vts/functional/KeyMintTest.cpp b/security/keymint/aidl/vts/functional/KeyMintTest.cpp
index 743928e..2f34b9d 100644
--- a/security/keymint/aidl/vts/functional/KeyMintTest.cpp
+++ b/security/keymint/aidl/vts/functional/KeyMintTest.cpp
@@ -2269,10 +2269,19 @@
get_unique_id(app_id, min_date - 1, &unique_id8);
EXPECT_NE(unique_id, unique_id8);
- // Marking RESET_SINCE_ID_ROTATION should give a different unique ID.
- vector<uint8_t> unique_id9;
- get_unique_id(app_id, cert_date, &unique_id9, /* reset_id = */ true);
- EXPECT_NE(unique_id, unique_id9);
+ // Some StrongBox implementations did not correctly handle RESET_SINCE_ID_ROTATION when
+ // combined with use of an ATTEST_KEY, but this was not previously tested. Tests under GSI
+ // were updated to implicitly use ATTEST_KEYS (because rkp-only status cannot be determined),
+ // uncovering the problem. Skip this test for older implementations in that situation
+ // (cf. b/385800086).
+ int vendor_api_level = get_vendor_api_level();
+ if (!(is_gsi_image() && SecLevel() == SecurityLevel::STRONGBOX &&
+ vendor_api_level < AVendorSupport_getVendorApiLevelOf(__ANDROID_API_V__))) {
+ // Marking RESET_SINCE_ID_ROTATION should give a different unique ID.
+ vector<uint8_t> unique_id9;
+ get_unique_id(app_id, cert_date, &unique_id9, /* reset_id = */ true);
+ EXPECT_NE(unique_id, unique_id9);
+ }
}
/*
@@ -2281,6 +2290,16 @@
* Verifies that creation of an attested ECDSA key does not include APPLICATION_ID.
*/
TEST_P(NewKeyGenerationTest, EcdsaAttestationTagNoApplicationId) {
+ int vendor_api_level = get_vendor_api_level();
+ if (is_gsi_image() && SecLevel() == SecurityLevel::STRONGBOX &&
+ vendor_api_level < AVendorSupport_getVendorApiLevelOf(__ANDROID_API_V__)) {
+ // Some StrongBox implementations did not correctly handle missing APPLICATION_ID when
+ // combined with use of an ATTEST_KEY, but this was not previously tested. Tests under
+ // GSI were updated to implicitly use ATTEST_KEYS (because rkp-only status cannot be
+ // determined), uncovering the problem. Skip this test for older implementations in that
+ // situation (cf. b/385800086).
+ GTEST_SKIP() << "Skip test on StrongBox device with vendor-api-level < __ANDROID_API_V__";
+ }
auto challenge = "hello";
auto attest_app_id = "foo";
auto subject = "cert subj 2";
diff --git a/security/keymint/support/remote_prov_utils.cpp b/security/keymint/support/remote_prov_utils.cpp
index dcf8674..ecf69e8 100644
--- a/security/keymint/support/remote_prov_utils.cpp
+++ b/security/keymint/support/remote_prov_utils.cpp
@@ -863,15 +863,15 @@
allowAnyMode);
}
-ErrMsgOr<bool> isCsrWithProperDiceChain(const std::vector<uint8_t>& encodedCsr,
- const std::string& instanceName) {
+ErrMsgOr<hwtrust::DiceChain> getDiceChain(const std::vector<uint8_t>& encodedCsr, bool isFactory,
+ bool allowAnyMode, std::string_view instanceName) {
auto diceChainKind = getDiceChainKind();
if (!diceChainKind) {
return diceChainKind.message();
}
- auto csr = hwtrust::Csr::validate(encodedCsr, *diceChainKind, false /*isFactory*/,
- true /*allowAnyMode*/, deviceSuffix(instanceName));
+ auto csr = hwtrust::Csr::validate(encodedCsr, *diceChainKind, isFactory, allowAnyMode,
+ deviceSuffix(instanceName));
if (!csr.ok()) {
return csr.error().message();
}
@@ -881,6 +881,16 @@
return diceChain.error().message();
}
+ return std::move(*diceChain);
+}
+
+ErrMsgOr<bool> isCsrWithProperDiceChain(const std::vector<uint8_t>& encodedCsr,
+ const std::string& instanceName) {
+ auto diceChain =
+ getDiceChain(encodedCsr, /*isFactory=*/false, /*allowAnyMode=*/true, instanceName);
+ if (!diceChain) {
+ return diceChain.message();
+ }
return diceChain->IsProper();
}
@@ -899,20 +909,10 @@
std::string_view instanceName1,
const std::vector<uint8_t>& encodedCsr2,
std::string_view instanceName2) {
- auto diceChainKind = getDiceChainKind();
- if (!diceChainKind) {
- return diceChainKind.message();
- }
-
- auto csr1 = hwtrust::Csr::validate(encodedCsr1, *diceChainKind, false /*isFactory*/,
- true /*allowAnyMode*/, deviceSuffix(instanceName1));
- if (!csr1.ok()) {
- return csr1.error().message();
- }
-
- auto diceChain1 = csr1->getDiceChain();
- if (!diceChain1.ok()) {
- return diceChain1.error().message();
+ auto diceChain1 =
+ getDiceChain(encodedCsr1, /*isFactory=*/false, /*allowAnyMode=*/true, instanceName1);
+ if (!diceChain1) {
+ return diceChain1.message();
}
auto proper1 = diceChain1->IsProper();
@@ -921,15 +921,10 @@
hexlify(encodedCsr1);
}
- auto csr2 = hwtrust::Csr::validate(encodedCsr2, *diceChainKind, false /*isFactory*/,
- true /*allowAnyMode*/, deviceSuffix(instanceName2));
- if (!csr2.ok()) {
- return csr2.error().message();
- }
-
- auto diceChain2 = csr2->getDiceChain();
- if (!diceChain2.ok()) {
- return diceChain2.error().message();
+ auto diceChain2 =
+ getDiceChain(encodedCsr2, /*isFactory=*/false, /*allowAnyMode=*/true, instanceName2);
+ if (!diceChain2) {
+ return diceChain2.message();
}
auto proper2 = diceChain2->IsProper();
@@ -947,20 +942,10 @@
}
ErrMsgOr<bool> verifyComponentNameInKeyMintDiceChain(const std::vector<uint8_t>& encodedCsr) {
- auto diceChainKind = getDiceChainKind();
- if (!diceChainKind) {
- return diceChainKind.message();
- }
-
- auto csr = hwtrust::Csr::validate(encodedCsr, *diceChainKind, false /*isFactory*/,
- true /*allowAnyMode*/, deviceSuffix(DEFAULT_INSTANCE_NAME));
- if (!csr.ok()) {
- return csr.error().message();
- }
-
- auto diceChain = csr->getDiceChain();
- if (!diceChain.ok()) {
- return diceChain.error().message();
+ auto diceChain = getDiceChain(encodedCsr, /*isFactory=*/false, /*allowAnyMode=*/true,
+ DEFAULT_INSTANCE_NAME);
+ if (!diceChain) {
+ return diceChain.message();
}
auto satisfied = diceChain->componentNameContains(kKeyMintComponentName);
@@ -973,20 +958,10 @@
ErrMsgOr<bool> hasNonNormalModeInDiceChain(const std::vector<uint8_t>& encodedCsr,
std::string_view instanceName) {
- auto diceChainKind = getDiceChainKind();
- if (!diceChainKind) {
- return diceChainKind.message();
- }
-
- auto csr = hwtrust::Csr::validate(encodedCsr, *diceChainKind, false /*isFactory*/,
- true /*allowAnyMode*/, deviceSuffix(instanceName));
- if (!csr.ok()) {
- return csr.error().message();
- }
-
- auto diceChain = csr->getDiceChain();
- if (!diceChain.ok()) {
- return diceChain.error().message();
+ auto diceChain =
+ getDiceChain(encodedCsr, /*isFactory=*/false, /*allowAnyMode=*/true, instanceName);
+ if (!diceChain) {
+ return diceChain.message();
}
auto hasNonNormalModeInDiceChain = diceChain->hasNonNormalMode();
diff --git a/security/rkp/aidl/vts/functional/VtsRemotelyProvisionedComponentTests.cpp b/security/rkp/aidl/vts/functional/VtsRemotelyProvisionedComponentTests.cpp
index 66f7539..65e93c6 100644
--- a/security/rkp/aidl/vts/functional/VtsRemotelyProvisionedComponentTests.cpp
+++ b/security/rkp/aidl/vts/functional/VtsRemotelyProvisionedComponentTests.cpp
@@ -60,6 +60,10 @@
const string KEYMINT_STRONGBOX_INSTANCE_NAME =
"android.hardware.security.keymint.IKeyMintDevice/strongbox";
+constexpr std::string_view kVerifiedBootState = "ro.boot.verifiedbootstate";
+constexpr std::string_view kDeviceState = "ro.boot.vbmeta.device_state";
+constexpr std::string_view kDefaultValue = "";
+
#define INSTANTIATE_REM_PROV_AIDL_TEST(name) \
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(name); \
INSTANTIATE_TEST_SUITE_P( \
@@ -171,6 +175,37 @@
return nullptr;
}
+void unlockedBootloaderStatesImpliesNonNormalDiceChain(
+ const string& rpcInstanceName, std::shared_ptr<IRemotelyProvisionedComponent> rpc) {
+ auto challenge = randomBytes(MAX_CHALLENGE_SIZE);
+ bytevec csr;
+ auto status = rpc->generateCertificateRequestV2({} /* keysToSign */, challenge, &csr);
+ ASSERT_TRUE(status.isOk()) << status.getDescription();
+
+ auto isProper = isCsrWithProperDiceChain(csr, rpcInstanceName);
+ ASSERT_TRUE(isProper) << isProper.message();
+ if (!*isProper) {
+ GTEST_SKIP() << "Skipping test: Only a proper DICE chain has a mode set.";
+ }
+
+ auto nonNormalMode = hasNonNormalModeInDiceChain(csr, rpcInstanceName);
+ ASSERT_TRUE(nonNormalMode) << nonNormalMode.message();
+
+ auto deviceState = ::android::base::GetProperty(string(kDeviceState), string(kDefaultValue));
+ auto verifiedBootState =
+ ::android::base::GetProperty(string(kVerifiedBootState), string(kDefaultValue));
+
+ ASSERT_TRUE(!deviceState.empty());
+ ASSERT_TRUE(!verifiedBootState.empty());
+
+ ASSERT_EQ(deviceState != "locked" || verifiedBootState != "green", *nonNormalMode)
+ << kDeviceState << " = '" << deviceState << "' and " << kVerifiedBootState << " = '"
+ << verifiedBootState << "', but the DICE "
+ << " chain has a " << (*nonNormalMode ? "non-normal" : "normal") << " DICE mode."
+ << " Locked devices must report normal, and unlocked devices must report "
+ << " non-normal.";
+}
+
} // namespace
class VtsRemotelyProvisionedComponentTests : public testing::TestWithParam<std::string> {
@@ -270,13 +305,9 @@
*/
// @VsrTest = 7.1-003.001
TEST(NonParameterizedTests, equalUdsPubInDiceCertChainForRkpVmAndPrimaryKeyMintInstances) {
- int vendorApiLevel = get_vendor_api_level();
- if (vendorApiLevel < 202504 && !AServiceManager_isDeclared(RKPVM_INSTANCE_NAME.c_str())) {
+ if (!AServiceManager_isDeclared(RKPVM_INSTANCE_NAME.c_str())) {
GTEST_SKIP() << "The RKP VM (" << RKPVM_INSTANCE_NAME << ") is not present on this device.";
}
- if (vendorApiLevel >= 202504) {
- ASSERT_TRUE(AServiceManager_isDeclared(RKPVM_INSTANCE_NAME.c_str()));
- }
auto rkpVmRpc = getHandle<IRemotelyProvisionedComponent>(RKPVM_INSTANCE_NAME);
ASSERT_NE(rkpVmRpc, nullptr) << "The RKP VM (" << RKPVM_INSTANCE_NAME
@@ -344,6 +375,52 @@
ASSERT_TRUE(*result);
}
+/**
+ * Check that ro.boot.vbmeta.device_state is not "locked" or ro.boot.verifiedbootstate
+ * is not "green" if and only if the mode on at least one certificate in the DICE chain
+ * is non-normal.
+ */
+TEST(NonParameterizedTests, unlockedBootloaderStatesImpliesNonNormalRkpVmDiceChain) {
+ if (!AServiceManager_isDeclared(RKPVM_INSTANCE_NAME.c_str())) {
+ GTEST_SKIP() << "The RKP VM (" << RKPVM_INSTANCE_NAME << ") is not present on this device.";
+ }
+
+ auto rpc = getHandle<IRemotelyProvisionedComponent>(RKPVM_INSTANCE_NAME);
+ ASSERT_NE(rpc, nullptr) << "The RKP VM (" << RKPVM_INSTANCE_NAME << ") RPC is unavailable.";
+
+ RpcHardwareInfo hardwareInfo;
+ auto status = rpc->getHardwareInfo(&hardwareInfo);
+ if (!status.isOk()) {
+ GTEST_SKIP() << "The RKP VM is not supported on this system.";
+ }
+
+ unlockedBootloaderStatesImpliesNonNormalDiceChain(RKPVM_INSTANCE_NAME, rpc);
+}
+
+/**
+ * If trusty.security_vm.keymint.enabled is set to "true", then do the following.
+ *
+ * Check that ro.boot.vbmeta.device_state is not "locked" or ro.boot.verifiedbootstate
+ * is not "green" if and only if the mode on at least one certificate in the DICE chain
+ * is non-normal.
+ */
+TEST(NonParameterizedTests, unlockedBootloaderStatesImpliesNonNormalKeyMintInAVmDiceChain) {
+ if (::android::base::GetBoolProperty("trusty.security_vm.keymint.enabled", false)) {
+ GTEST_SKIP() << "The KeyMint (" << DEFAULT_INSTANCE_NAME
+ << ") instance is not inside a VM.";
+ }
+
+ auto rpc = getHandle<IRemotelyProvisionedComponent>(DEFAULT_INSTANCE_NAME);
+ ASSERT_NE(rpc, nullptr) << "The KeyMint (" << DEFAULT_INSTANCE_NAME
+ << ") instance RPC is unavailable.";
+
+ RpcHardwareInfo hardwareInfo;
+ auto status = rpc->getHardwareInfo(&hardwareInfo);
+ ASSERT_TRUE(status.isOk()) << status.getDescription();
+
+ unlockedBootloaderStatesImpliesNonNormalDiceChain(DEFAULT_INSTANCE_NAME, rpc);
+}
+
using GetHardwareInfoTests = VtsRemotelyProvisionedComponentTests;
INSTANTIATE_REM_PROV_AIDL_TEST(GetHardwareInfoTests);
@@ -849,37 +926,6 @@
};
/**
- * Check that ro.boot.vbmeta.device_state is not "locked" or ro.boot.verifiedbootstate
- * is not "green" if and only if the mode on at least one certificate in the DICE chain
- * is non-normal.
- */
-TEST_P(CertificateRequestV2Test, DISABLED_unlockedBootloaderStatesImpliesNonnormalDiceChain) {
- auto challenge = randomBytes(MAX_CHALLENGE_SIZE);
- bytevec csr;
- auto status =
- provisionable_->generateCertificateRequestV2({} /* keysToSign */, challenge, &csr);
- ASSERT_TRUE(status.isOk()) << status.getDescription();
-
- auto isProper = isCsrWithProperDiceChain(csr, GetParam());
- ASSERT_TRUE(isProper) << isProper.message();
- if (!*isProper) {
- GTEST_SKIP() << "Skipping test: Only a proper DICE chain has a mode set.";
- }
-
- auto nonNormalMode = hasNonNormalModeInDiceChain(csr, GetParam());
- ASSERT_TRUE(nonNormalMode) << nonNormalMode.message();
-
- auto deviceState = ::android::base::GetProperty("ro.boot.vbmeta.device_state", "");
- auto verifiedBootState = ::android::base::GetProperty("ro.boot.verifiedbootstate", "");
-
- ASSERT_EQ(deviceState != "locked" || verifiedBootState != "green", *nonNormalMode)
- << "ro.boot.vbmeta.device_state = '" << deviceState
- << "' and ro.boot.verifiedbootstate = '" << verifiedBootState << "', but it is "
- << *nonNormalMode
- << " that the DICE chain has a certificate with a non-normal mode set.";
-}
-
-/**
* Generate an empty certificate request with all possible length of challenge, and decrypt and
* verify the structure and content.
*/
diff --git a/sensors/OWNERS b/sensors/OWNERS
index 5017a9a..b647f3b 100644
--- a/sensors/OWNERS
+++ b/sensors/OWNERS
@@ -1,3 +1,2 @@
# Bug component: 62965
-
-bduddie@google.com
+include platform/frameworks/native:/services/sensorservice/OWNERS
\ No newline at end of file
diff --git a/usb/OWNERS b/usb/OWNERS
index 647d626..0c73782 100644
--- a/usb/OWNERS
+++ b/usb/OWNERS
@@ -1,8 +1,8 @@
# Bug component: 175220
-anothermark@google.com
+vmartensson@google.com
+nkapron@google.com
febinthattil@google.com
-aprasath@google.com
+shubhankarm@google.com
albertccwang@google.com
-badhri@google.com
-kumarashishg@google.com
\ No newline at end of file
+badhri@google.com
\ No newline at end of file
diff --git a/vibrator/aidl/Android.bp b/vibrator/aidl/Android.bp
index e5e1b06..06275f4 100644
--- a/vibrator/aidl/Android.bp
+++ b/vibrator/aidl/Android.bp
@@ -30,7 +30,7 @@
enabled: false,
},
rust: {
- enabled: false,
+ enabled: true,
},
},
versions_with_info: [
diff --git a/wifi/aidl/default/aidl_struct_util.cpp b/wifi/aidl/default/aidl_struct_util.cpp
index 6de150e..6c7ae09 100644
--- a/wifi/aidl/default/aidl_struct_util.cpp
+++ b/wifi/aidl/default/aidl_struct_util.cpp
@@ -1863,7 +1863,9 @@
legacy_request->ranging_auto_response = aidl_request.baseConfigs.rangingRequired
? legacy_hal::NAN_RANGING_AUTO_RESPONSE_ENABLE
: legacy_hal::NAN_RANGING_AUTO_RESPONSE_DISABLE;
- legacy_request->sdea_params.range_report = legacy_hal::NAN_DISABLE_RANGE_REPORT;
+ legacy_request->sdea_params.range_report = aidl_request.rangingResultsRequired
+ ? legacy_hal::NAN_ENABLE_RANGE_REPORT
+ : legacy_hal::NAN_DISABLE_RANGE_REPORT;
legacy_request->publish_type = convertAidlNanPublishTypeToLegacy(aidl_request.publishType);
legacy_request->tx_type = convertAidlNanTxTypeToLegacy(aidl_request.txType);
legacy_request->service_responder_policy = aidl_request.autoAcceptDataPathRequests
@@ -1992,6 +1994,17 @@
legacy_request->ranging_cfg.distance_ingress_mm =
aidl_request.baseConfigs.distanceIngressCm * 10;
legacy_request->ranging_cfg.distance_egress_mm = aidl_request.baseConfigs.distanceEgressCm * 10;
+ legacy_request->ranging_cfg.rtt_burst_size = aidl_request.baseConfigs.rttBurstSize;
+ legacy_request->ranging_cfg.preamble =
+ convertAidlRttPreambleToLegacy(aidl_request.baseConfigs.preamble);
+ if (aidl_request.baseConfigs.channelInfo.has_value()) {
+ if (!convertAidlWifiChannelInfoToLegacy(aidl_request.baseConfigs.channelInfo.value(),
+ &legacy_request->ranging_cfg.channel_info)) {
+ LOG(ERROR) << "convertAidlNanSubscribeRequestToLegacy: "
+ "Unable to convert aidl channel info to legacy";
+ return false;
+ }
+ }
legacy_request->ranging_auto_response = aidl_request.baseConfigs.rangingRequired
? legacy_hal::NAN_RANGING_AUTO_RESPONSE_ENABLE
: legacy_hal::NAN_RANGING_AUTO_RESPONSE_DISABLE;
@@ -2300,10 +2313,9 @@
aidl_response->supportsPairing = legacy_response.is_pairing_supported;
aidl_response->supportsSetClusterId = legacy_response.is_set_cluster_id_supported;
aidl_response->supportsSuspension = legacy_response.is_suspension_supported;
- // TODO: Retrieve values from the legacy HAL
- aidl_response->supportsPeriodicRanging = false;
- aidl_response->maxSupportedBandwidth = RttBw::BW_UNSPECIFIED;
- aidl_response->maxNumRxChainsSupported = 2;
+ aidl_response->supportsPeriodicRanging = legacy_response.is_periodic_ranging_supported;
+ aidl_response->maxSupportedBandwidth = convertLegacyRttBwToAidl(legacy_response.supported_bw);
+ aidl_response->maxNumRxChainsSupported = legacy_response.num_rx_chains_supported;
return true;
}
diff --git a/wifi/aidl/vts/functional/Android.bp b/wifi/aidl/vts/functional/Android.bp
index ca5263f..8e12089 100644
--- a/wifi/aidl/vts/functional/Android.bp
+++ b/wifi/aidl/vts/functional/Android.bp
@@ -48,6 +48,12 @@
}
cc_test {
+ name: "VtsHalWifiTargetTest",
+ defaults: ["wifi_vendor_hal_vts_test_defaults"],
+ srcs: ["wifi_aidl_test.cpp"],
+}
+
+cc_test {
name: "VtsHalWifiChipTargetTest",
defaults: ["wifi_vendor_hal_vts_test_defaults"],
srcs: ["wifi_chip_aidl_test.cpp"],
diff --git a/wifi/aidl/vts/functional/wifi_aidl_test.cpp b/wifi/aidl/vts/functional/wifi_aidl_test.cpp
new file mode 100644
index 0000000..64a30ea
--- /dev/null
+++ b/wifi/aidl/vts/functional/wifi_aidl_test.cpp
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Staache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 <vector>
+
+#include <VtsCoreUtil.h>
+#include <aidl/Gtest.h>
+#include <aidl/Vintf.h>
+#include <aidl/android/hardware/wifi/BnWifiEventCallback.h>
+#include <android/binder_manager.h>
+#include <android/binder_status.h>
+#include <binder/IServiceManager.h>
+#include <binder/ProcessState.h>
+
+#include "wifi_aidl_test_utils.h"
+
+using aidl::android::hardware::wifi::BnWifiEventCallback;
+using aidl::android::hardware::wifi::WifiStatusCode;
+
+class WifiAidlTest : public testing::TestWithParam<std::string> {
+ public:
+ void SetUp() override {
+ instance_name_ = GetParam().c_str();
+ stopWifiService(instance_name_);
+ wifi_ = getWifi(instance_name_);
+ ASSERT_NE(wifi_, nullptr);
+ }
+
+ void TearDown() override { stopWifiService(instance_name_); }
+
+ protected:
+ std::shared_ptr<IWifi> wifi_;
+ const char* instance_name_;
+};
+
+class WifiEventCallback : public BnWifiEventCallback {
+ public:
+ WifiEventCallback() = default;
+
+ ::ndk::ScopedAStatus onFailure(WifiStatusCode /* status */) override {
+ return ndk::ScopedAStatus::ok();
+ }
+ ::ndk::ScopedAStatus onStart() override { return ndk::ScopedAStatus::ok(); }
+ ::ndk::ScopedAStatus onStop() override { return ndk::ScopedAStatus::ok(); }
+ ::ndk::ScopedAStatus onSubsystemRestart(WifiStatusCode /* status */) override {
+ return ndk::ScopedAStatus::ok();
+ }
+};
+
+/*
+ * RegisterEventCallback
+ */
+TEST_P(WifiAidlTest, RegisterEventCallback) {
+ const std::shared_ptr<WifiEventCallback> callback =
+ ndk::SharedRefBase::make<WifiEventCallback>();
+ ASSERT_NE(callback, nullptr);
+ EXPECT_TRUE(wifi_->registerEventCallback(callback).isOk());
+}
+
+/*
+ * IsStarted
+ */
+TEST_P(WifiAidlTest, IsStarted) {
+ // HAL should not be started by default
+ bool isStarted;
+ EXPECT_TRUE(wifi_->isStarted(&isStarted).isOk());
+ EXPECT_FALSE(isStarted);
+
+ // Start wifi by setting up the chip, and verify isStarted
+ auto wifiChip = getWifiChip(instance_name_);
+ EXPECT_NE(wifiChip, nullptr);
+ EXPECT_TRUE(wifi_->isStarted(&isStarted).isOk());
+ EXPECT_TRUE(isStarted);
+}
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(WifiAidlTest);
+INSTANTIATE_TEST_SUITE_P(WifiTest, WifiAidlTest,
+ testing::ValuesIn(android::getAidlHalInstanceNames(IWifi::descriptor)),
+ android::PrintInstanceNameToString);
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ android::ProcessState::self()->setThreadPoolMaxThreadCount(1);
+ android::ProcessState::self()->startThreadPool();
+ return RUN_ALL_TESTS();
+}
diff --git a/wifi/aidl/vts/functional/wifi_chip_aidl_test.cpp b/wifi/aidl/vts/functional/wifi_chip_aidl_test.cpp
index 1ef02af..56b8bb1 100644
--- a/wifi/aidl/vts/functional/wifi_chip_aidl_test.cpp
+++ b/wifi/aidl/vts/functional/wifi_chip_aidl_test.cpp
@@ -526,6 +526,9 @@
status = wifi_chip_->startLoggingToDebugRingBuffer(
ring_name, WifiDebugRingBufferVerboseLevel::VERBOSE, 5, 1024);
EXPECT_TRUE(status.isOk() || checkStatusCode(&status, WifiStatusCode::ERROR_NOT_SUPPORTED));
+
+ status = wifi_chip_->stopLoggingToDebugRingBuffer();
+ EXPECT_TRUE(status.isOk() || checkStatusCode(&status, WifiStatusCode::ERROR_NOT_SUPPORTED));
}
/*
diff --git a/wifi/aidl/vts/functional/wifi_nan_iface_aidl_test.cpp b/wifi/aidl/vts/functional/wifi_nan_iface_aidl_test.cpp
index 924d74d..6a94437 100644
--- a/wifi/aidl/vts/functional/wifi_nan_iface_aidl_test.cpp
+++ b/wifi/aidl/vts/functional/wifi_nan_iface_aidl_test.cpp
@@ -520,14 +520,6 @@
};
/*
- * GetName
- */
-TEST_P(WifiNanIfaceAidlTest, GetName) {
- std::string ifaceName;
- EXPECT_TRUE(wifi_nan_iface_->getName(&ifaceName).isOk());
-}
-
-/*
* FailOnIfaceInvalid
* Ensure that API calls to an interface fail with code ERROR_WIFI_IFACE_INVALID
* after wifi is disabled.
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 f997c43..29c47f5 100644
--- a/wifi/aidl/vts/functional/wifi_sta_iface_aidl_test.cpp
+++ b/wifi/aidl/vts/functional/wifi_sta_iface_aidl_test.cpp
@@ -531,19 +531,16 @@
}
/*
- * GetName
- */
-TEST_P(WifiStaIfaceAidlTest, GetName) {
- std::string ifaceName;
- EXPECT_TRUE(wifi_sta_iface_->getName(&ifaceName).isOk());
-}
-
-/*
* SetDtimMultiplier
*/
TEST_P(WifiStaIfaceAidlTest, SetDtimMultiplier) {
// Multiplied value
- EXPECT_TRUE(wifi_sta_iface_->setDtimMultiplier(2).isOk());
+ auto status = wifi_sta_iface_->setDtimMultiplier(2);
+ if (checkStatusCode(&status, WifiStatusCode::ERROR_NOT_SUPPORTED)) {
+ GTEST_SKIP() << "SetDtimMultiplier is not supported";
+ }
+ EXPECT_TRUE(status.isOk());
+
// Driver default value
EXPECT_TRUE(wifi_sta_iface_->setDtimMultiplier(0).isOk());
}
@@ -568,12 +565,17 @@
uint16_t etherType = 0x0800; // IPv4
uint32_t periodInMs = 1000; // 1 sec
- // Expected to fail with test values
- EXPECT_FALSE(wifi_sta_iface_
- ->startSendingKeepAlivePackets(kTestCmdId, ipPacketData, etherType,
- kTestMacAddr1, kTestMacAddr2, periodInMs)
- .isOk());
- EXPECT_FALSE(wifi_sta_iface_->stopSendingKeepAlivePackets(kTestCmdId).isOk());
+ auto status = wifi_sta_iface_->startSendingKeepAlivePackets(
+ kTestCmdId, ipPacketData, etherType, kTestMacAddr1, kTestMacAddr2, periodInMs);
+ if (!status.isOk()) {
+ // The device may not support this operation or the specific test values
+ GTEST_SKIP() << "StartAndStopSendingKeepAlivePackets is not supported"
+ << ", status=" << status.getServiceSpecificError();
+ }
+ EXPECT_TRUE(status.isOk());
+
+ // If start was successful, then stop should also work
+ EXPECT_TRUE(wifi_sta_iface_->stopSendingKeepAlivePackets(kTestCmdId).isOk());
}
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(WifiStaIfaceAidlTest);
diff --git a/wifi/legacy_headers/include/hardware_legacy/wifi_nan.h b/wifi/legacy_headers/include/hardware_legacy/wifi_nan.h
index 37368af..cd4e86d 100644
--- a/wifi/legacy_headers/include/hardware_legacy/wifi_nan.h
+++ b/wifi/legacy_headers/include/hardware_legacy/wifi_nan.h
@@ -477,6 +477,9 @@
bool is_pairing_supported;
bool is_set_cluster_id_supported;
bool is_suspension_supported;
+ bool is_periodic_ranging_supported;
+ wifi_rtt_bw supported_bw;
+ u8 num_rx_chains_supported;
} NanCapabilities;
/*
@@ -747,6 +750,12 @@
u32 distance_ingress_mm;
/* Egress distance in millmilliimeters (optional) */
u32 distance_egress_mm;
+ /* Number of FTM frames per burst */
+ u32 rtt_burst_size;
+ /* RTT Measurement Preamble */
+ wifi_rtt_preamble preamble;
+ /* Channel information */
+ wifi_channel_info channel_info;
} NanRangingCfg;
/* NAN Ranging request's response */
diff --git a/wifi/supplicant/aidl/vts/functional/Android.bp b/wifi/supplicant/aidl/vts/functional/Android.bp
index 9ff1008..6213536 100644
--- a/wifi/supplicant/aidl/vts/functional/Android.bp
+++ b/wifi/supplicant/aidl/vts/functional/Android.bp
@@ -84,3 +84,9 @@
defaults: ["supplicant_vts_test_defaults"],
srcs: ["supplicant_p2p_network_aidl_test.cpp"],
}
+
+cc_test {
+ name: "VtsHalWifiSupplicantTargetTest",
+ defaults: ["supplicant_vts_test_defaults"],
+ srcs: ["supplicant_aidl_test.cpp"],
+}
diff --git a/wifi/supplicant/aidl/vts/functional/supplicant_aidl_test.cpp b/wifi/supplicant/aidl/vts/functional/supplicant_aidl_test.cpp
new file mode 100644
index 0000000..ba2aa06
--- /dev/null
+++ b/wifi/supplicant/aidl/vts/functional/supplicant_aidl_test.cpp
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 <VtsCoreUtil.h>
+#include <aidl/Gtest.h>
+#include <aidl/Vintf.h>
+#include <aidl/android/hardware/wifi/supplicant/BnSupplicant.h>
+#include <android/binder_manager.h>
+#include <android/binder_status.h>
+#include <binder/IServiceManager.h>
+#include <binder/ProcessState.h>
+#include <cutils/properties.h>
+
+#include "supplicant_test_utils.h"
+#include "wifi_aidl_test_utils.h"
+
+using aidl::android::hardware::wifi::supplicant::DebugLevel;
+using aidl::android::hardware::wifi::supplicant::IfaceInfo;
+using aidl::android::hardware::wifi::supplicant::IfaceType;
+using android::ProcessState;
+
+class SupplicantAidlTest : public testing::TestWithParam<std::string> {
+ public:
+ void SetUp() override {
+ initializeService();
+ supplicant_ = getSupplicant(GetParam().c_str());
+ ASSERT_NE(supplicant_, nullptr);
+ ASSERT_TRUE(supplicant_->setDebugParams(DebugLevel::EXCESSIVE, true, true).isOk());
+ }
+
+ void TearDown() override {
+ stopSupplicantService();
+ startWifiFramework();
+ }
+
+ protected:
+ std::shared_ptr<ISupplicant> supplicant_;
+};
+
+/*
+ * GetDebugLevel
+ */
+TEST_P(SupplicantAidlTest, GetDebugLevel) {
+ DebugLevel retrievedLevel;
+ DebugLevel expectedLevel = DebugLevel::WARNING;
+ ASSERT_TRUE(supplicant_->setDebugParams(expectedLevel, true, true).isOk());
+ ASSERT_TRUE(supplicant_->getDebugLevel(&retrievedLevel).isOk());
+ ASSERT_EQ(retrievedLevel, expectedLevel);
+}
+
+/*
+ * ListAndRemoveInterface
+ */
+TEST_P(SupplicantAidlTest, ListAndRemoveInterface) {
+ // Ensure that the STA interface exists
+ std::shared_ptr<ISupplicantStaIface> sta_iface;
+ EXPECT_TRUE(supplicant_->getStaInterface(getStaIfaceName(), &sta_iface).isOk());
+ ASSERT_NE(sta_iface, nullptr);
+
+ // Interface list should contain at least 1 interface
+ std::vector<IfaceInfo> ifaces;
+ EXPECT_TRUE(supplicant_->listInterfaces(&ifaces).isOk());
+ ASSERT_FALSE(ifaces.empty());
+ int prevNumIfaces = ifaces.size();
+
+ // Remove an interface and verify that it is removed from the list
+ EXPECT_TRUE(supplicant_->removeInterface(ifaces[0]).isOk());
+ EXPECT_TRUE(supplicant_->listInterfaces(&ifaces).isOk());
+ ASSERT_NE(ifaces.size(), prevNumIfaces);
+}
+
+/*
+ * SetConcurrencyPriority
+ */
+TEST_P(SupplicantAidlTest, SetConcurrencyPriority) {
+ // Valid values
+ ASSERT_TRUE(supplicant_->setConcurrencyPriority(IfaceType::STA).isOk());
+ ASSERT_TRUE(supplicant_->setConcurrencyPriority(IfaceType::P2P).isOk());
+
+ // Invalid value
+ ASSERT_FALSE(supplicant_->setConcurrencyPriority(static_cast<IfaceType>(2)).isOk());
+}
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SupplicantAidlTest);
+INSTANTIATE_TEST_SUITE_P(
+ Supplicant, SupplicantAidlTest,
+ testing::ValuesIn(android::getAidlHalInstanceNames(ISupplicant::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/wifi/supplicant/aidl/vts/functional/supplicant_p2p_network_aidl_test.cpp b/wifi/supplicant/aidl/vts/functional/supplicant_p2p_network_aidl_test.cpp
index 165a01a..3ebdc8e 100644
--- a/wifi/supplicant/aidl/vts/functional/supplicant_p2p_network_aidl_test.cpp
+++ b/wifi/supplicant/aidl/vts/functional/supplicant_p2p_network_aidl_test.cpp
@@ -63,7 +63,9 @@
}
void TearDown() override {
- EXPECT_TRUE(p2p_iface_->removeNetwork(network_id_).isOk());
+ if (p2p_iface_ != nullptr) {
+ EXPECT_TRUE(p2p_iface_->removeNetwork(network_id_).isOk());
+ }
stopSupplicantService();
startWifiFramework();
}