Merge "Add APP SessionTag" into main
diff --git a/TEST_MAPPING b/TEST_MAPPING
index 25246d8..92cafbd 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -11,6 +11,9 @@
},
{
"name": "VtsHalTvInputV1_0TargetTest"
+ },
+ {
+ "name": "CtsStrictJavaPackagesTestCases"
}
],
"auto-presubmit": [
diff --git a/automotive/vehicle/vts/Android.bp b/automotive/vehicle/vts/Android.bp
index 736787b..67d0d34 100644
--- a/automotive/vehicle/vts/Android.bp
+++ b/automotive/vehicle/vts/Android.bp
@@ -30,6 +30,7 @@
],
static_libs: [
"libgtest",
+ "libgmock",
"libvhalclient",
],
shared_libs: [
@@ -41,6 +42,9 @@
"use_libaidlvintf_gtest_helper_static",
"vhalclient_defaults",
],
+ header_libs: [
+ "IVehicleGeneratedHeaders",
+ ],
test_suites: [
"general-tests",
"vts",
diff --git a/automotive/vehicle/vts/src/VtsHalAutomotiveVehicle_TargetTest.cpp b/automotive/vehicle/vts/src/VtsHalAutomotiveVehicle_TargetTest.cpp
index b5ee335..f8ddfaa 100644
--- a/automotive/vehicle/vts/src/VtsHalAutomotiveVehicle_TargetTest.cpp
+++ b/automotive/vehicle/vts/src/VtsHalAutomotiveVehicle_TargetTest.cpp
@@ -19,12 +19,14 @@
#include <IVhalClient.h>
#include <VehicleHalTypes.h>
#include <VehicleUtils.h>
+#include <VersionForVehicleProperty.h>
#include <aidl/Gtest.h>
#include <aidl/Vintf.h>
#include <aidl/android/hardware/automotive/vehicle/IVehicle.h>
#include <android-base/stringprintf.h>
#include <android-base/thread_annotations.h>
#include <android/binder_process.h>
+#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <hidl/GtestPrinter.h>
#include <hidl/ServiceManagement.h>
@@ -47,6 +49,7 @@
using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyChangeMode;
using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyGroup;
using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyType;
+using ::aidl::android::hardware::automotive::vehicle::VersionForVehicleProperty;
using ::android::getAidlHalInstanceNames;
using ::android::base::ScopedLockAssertion;
using ::android::base::StringPrintf;
@@ -58,7 +61,10 @@
using ::android::frameworks::automotive::vhal::IVhalClient;
using ::android::hardware::getAllHalInstanceNames;
using ::android::hardware::Sanitize;
+using ::android::hardware::automotive::vehicle::isSystemProp;
+using ::android::hardware::automotive::vehicle::propIdToString;
using ::android::hardware::automotive::vehicle::toInt;
+using ::testing::Ge;
constexpr int32_t kInvalidProp = 0x31600207;
@@ -202,6 +208,41 @@
ASSERT_NE(result.error().message(), "") << "Expect error message not to be empty";
}
+// Test system property IDs returned by getPropConfigs() are defined in the VHAL property interface.
+TEST_P(VtsHalAutomotiveVehicleTargetTest, testPropConfigs_onlyDefinedSystemPropertyIdsReturned) {
+ if (!mVhalClient->isAidlVhal()) {
+ GTEST_SKIP() << "Skip for HIDL VHAL because HAL interface run-time version is only"
+ << "introduced for AIDL";
+ }
+
+ auto result = mVhalClient->getAllPropConfigs();
+ ASSERT_TRUE(result.ok()) << "Failed to get all property configs, error: "
+ << result.error().message();
+
+ int32_t vhalVersion = mVhalClient->getRemoteInterfaceVersion();
+ const auto& configs = result.value();
+ for (size_t i = 0; i < configs.size(); i++) {
+ int32_t propId = configs[i]->getPropId();
+ if (!isSystemProp(propId)) {
+ continue;
+ }
+
+ std::string propName = propIdToString(propId);
+ auto it = VersionForVehicleProperty.find(static_cast<VehicleProperty>(propId));
+ bool found = (it != VersionForVehicleProperty.end());
+ EXPECT_TRUE(found) << "System Property: " << propName
+ << " is not defined in VHAL property interface";
+ if (!found) {
+ continue;
+ }
+ int32_t requiredVersion = it->second;
+ EXPECT_THAT(vhalVersion, Ge(requiredVersion))
+ << "System Property: " << propName << " requires VHAL version: " << requiredVersion
+ << ", but the current VHAL version"
+ << " is " << vhalVersion << ", must not be supported";
+ }
+}
+
// Test get() return current value for properties.
TEST_P(VtsHalAutomotiveVehicleTargetTest, get) {
ALOGD("VtsHalAutomotiveVehicleTargetTest::get");
diff --git a/biometrics/common/aidl/aidl_api/android.hardware.biometrics.common/current/android/hardware/biometrics/common/OperationContext.aidl b/biometrics/common/aidl/aidl_api/android.hardware.biometrics.common/current/android/hardware/biometrics/common/OperationContext.aidl
index 42c305a..8d913c8 100644
--- a/biometrics/common/aidl/aidl_api/android.hardware.biometrics.common/current/android/hardware/biometrics/common/OperationContext.aidl
+++ b/biometrics/common/aidl/aidl_api/android.hardware.biometrics.common/current/android/hardware/biometrics/common/OperationContext.aidl
@@ -46,4 +46,5 @@
android.hardware.biometrics.common.DisplayState displayState = android.hardware.biometrics.common.DisplayState.UNKNOWN;
@nullable android.hardware.biometrics.common.AuthenticateReason authenticateReason;
android.hardware.biometrics.common.FoldState foldState = android.hardware.biometrics.common.FoldState.UNKNOWN;
+ @nullable android.hardware.biometrics.common.OperationState operationState;
}
diff --git a/biometrics/common/aidl/aidl_api/android.hardware.biometrics.common/current/android/hardware/biometrics/common/OperationState.aidl b/biometrics/common/aidl/aidl_api/android.hardware.biometrics.common/current/android/hardware/biometrics/common/OperationState.aidl
new file mode 100644
index 0000000..fca9525
--- /dev/null
+++ b/biometrics/common/aidl/aidl_api/android.hardware.biometrics.common/current/android/hardware/biometrics/common/OperationState.aidl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.biometrics.common;
+/* @hide */
+@VintfStability
+union OperationState {
+ android.hardware.biometrics.common.OperationState.FingerprintOperationState fingerprintOperationState;
+ android.hardware.biometrics.common.OperationState.FaceOperationState faceOperationState;
+ @VintfStability
+ parcelable FingerprintOperationState {
+ ParcelableHolder extension;
+ boolean isHardwareIgnoringTouches = false;
+ }
+ @VintfStability
+ parcelable FaceOperationState {
+ ParcelableHolder extension;
+ }
+}
diff --git a/biometrics/common/aidl/android/hardware/biometrics/common/OperationContext.aidl b/biometrics/common/aidl/android/hardware/biometrics/common/OperationContext.aidl
index 584057d..5f9844f 100644
--- a/biometrics/common/aidl/android/hardware/biometrics/common/OperationContext.aidl
+++ b/biometrics/common/aidl/android/hardware/biometrics/common/OperationContext.aidl
@@ -20,6 +20,7 @@
import android.hardware.biometrics.common.DisplayState;
import android.hardware.biometrics.common.FoldState;
import android.hardware.biometrics.common.OperationReason;
+import android.hardware.biometrics.common.OperationState;
import android.hardware.biometrics.common.WakeReason;
/**
@@ -75,4 +76,7 @@
/** The current fold/unfold state. */
FoldState foldState = FoldState.UNKNOWN;
+
+ /** An associated operation state for this operation. */
+ @nullable OperationState operationState;
}
diff --git a/biometrics/common/aidl/android/hardware/biometrics/common/OperationState.aidl b/biometrics/common/aidl/android/hardware/biometrics/common/OperationState.aidl
new file mode 100644
index 0000000..40cf589
--- /dev/null
+++ b/biometrics/common/aidl/android/hardware/biometrics/common/OperationState.aidl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.biometrics.common;
+
+/**
+ * Additional state associated with an operation
+ *
+ * @hide
+ */
+@VintfStability
+union OperationState {
+ /** Operation state related to fingerprint*/
+ @VintfStability
+ parcelable FingerprintOperationState {
+ ParcelableHolder extension;
+
+ /** Flag indicating if the HAL should ignore touches on the fingerprint sensor */
+ boolean isHardwareIgnoringTouches = false;
+ }
+
+ /** Operation state related to face*/
+ @VintfStability
+ parcelable FaceOperationState {
+ ParcelableHolder extension;
+ }
+
+ OperationState.FingerprintOperationState fingerprintOperationState;
+ OperationState.FaceOperationState faceOperationState;
+}
diff --git a/biometrics/face/aidl/default/FakeFaceEngine.cpp b/biometrics/face/aidl/default/FakeFaceEngine.cpp
index 7380611..bdc13fd 100644
--- a/biometrics/face/aidl/default/FakeFaceEngine.cpp
+++ b/biometrics/face/aidl/default/FakeFaceEngine.cpp
@@ -70,7 +70,7 @@
EnrollmentType /*enrollmentType*/,
const std::vector<Feature>& /*features*/,
const std::future<void>& cancel) {
- BEGIN_OP(FaceHalProperties::operation_start_enroll_latency().value_or(0));
+ BEGIN_OP(getLatency(FaceHalProperties::operation_enroll_latency()));
// Do proper HAT verification in the real implementation.
if (hat.mac.empty()) {
@@ -158,7 +158,7 @@
void FakeFaceEngine::authenticateImpl(ISessionCallback* cb, int64_t /*operationId*/,
const std::future<void>& cancel) {
- BEGIN_OP(FaceHalProperties::operation_authenticate_latency().value_or(0));
+ BEGIN_OP(getLatency(FaceHalProperties::operation_authenticate_latency()));
auto id = FaceHalProperties::enrollment_hit().value_or(0);
auto enrolls = FaceHalProperties::enrollments();
@@ -291,7 +291,7 @@
}
void FakeFaceEngine::detectInteractionImpl(ISessionCallback* cb, const std::future<void>& cancel) {
- BEGIN_OP(FaceHalProperties::operation_detect_interaction_latency().value_or(0));
+ BEGIN_OP(getLatency(FaceHalProperties::operation_detect_interaction_latency()));
if (FaceHalProperties::operation_detect_interaction_fails().value_or(false)) {
LOG(ERROR) << "Fail: operation_detect_interaction_fails";
@@ -418,4 +418,33 @@
cb->onLockoutCleared();
}
+int32_t FakeFaceEngine::getRandomInRange(int32_t bound1, int32_t bound2) {
+ std::uniform_int_distribution<int32_t> dist(std::min(bound1, bound2), std::max(bound1, bound2));
+ return dist(mRandom);
+}
+
+int32_t FakeFaceEngine::getLatency(const std::vector<std::optional<std::int32_t>>& latencyIn) {
+ int32_t res = DEFAULT_LATENCY;
+
+ std::vector<int32_t> latency;
+ for (auto x : latencyIn)
+ if (x.has_value()) latency.push_back(*x);
+
+ switch (latency.size()) {
+ case 0:
+ break;
+ case 1:
+ res = latency[0];
+ break;
+ case 2:
+ res = getRandomInRange(latency[0], latency[1]);
+ break;
+ default:
+ LOG(ERROR) << "ERROR: unexpected input of size " << latency.size();
+ break;
+ }
+
+ return res;
+}
+
} // namespace aidl::android::hardware::biometrics::face
diff --git a/biometrics/face/aidl/default/FakeFaceEngine.h b/biometrics/face/aidl/default/FakeFaceEngine.h
index 8d9303c..b1e1388 100644
--- a/biometrics/face/aidl/default/FakeFaceEngine.h
+++ b/biometrics/face/aidl/default/FakeFaceEngine.h
@@ -60,6 +60,7 @@
void getAuthenticatorIdImpl(ISessionCallback* cb);
void invalidateAuthenticatorIdImpl(ISessionCallback* cb);
void resetLockoutImpl(ISessionCallback* cb, const keymaster::HardwareAuthToken& /*hat*/);
+ int32_t getLatency(const std::vector<std::optional<std::int32_t>>& latencyVec);
virtual std::string toString() const {
std::ostringstream os;
@@ -71,6 +72,7 @@
std::mt19937 mRandom;
private:
+ int32_t getRandomInRange(int32_t bound1, int32_t bound2);
static constexpr int32_t FACE_ACQUIRED_VENDOR_BASE = 1000;
static constexpr int32_t FACE_ERROR_VENDOR_BASE = 1000;
std::pair<AcquiredInfo, int32_t> convertAcquiredInfo(int32_t code);
diff --git a/biometrics/face/aidl/default/FakeLockoutTracker.h b/biometrics/face/aidl/default/FakeLockoutTracker.h
index f2d38f3..82cc313 100644
--- a/biometrics/face/aidl/default/FakeLockoutTracker.h
+++ b/biometrics/face/aidl/default/FakeLockoutTracker.h
@@ -28,7 +28,9 @@
public:
FakeLockoutTracker()
: mFailedCount(0),
+ mTimedFailedCount(0),
mLastFailedTime(0),
+ mCurrentMode(LockoutMode::kNone),
mIsLockoutTimerStarted(false),
mIsLockoutTimerAborted(false) {}
~FakeLockoutTracker() {}
diff --git a/biometrics/face/aidl/default/api/android.hardware.biometrics.face.VirtualProps-current.txt b/biometrics/face/aidl/default/api/android.hardware.biometrics.face.VirtualProps-current.txt
index 9548920..e69de29 100644
--- a/biometrics/face/aidl/default/api/android.hardware.biometrics.face.VirtualProps-current.txt
+++ b/biometrics/face/aidl/default/api/android.hardware.biometrics.face.VirtualProps-current.txt
@@ -1,98 +0,0 @@
-props {
- owner: Vendor
- module: "android.face.virt.FaceHalProperties"
- prop {
- api_name: "authenticator_id"
- type: Long
- access: ReadWrite
- prop_name: "vendor.face.virtual.authenticator_id"
- }
- prop {
- api_name: "challenge"
- type: Long
- access: ReadWrite
- prop_name: "vendor.face.virtual.challenge"
- }
- prop {
- api_name: "enrollment_hit"
- type: Integer
- access: ReadWrite
- prop_name: "vendor.face.virtual.enrollment_hit"
- }
- prop {
- api_name: "enrollments"
- type: IntegerList
- access: ReadWrite
- prop_name: "persist.vendor.face.virtual.enrollments"
- }
- prop {
- api_name: "features"
- type: IntegerList
- access: ReadWrite
- prop_name: "persist.vendor.face.virtual.features"
- }
- prop {
- api_name: "lockout"
- access: ReadWrite
- prop_name: "vendor.face.virtual.lockout"
- }
- prop {
- api_name: "next_enrollment"
- type: String
- access: ReadWrite
- prop_name: "vendor.face.virtual.next_enrollment"
- }
- prop {
- api_name: "operation_authenticate_duration"
- type: Integer
- access: ReadWrite
- prop_name: "vendor.face.virtual.operation_authenticate_duration"
- }
- prop {
- api_name: "operation_authenticate_fails"
- access: ReadWrite
- prop_name: "vendor.face.virtual.operation_authenticate_fails"
- }
- prop {
- api_name: "operation_authenticate_latency"
- type: Integer
- access: ReadWrite
- prop_name: "vendor.face.virtual.operation_authenticate_latency"
- }
- prop {
- api_name: "operation_detect_interaction_fails"
- access: ReadWrite
- prop_name: "vendor.face.virtual.operation_detect_interaction_fails"
- }
- prop {
- api_name: "operation_detect_interaction_latency"
- type: Integer
- access: ReadWrite
- prop_name: "vendor.face.virtual.operation_detect_interaction_latency"
- }
- prop {
- api_name: "operation_enroll_fails"
- access: ReadWrite
- prop_name: "vendor.face.virtual.operation_enroll_fails"
- }
- prop {
- api_name: "operation_start_enroll_latency"
- type: Integer
- access: ReadWrite
- prop_name: "vendor.face.virtual.operation_start_enroll_latency"
- }
- prop {
- api_name: "strength"
- type: String
- access: ReadWrite
- prop_name: "persist.vendor.face.virtual.strength"
- enum_values: "convenience|weak|strong"
- }
- prop {
- api_name: "type"
- type: String
- access: ReadWrite
- prop_name: "persist.vendor.face.virtual.type"
- enum_values: "IR|RGB"
- }
-}
diff --git a/biometrics/face/aidl/default/face.sysprop b/biometrics/face/aidl/default/face.sysprop
index 95b0b43..997fd67 100644
--- a/biometrics/face/aidl/default/face.sysprop
+++ b/biometrics/face/aidl/default/face.sysprop
@@ -7,7 +7,7 @@
prop {
prop_name: "persist.vendor.face.virtual.type"
type: String
- scope: Public
+ scope: Internal
access: ReadWrite
enum_values: "IR|RGB"
api_name: "type"
@@ -17,7 +17,7 @@
prop {
prop_name: "persist.vendor.face.virtual.strength"
type: String
- scope: Public
+ scope: Internal
access: ReadWrite
enum_values: "convenience|weak|strong"
api_name: "strength"
@@ -27,7 +27,7 @@
prop {
prop_name: "persist.vendor.face.virtual.enrollments"
type: IntegerList
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "enrollments"
}
@@ -36,7 +36,7 @@
prop {
prop_name: "persist.vendor.face.virtual.features"
type: IntegerList
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "features"
}
@@ -46,20 +46,11 @@
prop {
prop_name: "vendor.face.virtual.enrollment_hit"
type: Integer
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "enrollment_hit"
}
-# The initial latency for enrollment
-prop {
- prop_name: "vendor.face.virtual.operation_start_enroll_latency"
- type: Integer
- scope: Public
- access: ReadWrite
- api_name: "operation_start_enroll_latency"
-}
-
# the next enrollment in the format:
# "<id>,<bucket_id>:<delay>:<succeeds>,<bucket_id>..."
# for example: "0:1,0:100:1,1:200:1" indicating that bucket 0 took
@@ -69,7 +60,7 @@
prop {
prop_name: "vendor.face.virtual.next_enrollment"
type: String
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "next_enrollment"
}
@@ -78,7 +69,7 @@
prop {
prop_name: "vendor.face.virtual.authenticator_id"
type: Long
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "authenticator_id"
}
@@ -87,7 +78,7 @@
prop {
prop_name: "vendor.face.virtual.challenge"
type: Long
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "challenge"
}
@@ -96,7 +87,7 @@
prop {
prop_name: "vendor.face.virtual.lockout"
type: Boolean
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "lockout"
}
@@ -105,7 +96,7 @@
prop {
prop_name: "vendor.face.virtual.operation_authenticate_fails"
type: Boolean
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "operation_authenticate_fails"
}
@@ -114,7 +105,7 @@
prop {
prop_name: "vendor.face.virtual.operation_detect_interaction_fails"
type: Boolean
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "operation_detect_interaction_fails"
}
@@ -123,7 +114,7 @@
prop {
prop_name: "vendor.face.virtual.operation_enroll_fails"
type: Boolean
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "operation_enroll_fails"
}
@@ -133,8 +124,8 @@
# the HAL will send AcquiredInfo::START and AcquiredInfo::FIRST_FRAME_RECEIVED
prop {
prop_name: "vendor.face.virtual.operation_authenticate_latency"
- type: Integer
- scope: Public
+ type: IntegerList
+ scope: Internal
access: ReadWrite
api_name: "operation_authenticate_latency"
}
@@ -142,18 +133,27 @@
# add a latency to detectInteraction operations
prop {
prop_name: "vendor.face.virtual.operation_detect_interaction_latency"
- type: Integer
- scope: Public
+ type: IntegerList
+ scope: Internal
access: ReadWrite
api_name: "operation_detect_interaction_latency"
}
+# add a latency to enroll operations
+prop {
+ prop_name: "vendor.face.virtual.operation_enroll_latency"
+ type: IntegerList
+ scope: Internal
+ access: ReadWrite
+ api_name: "operation_enroll_latency"
+}
+
# millisecond duration for authenticate operations
# (waits for changes to enrollment_hit)
prop {
prop_name: "vendor.face.virtual.operation_authenticate_duration"
type: Integer
- scope: Public
+ scope: Internal
access: ReadWrite
api_name: "operation_authenticate_duration"
}
diff --git a/biometrics/face/aidl/default/tests/FakeFaceEngineTest.cpp b/biometrics/face/aidl/default/tests/FakeFaceEngineTest.cpp
index 69c9bf4..8c39b58 100644
--- a/biometrics/face/aidl/default/tests/FakeFaceEngineTest.cpp
+++ b/biometrics/face/aidl/default/tests/FakeFaceEngineTest.cpp
@@ -22,6 +22,7 @@
#include <android-base/logging.h>
#include "FakeFaceEngine.h"
+#include "util/Util.h"
using namespace ::android::face::virt;
using namespace ::aidl::android::hardware::biometrics::face;
@@ -137,11 +138,15 @@
void SetUp() override {
LOG(ERROR) << "JRM SETUP";
mCallback = ndk::SharedRefBase::make<TestSessionCallback>();
+ }
+
+ void TearDown() override {
FaceHalProperties::enrollments({});
FaceHalProperties::challenge({});
FaceHalProperties::features({});
FaceHalProperties::authenticator_id({});
FaceHalProperties::strength("");
+ FaceHalProperties::operation_detect_interaction_latency({});
}
FakeFaceEngine mEngine;
@@ -383,4 +388,26 @@
ASSERT_FALSE(mCallback->mAuthenticateFailed);
}
+TEST_F(FakeFaceEngineTest, LatencyDefault) {
+ FaceHalProperties::operation_detect_interaction_latency({});
+ ASSERT_EQ(DEFAULT_LATENCY,
+ mEngine.getLatency(FaceHalProperties::operation_detect_interaction_latency()));
+}
+
+TEST_F(FakeFaceEngineTest, LatencyFixed) {
+ FaceHalProperties::operation_detect_interaction_latency({10});
+ ASSERT_EQ(10, mEngine.getLatency(FaceHalProperties::operation_detect_interaction_latency()));
+}
+
+TEST_F(FakeFaceEngineTest, LatencyRandom) {
+ FaceHalProperties::operation_detect_interaction_latency({1, 1000});
+ std::set<int32_t> latencySet;
+ for (int i = 0; i < 100; i++) {
+ auto x = mEngine.getLatency(FaceHalProperties::operation_detect_interaction_latency());
+ ASSERT_TRUE(x >= 1 && x <= 1000);
+ latencySet.insert(x);
+ }
+ ASSERT_TRUE(latencySet.size() > 95); // unique values
+}
+
} // namespace aidl::android::hardware::biometrics::face
diff --git a/biometrics/fingerprint/aidl/aidl_api/android.hardware.biometrics.fingerprint/current/android/hardware/biometrics/fingerprint/ISession.aidl b/biometrics/fingerprint/aidl/aidl_api/android.hardware.biometrics.fingerprint/current/android/hardware/biometrics/fingerprint/ISession.aidl
index 4fdcefc..feb6ba3 100644
--- a/biometrics/fingerprint/aidl/aidl_api/android.hardware.biometrics.fingerprint/current/android/hardware/biometrics/fingerprint/ISession.aidl
+++ b/biometrics/fingerprint/aidl/aidl_api/android.hardware.biometrics.fingerprint/current/android/hardware/biometrics/fingerprint/ISession.aidl
@@ -62,5 +62,8 @@
void onPointerUpWithContext(in android.hardware.biometrics.fingerprint.PointerContext context);
void onContextChanged(in android.hardware.biometrics.common.OperationContext context);
void onPointerCancelWithContext(in android.hardware.biometrics.fingerprint.PointerContext context);
+ /**
+ * @deprecated use isHardwareIgnoringTouches in OperationContext from onContextChanged instead
+ */
void setIgnoreDisplayTouches(in boolean shouldIgnore);
}
diff --git a/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/ISession.aidl b/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/ISession.aidl
index 83e7bbc..07e22c2 100644
--- a/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/ISession.aidl
+++ b/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/ISession.aidl
@@ -544,6 +544,8 @@
* whenever it's appropriate.
*
* @param shouldIgnore whether the display touches should be ignored.
+
+ * @deprecated use isHardwareIgnoringTouches in OperationContext from onContextChanged instead
*/
void setIgnoreDisplayTouches(in boolean shouldIgnore);
}
diff --git a/bluetooth/audio/aidl/aidl_api/android.hardware.bluetooth.audio/current/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl b/bluetooth/audio/aidl/aidl_api/android.hardware.bluetooth.audio/current/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl
index f155634..87401ff 100644
--- a/bluetooth/audio/aidl/aidl_api/android.hardware.bluetooth.audio/current/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl
+++ b/bluetooth/audio/aidl/aidl_api/android.hardware.bluetooth.audio/current/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl
@@ -45,7 +45,7 @@
void setCodecPriority(in android.hardware.bluetooth.audio.CodecId codecId, int priority);
List<android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioAseConfigurationSetting> getLeAudioAseConfiguration(in @nullable List<android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioDeviceCapabilities> remoteSinkAudioCapabilities, in @nullable List<android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioDeviceCapabilities> remoteSourceAudioCapabilities, in List<android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioConfigurationRequirement> requirements);
android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioAseQosConfigurationPair getLeAudioAseQosConfiguration(in android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioAseQosConfigurationRequirement qosRequirement);
- android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioDataPathConfigurationPair getLeAudioAseDatapathConfiguration(in android.hardware.bluetooth.audio.AudioContext context, in android.hardware.bluetooth.audio.LeAudioConfiguration.StreamMap[] streamMap);
+ android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioDataPathConfigurationPair getLeAudioAseDatapathConfiguration(in @nullable android.hardware.bluetooth.audio.IBluetoothAudioProvider.StreamConfig sinkConfig, in @nullable android.hardware.bluetooth.audio.IBluetoothAudioProvider.StreamConfig sourceConfig);
void onSinkAseMetadataChanged(in android.hardware.bluetooth.audio.IBluetoothAudioProvider.AseState state, int cigId, int cisId, in @nullable android.hardware.bluetooth.audio.MetadataLtv[] metadata);
void onSourceAseMetadataChanged(in android.hardware.bluetooth.audio.IBluetoothAudioProvider.AseState state, int cigId, int cisId, in @nullable android.hardware.bluetooth.audio.MetadataLtv[] metadata);
android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioBroadcastConfigurationSetting getLeAudioBroadcastConfiguration(in @nullable List<android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioDeviceCapabilities> remoteSinkAudioCapabilities, in android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioBroadcastConfigurationRequirement requirement);
@@ -146,6 +146,10 @@
@nullable android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioDataPathConfiguration inputConfig;
@nullable android.hardware.bluetooth.audio.IBluetoothAudioProvider.LeAudioDataPathConfiguration outputConfig;
}
+ parcelable StreamConfig {
+ android.hardware.bluetooth.audio.AudioContext context;
+ android.hardware.bluetooth.audio.LeAudioConfiguration.StreamMap[] streamMap;
+ }
@Backing(type="byte") @VintfStability
enum AseState {
ENABLING = 0x00,
diff --git a/bluetooth/audio/aidl/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl b/bluetooth/audio/aidl/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl
index 2e16f4e..8c6fe69 100644
--- a/bluetooth/audio/aidl/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl
+++ b/bluetooth/audio/aidl/android/hardware/bluetooth/audio/IBluetoothAudioProvider.aidl
@@ -519,14 +519,37 @@
}
/**
+ * Stream Configuration
+ */
+ parcelable StreamConfig {
+ /**
+ * Streaming Audio Context.
+ * This can serve as a hint for selecting the proper configuration by
+ * the offloader.
+ */
+ AudioContext context;
+ /**
+ * Stream configuration, including connection handles and audio channel
+ * allocations.
+ */
+ StreamMap[] streamMap;
+ }
+
+ /**
* Used to get a data path configuration which dynamically depends on CIS
* connection handles in StreamMap. This is used if non-dynamic data path
* was not provided in LeAudioAseConfigurationSetting. Calling this during
* the unicast audio stream establishment might slightly delay the stream
* start.
+ *
+ * @param sinkConfig - remote sink device stream configuration
+ * @param sourceConfig - remote source device stream configuration
+ *
+ * @return LeAudioDataPathConfigurationPair
*/
LeAudioDataPathConfigurationPair getLeAudioAseDatapathConfiguration(
- in AudioContext context, in StreamMap[] streamMap);
+ in @nullable StreamConfig sinkConfig,
+ in @nullable StreamConfig sourceConfig);
/*
* Audio Stream Endpoint state used to report Metadata changes on the remote
diff --git a/bluetooth/audio/aidl/default/BluetoothAudioProvider.cpp b/bluetooth/audio/aidl/default/BluetoothAudioProvider.cpp
index bdba898..8d03fae 100644
--- a/bluetooth/audio/aidl/default/BluetoothAudioProvider.cpp
+++ b/bluetooth/audio/aidl/default/BluetoothAudioProvider.cpp
@@ -229,14 +229,17 @@
};
ndk::ScopedAStatus BluetoothAudioProvider::getLeAudioAseDatapathConfiguration(
- const ::aidl::android::hardware::bluetooth::audio::AudioContext& in_context,
- const std::vector<::aidl::android::hardware::bluetooth::audio::
- LeAudioConfiguration::StreamMap>& in_streamMap,
+ const std::optional<::aidl::android::hardware::bluetooth::audio::
+ IBluetoothAudioProvider::StreamConfig>&
+ in_sinkConfig,
+ const std::optional<::aidl::android::hardware::bluetooth::audio::
+ IBluetoothAudioProvider::StreamConfig>&
+ in_sourceConfig,
::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
LeAudioDataPathConfigurationPair* _aidl_return) {
/* TODO: Implement */
- (void)in_context;
- (void)in_streamMap;
+ (void)in_sinkConfig;
+ (void)in_sourceConfig;
(void)_aidl_return;
return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
}
diff --git a/bluetooth/audio/aidl/default/BluetoothAudioProvider.h b/bluetooth/audio/aidl/default/BluetoothAudioProvider.h
index 5064869..2c21440 100644
--- a/bluetooth/audio/aidl/default/BluetoothAudioProvider.h
+++ b/bluetooth/audio/aidl/default/BluetoothAudioProvider.h
@@ -71,10 +71,12 @@
::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
LeAudioAseQosConfigurationPair* _aidl_return) override;
ndk::ScopedAStatus getLeAudioAseDatapathConfiguration(
- const ::aidl::android::hardware::bluetooth::audio::AudioContext&
- in_context,
- const std::vector<::aidl::android::hardware::bluetooth::audio::
- LeAudioConfiguration::StreamMap>& in_streamMap,
+ const std::optional<::aidl::android::hardware::bluetooth::audio::
+ IBluetoothAudioProvider::StreamConfig>&
+ in_sinkConfig,
+ const std::optional<::aidl::android::hardware::bluetooth::audio::
+ IBluetoothAudioProvider::StreamConfig>&
+ in_sourceConfig,
::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
LeAudioDataPathConfigurationPair* _aidl_return) override;
ndk::ScopedAStatus onSinkAseMetadataChanged(
diff --git a/bluetooth/audio/aidl/vts/VtsHalBluetoothAudioTargetTest.cpp b/bluetooth/audio/aidl/vts/VtsHalBluetoothAudioTargetTest.cpp
index 88f2f97..be49a74 100644
--- a/bluetooth/audio/aidl/vts/VtsHalBluetoothAudioTargetTest.cpp
+++ b/bluetooth/audio/aidl/vts/VtsHalBluetoothAudioTargetTest.cpp
@@ -2506,6 +2506,40 @@
// QoS Configurations should not be empty, as we searched for all contexts
ASSERT_FALSE(QoSConfigurations.empty());
}
+
+TEST_P(BluetoothAudioProviderLeAudioOutputHardwareAidl,
+ GetDataPathConfiguration) {
+ IBluetoothAudioProvider::StreamConfig sink_requirement;
+ IBluetoothAudioProvider::StreamConfig source_requirement;
+ std::vector<IBluetoothAudioProvider::LeAudioDataPathConfiguration>
+ DataPathConfigurations;
+ bool is_supported = false;
+
+ for (auto bitmask : all_context_bitmasks) {
+ sink_requirement.context = GetAudioContext(bitmask);
+ source_requirement.context = GetAudioContext(bitmask);
+ IBluetoothAudioProvider::LeAudioDataPathConfigurationPair result;
+ auto aidl_retval = audio_provider_->getLeAudioAseDatapathConfiguration(
+ sink_requirement, source_requirement, &result);
+ if (!aidl_retval.isOk()) {
+ // If not OK, then it could be not supported, as it is an optional feature
+ ASSERT_EQ(aidl_retval.getExceptionCode(), EX_UNSUPPORTED_OPERATION);
+ } else {
+ is_supported = true;
+ if (result.inputConfig.has_value())
+ DataPathConfigurations.push_back(result.inputConfig.value());
+ if (result.inputConfig.has_value())
+ DataPathConfigurations.push_back(result.inputConfig.value());
+ }
+ }
+
+ if (is_supported) {
+ // Datapath Configurations should not be empty, as we searched for all
+ // contexts
+ ASSERT_FALSE(DataPathConfigurations.empty());
+ }
+}
+
/**
* Test whether each provider of type
* SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH can be started and
diff --git a/bluetooth/finder/aidl/android/hardware/bluetooth/finder/Eid.aidl b/bluetooth/finder/aidl/android/hardware/bluetooth/finder/Eid.aidl
index ae9b159..0de306f 100644
--- a/bluetooth/finder/aidl/android/hardware/bluetooth/finder/Eid.aidl
+++ b/bluetooth/finder/aidl/android/hardware/bluetooth/finder/Eid.aidl
@@ -17,7 +17,7 @@
package android.hardware.bluetooth.finder;
/**
- * Ephemeral Identifier
+ * Find My Device network ephemeral identifier
*/
@VintfStability
parcelable Eid {
diff --git a/bluetooth/finder/aidl/android/hardware/bluetooth/finder/IBluetoothFinder.aidl b/bluetooth/finder/aidl/android/hardware/bluetooth/finder/IBluetoothFinder.aidl
index 615739b..a374c2a 100644
--- a/bluetooth/finder/aidl/android/hardware/bluetooth/finder/IBluetoothFinder.aidl
+++ b/bluetooth/finder/aidl/android/hardware/bluetooth/finder/IBluetoothFinder.aidl
@@ -21,7 +21,7 @@
@VintfStability
interface IBluetoothFinder {
/**
- * API to set the EIDs to the Bluetooth Controller
+ * API to set Find My Device network EIDs to the Bluetooth Controller
*
* @param eids array of 20 bytes EID to the Bluetooth
* controller
diff --git a/broadcastradio/common/tests/Android.bp b/broadcastradio/common/tests/Android.bp
index 0a6a3a2..1ea4e85 100644
--- a/broadcastradio/common/tests/Android.bp
+++ b/broadcastradio/common/tests/Android.bp
@@ -86,4 +86,7 @@
],
static_libs: ["android.hardware.broadcastradio@common-utils-lib"],
test_suites: ["general-tests"],
+ shared_libs: [
+ "libbase",
+ ],
}
diff --git a/broadcastradio/common/utils/WorkerThread.cpp b/broadcastradio/common/utils/WorkerThread.cpp
index 43fd04a..5c8e59c 100644
--- a/broadcastradio/common/utils/WorkerThread.cpp
+++ b/broadcastradio/common/utils/WorkerThread.cpp
@@ -69,8 +69,11 @@
}
void WorkerThread::threadLoop() {
- while (!mIsTerminating) {
+ while (true) {
unique_lock<mutex> lk(mMut);
+ if (mIsTerminating) {
+ return;
+ }
if (mTasks.empty()) {
mCond.wait(lk);
continue;
diff --git a/broadcastradio/common/utils/include/broadcastradio-utils/WorkerThread.h b/broadcastradio/common/utils/include/broadcastradio-utils/WorkerThread.h
index 457b57e..e381f5a 100644
--- a/broadcastradio/common/utils/include/broadcastradio-utils/WorkerThread.h
+++ b/broadcastradio/common/utils/include/broadcastradio-utils/WorkerThread.h
@@ -20,6 +20,8 @@
#include <queue>
#include <thread>
+#include <android-base/thread_annotations.h>
+
namespace android {
class WorkerThread {
@@ -40,11 +42,11 @@
};
friend bool operator<(const Task& lhs, const Task& rhs);
- std::atomic<bool> mIsTerminating;
std::mutex mMut;
- std::condition_variable mCond;
+ bool mIsTerminating GUARDED_BY(mMut);
+ std::condition_variable mCond GUARDED_BY(mMut);
std::thread mThread;
- std::priority_queue<Task> mTasks;
+ std::priority_queue<Task> mTasks GUARDED_BY(mMut);
void threadLoop();
};
diff --git a/camera/device/aidl/aidl_api/android.hardware.camera.device/current/android/hardware/camera/device/ConfigureStreamsRet.aidl b/camera/device/aidl/aidl_api/android.hardware.camera.device/current/android/hardware/camera/device/ConfigureStreamsRet.aidl
index 5535a30..670f7d2 100644
--- a/camera/device/aidl/aidl_api/android.hardware.camera.device/current/android/hardware/camera/device/ConfigureStreamsRet.aidl
+++ b/camera/device/aidl/aidl_api/android.hardware.camera.device/current/android/hardware/camera/device/ConfigureStreamsRet.aidl
@@ -35,5 +35,4 @@
@VintfStability
parcelable ConfigureStreamsRet {
android.hardware.camera.device.HalStream[] halStreams;
- boolean enableHalBufferManager = false;
}
diff --git a/camera/device/aidl/aidl_api/android.hardware.camera.device/current/android/hardware/camera/device/HalStream.aidl b/camera/device/aidl/aidl_api/android.hardware.camera.device/current/android/hardware/camera/device/HalStream.aidl
index a5784bc..3ae261d 100644
--- a/camera/device/aidl/aidl_api/android.hardware.camera.device/current/android/hardware/camera/device/HalStream.aidl
+++ b/camera/device/aidl/aidl_api/android.hardware.camera.device/current/android/hardware/camera/device/HalStream.aidl
@@ -42,4 +42,5 @@
android.hardware.graphics.common.Dataspace overrideDataSpace;
String physicalCameraId;
boolean supportOffline;
+ boolean enableHalBufferManager;
}
diff --git a/camera/device/aidl/android/hardware/camera/device/ConfigureStreamsRet.aidl b/camera/device/aidl/android/hardware/camera/device/ConfigureStreamsRet.aidl
index 8f462ec..702901f 100644
--- a/camera/device/aidl/android/hardware/camera/device/ConfigureStreamsRet.aidl
+++ b/camera/device/aidl/android/hardware/camera/device/ConfigureStreamsRet.aidl
@@ -34,9 +34,4 @@
* overridden format, maximum buffers etc.
*/
HalStream[] halStreams;
- /**
- * A boolean informing the camera framework whether the HAL buffer manager
- * must be used for the session configured.
- */
- boolean enableHalBufferManager = false;
}
diff --git a/camera/device/aidl/android/hardware/camera/device/HalStream.aidl b/camera/device/aidl/android/hardware/camera/device/HalStream.aidl
index 25a80bc..fac89e6 100644
--- a/camera/device/aidl/android/hardware/camera/device/HalStream.aidl
+++ b/camera/device/aidl/android/hardware/camera/device/HalStream.aidl
@@ -127,4 +127,24 @@
*
*/
boolean supportOffline;
+
+ /**
+ * Whether the buffers for this stream are HAL buffer managed.
+ *
+ * If ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION is
+ * ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_SESSION_CONFIGURABLE, this field
+ * must be set by the HAL to inform the camera framework, whether output buffers for this
+ * stream will be HAL buffer managed - i.e. requested through the
+ * ICameraDeviceCallback.requestStreamsBuffers() API. Only the output buffers for the streams
+ * that have this field set to 'true' will be HAL buffer managed. The output buffers for other
+ * streams will be managed by the camera framework.
+ *
+ * If the value of ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION is
+ * ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_AIDL_DEVICE, the camera framework
+ * will ignore this field and assume that all output streams are hal buffer managed.
+ *
+ * If ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION is not set at all, the camera framework
+ * will ignore this field and assume output buffers are managed by the camera framework.
+ */
+ boolean enableHalBufferManager;
}
diff --git a/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp b/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp
index 489bdc9..9a5f248 100644
--- a/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp
+++ b/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp
@@ -698,7 +698,6 @@
for (const auto& cameraDeviceIds : concurrentDeviceCombinations) {
std::vector<CameraIdAndStreamCombination> cameraIdsAndStreamCombinations;
std::vector<CameraTestInfo> cameraTestInfos;
- size_t i = 0;
for (const auto& id : cameraDeviceIds.combination) {
CameraTestInfo cti;
auto it = idToNameMap.find(id);
@@ -749,7 +748,6 @@
cameraIdAndStreamCombination.cameraId = id;
cameraIdAndStreamCombination.streamConfiguration = cti.config;
cameraIdsAndStreamCombinations.push_back(cameraIdAndStreamCombination);
- i++;
cameraTestInfos.push_back(cti);
}
// Now verify that concurrent streams are supported
@@ -1614,7 +1612,7 @@
std::vector<HalStream> halStreams;
bool supportsPartialResults = false;
- bool useHalBufManager = false;
+ std::set<int32_t> halBufManagedStreamIds;
int32_t partialResultCount = 0;
Stream previewStream;
std::shared_ptr<DeviceCb> cb;
@@ -1622,7 +1620,7 @@
configurePreviewStreams(
name, mProvider, &previewThreshold, physicalIds, &mSession, &previewStream,
&halStreams /*out*/, &supportsPartialResults /*out*/, &partialResultCount /*out*/,
- &useHalBufManager /*out*/, &cb /*out*/, 0 /*streamConfigCounter*/, true);
+ &halBufManagedStreamIds /*out*/, &cb /*out*/, 0 /*streamConfigCounter*/, true);
if (mSession == nullptr) {
// stream combination not supported by HAL, skip test for device
continue;
@@ -1659,7 +1657,9 @@
size_t k = 0;
for (const auto& halStream : halStreams) {
buffer_handle_t buffer_handle;
- if (useHalBufManager) {
+ bool useHalBufManagerForStream =
+ halBufManagedStreamIds.find(halStream.id) != halBufManagedStreamIds.end();
+ if (useHalBufManagerForStream) {
outputBuffers[k] = {halStream.id, /*bufferId*/ 0, NativeHandle(),
BufferStatus::OK, NativeHandle(), NativeHandle()};
} else {
@@ -1763,10 +1763,13 @@
defaultPreviewSettings.unlock(settingsBuffer);
filteredSettings.unlock(filteredSettingsBuffer);
- if (useHalBufManager) {
- std::vector<int32_t> streamIds(halStreams.size());
- for (size_t i = 0; i < streamIds.size(); i++) {
- streamIds[i] = halStreams[i].id;
+ if (halBufManagedStreamIds.size() != 0) {
+ std::vector<int32_t> streamIds;
+ for (size_t i = 0; i < halStreams.size(); i++) {
+ int32_t streamId = halStreams[i].id;
+ if (halBufManagedStreamIds.find(streamId) != halBufManagedStreamIds.end()) {
+ streamIds.emplace_back(streamId);
+ }
}
verifyBuffersReturned(mSession, streamIds, cb);
}
@@ -1830,7 +1833,7 @@
std::vector<HalStream> halStreams;
bool supportsPartialResults = false;
- bool useHalBufManager = false;
+ std::set<int32_t> halBufManagedStreamIds;
int32_t partialResultCount = 0;
Stream previewStream;
std::shared_ptr<DeviceCb> cb;
@@ -1842,8 +1845,8 @@
GRALLOC1_CONSUMER_USAGE_CPU_READ);
previewStream.dataSpace = Dataspace::UNKNOWN;
configureStreams(name, mProvider, format, &mSession, &previewStream, &halStreams,
- &supportsPartialResults, &partialResultCount, &useHalBufManager, &cb,
- 0, /*maxResolution*/ true);
+ &supportsPartialResults, &partialResultCount, &halBufManagedStreamIds,
+ &cb, 0, /*maxResolution*/ true);
ASSERT_NE(mSession, nullptr);
::aidl::android::hardware::common::fmq::MQDescriptor<
@@ -1874,7 +1877,9 @@
size_t k = 0;
for (const auto& halStream : halStreams) {
buffer_handle_t buffer_handle;
- if (useHalBufManager) {
+ bool halBufManagerUsed =
+ halBufManagedStreamIds.find(halStream.id) != halBufManagedStreamIds.end();
+ if (halBufManagerUsed) {
outputBuffers[k] = {halStream.id, 0,
NativeHandle(), BufferStatus::OK,
NativeHandle(), NativeHandle()};
@@ -1926,10 +1931,12 @@
ASSERT_FALSE(inflightReq->errorCodeValid);
ASSERT_NE(inflightReq->resultOutputBuffers.size(), 0u);
}
- if (useHalBufManager) {
- std::vector<int32_t> streamIds(halStreams.size());
- for (size_t i = 0; i < streamIds.size(); i++) {
- streamIds[i] = halStreams[i].id;
+ if (halBufManagedStreamIds.size()) {
+ std::vector<int32_t> streamIds;
+ for (size_t i = 0; i < halStreams.size(); i++) {
+ if (contains(halBufManagedStreamIds, halStreams[i].id)) {
+ streamIds.emplace_back(halStreams[i].id);
+ }
}
verifyBuffersReturned(mSession, streamIds, cb);
}
@@ -1991,7 +1998,7 @@
std::vector<HalStream> halStreams;
bool supportsPartialResults = false;
- bool useHalBufManager = false;
+ std::set<int32_t> halBufManagedStreamIds;
int32_t partialResultCount = 0;
Stream previewStream;
std::shared_ptr<DeviceCb> cb;
@@ -2002,7 +2009,7 @@
previewStream.dataSpace = getDataspace(PixelFormat::IMPLEMENTATION_DEFINED);
configureStreams(name, mProvider, PixelFormat::IMPLEMENTATION_DEFINED, &mSession,
&previewStream, &halStreams, &supportsPartialResults,
- &partialResultCount, &useHalBufManager, &cb, 0,
+ &partialResultCount, &halBufManagedStreamIds, &cb, 0,
/*maxResolution*/ false, profile);
ASSERT_NE(mSession, nullptr);
@@ -2041,7 +2048,7 @@
auto bufferId = requestId + 1; // Buffer id value 0 is not valid
for (const auto& halStream : halStreams) {
buffer_handle_t buffer_handle;
- if (useHalBufManager) {
+ if (contains(halBufManagedStreamIds, halStream.id)) {
outputBuffers[k] = {halStream.id, 0,
NativeHandle(), BufferStatus::OK,
NativeHandle(), NativeHandle()};
@@ -2107,10 +2114,12 @@
verify10BitMetadata(mHandleImporter, *inflightReq, profile);
}
- if (useHalBufManager) {
- std::vector<int32_t> streamIds(halStreams.size());
- for (size_t i = 0; i < streamIds.size(); i++) {
- streamIds[i] = halStreams[i].id;
+ if (halBufManagedStreamIds.size() != 0) {
+ std::vector<int32_t> streamIds;
+ for (size_t i = 0; i < halStreams.size(); i++) {
+ if (contains(halBufManagedStreamIds, halStreams[i].id)) {
+ streamIds.emplace_back(halStreams[i].id);
+ }
}
mSession->signalStreamFlush(streamIds, /*streamConfigCounter*/ 0);
cb->waitForBuffersReturned();
@@ -2442,11 +2451,11 @@
std::vector<HalStream> halStreams;
std::shared_ptr<DeviceCb> cb;
int32_t jpegBufferSize;
- bool useHalBufManager;
+ std::set<int32_t> halBufManagedStreamIds;
configureOfflineStillStream(name, mProvider, &threshold, &mSession /*out*/, &stream /*out*/,
&halStreams /*out*/, &supportsPartialResults /*out*/,
&partialResultCount /*out*/, &cb /*out*/,
- &jpegBufferSize /*out*/, &useHalBufManager /*out*/);
+ &jpegBufferSize /*out*/, &halBufManagedStreamIds /*out*/);
auto ret = mSession->constructDefaultRequestSettings(RequestTemplate::STILL_CAPTURE,
&settings);
@@ -2482,7 +2491,7 @@
StreamBuffer& outputBuffer = outputBuffers[0];
std::unique_lock<std::mutex> l(mLock);
- if (useHalBufManager) {
+ if (contains(halBufManagedStreamIds, halStream.id)) {
outputBuffer = {halStream.id, 0, NativeHandle(), BufferStatus::OK, NativeHandle(),
NativeHandle()};
} else {
diff --git a/camera/provider/aidl/vts/camera_aidl_test.cpp b/camera/provider/aidl/vts/camera_aidl_test.cpp
index 6a08f58..d2a409e 100644
--- a/camera/provider/aidl/vts/camera_aidl_test.cpp
+++ b/camera/provider/aidl/vts/camera_aidl_test.cpp
@@ -2258,7 +2258,6 @@
int64_t bufferId = 1;
int32_t frameNumber = 1;
CameraMetadata settings;
-
for (const auto& name : cameraDeviceNames) {
Stream testStream;
std::vector<HalStream> halStreams;
@@ -2548,12 +2547,19 @@
ndk::ScopedAStatus CameraAidlTest::configureStreams(std::shared_ptr<ICameraDeviceSession>& session,
const StreamConfiguration& config,
- bool sessionHalBufferManager,
- bool* useHalBufManager,
+ BufferManagerType bufferManagerType,
+ std::set<int32_t>* halBufManagedStreamIds,
std::vector<HalStream>* halStreams) {
auto ret = ndk::ScopedAStatus::ok();
ConfigureStreamsRet aidl_return;
- if (sessionHalBufferManager) {
+ int32_t interfaceVersion = -1;
+ ret = session->getInterfaceVersion(&interfaceVersion);
+ if (!ret.isOk()) {
+ return ret;
+ }
+
+ if (flags::session_hal_buf_manager() &&
+ (bufferManagerType == BufferManagerType::SESSION && interfaceVersion >= 3)) {
ret = session->configureStreamsV2(config, &aidl_return);
} else {
ret = session->configureStreams(config, halStreams);
@@ -2561,10 +2567,16 @@
if (!ret.isOk()) {
return ret;
}
- if (sessionHalBufferManager) {
- *useHalBufManager = aidl_return.enableHalBufferManager;
+ if (flags::session_hal_buf_manager() && bufferManagerType == BufferManagerType::SESSION) {
*halStreams = std::move(aidl_return.halStreams);
}
+ for (const auto& halStream : *halStreams) {
+ if ((flags::session_hal_buf_manager() && bufferManagerType == BufferManagerType::SESSION &&
+ halStream.enableHalBufferManager) ||
+ bufferManagerType == BufferManagerType::HAL) {
+ halBufManagedStreamIds->insert(halStream.id);
+ }
+ }
return ndk::ScopedAStatus::ok();
}
@@ -2621,16 +2633,16 @@
ASSERT_TRUE(ret.isOk());
ASSERT_NE(*session, nullptr);
- *useHalBufManager = false;
- bool sessionHalBufferManager = false;
+ BufferManagerType bufferManagerType = BufferManagerType::FRAMEWORK;
status = find_camera_metadata_ro_entry(
staticMeta, ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION, &entry);
if ((0 == status) && (entry.count == 1)) {
- *useHalBufManager = (entry.data.u8[0] ==
- ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_HIDL_DEVICE_3_5);
- sessionHalBufferManager =
- (entry.data.u8[0] ==
- ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_SESSION_CONFIGURABLE);
+ if (entry.data.u8[0] == ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_HIDL_DEVICE_3_5) {
+ bufferManagerType = BufferManagerType::HAL;
+ } else if (entry.data.u8[0] ==
+ ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_SESSION_CONFIGURABLE) {
+ bufferManagerType = BufferManagerType::SESSION;
+ }
}
outputPreviewStreams.clear();
@@ -2689,7 +2701,8 @@
ASSERT_EQ(supported, true);
std::vector<HalStream> halConfigs;
- ret = configureStreams(*session, config, sessionHalBufferManager, useHalBufManager,
+ std::set<int32_t> halBufManagedStreamIds;
+ ret = configureStreams(*session, config, bufferManagerType, &halBufManagedStreamIds,
&halConfigs);
ALOGI("configureStreams returns status: %d:%d", ret.getExceptionCode(),
ret.getServiceSpecificError());
@@ -2697,6 +2710,7 @@
ASSERT_EQ(1u, halConfigs.size());
halStreams->clear();
halStreams->push_back(halConfigs[0]);
+ *useHalBufManager = halBufManagedStreamIds.size() != 0;
if (*useHalBufManager) {
std::vector<Stream> ss(1);
std::vector<HalStream> hs(1);
@@ -2823,6 +2837,7 @@
overrideRotateAndCrop(&request.settings);
request.outputBuffers = std::vector<StreamBuffer>(1);
StreamBuffer& outputBuffer = request.outputBuffers[0];
+
if (useHalBufManager) {
outputBuffer = {halStreams[0].id,
/*bufferId*/ 0, NativeHandle(), BufferStatus::OK,
@@ -2941,14 +2956,14 @@
const AvailableStream* previewThreshold, const std::unordered_set<std::string>& physicalIds,
std::shared_ptr<ICameraDeviceSession>* session, Stream* previewStream,
std::vector<HalStream>* halStreams, bool* supportsPartialResults,
- int32_t* partialResultCount, bool* useHalBufManager, std::shared_ptr<DeviceCb>* cb,
- int32_t streamConfigCounter, bool allowUnsupport) {
+ int32_t* partialResultCount, std::set<int32_t>* halBufManagedStreamIds,
+ std::shared_ptr<DeviceCb>* cb, int32_t streamConfigCounter, bool allowUnsupport) {
ASSERT_NE(nullptr, session);
ASSERT_NE(nullptr, halStreams);
ASSERT_NE(nullptr, previewStream);
ASSERT_NE(nullptr, supportsPartialResults);
ASSERT_NE(nullptr, partialResultCount);
- ASSERT_NE(nullptr, useHalBufManager);
+ ASSERT_NE(nullptr, halBufManagedStreamIds);
ASSERT_NE(nullptr, cb);
ASSERT_FALSE(physicalIds.empty());
@@ -2985,16 +3000,16 @@
ASSERT_TRUE(ret.isOk());
ASSERT_NE(*session, nullptr);
- *useHalBufManager = false;
- bool sessionHalBufferManager = false;
+ BufferManagerType bufferManagerType = BufferManagerType::FRAMEWORK;
status = find_camera_metadata_ro_entry(
staticMeta, ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION, &entry);
if ((0 == status) && (entry.count == 1)) {
- *useHalBufManager = (entry.data.u8[0] ==
- ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_HIDL_DEVICE_3_5);
- sessionHalBufferManager =
- (entry.data.u8[0] ==
- ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_SESSION_CONFIGURABLE);
+ if (entry.data.u8[0] == ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_HIDL_DEVICE_3_5) {
+ bufferManagerType = BufferManagerType::HAL;
+ } else if (entry.data.u8[0] ==
+ ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_SESSION_CONFIGURABLE) {
+ bufferManagerType = BufferManagerType::SESSION;
+ }
}
outputPreviewStreams.clear();
@@ -3049,18 +3064,21 @@
config.streamConfigCounter = streamConfigCounter;
std::vector<HalStream> halConfigs;
- ret = configureStreams(*session, config, sessionHalBufferManager, useHalBufManager,
+ ret = configureStreams(*session, config, bufferManagerType, halBufManagedStreamIds,
&halConfigs);
ASSERT_TRUE(ret.isOk());
ASSERT_EQ(physicalIds.size(), halConfigs.size());
*halStreams = halConfigs;
- if (*useHalBufManager) {
- std::vector<Stream> ss(physicalIds.size());
- std::vector<HalStream> hs(physicalIds.size());
+ if (halBufManagedStreamIds->size() != 0) {
+ // Only include the streams that are HAL buffer managed
+ std::vector<Stream> ss;
+ std::vector<HalStream> hs;
for (size_t i = 0; i < physicalIds.size(); i++) {
- ss[i] = streams[i];
- hs[i] = halConfigs[i];
+ if (contains(*halBufManagedStreamIds, halConfigs[i].id)) {
+ ss.emplace_back(streams[i]);
+ hs.emplace_back(halConfigs[i]);
+ }
}
(*cb)->setCurrentStreamConfig(ss, hs);
}
@@ -3078,22 +3096,20 @@
cb->waitForBuffersReturned();
}
-void CameraAidlTest::configureStreams(const std::string& name,
- const std::shared_ptr<ICameraProvider>& provider,
- PixelFormat format,
- std::shared_ptr<ICameraDeviceSession>* session,
- Stream* previewStream, std::vector<HalStream>* halStreams,
- bool* supportsPartialResults, int32_t* partialResultCount,
- bool* useHalBufManager, std::shared_ptr<DeviceCb>* outCb,
- uint32_t streamConfigCounter, bool maxResolution,
- RequestAvailableDynamicRangeProfilesMap dynamicRangeProf,
- RequestAvailableColorSpaceProfilesMap colorSpaceProf) {
+void CameraAidlTest::configureStreams(
+ const std::string& name, const std::shared_ptr<ICameraProvider>& provider,
+ PixelFormat format, std::shared_ptr<ICameraDeviceSession>* session, Stream* previewStream,
+ std::vector<HalStream>* halStreams, bool* supportsPartialResults,
+ int32_t* partialResultCount, std::set<int32_t>* halBufManagedStreamIds,
+ std::shared_ptr<DeviceCb>* outCb, uint32_t streamConfigCounter, bool maxResolution,
+ RequestAvailableDynamicRangeProfilesMap dynamicRangeProf,
+ RequestAvailableColorSpaceProfilesMap colorSpaceProf) {
ASSERT_NE(nullptr, session);
ASSERT_NE(nullptr, halStreams);
ASSERT_NE(nullptr, previewStream);
ASSERT_NE(nullptr, supportsPartialResults);
ASSERT_NE(nullptr, partialResultCount);
- ASSERT_NE(nullptr, useHalBufManager);
+ ASSERT_NE(nullptr, halBufManagedStreamIds);
ASSERT_NE(nullptr, outCb);
ALOGI("configureStreams: Testing camera device %s", name.c_str());
@@ -3130,16 +3146,16 @@
ASSERT_TRUE(ret.isOk());
ASSERT_NE(*session, nullptr);
- *useHalBufManager = false;
- bool sessionHalBufferManager = false;
+ BufferManagerType bufferManagerType = BufferManagerType::FRAMEWORK;
status = find_camera_metadata_ro_entry(
staticMeta, ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION, &entry);
if ((0 == status) && (entry.count == 1)) {
- *useHalBufManager = (entry.data.u8[0] ==
- ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_HIDL_DEVICE_3_5);
- sessionHalBufferManager =
- (entry.data.u8[0] ==
- ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_SESSION_CONFIGURABLE);
+ if (entry.data.u8[0] == ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_HIDL_DEVICE_3_5) {
+ bufferManagerType = BufferManagerType::HAL;
+ } else if (entry.data.u8[0] ==
+ ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_SESSION_CONFIGURABLE) {
+ bufferManagerType = BufferManagerType::SESSION;
+ }
}
outputStreams.clear();
@@ -3193,11 +3209,11 @@
ASSERT_TRUE(ret.isOk());
ASSERT_EQ(supported, true);
- ret = configureStreams(*session, config, sessionHalBufferManager, useHalBufManager, halStreams);
+ ret = configureStreams(*session, config, bufferManagerType, halBufManagedStreamIds, halStreams);
ASSERT_TRUE(ret.isOk());
- if (*useHalBufManager) {
+ if (halBufManagedStreamIds->size() != 0) {
std::vector<Stream> ss(1);
std::vector<HalStream> hs(1);
ss[0] = streams[0];
@@ -3542,7 +3558,7 @@
const AvailableStream* threshold, std::shared_ptr<ICameraDeviceSession>* session,
Stream* stream, std::vector<HalStream>* halStreams, bool* supportsPartialResults,
int32_t* partialResultCount, std::shared_ptr<DeviceCb>* outCb, int32_t* jpegBufferSize,
- bool* useHalBufManager) {
+ std::set<int32_t>* halBufManagedStreamIds) {
ASSERT_NE(nullptr, session);
ASSERT_NE(nullptr, halStreams);
ASSERT_NE(nullptr, stream);
@@ -3550,7 +3566,7 @@
ASSERT_NE(nullptr, partialResultCount);
ASSERT_NE(nullptr, outCb);
ASSERT_NE(nullptr, jpegBufferSize);
- ASSERT_NE(nullptr, useHalBufManager);
+ ASSERT_NE(nullptr, halBufManagedStreamIds);
std::vector<AvailableStream> outputStreams;
std::shared_ptr<ICameraDevice> cameraDevice;
@@ -3577,16 +3593,16 @@
*supportsPartialResults = (*partialResultCount > 1);
}
- *useHalBufManager = false;
- bool sessionHalBufferManager = false;
+ BufferManagerType bufferManagerType = BufferManagerType::FRAMEWORK;
status = find_camera_metadata_ro_entry(
staticMeta, ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION, &entry);
if ((0 == status) && (entry.count == 1)) {
- *useHalBufManager = (entry.data.u8[0] ==
- ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_HIDL_DEVICE_3_5);
- sessionHalBufferManager =
- (entry.data.u8[0] ==
- ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_SESSION_CONFIGURABLE);
+ if (entry.data.u8[0] == ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_HIDL_DEVICE_3_5) {
+ bufferManagerType = BufferManagerType::HAL;
+ } else if (entry.data.u8[0] ==
+ ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_SESSION_CONFIGURABLE) {
+ bufferManagerType = BufferManagerType::SESSION;
+ }
}
auto st = getJpegBufferSize(staticMeta, jpegBufferSize);
@@ -3639,11 +3655,11 @@
StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE, CameraMetadata()};
- ret = configureStreams(*session, config, sessionHalBufferManager, useHalBufManager, halStreams);
+ ret = configureStreams(*session, config, bufferManagerType, halBufManagedStreamIds, halStreams);
ASSERT_TRUE(ret.isOk());
- if (*useHalBufManager) {
+ if (halBufManagedStreamIds->size() != 0) {
(*outCb)->setCurrentStreamConfig(streams, *halStreams);
}
@@ -3746,7 +3762,7 @@
std::vector<HalStream> halStreams;
bool supportsPartialResults = false;
- bool useHalBufManager = false;
+ std::set<int32_t> halBufManagedStreamIds;
int32_t partialResultCount = 0;
Stream previewStream;
std::shared_ptr<DeviceCb> cb;
@@ -3755,7 +3771,7 @@
GRALLOC1_CONSUMER_USAGE_HWCOMPOSER);
configureStreams(name, mProvider, PixelFormat::IMPLEMENTATION_DEFINED, &mSession,
&previewStream, &halStreams, &supportsPartialResults, &partialResultCount,
- &useHalBufManager, &cb, 0,
+ &halBufManagedStreamIds, &cb, 0,
/*maxResolution*/ false, dynamicRangeProfile, colorSpace);
ASSERT_NE(mSession, nullptr);
@@ -3794,7 +3810,7 @@
auto bufferId = requestId + 1; // Buffer id value 0 is not valid
for (const auto& halStream : halStreams) {
buffer_handle_t buffer_handle;
- if (useHalBufManager) {
+ if (contains(halBufManagedStreamIds, halStream.id)) {
outputBuffers[k] = {halStream.id, 0,
NativeHandle(), BufferStatus::OK,
NativeHandle(), NativeHandle()};
@@ -3861,10 +3877,12 @@
}
}
- if (useHalBufManager) {
- std::vector<int32_t> streamIds(halStreams.size());
+ if (halBufManagedStreamIds.size() != 0) {
+ std::vector<int32_t> streamIds;
for (size_t i = 0; i < streamIds.size(); i++) {
- streamIds[i] = halStreams[i].id;
+ if (contains(halBufManagedStreamIds, halStreams[i].id)) {
+ streamIds.emplace_back(halStreams[i].id);
+ }
}
mSession->signalStreamFlush(streamIds, /*streamConfigCounter*/ 0);
cb->waitForBuffersReturned();
diff --git a/camera/provider/aidl/vts/camera_aidl_test.h b/camera/provider/aidl/vts/camera_aidl_test.h
index e3b0820..507a637 100644
--- a/camera/provider/aidl/vts/camera_aidl_test.h
+++ b/camera/provider/aidl/vts/camera_aidl_test.h
@@ -99,6 +99,11 @@
class DeviceCb; // Forward declare to break circular header dependency
+template <typename T>
+bool contains(const std::set<T>& container, T value) {
+ return container.find(value) != container.end();
+}
+
class CameraAidlTest : public ::testing::TestWithParam<std::string> {
public:
enum SystemCameraKind {
@@ -121,6 +126,8 @@
HIDDEN_SECURE_CAMERA
};
+ enum BufferManagerType { FRAMEWORK = 0, HAL, SESSION };
+
struct AvailableStream {
int32_t width;
int32_t height;
@@ -200,11 +207,12 @@
std::shared_ptr<ICameraDeviceSession>* session /*out*/, Stream* stream /*out*/,
std::vector<HalStream>* halStreams, bool* supportsPartialResults /*out*/,
int32_t* partialResultCount /*out*/, std::shared_ptr<DeviceCb>* outCb /*out*/,
- int32_t* jpegBufferSize /*out*/, bool* useHalBufManager /*out*/);
+ int32_t* jpegBufferSize /*out*/, std::set<int32_t>* halBufManagedStreamIds /*out*/);
ndk::ScopedAStatus configureStreams(std::shared_ptr<ICameraDeviceSession>& session,
const StreamConfiguration& config,
- bool sessionHalBufferManager, bool* useHalBufManager,
+ BufferManagerType bufferManagerType,
+ std::set<int32_t>* halBufManagedStreamIds,
std::vector<HalStream>* halStreams);
void configureStreams(
@@ -212,8 +220,9 @@
PixelFormat format, std::shared_ptr<ICameraDeviceSession>* session /*out*/,
Stream* previewStream /*out*/, std::vector<HalStream>* halStreams /*out*/,
bool* supportsPartialResults /*out*/, int32_t* partialResultCount /*out*/,
- bool* useHalBufManager /*out*/, std::shared_ptr<DeviceCb>* outCb /*out*/,
- uint32_t streamConfigCounter, bool maxResolution,
+ std::set<int32_t>* halBufManagedStreamIds /*out*/,
+ std::shared_ptr<DeviceCb>* outCb /*out*/, uint32_t streamConfigCounter,
+ bool maxResolution,
RequestAvailableDynamicRangeProfilesMap dynamicRangeProf =
RequestAvailableDynamicRangeProfilesMap::
ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD,
@@ -227,7 +236,7 @@
const std::unordered_set<std::string>& physicalIds,
std::shared_ptr<ICameraDeviceSession>* session /*out*/, Stream* previewStream /*out*/,
std::vector<HalStream>* halStreams /*out*/, bool* supportsPartialResults /*out*/,
- int32_t* partialResultCount /*out*/, bool* useHalBufManager /*out*/,
+ int32_t* partialResultCount /*out*/, std::set<int32_t>* halBufManagedStreamIds /*out*/,
std::shared_ptr<DeviceCb>* cb /*out*/, int32_t streamConfigCounter = 0,
bool allowUnsupport = false);
diff --git a/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp b/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp
index b67cfc2..a1992b9 100644
--- a/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp
+++ b/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp
@@ -315,6 +315,8 @@
* required client targets.
*/
TEST_P(GraphicsComposerHidlTest, GetClientTargetSupport) {
+ ASSERT_NO_FATAL_FAILURE(
+ mComposerClient->setPowerMode(mPrimaryDisplay, IComposerClient::PowerMode::ON));
std::vector<Config> configs = mComposerClient->getDisplayConfigs(mPrimaryDisplay);
for (auto config : configs) {
int32_t width = mComposerClient->getDisplayAttribute(mPrimaryDisplay, config,
diff --git a/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2TargetTest.cpp b/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2TargetTest.cpp
index 2bd287b..cd4cb58 100644
--- a/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2TargetTest.cpp
+++ b/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2TargetTest.cpp
@@ -256,6 +256,8 @@
* required client targets.
*/
TEST_P(GraphicsComposerHidlTest, GetClientTargetSupport_2_2) {
+ ASSERT_NO_FATAL_FAILURE(
+ mComposerClient->setPowerMode_2_2(mPrimaryDisplay, IComposerClient::PowerMode::ON));
std::vector<Config> configs = mComposerClient->getDisplayConfigs(mPrimaryDisplay);
for (auto config : configs) {
int32_t width = mComposerClient->getDisplayAttribute(mPrimaryDisplay, config,
diff --git a/graphics/composer/2.3/vts/functional/VtsHalGraphicsComposerV2_3TargetTest.cpp b/graphics/composer/2.3/vts/functional/VtsHalGraphicsComposerV2_3TargetTest.cpp
index c072ef0..f99c72d 100644
--- a/graphics/composer/2.3/vts/functional/VtsHalGraphicsComposerV2_3TargetTest.cpp
+++ b/graphics/composer/2.3/vts/functional/VtsHalGraphicsComposerV2_3TargetTest.cpp
@@ -274,6 +274,8 @@
* Test IComposerClient::getClientTargetSupport_2_3
*/
TEST_P(GraphicsComposerHidlTest, GetClientTargetSupport_2_3) {
+ ASSERT_NO_FATAL_FAILURE(
+ mComposerClient->setPowerMode_2_2(mPrimaryDisplay, IComposerClient::PowerMode::ON));
std::vector<V2_1::Config> configs = mComposerClient->getDisplayConfigs(mPrimaryDisplay);
for (auto config : configs) {
int32_t width = mComposerClient->getDisplayAttribute(mPrimaryDisplay, config,
diff --git a/health/2.0/README.md b/health/2.0/README.md
index 8a7c922..1c636c7 100644
--- a/health/2.0/README.md
+++ b/health/2.0/README.md
@@ -1,181 +1,7 @@
-# Implement the 2.1 HAL instead!
+# Deprecated.
-It is strongly recommended that you implement the 2.1 HAL directly. See
-`hardware/interfaces/health/2.1/README.md` for more details.
+Health HIDL HAL 2.0 is deprecated and subject to removal. Please
+implement the Health AIDL HAL instead.
-# Upgrading from Health 1.0 HAL
-
-1. Remove `android.hardware.health@1.0*` from `PRODUCT_PACKAGES`
- in `device/<manufacturer>/<device>/device.mk`
-
-1. If the device does not have a vendor-specific `libhealthd` AND does not
- implement storage-related APIs, just do the following:
-
- ```mk
- PRODUCT_PACKAGES += android.hardware.health@2.0-service
- ```
-
- Otherwise, continue to the next step.
-
-1. Create directory
- `device/<manufacturer>/<device>/health`
-
-1. Create `device/<manufacturer>/<device>/health/Android.bp`
- (or equivalent `device/<manufacturer>/<device>/health/Android.mk`)
-
- ```bp
- cc_binary {
- name: "android.hardware.health@2.0-service.<device>",
- init_rc: ["android.hardware.health@2.0-service.<device>.rc"],
- proprietary: true,
- relative_install_path: "hw",
- srcs: [
- "HealthService.cpp",
- ],
-
- cflags: [
- "-Wall",
- "-Werror",
- ],
-
- static_libs: [
- "android.hardware.health@2.0-impl",
- "android.hardware.health@1.0-convert",
- "libhealthservice",
- "libbatterymonitor",
- ],
-
- shared_libs: [
- "libbase",
- "libcutils",
- "libhidlbase",
- "libutils",
- "android.hardware.health@2.0",
- ],
-
- header_libs: ["libhealthd_headers"],
-
- overrides: [
- "healthd",
- ],
- }
- ```
-
- 1. (recommended) To remove `healthd` from the build, keep "overrides" section.
- 1. To keep `healthd` in the build, remove "overrides" section.
-
-1. Create `device/<manufacturer>/<device>/health/android.hardware.health@2.0-service.<device>.rc`
-
- ```rc
- service vendor.health-hal-2-0 /vendor/bin/hw/android.hardware.health@2.0-service.<device>
- class hal
- user system
- group system
- capabilities WAKE_ALARM
- file /dev/kmsg w
- ```
-
-1. Create `device/<manufacturer>/<device>/health/HealthService.cpp`:
-
- ```c++
- #include <health2/service.h>
- int main() { return health_service_main(); }
- ```
-
-1. `libhealthd` dependency:
-
- 1. If the device has a vendor-specific `libhealthd.<soc>`, add it to static_libs.
-
- 1. If the device does not have a vendor-specific `libhealthd`, add the following
- lines to `HealthService.cpp`:
-
- ```c++
- #include <healthd/healthd.h>
- void healthd_board_init(struct healthd_config*) {}
-
- int healthd_board_battery_update(struct android::BatteryProperties*) {
- // return 0 to log periodic polled battery status to kernel log
- return 0;
- }
- ```
-
-1. Storage related APIs:
-
- 1. If the device does not implement `IHealth.getDiskStats` and
- `IHealth.getStorageInfo`, add `libhealthstoragedefault` to `static_libs`.
-
- 1. If the device implements one of these two APIs, add and implement the
- following functions in `HealthService.cpp`:
-
- ```c++
- void get_storage_info(std::vector<struct StorageInfo>& info) {
- // ...
- }
- void get_disk_stats(std::vector<struct DiskStats>& stats) {
- // ...
- }
- ```
-
-1. Update necessary SELinux permissions. For example,
-
- ```
- # device/<manufacturer>/<device>/sepolicy/vendor/file_contexts
- /vendor/bin/hw/android\.hardware\.health@2\.0-service\.<device> u:object_r:hal_health_default_exec:s0
-
- # device/<manufacturer>/<device>/sepolicy/vendor/hal_health_default.te
- # Add device specific permissions to hal_health_default domain, especially
- # if a device-specific libhealthd is used and/or device-specific storage related
- # APIs are implemented.
- ```
-
-1. Implementing health HAL in recovery. The health HAL is used for battery
-status checks during OTA for non-A/B devices. If the health HAL is not
-implemented in recovery, `is_battery_ok()` will always return `true`.
-
- 1. If the device does not have a vendor-specific `libhealthd`, nothing needs to
- be done. A "backup" implementation is provided in
- `android.hardware.health@2.0-impl-default`, which is always installed to recovery
- image by default.
-
- 1. If the device does have a vendor-specific `libhealthd`, implement the following
- module and include it in `PRODUCT_PACKAGES` (replace `<device>` with appropriate
- strings):
-
- ```bp
- // Android.bp
- cc_library_shared {
- name: "android.hardware.health@2.0-impl-<device>",
- recovery_available: true,
- relative_install_path: "hw",
- static_libs: [
- "android.hardware.health@2.0-impl",
- "libhealthd.<device>"
- // Include the following or implement device-specific storage APIs
- "libhealthstoragedefault",
- ],
- srcs: [
- "HealthImpl.cpp",
- ],
- overrides: [
- "android.hardware.health@2.0-impl-default",
- ],
- }
- ```
-
- ```c++
- // HealthImpl.cpp
- #include <health2/Health.h>
- #include <healthd/healthd.h>
- using android::hardware::health::V2_0::IHealth;
- using android::hardware::health::V2_0::implementation::Health;
- extern "C" IHealth* HIDL_FETCH_IHealth(const char* name) {
- const static std::string providedInstance{"default"};
- if (providedInstance != name) return nullptr;
- return Health::initInstance(&gHealthdConfig).get();
- }
- ```
-
- ```mk
- # device.mk
- PRODUCT_PACKAGES += android.hardware.health@2.0-impl-<device>
- ```
+See [`hardware/interfaces/health/aidl/README.md`](../aidl/README.md) for
+details.
diff --git a/health/2.0/default/Android.bp b/health/2.0/default/Android.bp
deleted file mode 100644
index 73cd553..0000000
--- a/health/2.0/default/Android.bp
+++ /dev/null
@@ -1,72 +0,0 @@
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "hardware_interfaces_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["hardware_interfaces_license"],
-}
-
-cc_defaults {
- name: "android.hardware.health@2.0-impl_defaults",
-
- recovery_available: true,
- cflags: [
- "-Wall",
- "-Werror",
- ],
-
- shared_libs: [
- "libbase",
- "libhidlbase",
- "liblog",
- "libutils",
- "libcutils",
- "android.hardware.health@2.0",
- ],
-
- static_libs: [
- "libbatterymonitor",
- "android.hardware.health@1.0-convert",
- ],
-}
-
-// Helper library for implementing health HAL. It is recommended that a health
-// service or passthrough HAL link to this library.
-cc_library_static {
- name: "android.hardware.health@2.0-impl",
- defaults: ["android.hardware.health@2.0-impl_defaults"],
-
- vendor_available: true,
- srcs: [
- "Health.cpp",
- "healthd_common_adapter.cpp",
- ],
-
- whole_static_libs: [
- "libhealthloop",
- ],
-
- export_include_dirs: ["include"],
-}
-
-// Default passthrough implementation for recovery. Vendors can implement
-// android.hardware.health@2.0-impl-recovery-<device> to customize the behavior
-// of the HAL in recovery.
-// The implementation does NOT start the uevent loop for polling.
-cc_library_shared {
- name: "android.hardware.health@2.0-impl-default",
- defaults: ["android.hardware.health@2.0-impl_defaults"],
-
- recovery_available: true,
- relative_install_path: "hw",
-
- static_libs: [
- "android.hardware.health@2.0-impl",
- "libhealthstoragedefault",
- ],
-
- srcs: [
- "HealthImplDefault.cpp",
- ],
-}
diff --git a/health/2.0/default/Health.cpp b/health/2.0/default/Health.cpp
deleted file mode 100644
index 65eada8..0000000
--- a/health/2.0/default/Health.cpp
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_TAG "android.hardware.health@2.0-impl"
-#include <android-base/logging.h>
-
-#include <android-base/file.h>
-#include <android/hardware/health/2.0/types.h>
-#include <health2/Health.h>
-
-#include <hal_conversion.h>
-#include <hidl/HidlTransportSupport.h>
-
-using HealthInfo_1_0 = android::hardware::health::V1_0::HealthInfo;
-using android::hardware::health::V1_0::hal_conversion::convertFromHealthInfo;
-
-extern void healthd_battery_update_internal(bool);
-
-namespace android {
-namespace hardware {
-namespace health {
-namespace V2_0 {
-namespace implementation {
-
-sp<Health> Health::instance_;
-
-Health::Health(struct healthd_config* c) {
- // TODO(b/69268160): remove when libhealthd is removed.
- healthd_board_init(c);
- battery_monitor_ = std::make_unique<BatteryMonitor>();
- battery_monitor_->init(c);
-}
-
-// Methods from IHealth follow.
-Return<Result> Health::registerCallback(const sp<IHealthInfoCallback>& callback) {
- if (callback == nullptr) {
- return Result::SUCCESS;
- }
-
- {
- std::lock_guard<decltype(callbacks_lock_)> lock(callbacks_lock_);
- callbacks_.push_back(callback);
- // unlock
- }
-
- auto linkRet = callback->linkToDeath(this, 0u /* cookie */);
- if (!linkRet.withDefault(false)) {
- LOG(WARNING) << __func__ << "Cannot link to death: "
- << (linkRet.isOk() ? "linkToDeath returns false" : linkRet.description());
- // ignore the error
- }
-
- return updateAndNotify(callback);
-}
-
-bool Health::unregisterCallbackInternal(const sp<IBase>& callback) {
- if (callback == nullptr) return false;
-
- bool removed = false;
- std::lock_guard<decltype(callbacks_lock_)> lock(callbacks_lock_);
- for (auto it = callbacks_.begin(); it != callbacks_.end();) {
- if (interfacesEqual(*it, callback)) {
- it = callbacks_.erase(it);
- removed = true;
- } else {
- ++it;
- }
- }
- (void)callback->unlinkToDeath(this).isOk(); // ignore errors
- return removed;
-}
-
-Return<Result> Health::unregisterCallback(const sp<IHealthInfoCallback>& callback) {
- return unregisterCallbackInternal(callback) ? Result::SUCCESS : Result::NOT_FOUND;
-}
-
-template <typename T>
-void getProperty(const std::unique_ptr<BatteryMonitor>& monitor, int id, T defaultValue,
- const std::function<void(Result, T)>& callback) {
- struct BatteryProperty prop;
- T ret = defaultValue;
- Result result = Result::SUCCESS;
- status_t err = monitor->getProperty(static_cast<int>(id), &prop);
- if (err != OK) {
- LOG(DEBUG) << "getProperty(" << id << ")"
- << " fails: (" << err << ") " << strerror(-err);
- } else {
- ret = static_cast<T>(prop.valueInt64);
- }
- switch (err) {
- case OK:
- result = Result::SUCCESS;
- break;
- case NAME_NOT_FOUND:
- result = Result::NOT_SUPPORTED;
- break;
- default:
- result = Result::UNKNOWN;
- break;
- }
- callback(result, static_cast<T>(ret));
-}
-
-Return<void> Health::getChargeCounter(getChargeCounter_cb _hidl_cb) {
- getProperty<int32_t>(battery_monitor_, BATTERY_PROP_CHARGE_COUNTER, 0, _hidl_cb);
- return Void();
-}
-
-Return<void> Health::getCurrentNow(getCurrentNow_cb _hidl_cb) {
- getProperty<int32_t>(battery_monitor_, BATTERY_PROP_CURRENT_NOW, 0, _hidl_cb);
- return Void();
-}
-
-Return<void> Health::getCurrentAverage(getCurrentAverage_cb _hidl_cb) {
- getProperty<int32_t>(battery_monitor_, BATTERY_PROP_CURRENT_AVG, 0, _hidl_cb);
- return Void();
-}
-
-Return<void> Health::getCapacity(getCapacity_cb _hidl_cb) {
- getProperty<int32_t>(battery_monitor_, BATTERY_PROP_CAPACITY, 0, _hidl_cb);
- return Void();
-}
-
-Return<void> Health::getEnergyCounter(getEnergyCounter_cb _hidl_cb) {
- getProperty<int64_t>(battery_monitor_, BATTERY_PROP_ENERGY_COUNTER, 0, _hidl_cb);
- return Void();
-}
-
-Return<void> Health::getChargeStatus(getChargeStatus_cb _hidl_cb) {
- getProperty(battery_monitor_, BATTERY_PROP_BATTERY_STATUS, BatteryStatus::UNKNOWN, _hidl_cb);
- return Void();
-}
-
-Return<Result> Health::update() {
- if (!healthd_mode_ops || !healthd_mode_ops->battery_update) {
- LOG(WARNING) << "health@2.0: update: not initialized. "
- << "update() should not be called in charger";
- return Result::UNKNOWN;
- }
-
- // Retrieve all information and call healthd_mode_ops->battery_update, which calls
- // notifyListeners.
- battery_monitor_->updateValues();
- const HealthInfo_1_0& health_info = battery_monitor_->getHealthInfo_1_0();
- struct BatteryProperties props;
- convertFromHealthInfo(health_info, &props);
- bool log = (healthd_board_battery_update(&props) == 0);
- if (log) {
- battery_monitor_->logValues();
- }
- healthd_mode_ops->battery_update(&props);
- bool chargerOnline = battery_monitor_->isChargerOnline();
-
- // adjust uevent / wakealarm periods
- healthd_battery_update_internal(chargerOnline);
-
- return Result::SUCCESS;
-}
-
-Return<Result> Health::updateAndNotify(const sp<IHealthInfoCallback>& callback) {
- std::lock_guard<decltype(callbacks_lock_)> lock(callbacks_lock_);
- std::vector<sp<IHealthInfoCallback>> storedCallbacks{std::move(callbacks_)};
- callbacks_.clear();
- if (callback != nullptr) {
- callbacks_.push_back(callback);
- }
- Return<Result> result = update();
- callbacks_ = std::move(storedCallbacks);
- return result;
-}
-
-void Health::notifyListeners(HealthInfo* healthInfo) {
- std::vector<StorageInfo> info;
- get_storage_info(info);
-
- std::vector<DiskStats> stats;
- get_disk_stats(stats);
-
- int32_t currentAvg = 0;
-
- struct BatteryProperty prop;
- status_t ret = battery_monitor_->getProperty(BATTERY_PROP_CURRENT_AVG, &prop);
- if (ret == OK) {
- currentAvg = static_cast<int32_t>(prop.valueInt64);
- }
-
- healthInfo->batteryCurrentAverage = currentAvg;
- healthInfo->diskStats = stats;
- healthInfo->storageInfos = info;
-
- std::lock_guard<decltype(callbacks_lock_)> lock(callbacks_lock_);
- for (auto it = callbacks_.begin(); it != callbacks_.end();) {
- auto ret = (*it)->healthInfoChanged(*healthInfo);
- if (!ret.isOk() && ret.isDeadObject()) {
- it = callbacks_.erase(it);
- } else {
- ++it;
- }
- }
-}
-
-Return<void> Health::debug(const hidl_handle& handle, const hidl_vec<hidl_string>&) {
- if (handle != nullptr && handle->numFds >= 1) {
- int fd = handle->data[0];
- battery_monitor_->dumpState(fd);
-
- getHealthInfo([fd](auto res, const auto& info) {
- android::base::WriteStringToFd("\ngetHealthInfo -> ", fd);
- if (res == Result::SUCCESS) {
- android::base::WriteStringToFd(toString(info), fd);
- } else {
- android::base::WriteStringToFd(toString(res), fd);
- }
- android::base::WriteStringToFd("\n", fd);
- });
-
- fsync(fd);
- }
- return Void();
-}
-
-Return<void> Health::getStorageInfo(getStorageInfo_cb _hidl_cb) {
- std::vector<struct StorageInfo> info;
- get_storage_info(info);
- hidl_vec<struct StorageInfo> info_vec(info);
- if (!info.size()) {
- _hidl_cb(Result::NOT_SUPPORTED, info_vec);
- } else {
- _hidl_cb(Result::SUCCESS, info_vec);
- }
- return Void();
-}
-
-Return<void> Health::getDiskStats(getDiskStats_cb _hidl_cb) {
- std::vector<struct DiskStats> stats;
- get_disk_stats(stats);
- hidl_vec<struct DiskStats> stats_vec(stats);
- if (!stats.size()) {
- _hidl_cb(Result::NOT_SUPPORTED, stats_vec);
- } else {
- _hidl_cb(Result::SUCCESS, stats_vec);
- }
- return Void();
-}
-
-Return<void> Health::getHealthInfo(getHealthInfo_cb _hidl_cb) {
- using android::hardware::health::V1_0::hal_conversion::convertToHealthInfo;
-
- updateAndNotify(nullptr);
- HealthInfo healthInfo = battery_monitor_->getHealthInfo_2_0();
-
- std::vector<StorageInfo> info;
- get_storage_info(info);
-
- std::vector<DiskStats> stats;
- get_disk_stats(stats);
-
- int32_t currentAvg = 0;
-
- struct BatteryProperty prop;
- status_t ret = battery_monitor_->getProperty(BATTERY_PROP_CURRENT_AVG, &prop);
- if (ret == OK) {
- currentAvg = static_cast<int32_t>(prop.valueInt64);
- }
-
- healthInfo.batteryCurrentAverage = currentAvg;
- healthInfo.diskStats = stats;
- healthInfo.storageInfos = info;
-
- _hidl_cb(Result::SUCCESS, healthInfo);
- return Void();
-}
-
-void Health::serviceDied(uint64_t /* cookie */, const wp<IBase>& who) {
- (void)unregisterCallbackInternal(who.promote());
-}
-
-sp<IHealth> Health::initInstance(struct healthd_config* c) {
- if (instance_ == nullptr) {
- instance_ = new Health(c);
- }
- return instance_;
-}
-
-sp<Health> Health::getImplementation() {
- CHECK(instance_ != nullptr);
- return instance_;
-}
-
-} // namespace implementation
-} // namespace V2_0
-} // namespace health
-} // namespace hardware
-} // namespace android
diff --git a/health/2.0/default/HealthImplDefault.cpp b/health/2.0/default/HealthImplDefault.cpp
deleted file mode 100644
index 08fee9e..0000000
--- a/health/2.0/default/HealthImplDefault.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <health2/Health.h>
-#include <healthd/healthd.h>
-
-using android::hardware::health::V2_0::IHealth;
-using android::hardware::health::V2_0::implementation::Health;
-
-static struct healthd_config gHealthdConfig = {
- .energyCounter = nullptr,
- .boot_min_cap = 0,
- .screen_on = nullptr};
-
-void healthd_board_init(struct healthd_config*) {
- // use defaults
-}
-
-int healthd_board_battery_update(struct android::BatteryProperties*) {
- // return 0 to log periodic polled battery status to kernel log
- return 0;
-}
-
-void healthd_mode_default_impl_init(struct healthd_config*) {
- // noop
-}
-
-int healthd_mode_default_impl_preparetowait(void) {
- return -1;
-}
-
-void healthd_mode_default_impl_heartbeat(void) {
- // noop
-}
-
-void healthd_mode_default_impl_battery_update(struct android::BatteryProperties*) {
- // noop
-}
-
-static struct healthd_mode_ops healthd_mode_default_impl_ops = {
- .init = healthd_mode_default_impl_init,
- .preparetowait = healthd_mode_default_impl_preparetowait,
- .heartbeat = healthd_mode_default_impl_heartbeat,
- .battery_update = healthd_mode_default_impl_battery_update,
-};
-
-extern "C" IHealth* HIDL_FETCH_IHealth(const char* name) {
- const static std::string providedInstance{"backup"};
- healthd_mode_ops = &healthd_mode_default_impl_ops;
- if (providedInstance == name) {
- // use defaults
- // Health class stores static instance
- return Health::initInstance(&gHealthdConfig).get();
- }
- return nullptr;
-}
diff --git a/health/2.0/default/healthd_common_adapter.cpp b/health/2.0/default/healthd_common_adapter.cpp
deleted file mode 100644
index 0b5d869..0000000
--- a/health/2.0/default/healthd_common_adapter.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Support legacy functions in healthd/healthd.h using healthd_mode_ops.
-// New code should use HealthLoop directly instead.
-
-#include <memory>
-
-#include <cutils/klog.h>
-#include <health/HealthLoop.h>
-#include <health2/Health.h>
-#include <healthd/healthd.h>
-
-using android::hardware::health::HealthLoop;
-using android::hardware::health::V2_0::implementation::Health;
-
-struct healthd_mode_ops* healthd_mode_ops = nullptr;
-
-// Adapter of HealthLoop to use legacy healthd_mode_ops.
-class HealthLoopAdapter : public HealthLoop {
- public:
- // Expose internal functions, assuming clients calls them in the same thread
- // where StartLoop is called.
- int RegisterEvent(int fd, BoundFunction func, EventWakeup wakeup) {
- return HealthLoop::RegisterEvent(fd, func, wakeup);
- }
- void AdjustWakealarmPeriods(bool charger_online) {
- return HealthLoop::AdjustWakealarmPeriods(charger_online);
- }
- protected:
- void Init(healthd_config* config) override { healthd_mode_ops->init(config); }
- void Heartbeat() override { healthd_mode_ops->heartbeat(); }
- int PrepareToWait() override { return healthd_mode_ops->preparetowait(); }
- void ScheduleBatteryUpdate() override { Health::getImplementation()->update(); }
-};
-static std::unique_ptr<HealthLoopAdapter> health_loop;
-
-int healthd_register_event(int fd, void (*handler)(uint32_t), EventWakeup wakeup) {
- if (!health_loop) return -1;
-
- auto wrapped_handler = [handler](auto*, uint32_t epevents) { handler(epevents); };
- return health_loop->RegisterEvent(fd, wrapped_handler, wakeup);
-}
-
-void healthd_battery_update_internal(bool charger_online) {
- if (!health_loop) return;
- health_loop->AdjustWakealarmPeriods(charger_online);
-}
-
-int healthd_main() {
- if (!healthd_mode_ops) {
- KLOG_ERROR("healthd ops not set, exiting\n");
- exit(1);
- }
-
- health_loop = std::make_unique<HealthLoopAdapter>();
-
- int ret = health_loop->StartLoop();
-
- // Should not reach here. The following will exit().
- health_loop.reset();
-
- return ret;
-}
diff --git a/health/2.0/default/include/health2/Health.h b/health/2.0/default/include/health2/Health.h
deleted file mode 100644
index 6410474..0000000
--- a/health/2.0/default/include/health2/Health.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#ifndef ANDROID_HARDWARE_HEALTH_V2_0_HEALTH_H
-#define ANDROID_HARDWARE_HEALTH_V2_0_HEALTH_H
-
-#include <memory>
-#include <vector>
-
-#include <android/hardware/health/1.0/types.h>
-#include <android/hardware/health/2.0/IHealth.h>
-#include <healthd/BatteryMonitor.h>
-#include <hidl/Status.h>
-
-using android::hardware::health::V2_0::StorageInfo;
-using android::hardware::health::V2_0::DiskStats;
-
-void get_storage_info(std::vector<struct StorageInfo>& info);
-void get_disk_stats(std::vector<struct DiskStats>& stats);
-
-namespace android {
-namespace hardware {
-namespace health {
-namespace V2_0 {
-namespace implementation {
-
-using V1_0::BatteryStatus;
-
-using ::android::hidl::base::V1_0::IBase;
-
-struct Health : public IHealth, hidl_death_recipient {
- public:
- static sp<IHealth> initInstance(struct healthd_config* c);
- // Should only be called by implementation itself (-impl, -service).
- // Clients should not call this function. Instead, initInstance() initializes and returns the
- // global instance that has fewer functions.
- static sp<Health> getImplementation();
-
- Health(struct healthd_config* c);
-
- void notifyListeners(HealthInfo* info);
-
- // Methods from IHealth follow.
- Return<Result> registerCallback(const sp<IHealthInfoCallback>& callback) override;
- Return<Result> unregisterCallback(const sp<IHealthInfoCallback>& callback) override;
- Return<Result> update() override;
- Return<void> getChargeCounter(getChargeCounter_cb _hidl_cb) override;
- Return<void> getCurrentNow(getCurrentNow_cb _hidl_cb) override;
- Return<void> getCurrentAverage(getCurrentAverage_cb _hidl_cb) override;
- Return<void> getCapacity(getCapacity_cb _hidl_cb) override;
- Return<void> getEnergyCounter(getEnergyCounter_cb _hidl_cb) override;
- Return<void> getChargeStatus(getChargeStatus_cb _hidl_cb) override;
- Return<void> getStorageInfo(getStorageInfo_cb _hidl_cb) override;
- Return<void> getDiskStats(getDiskStats_cb _hidl_cb) override;
- Return<void> getHealthInfo(getHealthInfo_cb _hidl_cb) override;
-
- // Methods from ::android::hidl::base::V1_0::IBase follow.
- Return<void> debug(const hidl_handle& fd, const hidl_vec<hidl_string>& args) override;
-
- void serviceDied(uint64_t cookie, const wp<IBase>& /* who */) override;
-
- private:
- static sp<Health> instance_;
-
- std::recursive_mutex callbacks_lock_;
- std::vector<sp<IHealthInfoCallback>> callbacks_;
- std::unique_ptr<BatteryMonitor> battery_monitor_;
-
- bool unregisterCallbackInternal(const sp<IBase>& cb);
-
- // update() and only notify the given callback, but none of the other callbacks.
- // If cb is null, do not notify any callback at all.
- Return<Result> updateAndNotify(const sp<IHealthInfoCallback>& cb);
-};
-
-} // namespace implementation
-} // namespace V2_0
-} // namespace health
-} // namespace hardware
-} // namespace android
-
-#endif // ANDROID_HARDWARE_HEALTH_V2_0_HEALTH_H
diff --git a/health/2.0/utils/README.md b/health/2.0/utils/README.md
index c59b3f3..3fc8dab 100644
--- a/health/2.0/utils/README.md
+++ b/health/2.0/utils/README.md
@@ -6,25 +6,3 @@
calling `IHealth::getService()` directly.
Its Java equivalent can be found in `BatteryService.HealthServiceWrapper`.
-
-# libhealthservice
-
-Common code for all (hwbinder) services of the health HAL, including healthd and
-vendor health service `android.hardware.health@2.0-service(.<vendor>)`. `main()` in
-those binaries calls `health_service_main()` directly.
-
-# libhealthstoragedefault
-
-Default implementation for storage related APIs for (hwbinder) services of the
-health HAL. If an implementation of the health HAL do not wish to provide any
-storage info, include this library. Otherwise, it should implement the following
-two functions:
-
-```c++
-void get_storage_info(std::vector<struct StorageInfo>& info) {
- // ...
-}
-void get_disk_stats(std::vector<struct DiskStats>& stats) {
- // ...
-}
-```
diff --git a/health/2.0/utils/libhealthhalutils/HealthHalUtils.cpp b/health/2.0/utils/libhealthhalutils/HealthHalUtils.cpp
index 3c353e6..67f0ecc 100644
--- a/health/2.0/utils/libhealthhalutils/HealthHalUtils.cpp
+++ b/health/2.0/utils/libhealthhalutils/HealthHalUtils.cpp
@@ -24,34 +24,14 @@
namespace health {
namespace V2_0 {
+// Deprecated. Kept to minimize migration cost.
+// The function can be removed once Health 2.1 is removed
+// (i.e. compatibility_matrix.7.xml is the lowest supported level).
sp<IHealth> get_health_service() {
- // For the core and vendor variant, the "backup" instance points to healthd,
- // which is removed.
- // For the recovery variant, the "backup" instance has a different
- // meaning. It points to android.hardware.health@2.0-impl-default.recovery
- // which was assumed by OEMs to be always installed when a
- // vendor-specific libhealthd is not necessary. Hence, its behavior
- // is kept. See health/2.0/README.md.
- // android.hardware.health@2.0-impl-default.recovery, and subsequently the
- // special handling of recovery mode below, can be removed once health@2.1
- // is the minimum required version (i.e. compatibility matrix level 5 is the
- // minimum supported level). Health 2.1 requires OEMs to install the
+ // Health 2.1 requires OEMs to install the
// implementation to the recovery partition when it is necessary (i.e. on
// non-A/B devices, where IsBatteryOk() is needed in recovery).
- for (auto&& instanceName :
-#ifdef __ANDROID_RECOVERY__
- { "default", "backup" }
-#else
- {"default"}
-#endif
- ) {
- auto ret = IHealth::getService(instanceName);
- if (ret != nullptr) {
- return ret;
- }
- LOG(INFO) << "health: cannot get " << instanceName << " service";
- }
- return nullptr;
+ return IHealth::getService();
}
} // namespace V2_0
diff --git a/health/2.0/utils/libhealthservice/Android.bp b/health/2.0/utils/libhealthservice/Android.bp
deleted file mode 100644
index 8023692..0000000
--- a/health/2.0/utils/libhealthservice/Android.bp
+++ /dev/null
@@ -1,38 +0,0 @@
-// Reasonable defaults for android.hardware.health@2.0-service.<device>.
-// Vendor service can customize by implementing functions defined in
-// libhealthd and libhealthstoragedefault.
-
-
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "hardware_interfaces_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["hardware_interfaces_license"],
-}
-
-cc_library_static {
- name: "libhealthservice",
- vendor_available: true,
- srcs: ["HealthServiceCommon.cpp"],
-
- export_include_dirs: ["include"],
-
- cflags: [
- "-Wall",
- "-Werror",
- ],
- shared_libs: [
- "android.hardware.health@2.0",
- ],
- static_libs: [
- "android.hardware.health@2.0-impl",
- "android.hardware.health@1.0-convert",
- ],
- export_static_lib_headers: [
- "android.hardware.health@1.0-convert",
- ],
- header_libs: ["libhealthd_headers"],
- export_header_lib_headers: ["libhealthd_headers"],
-}
diff --git a/health/2.0/utils/libhealthservice/HealthServiceCommon.cpp b/health/2.0/utils/libhealthservice/HealthServiceCommon.cpp
deleted file mode 100644
index 039570a..0000000
--- a/health/2.0/utils/libhealthservice/HealthServiceCommon.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "health@2.0/"
-#include <android-base/logging.h>
-
-#include <android/hardware/health/1.0/types.h>
-#include <hal_conversion.h>
-#include <health2/Health.h>
-#include <health2/service.h>
-#include <healthd/healthd.h>
-#include <hidl/HidlTransportSupport.h>
-#include <hwbinder/IPCThreadState.h>
-
-using android::hardware::IPCThreadState;
-using android::hardware::configureRpcThreadpool;
-using android::hardware::handleTransportPoll;
-using android::hardware::setupTransportPolling;
-using android::hardware::health::V2_0::HealthInfo;
-using android::hardware::health::V1_0::hal_conversion::convertToHealthInfo;
-using android::hardware::health::V2_0::IHealth;
-using android::hardware::health::V2_0::implementation::Health;
-
-extern int healthd_main(void);
-
-static int gBinderFd = -1;
-static std::string gInstanceName;
-
-static void binder_event(uint32_t /*epevents*/) {
- if (gBinderFd >= 0) handleTransportPoll(gBinderFd);
-}
-
-void healthd_mode_service_2_0_init(struct healthd_config* config) {
- LOG(INFO) << LOG_TAG << gInstanceName << " Hal is starting up...";
-
- gBinderFd = setupTransportPolling();
-
- if (gBinderFd >= 0) {
- if (healthd_register_event(gBinderFd, binder_event))
- LOG(ERROR) << LOG_TAG << gInstanceName << ": Register for binder events failed";
- }
-
- android::sp<IHealth> service = Health::initInstance(config);
- CHECK_EQ(service->registerAsService(gInstanceName), android::OK)
- << LOG_TAG << gInstanceName << ": Failed to register HAL";
-
- LOG(INFO) << LOG_TAG << gInstanceName << ": Hal init done";
-}
-
-int healthd_mode_service_2_0_preparetowait(void) {
- IPCThreadState::self()->flushCommands();
- return -1;
-}
-
-void healthd_mode_service_2_0_heartbeat(void) {
- // noop
-}
-
-void healthd_mode_service_2_0_battery_update(struct android::BatteryProperties* prop) {
- HealthInfo info;
- convertToHealthInfo(prop, info.legacy);
- Health::getImplementation()->notifyListeners(&info);
-}
-
-static struct healthd_mode_ops healthd_mode_service_2_0_ops = {
- .init = healthd_mode_service_2_0_init,
- .preparetowait = healthd_mode_service_2_0_preparetowait,
- .heartbeat = healthd_mode_service_2_0_heartbeat,
- .battery_update = healthd_mode_service_2_0_battery_update,
-};
-
-int health_service_main(const char* instance) {
- gInstanceName = instance;
- if (gInstanceName.empty()) {
- gInstanceName = "default";
- }
- healthd_mode_ops = &healthd_mode_service_2_0_ops;
- LOG(INFO) << LOG_TAG << gInstanceName << ": Hal starting main loop...";
- return healthd_main();
-}
diff --git a/health/2.0/utils/libhealthservice/include/health2/service.h b/health/2.0/utils/libhealthservice/include/health2/service.h
deleted file mode 100644
index d260568..0000000
--- a/health/2.0/utils/libhealthservice/include/health2/service.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_HARDWARE_HEALTH_V2_0_SERVICE_COMMON
-#define ANDROID_HARDWARE_HEALTH_V2_0_SERVICE_COMMON
-
-int health_service_main(const char* instance = "");
-
-#endif // ANDROID_HARDWARE_HEALTH_V2_0_SERVICE_COMMON
diff --git a/health/2.0/utils/libhealthstoragedefault/Android.bp b/health/2.0/utils/libhealthstoragedefault/Android.bp
deleted file mode 100644
index 3de8789..0000000
--- a/health/2.0/utils/libhealthstoragedefault/Android.bp
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Default implementation for (passthrough) clients that statically links to
-// android.hardware.health@2.0-impl but do no query for storage related
-// information.
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "hardware_interfaces_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["hardware_interfaces_license"],
-}
-
-cc_library_static {
- srcs: ["StorageHealthDefault.cpp"],
- name: "libhealthstoragedefault",
- vendor_available: true,
- recovery_available: true,
- cflags: ["-Werror"],
- shared_libs: [
- "android.hardware.health@2.0",
- ],
-}
diff --git a/health/2.0/utils/libhealthstoragedefault/StorageHealthDefault.cpp b/health/2.0/utils/libhealthstoragedefault/StorageHealthDefault.cpp
deleted file mode 100644
index aba6cc3..0000000
--- a/health/2.0/utils/libhealthstoragedefault/StorageHealthDefault.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "include/StorageHealthDefault.h"
-
-void get_storage_info(std::vector<struct StorageInfo>&) {
- // Use defaults.
-}
-
-void get_disk_stats(std::vector<struct DiskStats>&) {
- // Use defaults
-}
diff --git a/health/2.0/utils/libhealthstoragedefault/include/StorageHealthDefault.h b/health/2.0/utils/libhealthstoragedefault/include/StorageHealthDefault.h
deleted file mode 100644
index 85eb210..0000000
--- a/health/2.0/utils/libhealthstoragedefault/include/StorageHealthDefault.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef ANDROID_HARDWARE_HEALTH_V2_0_STORAGE_HEALTH_H
-#define ANDROID_HARDWARE_HEALTH_V2_0_STORAGE_HEALTH_H
-
-#include <android/hardware/health/2.0/types.h>
-
-using android::hardware::health::V2_0::StorageInfo;
-using android::hardware::health::V2_0::DiskStats;
-
-/*
- * Get storage information.
- */
-void get_storage_info(std::vector<struct StorageInfo>& info);
-
-/*
- * Get disk statistics.
- */
-void get_disk_stats(std::vector<struct DiskStats>& stats);
-
-#endif // ANDROID_HARDWARE_HEALTH_V2_0_STORAGE_HEALTH_H
diff --git a/radio/aidl/vts/radio_config_response.cpp b/radio/aidl/vts/radio_config_response.cpp
index dccbd0e..c532440 100644
--- a/radio/aidl/vts/radio_config_response.cpp
+++ b/radio/aidl/vts/radio_config_response.cpp
@@ -41,8 +41,9 @@
}
ndk::ScopedAStatus RadioConfigResponse::getSimultaneousCallingSupportResponse(
- const RadioResponseInfo& info, const std::vector<int32_t>& /* enabledLogicalSlots */) {
+ const RadioResponseInfo& info, const std::vector<int32_t>& enabledLogicalSlots) {
rspInfo = info;
+ currentEnabledLogicalSlots = enabledLogicalSlots;
parent_config.notify(info.serial);
return ndk::ScopedAStatus::ok();
}
diff --git a/radio/aidl/vts/radio_config_test.cpp b/radio/aidl/vts/radio_config_test.cpp
index f725136..6f18d18 100644
--- a/radio/aidl/vts/radio_config_test.cpp
+++ b/radio/aidl/vts/radio_config_test.cpp
@@ -150,10 +150,17 @@
ALOGI("getSimultaneousCallingSupport, rspInfo.error = %s\n",
toString(radioRsp_config->rspInfo.error).c_str());
+ // REQUEST_NOT_SUPPORTED is omitted here because users of the V3 HAL should implement this
+ // method and return at least an empty array
ASSERT_TRUE(CheckAnyOfErrors(
radioRsp_config->rspInfo.error,
{RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE, RadioError::INTERNAL_ERR,
- RadioError::MODEM_ERR, RadioError::REQUEST_NOT_SUPPORTED}));
+ RadioError::MODEM_ERR}));
+
+ if (radioRsp_config->rspInfo.error == RadioError ::NONE) {
+ // The size of enabledLogicalSLots should be 0 or a positive number:
+ EXPECT_GE(radioRsp_config->currentEnabledLogicalSlots.size(), 0);
+ }
}
/*
diff --git a/radio/aidl/vts/radio_config_utils.h b/radio/aidl/vts/radio_config_utils.h
index 9e809ff..84c74fc 100644
--- a/radio/aidl/vts/radio_config_utils.h
+++ b/radio/aidl/vts/radio_config_utils.h
@@ -39,6 +39,7 @@
PhoneCapability phoneCap;
bool modemReducedFeatureSet1;
std::vector<SimSlotStatus> simSlotStatus;
+ std::vector<int32_t> currentEnabledLogicalSlots;
virtual ndk::ScopedAStatus getSimSlotsStatusResponse(
const RadioResponseInfo& info, const std::vector<SimSlotStatus>& slotStatus) override;
diff --git a/secure_element/aidl/vts/AndroidTest.xml b/secure_element/aidl/vts/AndroidTest.xml
new file mode 100644
index 0000000..94dfa82
--- /dev/null
+++ b/secure_element/aidl/vts/AndroidTest.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration description="Runs VtsHalSecureElementTargetTest.">
+ <option name="test-suite-tag" value="apct" />
+ <option name="test-suite-tag" value="apct-native" />
+ <option name="config-descriptor:metadata" key="token" value="SECURE_ELEMENT_SIM_CARD" />
+
+ <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer">
+ </target_preparer>
+
+ <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
+ <option name="cleanup" value="true" />
+ <option name="push" value="VtsHalSecureElementTargetTest->/data/local/tmp/VtsHalSecureElementTargetTest" />
+ </target_preparer>
+
+ <test class="com.android.tradefed.testtype.GTest" >
+ <option name="native-test-device-path" value="/data/local/tmp" />
+ <option name="module-name" value="VtsHalSecureElementTargetTest" />
+ </test>
+</configuration>
diff --git a/tv/tuner/aidl/vts/functional/utils/IpStreamer.h b/tv/tuner/aidl/vts/functional/utils/IpStreamer.h
index d073003..8ac2ddb 100644
--- a/tv/tuner/aidl/vts/functional/utils/IpStreamer.h
+++ b/tv/tuner/aidl/vts/functional/utils/IpStreamer.h
@@ -37,7 +37,7 @@
private:
int mSockfd = -1;
- FILE* mFp;
+ FILE* mFp = nullptr;
bool mIsIpV4 = true; // By default, set to IPV4
int mPort = 12345; // default port
int mBufferSize = 188; // bytes
diff --git a/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl b/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
index 21951b6..58919d1 100644
--- a/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
+++ b/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
@@ -46,6 +46,7 @@
CCC_SUPPORTED_MAX_RANGING_SESSION_NUMBER = 0xA8,
CCC_SUPPORTED_MIN_UWB_INITIATION_TIME_MS = 0xA9,
CCC_PRIORITIZED_CHANNEL_LIST = 0xAA,
+ CCC_SUPPORTED_UWBS_MAX_PPM = 0xAB,
RADAR_SUPPORT = 0xB0,
SUPPORTED_AOA_RESULT_REQ_ANTENNA_INTERLEAVING = 0xE3,
SUPPORTED_MIN_RANGING_INTERVAL_MS = 0xE4,
diff --git a/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl b/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
index 2141b5a..4df45b6 100644
--- a/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
+++ b/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
@@ -154,6 +154,11 @@
*/
CCC_PRIORITIZED_CHANNEL_LIST = 0xAA,
+ /**
+ * Short (2-octet) value to indicate the UWBS Max Clock Skew PPM value.
+ */
+ CCC_SUPPORTED_UWBS_MAX_PPM = 0xAB,
+
/*********************************************
* RADAR specific
********************************************/